From 138e3b87b29974c53e9574d4d724dd1ffd71b027 Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 01:29:36 +0200 Subject: [PATCH 01/76] feat(workbench): add governed work design foundation --- .github/workflows/work-design-integrity.yml | 36 + .gitignore | 1 + INTEGRATION.md | 27 + bun.lock | 2 + packages/app/package.json | 1 + packages/app/src/app.tsx | 7 +- packages/app/src/context/mode.test.ts | 6 + packages/app/src/context/mode.tsx | 40 + packages/app/src/pages/layout.tsx | 5 + .../app/src/pages/layout/sidebar-shell.tsx | 17 + packages/app/src/pages/workbench-mode.tsx | 13 + packages/contracts/package.json | 4 + .../contracts/src/workbench-wire/index.ts | 244 + .../contracts/test/workbench-wire.test.ts | 50 + .../mobile/scripts/prepare-android-runtime.sh | 22 +- .../src-tauri/assets/runtime/unifia-cli.js | 13425 ++++++++-------- .../app/src/main/assets/runtime/unifia-cli.js | 13425 ++++++++-------- .../src-tauri/gen/schemas/acl-manifests.json | 2 +- packages/mobile/src-tauri/tauri.conf.json | 2 +- packages/spec-runtime/src/index.ts | 3 +- packages/workbench-server/package.json | 4 +- packages/workbench-server/src/index.ts | 7 +- packages/workbench-server/src/security.ts | 26 + .../test/cors-preflight.test.ts | 21 + .../workbench-server/test/security.test.ts | 18 + .../workbench-server/test/topology.test.ts | 32 + packages/workbench-shell/package.json | 6 +- .../test/modes-contract.test.ts | 8 + packages/workspace-runtime/package.json | 4 +- .../workspace-runtime/test/identity.test.ts | 35 + scripts/check-mode-registry.mjs | 30 + scripts/check-pr-size.sh | 31 + scripts/check-workbench-security.mjs | 20 + work_design/DECISIONS.md | 64 + work_design/MANUAL-VERIFICATION.md | 22 + work_design/STATE.md | 66 + 36 files changed, 14638 insertions(+), 13088 deletions(-) create mode 100644 .github/workflows/work-design-integrity.yml create mode 100644 INTEGRATION.md create mode 100644 packages/app/src/context/mode.test.ts create mode 100644 packages/app/src/context/mode.tsx create mode 100644 packages/app/src/pages/workbench-mode.tsx create mode 100644 packages/contracts/src/workbench-wire/index.ts create mode 100644 packages/contracts/test/workbench-wire.test.ts create mode 100644 packages/workbench-server/src/security.ts create mode 100644 packages/workbench-server/test/cors-preflight.test.ts create mode 100644 packages/workbench-server/test/security.test.ts create mode 100644 packages/workbench-server/test/topology.test.ts create mode 100644 packages/workbench-shell/test/modes-contract.test.ts create mode 100644 packages/workspace-runtime/test/identity.test.ts create mode 100644 scripts/check-mode-registry.mjs create mode 100644 scripts/check-pr-size.sh create mode 100644 scripts/check-workbench-security.mjs create mode 100644 work_design/DECISIONS.md create mode 100644 work_design/MANUAL-VERIFICATION.md create mode 100644 work_design/STATE.md diff --git a/.github/workflows/work-design-integrity.yml b/.github/workflows/work-design-integrity.yml new file mode 100644 index 000000000000..d5de244d6e0f --- /dev/null +++ b/.github/workflows/work-design-integrity.yml @@ -0,0 +1,36 @@ +name: work-design-integrity + +on: + pull_request: + branches: [dev] + paths: + - "work_design/**" + - "INTEGRATION.md" + - "scripts/check-pr-size.sh" + - ".github/workflows/work-design-integrity.yml" + +permissions: + contents: read + +jobs: + merge-and-size: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Fetch base + run: git fetch origin dev --depth=1 + + - name: Check mergeability without mutating the checkout + run: git merge-tree --write-tree origin/dev HEAD + + - name: Check card size + run: bash scripts/check-pr-size.sh dev + + - name: Check whitespace + run: git diff --check origin/dev...HEAD + + - name: Check Workbench security policy + run: node scripts/check-workbench-security.mjs diff --git a/.gitignore b/.gitignore index 9af9d8c88444..a57846889fe3 100644 --- a/.gitignore +++ b/.gitignore @@ -130,3 +130,4 @@ unifia-conformance.json # repository path and per-machine tool versions, so it is a local record rather # than something to track. artifacts/ +packages/mobile/src-tauri/ort-runtime/ diff --git a/INTEGRATION.md b/INTEGRATION.md new file mode 100644 index 000000000000..8aa319942941 --- /dev/null +++ b/INTEGRATION.md @@ -0,0 +1,27 @@ +# Work/Design integration ownership + +This file records high-conflict surfaces and the rule for resolving overlap between cards. + +## Ownership map + +| Surface | Owner card | Conflict rule | +|---|---|---| +| `packages/app/src/pages/layout.tsx` | M4/M16 | Keep route registration and shell composition in one card; split any conflict before resolving. | +| `packages/app/src/app.tsx` | M4 | Preserve the existing provider order; route/context changes require an architecture note. | +| `packages/app/package.json` | M2a | Dependency and export changes are atomic with the lockfile generated by the package manager. | +| `packages/workbench-server/src` | M1b/M1c/M6-M10 | Server transport, security, and feature routes remain separate card boundaries. | +| Tauri configuration files | M1c/M22 | Native bridge and packaging changes require platform evidence before integration. | +| `packages/contracts` | M3 | Wire contracts have one owner; consumers do not duplicate schemas. | + +## Resolution budget + +- Resolve at most 50 changed lines in a card-level conflict. +- Above that limit, stop, record the conflict, and split the card before editing. +- Never resolve by accepting an entire side blindly. + +## File-type rules + +- TypeScript: preserve the local formatter and package boundary. +- JSON/YAML: keep generated ordering; regenerate rather than hand-edit generated output. +- Native configuration: preserve platform identifiers unless a reviewed gate explicitly changes them. +- Tests: add evidence next to the behavior they prove; do not weaken an existing assertion to make a card pass. diff --git a/bun.lock b/bun.lock index 56f3fa2ebbc4..164704ebaa66 100644 --- a/bun.lock +++ b/bun.lock @@ -52,6 +52,7 @@ "@unifia/sdk-shared": "workspace:*", "@unifia/ui": "workspace:*", "@unifia/util": "workspace:*", + "@unifia/workbench-shell": "workspace:*", "diff": "catalog:", "effect": "catalog:", "fuzzysort": "catalog:", @@ -931,6 +932,7 @@ "@tsconfig/node22": "22.0.2", "@types/bun": "catalog:", "@types/node": "catalog:", + "@unifia/spec-runtime": "workspace:*", "typescript": "catalog:", }, }, diff --git a/packages/app/package.json b/packages/app/package.json index b63e6150677d..cb94bd2e9294 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -43,6 +43,7 @@ "@kobalte/core": "catalog:", "@unifia/sdk": "workspace:*", "@unifia/sdk-shared": "workspace:*", + "@unifia/workbench-shell": "workspace:*", "@unifia/ui": "workspace:*", "@unifia/util": "workspace:*", "@shikijs/transformers": "3.9.2", diff --git a/packages/app/src/app.tsx b/packages/app/src/app.tsx index 6d4848c7974e..cb95e8948f1b 100644 --- a/packages/app/src/app.tsx +++ b/packages/app/src/app.tsx @@ -36,6 +36,7 @@ import { HighlightsProvider } from "@/context/highlights" import { LanguageProvider, type Locale, useLanguage } from "@/context/language" import { LayoutProvider } from "@/context/layout" import { ModelsProvider } from "@/context/models" +import { ModeProvider } from "@/context/mode" import { NotificationProvider } from "@/context/notification" import { PermissionProvider } from "@/context/permission" import { PromptProvider } from "@/context/prompt" @@ -64,6 +65,7 @@ const SessionRoute = () => ( ) const SessionIndexRoute = () => +const WorkbenchModeRoute = lazy(() => import("@/pages/workbench-mode")) function UiI18nBridge(props: ParentProps) { const language = useLanguage() @@ -95,7 +97,9 @@ function AppShellProviders(props: ParentProps) { - {props.children} + + {props.children} + @@ -406,6 +410,7 @@ export function AppInterface(props: { + ) diff --git a/packages/app/src/context/mode.test.ts b/packages/app/src/context/mode.test.ts new file mode 100644 index 000000000000..9611ecabaf64 --- /dev/null +++ b/packages/app/src/context/mode.test.ts @@ -0,0 +1,6 @@ +import { expect, test } from "bun:test" +import { SHELL_MODES } from "@unifia/workbench-shell/modes" + +test("mode registry exposes the four navigation destinations", () => { + expect(SHELL_MODES).toEqual(["code", "work", "design", "automate"]) +}) diff --git a/packages/app/src/context/mode.tsx b/packages/app/src/context/mode.tsx new file mode 100644 index 000000000000..215170f4a12c --- /dev/null +++ b/packages/app/src/context/mode.tsx @@ -0,0 +1,40 @@ +import { createMemo, type ParentProps } from "solid-js" +import { createStore } from "solid-js/store" +import { useLocation, useNavigate, useParams } from "@solidjs/router" +import { createSimpleContext } from "@unifia/ui/context" +import { SHELL_MODES, type ShellMode } from "@unifia/workbench-shell/modes" +import { base64Encode } from "@unifia/util/encode" +import { Persist, persisted } from "@/utils/persist" + +const isMode = (value: string | undefined): value is ShellMode => !!value && SHELL_MODES.includes(value as ShellMode) + +const { use: useMode, provider: ModeContextProvider } = createSimpleContext({ + name: "Mode", + init: () => { + const params = useParams() + const location = useLocation() + const navigate = useNavigate() + const directory = createMemo(() => params.dir ?? "") + const [store, setStore] = createStore<{ value: ShellMode }>({ value: "code" }) + persisted(Persist.workspace(directory(), "mode"), [store, setStore]) + + const active = createMemo(() => { + const segment = location.pathname.slice(`/${directory()}`.length).split("/").filter(Boolean)[0] + return isMode(segment) ? segment : store.value + }) + + function select(mode: ShellMode): void { + setStore("value", mode) + if (mode === "code") { + navigate(`/${base64Encode(directory())}/session`) + return + } + navigate(`/${base64Encode(directory())}/${mode}`) + } + + return { modes: SHELL_MODES, active, select, directory } + }, +}) + +export { useMode } +export const ModeProvider = ModeContextProvider diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx index b48382d4e166..951b0b3380bc 100644 --- a/packages/app/src/pages/layout.tsx +++ b/packages/app/src/pages/layout.tsx @@ -55,6 +55,7 @@ import type { import { ProjectDragOverlay, SortableProject, type ProjectSidebarContext } from "./layout/sidebar-project" import { SidebarPanel, type SidebarPanelContext } from "./layout/sidebar-panel" import { SidebarContent } from "./layout/sidebar-shell" +import { useMode } from "@/context/mode" import { DialogDeleteWorkspace, DialogResetWorkspace } from "./layout/dialog-workspace" import { createPrefetchSystem } from "./layout/prefetch" import { useUpdatePolling, useSDKNotificationToasts } from "./layout/notifications" @@ -959,6 +960,7 @@ export default function Layout(props: ParentProps) { } const projects = () => layout.projects.list() + const mode = useMode() const projectOverlay = () => store.activeProject} /> const sidebarContent = (mobile?: boolean) => ( mobile ? : } + modes={mode.modes} + activeMode={mode.active} + onMode={mode.select} /> ) diff --git a/packages/app/src/pages/layout/sidebar-shell.tsx b/packages/app/src/pages/layout/sidebar-shell.tsx index 1e1da51c04e3..6b0ba5dc538c 100644 --- a/packages/app/src/pages/layout/sidebar-shell.tsx +++ b/packages/app/src/pages/layout/sidebar-shell.tsx @@ -11,6 +11,7 @@ import { ConstrainDragXAxis } from "@/utils/solid-dnd" import { IconButton } from "@unifia/ui/icon-button" import { Tooltip, TooltipKeybind } from "@unifia/ui/tooltip" import type { LocalProject } from "@/context/layout" +import type { ShellMode } from "@unifia/workbench-shell/modes" export const SidebarContent = (props: { mobile?: boolean @@ -31,6 +32,9 @@ export const SidebarContent = (props: { helpLabel: Accessor onOpenHelp: () => void renderPanel: () => JSX.Element + modes: readonly ShellMode[] + activeMode: Accessor + onMode: (mode: ShellMode) => void }): JSX.Element => { const expanded = createMemo(() => !!props.mobile || props.opened()) const placement = () => (props.mobile ? "bottom" : "right") @@ -63,6 +67,19 @@ export const SidebarContent = (props: {
+ + {(mode) => ( + + props.onMode(mode)} + aria-label={`${mode} mode`} + /> + + )} + p.worktree)}> {(project) => props.renderProject(project)} diff --git a/packages/app/src/pages/workbench-mode.tsx b/packages/app/src/pages/workbench-mode.tsx new file mode 100644 index 000000000000..07ddf95ab0c4 --- /dev/null +++ b/packages/app/src/pages/workbench-mode.tsx @@ -0,0 +1,13 @@ +import { useMode } from "@/context/mode" + +export default function WorkbenchMode() { + const mode = useMode() + return ( +
+
+

{mode.active()} mode

+

This Unifia surface is enabled in navigation and ready for its implementation card.

+
+
+ ) +} diff --git a/packages/contracts/package.json b/packages/contracts/package.json index b0ba85d8acc3..2771906c955e 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -5,6 +5,10 @@ "type": "module", "main": "./src/index.ts", "types": "./src/index.ts", + "exports": { + ".": "./src/index.ts", + "./workbench-wire": "./src/workbench-wire/index.ts" + }, "license": "MIT", "scripts": { "typecheck": "tsc --noEmit", diff --git a/packages/contracts/src/workbench-wire/index.ts b/packages/contracts/src/workbench-wire/index.ts new file mode 100644 index 000000000000..3b611d72121e --- /dev/null +++ b/packages/contracts/src/workbench-wire/index.ts @@ -0,0 +1,244 @@ +/* SPDX-License-Identifier: MIT */ + +export const WIRE_PROTOCOL_VERSION = 1 as const +export const WORKBENCH_EVENT_TYPES = [ + "workspace.changed", + "operation.updated", + "approval.updated", + "catalog.updated", + "trace.appended", +] as const + +export type WorkbenchEventType = (typeof WORKBENCH_EVENT_TYPES)[number] +export type EventMergeRule = "append-only" | "replace" | "last-wins" | "state-snapshot" + +export const EVENT_MERGE_RULES: Record = { + "workspace.changed": "state-snapshot", + "operation.updated": "last-wins", + "approval.updated": "replace", + "catalog.updated": "replace", + "trace.appended": "append-only", +} + +export const WIRE_POLICY = { + resyncSequenceGap: 1, + cursorMaxAgeMs: 15 * 60 * 1000, + tokenGracePeriodMs: 30 * 1000, + maxSseConnectionsPerWorkspace: 2, + maxSseConnectionsPerInstance: 4, + maxEventsPerSecond: { + "workspace.changed": 20, + "operation.updated": 50, + "approval.updated": 20, + "catalog.updated": 5, + "trace.appended": 200, + }, +} as const + +export type OpaqueCursor = string & { readonly __opaqueCursor: unique symbol } +export type IdempotencyKey = string & { readonly __idempotencyKey: unique symbol } + +export interface HandshakeRequest { + kind: "workbench.handshake" + protocolVersion: number + supportedVersions: readonly number[] + clientInstanceId: string +} + +export interface HandshakeResponse { + kind: "workbench.handshake.accepted" | "workbench.handshake.refused" + accepted: boolean + protocolVersion: number | null + supportedVersions: readonly number[] + instanceId: string + reason?: "unsupported-version" | "invalid-request" +} + +export interface WorkspaceEvent { + eventId: string + workspaceId: string + sequenceId: number + cursor: OpaqueCursor + type: WorkbenchEventType + payload: unknown +} + +export interface PageRequest { + workspaceId: string + cursor?: OpaqueCursor + pageSize: number +} + +export interface Page { + items: readonly T[] + nextCursor: OpaqueCursor | null + hasMore: boolean +} + +export interface BinaryPayloadRef { + kind: "binary-ref" + url: string + expiresAt: number + sha256: string + byteLength: number +} + +export interface AcceptedOperation { + status: 202 + operationId: string + approvalId: string | null + idempotencyKey: IdempotencyKey +} + +export interface TokenRotation { + state: "rotating" + token: string + previousToken: string | null + gracePeriodMs: number + expiresAt: number +} + +export interface WireProtocolError { + code: "unsupported-version" | "stale-cursor" | "expired-cursor" | "rate-limited" + message: string + supportedVersions?: readonly number[] + retryAfterMs?: number +} + +export const isRecord = (value: unknown): value is Record => + typeof value === "object" && value !== null + +const requireString = (value: unknown, field: string): string => { + if (typeof value !== "string" || value.length === 0) throw new TypeError(`${field} must be a non-empty string`) + return value +} + +const requireFiniteNumber = (value: unknown, field: string): number => { + if (typeof value !== "number" || !Number.isFinite(value)) throw new TypeError(`${field} must be finite`) + return value +} + +export const parseOpaqueCursor = (value: unknown): OpaqueCursor => { + const cursor = requireString(value, "cursor") + if (cursor.length > 512) throw new TypeError("cursor exceeds the 512 character limit") + return cursor as OpaqueCursor +} + +export const parseIdempotencyKey = (value: unknown): IdempotencyKey => { + const key = requireString(value, "idempotencyKey").toLowerCase() + if (!/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(key)) { + throw new TypeError("idempotencyKey must be a UUID v7") + } + return key as IdempotencyKey +} + +export const createIdempotencyKey = (timestamp = Date.now()): IdempotencyKey => { + const cryptoApi = globalThis.crypto + if (!cryptoApi?.getRandomValues) throw new Error("Web Crypto is required to create an idempotency key") + const bytes = new Uint8Array(16) + cryptoApi.getRandomValues(bytes) + let time = Math.max(0, Math.floor(timestamp)) + for (let index = 5; index >= 0; index -= 1) { + bytes[index] = time % 256 + time = Math.floor(time / 256) + } + bytes[6] = (bytes[6] & 0x0f) | 0x70 + bytes[8] = (bytes[8] & 0x3f) | 0x80 + const hex = [...bytes].map((byte) => byte.toString(16).padStart(2, "0")).join("") + return parseIdempotencyKey(`${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`) +} + +export const parseHandshakeRequest = (value: unknown): HandshakeRequest => { + if (!isRecord(value) || value.kind !== "workbench.handshake") throw new TypeError("invalid handshake request") + const supportedVersions = value.supportedVersions + if (!Array.isArray(supportedVersions) || supportedVersions.some((version) => !Number.isInteger(version))) { + throw new TypeError("supportedVersions must be an integer array") + } + return { + kind: value.kind, + protocolVersion: requireFiniteNumber(value.protocolVersion, "protocolVersion"), + supportedVersions, + clientInstanceId: requireString(value.clientInstanceId, "clientInstanceId"), + } +} + +export const parseHandshakeResponse = (value: unknown): HandshakeResponse => { + if (!isRecord(value) || !["workbench.handshake.accepted", "workbench.handshake.refused"].includes(value.kind as string)) { + throw new TypeError("invalid handshake response") + } + const supportedVersions = value.supportedVersions + if (!Array.isArray(supportedVersions) || supportedVersions.some((version) => !Number.isInteger(version))) { + throw new TypeError("supportedVersions must be an integer array") + } + if (typeof value.accepted !== "boolean") throw new TypeError("accepted must be boolean") + if (value.accepted !== (value.kind === "workbench.handshake.accepted")) throw new TypeError("handshake kind and accepted disagree") + return { + kind: value.kind as HandshakeResponse["kind"], + accepted: value.accepted, + protocolVersion: value.protocolVersion === null ? null : requireFiniteNumber(value.protocolVersion, "protocolVersion"), + supportedVersions, + instanceId: requireString(value.instanceId, "instanceId"), + reason: value.reason as HandshakeResponse["reason"], + } +} + +export const parsePageRequest = (value: unknown): PageRequest => { + if (!isRecord(value)) throw new TypeError("invalid page request") + const pageSize = requireFiniteNumber(value.pageSize, "pageSize") + if (!Number.isInteger(pageSize) || pageSize < 1 || pageSize > 100) throw new TypeError("pageSize must be between 1 and 100") + return { + workspaceId: requireString(value.workspaceId, "workspaceId"), + cursor: value.cursor === undefined ? undefined : parseOpaqueCursor(value.cursor), + pageSize, + } +} + +export const parseTokenRotation = (value: unknown): TokenRotation => { + if (!isRecord(value) || value.state !== "rotating") throw new TypeError("invalid token rotation") + const gracePeriodMs = requireFiniteNumber(value.gracePeriodMs, "gracePeriodMs") + if (gracePeriodMs < 0 || gracePeriodMs > WIRE_POLICY.tokenGracePeriodMs) throw new TypeError("grace period exceeds policy") + return { + state: "rotating", + token: requireString(value.token, "token"), + previousToken: value.previousToken === null ? null : requireString(value.previousToken, "previousToken"), + gracePeriodMs, + expiresAt: requireFiniteNumber(value.expiresAt, "expiresAt"), + } +} + +export const parseWorkspaceEvent = (value: unknown): WorkspaceEvent => { + if (!isRecord(value) || !WORKBENCH_EVENT_TYPES.includes(value.type as WorkbenchEventType)) throw new TypeError("invalid workspace event") + const sequenceId = requireFiniteNumber(value.sequenceId, "sequenceId") + if (!Number.isInteger(sequenceId) || sequenceId < 0) throw new TypeError("sequenceId must be a non-negative integer") + return { + eventId: requireString(value.eventId, "eventId"), + workspaceId: requireString(value.workspaceId, "workspaceId"), + sequenceId, + cursor: parseOpaqueCursor(value.cursor), + type: value.type as WorkbenchEventType, + payload: value.payload, + } +} + +export const parseBinaryPayloadRef = (value: unknown): BinaryPayloadRef => { + if (!isRecord(value) || value.kind !== "binary-ref") throw new TypeError("invalid binary payload reference") + const byteLength = requireFiniteNumber(value.byteLength, "byteLength") + if (!Number.isInteger(byteLength) || byteLength < 0) throw new TypeError("byteLength must be a non-negative integer") + return { + kind: value.kind, + url: requireString(value.url, "url"), + expiresAt: requireFiniteNumber(value.expiresAt, "expiresAt"), + sha256: requireString(value.sha256, "sha256"), + byteLength, + } +} + +export const parseAcceptedOperation = (value: unknown): AcceptedOperation => { + if (!isRecord(value) || value.status !== 202) throw new TypeError("invalid accepted operation") + return { + status: 202, + operationId: requireString(value.operationId, "operationId"), + approvalId: value.approvalId === null ? null : requireString(value.approvalId, "approvalId"), + idempotencyKey: parseIdempotencyKey(value.idempotencyKey), + } +} diff --git a/packages/contracts/test/workbench-wire.test.ts b/packages/contracts/test/workbench-wire.test.ts new file mode 100644 index 000000000000..62e678f18b05 --- /dev/null +++ b/packages/contracts/test/workbench-wire.test.ts @@ -0,0 +1,50 @@ +import { describe, expect, it } from "vitest" +import { + EVENT_MERGE_RULES, + createIdempotencyKey, + parseAcceptedOperation, + parseBinaryPayloadRef, + parseHandshakeRequest, + parseHandshakeResponse, + parsePageRequest, + parseTokenRotation, + parseWorkspaceEvent, + WIRE_POLICY, +} from "../src/workbench-wire/index" + +describe("workbench wire contract", () => { + it("keeps an explicit reconciliation rule for every event type", () => { + expect(Object.values(EVENT_MERGE_RULES)).toHaveLength(5) + expect(EVENT_MERGE_RULES["trace.appended"]).toBe("append-only") + }) + + it("validates the handshake and rejects unsupported shapes", () => { + expect(parseHandshakeRequest({ + kind: "workbench.handshake", + protocolVersion: 1, + supportedVersions: [1], + clientInstanceId: "client-1", + }).clientInstanceId).toBe("client-1") + expect(() => parseHandshakeRequest({ kind: "workbench.handshake", supportedVersions: [] })).toThrow() + expect(parseHandshakeResponse({ kind: "workbench.handshake.refused", accepted: false, protocolVersion: null, supportedVersions: [1], instanceId: "server-1", reason: "unsupported-version" }).accepted).toBe(false) + }) + + it("creates persisted-retry-safe UUID v7 idempotency keys", () => { + const key = createIdempotencyKey(1_725_000_000_000) + expect(key).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/) + expect(parseAcceptedOperation({ status: 202, operationId: "op-1", approvalId: null, idempotencyKey: key }).operationId).toBe("op-1") + }) + + it("validates monotonic event identity and short-lived binary references", () => { + expect(parseWorkspaceEvent({ eventId: "event-1", workspaceId: "ws-1", sequenceId: 4, cursor: "opaque-4", type: "workspace.changed", payload: {} }).sequenceId).toBe(4) + expect(parseBinaryPayloadRef({ kind: "binary-ref", url: "https://127.0.0.1/file", expiresAt: Date.now() + 1000, sha256: "abc", byteLength: 10 }).byteLength).toBe(10) + expect(() => parseWorkspaceEvent({ eventId: "event-1", workspaceId: "ws-1", sequenceId: -1, cursor: "opaque", type: "workspace.changed", payload: {} })).toThrow() + }) + + it("keeps cursor, rotation, and rate limits explicit", () => { + expect(parsePageRequest({ workspaceId: "ws-1", cursor: "opaque", pageSize: 20 }).pageSize).toBe(20) + expect(parseTokenRotation({ state: "rotating", token: "next", previousToken: "current", gracePeriodMs: 1000, expiresAt: Date.now() + 1000 }).previousToken).toBe("current") + expect(WIRE_POLICY.maxSseConnectionsPerWorkspace).toBe(2) + expect(() => parsePageRequest({ workspaceId: "ws-1", pageSize: 101 })).toThrow() + }) +}) diff --git a/packages/mobile/scripts/prepare-android-runtime.sh b/packages/mobile/scripts/prepare-android-runtime.sh index 0ed34376fdd4..6fd6e48e34ee 100644 --- a/packages/mobile/scripts/prepare-android-runtime.sh +++ b/packages/mobile/scripts/prepare-android-runtime.sh @@ -27,7 +27,13 @@ echo "" # The tar.gz is bundled as an APK asset and extracted at first launch. echo "[0/5] Building pre-built Alpine rootfs (via WSL)..." ROOTFS_TAR="$RUNTIME_DIR/rootfs.tgz" -if command -v wsl.exe &>/dev/null; then +if [ "$(uname -s)" = "Linux" ]; then + # When this script already runs inside WSL, invoking wsl.exe would prefix an + # existing /mnt path a second time and make the rootfs build unreachable. + if ! bash "$SCRIPT_DIR/build-alpine-rootfs.sh"; then + echo " WARNING: native WSL/Linux rootfs build failed; continuing without the offline Alpine rootfs." + fi +elif command -v wsl.exe &>/dev/null; then # Running on Windows — delegate to WSL SCRIPT_WSL="$(wsl.exe wslpath -a "$SCRIPT_DIR/build-alpine-rootfs.sh" 2>/dev/null || echo "")" if [ -n "$SCRIPT_WSL" ]; then @@ -43,11 +49,6 @@ elif command -v wsl &>/dev/null; then if ! bash "$SCRIPT_DIR/build-alpine-rootfs.sh"; then echo " WARNING: WSL rootfs build failed; continuing without the offline Alpine rootfs." fi -elif [ "$(uname -s)" = "Linux" ]; then - # GitHub-hosted Linux runners have no WSL, but can build the rootfs natively. - if ! bash "$SCRIPT_DIR/build-alpine-rootfs.sh"; then - echo " WARNING: Native Linux rootfs build failed; continuing without the offline Alpine rootfs." - fi else echo " WARNING: WSL not available. Build rootfs manually and place at:" echo " $ROOTFS_TAR" @@ -146,7 +147,14 @@ UNIFIA_DIR="$(cd "$MOBILE_DIR/../unifia" && pwd)" REPO_ROOT="$(cd "$MOBILE_DIR/../.." && pwd)" if [ -f "$UNIFIA_DIR/src/mobile-entry.ts" ]; then - node "$REPO_ROOT/scripts/bundle-mobile.mjs" --outdir "$RUNTIME_DIR" + if command -v bun &>/dev/null; then + node "$REPO_ROOT/scripts/bundle-mobile.mjs" --outdir "$RUNTIME_DIR" + elif [ -s "$RUNTIME_DIR/unifia-cli.js" ]; then + echo " CLI: reusing existing bundle because Bun is unavailable in this WSL environment" + else + echo " ERROR: Bun is unavailable and no existing mobile CLI bundle exists" >&2 + exit 1 + fi # Create shim for @parcel/watcher (native module not available on Android). # bundle-mobile.mjs externalizes it; this provides the stub it resolves to. diff --git a/packages/mobile/src-tauri/assets/runtime/unifia-cli.js b/packages/mobile/src-tauri/assets/runtime/unifia-cli.js index 5a87dc255b06..4a373cbaae9d 100644 --- a/packages/mobile/src-tauri/assets/runtime/unifia-cli.js +++ b/packages/mobile/src-tauri/assets/runtime/unifia-cli.js @@ -1,6 +1,6 @@ // AUTO-GENERATED: Inlined SQL migrations for Android mobile -globalThis.UNIFIA_VERSION = "0.0.0-reviewfix-202608100051"; -globalThis.UNIFIA_CHANNEL = "devtest"; +globalThis.UNIFIA_VERSION = "local"; +globalThis.UNIFIA_CHANNEL = "local"; globalThis.UNIFIA_MIGRATIONS = [{"sql":"CREATE TABLE `project` (\n\t`id` text PRIMARY KEY,\n\t`worktree` text NOT NULL,\n\t`vcs` text,\n\t`name` text,\n\t`icon_url` text,\n\t`icon_color` text,\n\t`time_created` integer NOT NULL,\n\t`time_updated` integer NOT NULL,\n\t`time_initialized` integer,\n\t`sandboxes` text NOT NULL\n);\n--> statement-breakpoint\nCREATE TABLE `message` (\n\t`id` text PRIMARY KEY,\n\t`session_id` text NOT NULL,\n\t`time_created` integer NOT NULL,\n\t`time_updated` integer NOT NULL,\n\t`data` text NOT NULL,\n\tCONSTRAINT `fk_message_session_id_session_id_fk` FOREIGN KEY (`session_id`) REFERENCES `session`(`id`) ON DELETE CASCADE\n);\n--> statement-breakpoint\nCREATE TABLE `part` (\n\t`id` text PRIMARY KEY,\n\t`message_id` text NOT NULL,\n\t`session_id` text NOT NULL,\n\t`time_created` integer NOT NULL,\n\t`time_updated` integer NOT NULL,\n\t`data` text NOT NULL,\n\tCONSTRAINT `fk_part_message_id_message_id_fk` FOREIGN KEY (`message_id`) REFERENCES `message`(`id`) ON DELETE CASCADE\n);\n--> statement-breakpoint\nCREATE TABLE `permission` (\n\t`project_id` text PRIMARY KEY,\n\t`time_created` integer NOT NULL,\n\t`time_updated` integer NOT NULL,\n\t`data` text NOT NULL,\n\tCONSTRAINT `fk_permission_project_id_project_id_fk` FOREIGN KEY (`project_id`) REFERENCES `project`(`id`) ON DELETE CASCADE\n);\n--> statement-breakpoint\nCREATE TABLE `session` (\n\t`id` text PRIMARY KEY,\n\t`project_id` text NOT NULL,\n\t`parent_id` text,\n\t`slug` text NOT NULL,\n\t`directory` text NOT NULL,\n\t`title` text NOT NULL,\n\t`version` text NOT NULL,\n\t`share_url` text,\n\t`summary_additions` integer,\n\t`summary_deletions` integer,\n\t`summary_files` integer,\n\t`summary_diffs` text,\n\t`revert` text,\n\t`permission` text,\n\t`time_created` integer NOT NULL,\n\t`time_updated` integer NOT NULL,\n\t`time_compacting` integer,\n\t`time_archived` integer,\n\tCONSTRAINT `fk_session_project_id_project_id_fk` FOREIGN KEY (`project_id`) REFERENCES `project`(`id`) ON DELETE CASCADE\n);\n--> statement-breakpoint\nCREATE TABLE `todo` (\n\t`session_id` text NOT NULL,\n\t`content` text NOT NULL,\n\t`status` text NOT NULL,\n\t`priority` text NOT NULL,\n\t`position` integer NOT NULL,\n\t`time_created` integer NOT NULL,\n\t`time_updated` integer NOT NULL,\n\tCONSTRAINT `todo_pk` PRIMARY KEY(`session_id`, `position`),\n\tCONSTRAINT `fk_todo_session_id_session_id_fk` FOREIGN KEY (`session_id`) REFERENCES `session`(`id`) ON DELETE CASCADE\n);\n--> statement-breakpoint\nCREATE TABLE `session_share` (\n\t`session_id` text PRIMARY KEY,\n\t`id` text NOT NULL,\n\t`secret` text NOT NULL,\n\t`url` text NOT NULL,\n\t`time_created` integer NOT NULL,\n\t`time_updated` integer NOT NULL,\n\tCONSTRAINT `fk_session_share_session_id_session_id_fk` FOREIGN KEY (`session_id`) REFERENCES `session`(`id`) ON DELETE CASCADE\n);\n--> statement-breakpoint\nCREATE INDEX `message_session_idx` ON `message` (`session_id`);--> statement-breakpoint\nCREATE INDEX `part_message_idx` ON `part` (`message_id`);--> statement-breakpoint\nCREATE INDEX `part_session_idx` ON `part` (`session_id`);--> statement-breakpoint\nCREATE INDEX `session_project_idx` ON `session` (`project_id`);--> statement-breakpoint\nCREATE INDEX `session_parent_idx` ON `session` (`parent_id`);--> statement-breakpoint\nCREATE INDEX `todo_session_idx` ON `todo` (`session_id`);","timestamp":1769552633000,"name":"20260127222353_familiar_lady_ursula"},{"sql":"ALTER TABLE `project` ADD `commands` text;","timestamp":1770830228000,"name":"20260211171708_add_project_commands"},{"sql":"CREATE TABLE `control_account` (\n\t`email` text NOT NULL,\n\t`url` text NOT NULL,\n\t`access_token` text NOT NULL,\n\t`refresh_token` text NOT NULL,\n\t`token_expiry` integer,\n\t`active` integer NOT NULL,\n\t`time_created` integer NOT NULL,\n\t`time_updated` integer NOT NULL,\n\tCONSTRAINT `control_account_pk` PRIMARY KEY(`email`, `url`)\n);\n","timestamp":1770993676000,"name":"20260213144116_wakeful_the_professor"},{"sql":"CREATE TABLE `workspace` (\n\t`id` text PRIMARY KEY,\n\t`branch` text,\n\t`project_id` text NOT NULL,\n\t`config` text NOT NULL,\n\tCONSTRAINT `fk_workspace_project_id_project_id_fk` FOREIGN KEY (`project_id`) REFERENCES `project`(`id`) ON DELETE CASCADE\n);\n","timestamp":1772056728000,"name":"20260225215848_workspace"},{"sql":"ALTER TABLE `session` ADD `workspace_id` text;--> statement-breakpoint\nCREATE INDEX `session_workspace_idx` ON `session` (`workspace_id`);","timestamp":1772228279000,"name":"20260227213759_add_session_workspace_id"},{"sql":"CREATE TABLE `account` (\n\t`id` text PRIMARY KEY,\n\t`email` text NOT NULL,\n\t`url` text NOT NULL,\n\t`access_token` text NOT NULL,\n\t`refresh_token` text NOT NULL,\n\t`token_expiry` integer,\n\t`selected_org_id` text,\n\t`time_created` integer NOT NULL,\n\t`time_updated` integer NOT NULL\n);\n--> statement-breakpoint\nCREATE TABLE `account_state` (\n\t`id` integer PRIMARY KEY NOT NULL,\n\t`active_account_id` text,\n\tFOREIGN KEY (`active_account_id`) REFERENCES `account`(`id`) ON UPDATE no action ON DELETE set null\n);\n","timestamp":1772310750000,"name":"20260228203230_blue_harpoon"},{"sql":"ALTER TABLE `workspace` ADD `type` text NOT NULL;--> statement-breakpoint\nALTER TABLE `workspace` ADD `name` text;--> statement-breakpoint\nALTER TABLE `workspace` ADD `directory` text;--> statement-breakpoint\nALTER TABLE `workspace` ADD `extra` text;--> statement-breakpoint\nALTER TABLE `workspace` DROP COLUMN `config`;","timestamp":1772579546000,"name":"20260303231226_add_workspace_fields"},{"sql":"ALTER TABLE `account_state` ADD `active_org_id` text;--> statement-breakpoint\nUPDATE `account_state` SET `active_org_id` = (SELECT `selected_org_id` FROM `account` WHERE `account`.`id` = `account_state`.`active_account_id`);--> statement-breakpoint\nALTER TABLE `account` DROP COLUMN `selected_org_id`;\n","timestamp":1773097200000,"name":"20260309230000_move_org_to_state"},{"sql":"DROP INDEX IF EXISTS `message_session_idx`;--> statement-breakpoint\nDROP INDEX IF EXISTS `part_message_idx`;--> statement-breakpoint\nCREATE INDEX `message_session_time_created_id_idx` ON `message` (`session_id`,`time_created`,`id`);--> statement-breakpoint\nCREATE INDEX `part_message_id_id_idx` ON `part` (`message_id`,`id`);","timestamp":1773290071000,"name":"20260312043431_session_message_cursor"},{"sql":"CREATE TABLE `event_sequence` (\n\t`aggregate_id` text PRIMARY KEY,\n\t`seq` integer NOT NULL\n);\n--> statement-breakpoint\nCREATE TABLE `event` (\n\t`id` text PRIMARY KEY,\n\t`aggregate_id` text NOT NULL,\n\t`seq` integer NOT NULL,\n\t`type` text NOT NULL,\n\t`data` text NOT NULL,\n\tCONSTRAINT `fk_event_aggregate_id_event_sequence_aggregate_id_fk` FOREIGN KEY (`aggregate_id`) REFERENCES `event_sequence`(`aggregate_id`) ON DELETE CASCADE\n);\n","timestamp":1774309702000,"name":"20260323234822_events"},{"sql":"ALTER TABLE `session` ADD `status` text DEFAULT 'idle';","timestamp":1775304000000,"name":"20260404120000_session_task_status"},{"sql":"CREATE TABLE IF NOT EXISTS `embedding` (\n `id` text PRIMARY KEY NOT NULL,\n `project_id` text NOT NULL REFERENCES `project`(`id`) ON DELETE CASCADE,\n `source_type` text NOT NULL,\n `source_id` text NOT NULL,\n `content` text NOT NULL,\n `vector` blob NOT NULL,\n `model` text NOT NULL,\n `dimensions` integer NOT NULL,\n `metadata` text,\n `content_hash` text NOT NULL,\n `time_created` integer DEFAULT (unixepoch() * 1000),\n `time_updated` integer DEFAULT (unixepoch() * 1000)\n);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `embedding_project_idx` ON `embedding` (`project_id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `embedding_source_idx` ON `embedding` (`source_type`, `source_id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `embedding_hash_idx` ON `embedding` (`content_hash`);\n","timestamp":1775390400000,"name":"20260405120000_rag_embeddings"},{"sql":"CREATE TABLE IF NOT EXISTS \"collab_user\" (\n \"id\" text PRIMARY KEY NOT NULL,\n \"username\" text NOT NULL,\n \"email\" text,\n \"display_name\" text,\n \"password_hash\" text NOT NULL,\n \"role\" text NOT NULL DEFAULT 'member',\n \"time_created\" integer NOT NULL DEFAULT (unixepoch() * 1000),\n \"time_updated\" integer NOT NULL DEFAULT (unixepoch() * 1000)\n);\n--> statement-breakpoint\nCREATE UNIQUE INDEX IF NOT EXISTS \"collab_user_username_idx\" ON \"collab_user\" (\"username\");\n--> statement-breakpoint\nCREATE TABLE IF NOT EXISTS \"collab_user_token\" (\n \"id\" text PRIMARY KEY NOT NULL,\n \"user_id\" text NOT NULL REFERENCES \"collab_user\"(\"id\") ON DELETE CASCADE,\n \"token_hash\" text NOT NULL,\n \"expires_at\" integer NOT NULL,\n \"time_created\" integer NOT NULL DEFAULT (unixepoch() * 1000)\n);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS \"collab_user_token_user_idx\" ON \"collab_user_token\" (\"user_id\");\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS \"collab_user_token_hash_idx\" ON \"collab_user_token\" (\"token_hash\");\n","timestamp":1775476800000,"name":"20260406120000_collaborative_users"},{"sql":"ALTER TABLE \"session\" ADD COLUMN \"user_id\" text;\n","timestamp":1775476801000,"name":"20260406120001_session_user_id"},{"sql":"CREATE INDEX IF NOT EXISTS \"session_user_idx\" ON \"session\" (\"user_id\");\n","timestamp":1775476802000,"name":"20260406120002_session_user_idx"},{"sql":"CREATE TABLE IF NOT EXISTS `bm25_doc` (\n `id` text PRIMARY KEY NOT NULL,\n `project_id` text NOT NULL REFERENCES `project`(`id`) ON DELETE CASCADE,\n `source_type` text NOT NULL,\n `source_id` text NOT NULL,\n `content` text NOT NULL,\n `content_hash` text NOT NULL,\n `tokens` text NOT NULL,\n `doc_length` integer NOT NULL,\n `time_created` integer DEFAULT (unixepoch() * 1000),\n `time_updated` integer DEFAULT (unixepoch() * 1000)\n);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `bm25_doc_project_idx` ON `bm25_doc` (`project_id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `bm25_doc_source_idx` ON `bm25_doc` (`source_type`, `source_id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `bm25_doc_hash_idx` ON `bm25_doc` (`content_hash`);\n","timestamp":1776081600000,"name":"20260413120000_bm25_docs"},{"sql":"CREATE TABLE IF NOT EXISTS `audit_log` (\n `id` text PRIMARY KEY NOT NULL,\n `ts` integer NOT NULL,\n `actor` text,\n `action` text NOT NULL,\n `target` text,\n `metadata` text,\n `time_created` integer NOT NULL,\n `time_updated` integer NOT NULL\n);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `audit_log_ts_idx` ON `audit_log` (`ts`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `audit_log_action_idx` ON `audit_log` (`action`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `audit_log_actor_idx` ON `audit_log` (`actor`);\n","timestamp":1776513600000,"name":"20260418120000_audit_log"},{"sql":"CREATE TABLE IF NOT EXISTS `debate` (\n `id` text PRIMARY KEY NOT NULL,\n `status` text NOT NULL DEFAULT 'pending',\n `prompt` text NOT NULL,\n `prompt_hash` text NOT NULL,\n `workspace_hash` text NOT NULL,\n `tier` text NOT NULL,\n `config` text NOT NULL,\n `report` text,\n `cost` real,\n `duration_ms` integer,\n `provider_count` integer NOT NULL,\n `blind_spot_count` integer,\n `error` text,\n `time_created` integer NOT NULL,\n `time_updated` integer NOT NULL\n);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `debate_status_idx` ON `debate` (`status`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `debate_time_created_idx` ON `debate` (`time_created`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `debate_prompt_hash_idx` ON `debate` (`prompt_hash`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `debate_workspace_hash_idx` ON `debate` (`workspace_hash`);\n--> statement-breakpoint\nCREATE TABLE IF NOT EXISTS `debate_claim` (\n `id` text PRIMARY KEY NOT NULL,\n `debate_id` text NOT NULL REFERENCES `debate`(`id`) ON DELETE CASCADE,\n `source_id` text NOT NULL,\n `source_provider` text NOT NULL,\n `category` text NOT NULL,\n `content` text NOT NULL,\n `confidence` real,\n `novelty` text,\n `is_actionable` integer,\n `verification_hint` text,\n `is_existence_claim` integer,\n `jargon_risk` real,\n `is_recovered` integer,\n `time_created` integer NOT NULL,\n `time_updated` integer NOT NULL\n);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `claim_debate_idx` ON `debate_claim` (`debate_id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `claim_category_idx` ON `debate_claim` (`category`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `claim_novelty_idx` ON `debate_claim` (`novelty`);\n--> statement-breakpoint\nCREATE TABLE IF NOT EXISTS `debate_claim_feedback` (\n `id` text PRIMARY KEY NOT NULL,\n `debate_id` text NOT NULL REFERENCES `debate`(`id`) ON DELETE CASCADE,\n `claim_id` text NOT NULL,\n `action` text NOT NULL,\n `time_created` integer NOT NULL,\n `time_updated` integer NOT NULL\n);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `feedback_debate_idx` ON `debate_claim_feedback` (`debate_id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `feedback_claim_idx` ON `debate_claim_feedback` (`claim_id`);\n","timestamp":1782129600000,"name":"20260622120000_debate"},{"sql":"CREATE TABLE IF NOT EXISTS `observability_event` (\n `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n `event_id` text NOT NULL,\n `trace_id` text NOT NULL,\n `span_id` text NOT NULL,\n `parent_span_id` text,\n `session_id` text,\n `project_id` text,\n `workspace_id` text,\n `message_id` text,\n `turn_id` text,\n `step_index` integer,\n `event_type` text NOT NULL,\n `status` text NOT NULL,\n `ts_ms` integer NOT NULL,\n `duration_ms` integer,\n `enqueue_seq` integer NOT NULL,\n `model_provider` text,\n `model_id` text,\n `input_tokens` integer,\n `output_tokens` integer,\n `cache_read_tokens` integer,\n `cache_write_tokens` integer,\n `cost_nano_usd` integer,\n `pricing_version` text,\n `pricing_source` text,\n `cost_computed_at_ms` integer,\n `redaction_status` text NOT NULL,\n `original_size_bytes` integer,\n `payload_truncated` integer DEFAULT false NOT NULL,\n `metadata_json` text NOT NULL,\n `local_redacted_json` text NOT NULL,\n `schema_version` integer DEFAULT 1 NOT NULL\n);\n--> statement-breakpoint\nCREATE UNIQUE INDEX IF NOT EXISTS `observability_event_event_id_idx` ON `observability_event` (`event_id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `observability_event_ts_id_idx` ON `observability_event` (`ts_ms`,`id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `observability_event_session_ts_id_idx` ON `observability_event` (`session_id`,`ts_ms`,`id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `observability_event_project_ts_id_idx` ON `observability_event` (`project_id`,`ts_ms`,`id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `observability_event_workspace_ts_id_idx` ON `observability_event` (`workspace_id`,`ts_ms`,`id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `observability_event_trace_ts_id_idx` ON `observability_event` (`trace_id`,`ts_ms`,`id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `observability_event_span_idx` ON `observability_event` (`span_id`);\n","timestamp":1783699200000,"name":"20260710160000_observability_event"},{"sql":"ALTER TABLE `observability_event` ADD COLUMN `local_content_redacted_json` text;\n--> statement-breakpoint\nALTER TABLE `observability_event` ADD COLUMN `local_full_json` text;\n--> statement-breakpoint\nALTER TABLE `observability_event` ADD COLUMN `content_expires_at_ms` integer;\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `observability_event_content_expires_idx` ON `observability_event` (`content_expires_at_ms`);\n--> statement-breakpoint\nCREATE TABLE IF NOT EXISTS `observability_content_optin` (\n `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n `scope` text NOT NULL,\n `scope_id` text NOT NULL,\n `level` text NOT NULL,\n `ttl_days` integer NOT NULL,\n `created_at_ms` integer NOT NULL,\n `expires_at_ms` integer NOT NULL\n);\n--> statement-breakpoint\nCREATE UNIQUE INDEX IF NOT EXISTS `observability_content_optin_scope_idx` ON `observability_content_optin` (`scope`,`scope_id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `observability_content_optin_expires_idx` ON `observability_content_optin` (`expires_at_ms`);\n","timestamp":1783857600000,"name":"20260712120000_observability_content"},{"sql":"-- Model Intelligence Registry schema (C01)\n--\n-- Tables : registry_meta, sources, providers, models, model_aliases,\n-- pricing_tiers, model_health, model_source_refs, notices, audit.\n--\n-- Compatible SQLite (pour usage WAL local) et PostgreSQL (pour usage\n-- production futur) — syntaxe portable.\n--\n-- Pas de secrets, pas de credentials : tout est open data license.\n\nCREATE TABLE IF NOT EXISTS registry_meta (\n schema_version TEXT PRIMARY KEY,\n generated_at_utc TEXT NOT NULL,\n registry_id TEXT NOT NULL,\n generator_version TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS sources (\n id TEXT PRIMARY KEY,\n url TEXT NOT NULL,\n type TEXT NOT NULL CHECK (type IN ('catalog', 'pricing', 'benchmarks', 'metadata')),\n license_code TEXT,\n license_file_url TEXT,\n copyright_notice TEXT,\n parser_version TEXT NOT NULL,\n confidence_level TEXT NOT NULL CHECK (confidence_level IN ('official', 'community', 'unverified')),\n rollback_policy TEXT NOT NULL CHECK (rollback_policy IN ('disable', 'fallback_to_cache', 'manual_review')),\n policy_doc_ref TEXT,\n deprecated INTEGER NOT NULL DEFAULT 0,\n deprecation_reason TEXT\n);\n\nCREATE TABLE IF NOT EXISTS providers (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n sdk TEXT,\n api_base_url TEXT,\n env_vars_json TEXT NOT NULL DEFAULT '[]',\n capabilities_json TEXT NOT NULL,\n modalities_json TEXT NOT NULL,\n status TEXT NOT NULL CHECK (status IN ('active', 'deprecated', 'experimental')),\n deprecation_reason TEXT,\n added_at_utc TEXT NOT NULL,\n removed_at_utc TEXT,\n docs_url TEXT,\n privacy_policy_ref TEXT,\n region_policy_json TEXT NOT NULL,\n aliases_json TEXT NOT NULL DEFAULT '[]'\n);\n\nCREATE TABLE IF NOT EXISTS models (\n id TEXT NOT NULL,\n provider_id TEXT NOT NULL REFERENCES providers(id),\n canonical_name TEXT NOT NULL,\n family TEXT,\n aliases_json TEXT NOT NULL DEFAULT '[]',\n capabilities_json TEXT NOT NULL,\n modalities_json TEXT NOT NULL,\n context_window_json TEXT NOT NULL,\n reasoning_json TEXT NOT NULL,\n tool_use_json TEXT NOT NULL,\n temperature_json TEXT NOT NULL,\n status TEXT NOT NULL CHECK (status IN ('alpha', 'beta', 'active', 'deprecated', 'quarantined')),\n deprecation_reason TEXT,\n lifecycle_stage TEXT NOT NULL CHECK (lifecycle_stage IN ('discovered', 'metadata_validated', 'probed', 'low_risk_eligible', 'general_eligible', 'trusted_by_domain', 'deprecated', 'quarantined')),\n release_date_utc TEXT,\n retirement_date_utc TEXT,\n pricing_json TEXT NOT NULL,\n health_json TEXT NOT NULL,\n provenance_json TEXT NOT NULL,\n last_seen_at_utc TEXT NOT NULL,\n PRIMARY KEY (provider_id, id)\n);\n\nCREATE INDEX IF NOT EXISTS idx_models_status ON models(status);\nCREATE INDEX IF NOT EXISTS idx_models_lifecycle ON models(lifecycle_stage);\nCREATE INDEX IF NOT EXISTS idx_models_provider ON models(provider_id);\n\nCREATE TABLE IF NOT EXISTS model_aliases (\n alias TEXT PRIMARY KEY,\n canonical_provider TEXT NOT NULL,\n canonical_model TEXT NOT NULL,\n deprecated INTEGER NOT NULL DEFAULT 0,\n replaced_by_provider TEXT,\n replaced_by_model TEXT\n);\n\nCREATE TABLE IF NOT EXISTS pricing_tiers (\n model_provider TEXT NOT NULL,\n model_id TEXT NOT NULL,\n threshold_tokens INTEGER NOT NULL,\n input_price REAL NOT NULL,\n output_price REAL NOT NULL,\n FOREIGN KEY (model_provider, model_id) REFERENCES models(provider_id, id),\n PRIMARY KEY (model_provider, model_id, threshold_tokens)\n);\n\nCREATE TABLE IF NOT EXISTS model_health (\n model_provider TEXT NOT NULL,\n model_id TEXT NOT NULL,\n last_check_utc TEXT NOT NULL,\n availability_score REAL NOT NULL,\n latency_p50_ms REAL,\n latency_p95_ms REAL,\n error_rate_1h REAL NOT NULL,\n rate_limit_json TEXT,\n notes TEXT,\n FOREIGN KEY (model_provider, model_id) REFERENCES models(provider_id, id),\n PRIMARY KEY (model_provider, model_id)\n);\n\nCREATE TABLE IF NOT EXISTS model_source_refs (\n model_provider TEXT NOT NULL,\n model_id TEXT NOT NULL,\n source_id TEXT NOT NULL REFERENCES sources(id),\n observed_at_utc TEXT NOT NULL,\n source_version TEXT NOT NULL,\n field_hashes_json TEXT NOT NULL,\n FOREIGN KEY (model_provider, model_id) REFERENCES models(provider_id, id),\n PRIMARY KEY (model_provider, model_id, source_id)\n);\n\nCREATE TABLE IF NOT EXISTS notices (\n source_id TEXT PRIMARY KEY REFERENCES sources(id),\n license_code TEXT,\n copyright_notice TEXT,\n license_file_url TEXT,\n confidence_level TEXT NOT NULL,\n url TEXT\n);\n\nCREATE TABLE IF NOT EXISTS audit (\n timestamp_utc TEXT NOT NULL,\n action TEXT NOT NULL,\n before_hash TEXT,\n after_hash TEXT,\n details_json TEXT\n);\n\nCREATE INDEX IF NOT EXISTS idx_audit_timestamp ON audit(timestamp_utc);\nCREATE INDEX IF NOT EXISTS idx_audit_action ON audit(action);\n\nCREATE TABLE IF NOT EXISTS snapshots (\n schema_version TEXT PRIMARY KEY,\n generated_at_utc TEXT NOT NULL,\n registry_id TEXT NOT NULL,\n snapshot_json TEXT NOT NULL,\n snapshot_hash TEXT NOT NULL,\n generator_version TEXT NOT NULL\n);","timestamp":1784635200000,"name":"20260721120000_model_intelligence"},{"sql":"-- D02 Team durable state. JSON is state metadata only; artifact bytes stay on disk.\nPRAGMA journal_mode = WAL;\nPRAGMA synchronous = NORMAL;\nPRAGMA foreign_keys = ON;\nPRAGMA busy_timeout = 5000;\n\nCREATE TABLE IF NOT EXISTS team_store_meta (\n schema_version TEXT PRIMARY KEY,\n migration_id TEXT NOT NULL UNIQUE,\n applied_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS team_runs (\n run_id TEXT PRIMARY KEY,\n schema_version TEXT NOT NULL,\n plan_id TEXT NOT NULL,\n status TEXT NOT NULL CHECK (status IN ('pending', 'running', 'completed', 'failed', 'aborted')),\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS team_tasks (\n task_id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL REFERENCES team_runs(run_id) ON DELETE CASCADE,\n status TEXT NOT NULL CHECK (status IN ('pending', 'assigned', 'running', 'completed', 'blocked', 'cancelled')),\n depends_on_json TEXT NOT NULL DEFAULT '[]' CHECK (length(depends_on_json) <= 65536),\n scope_json TEXT NOT NULL CHECK (length(scope_json) <= 65536),\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS team_attempts (\n attempt_id TEXT PRIMARY KEY,\n task_id TEXT NOT NULL REFERENCES team_tasks(task_id) ON DELETE CASCADE,\n worker_id TEXT NOT NULL,\n outcome TEXT NOT NULL CHECK (outcome IN ('success', 'failure', 'aborted', 'in_progress')),\n commit_sha TEXT,\n report_json TEXT CHECK (report_json IS NULL OR length(report_json) <= 65536),\n started_at TEXT NOT NULL,\n finished_at TEXT\n);\n\nCREATE TABLE IF NOT EXISTS team_locks (\n lease_id TEXT PRIMARY KEY,\n run_id TEXT REFERENCES team_runs(run_id) ON DELETE SET NULL,\n task_id TEXT REFERENCES team_tasks(task_id) ON DELETE SET NULL,\n worker_id TEXT NOT NULL,\n fencing_token INTEGER NOT NULL UNIQUE,\n branch TEXT NOT NULL,\n worktree TEXT NOT NULL,\n status TEXT NOT NULL CHECK (status IN ('CLAIMED', 'RELEASED', 'EXPIRED')),\n acquired_at TEXT NOT NULL,\n expires_at TEXT NOT NULL,\n released_at TEXT,\n release_reason TEXT\n);\n\nCREATE TABLE IF NOT EXISTS team_gates (\n gate_id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL REFERENCES team_runs(run_id) ON DELETE CASCADE,\n task_id TEXT REFERENCES team_tasks(task_id) ON DELETE SET NULL,\n verdict TEXT NOT NULL CHECK (verdict IN ('APPROVED', 'APPROVED_WITH_FOLLOWUP', 'CHANGES_REQUESTED')),\n findings_json TEXT NOT NULL CHECK (length(findings_json) <= 65536),\n decided_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS team_events (\n event_id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL REFERENCES team_runs(run_id) ON DELETE CASCADE,\n sequence INTEGER NOT NULL,\n kind TEXT NOT NULL,\n payload_json TEXT NOT NULL CHECK (length(payload_json) <= 16384),\n occurred_at TEXT NOT NULL,\n UNIQUE (run_id, sequence)\n);\n\nCREATE TABLE IF NOT EXISTS team_artifacts (\n artifact_id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL REFERENCES team_runs(run_id) ON DELETE CASCADE,\n task_id TEXT REFERENCES team_tasks(task_id) ON DELETE SET NULL,\n relative_path TEXT NOT NULL,\n sha256 TEXT NOT NULL CHECK (length(sha256) = 64),\n byte_length INTEGER NOT NULL CHECK (byte_length >= 0),\n metadata_json TEXT CHECK (metadata_json IS NULL OR length(metadata_json) <= 65536),\n recorded_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS team_checkpoints (\n checkpoint_id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL REFERENCES team_runs(run_id) ON DELETE CASCADE,\n sequence INTEGER NOT NULL,\n state_json TEXT NOT NULL CHECK (length(state_json) <= 65536),\n created_at TEXT NOT NULL,\n UNIQUE (run_id, sequence)\n);\n\nCREATE TABLE IF NOT EXISTS team_audit (\n audit_id TEXT PRIMARY KEY,\n run_id TEXT,\n action TEXT NOT NULL,\n target_id TEXT NOT NULL,\n details_json TEXT NOT NULL CHECK (length(details_json) <= 16384),\n recorded_at TEXT NOT NULL\n);\n\nCREATE UNIQUE INDEX IF NOT EXISTS team_locks_claimed_branch_idx ON team_locks(branch) WHERE status = 'CLAIMED';\nCREATE UNIQUE INDEX IF NOT EXISTS team_locks_claimed_worktree_idx ON team_locks(worktree) WHERE status = 'CLAIMED';\nCREATE INDEX IF NOT EXISTS team_tasks_run_status_idx ON team_tasks(run_id, status);\nCREATE INDEX IF NOT EXISTS team_attempts_task_idx ON team_attempts(task_id, started_at);\nCREATE INDEX IF NOT EXISTS team_events_run_time_idx ON team_events(run_id, occurred_at);\nCREATE INDEX IF NOT EXISTS team_checkpoints_run_time_idx ON team_checkpoints(run_id, created_at);\nCREATE INDEX IF NOT EXISTS team_audit_run_time_idx ON team_audit(run_id, recorded_at);\n\nINSERT OR IGNORE INTO team_store_meta(schema_version, migration_id, applied_at)\nVALUES ('1.0.0', '20260726193000_team_store', strftime('%Y-%m-%dT%H:%M:%fZ', 'now'));\n","timestamp":1785094200000,"name":"20260726193000_team_store"}]; // @bun var __create = Object.create; @@ -72,28 +72,6 @@ var require_get_caller_file = __commonJS((exports, module2) => { }; }); -// node_modules/xdg-basedir/index.js -import os from "os"; -import path from "path"; -var homeDirectory, env2, xdgData, xdgConfig, xdgState, xdgCache, xdgRuntime, xdgDataDirectories, xdgConfigDirectories; -var init_xdg_basedir = __esm(() => { - homeDirectory = os.homedir(); - ({ env: env2 } = process); - xdgData = env2.XDG_DATA_HOME || (homeDirectory ? path.join(homeDirectory, ".local", "share") : undefined); - xdgConfig = env2.XDG_CONFIG_HOME || (homeDirectory ? path.join(homeDirectory, ".config") : undefined); - xdgState = env2.XDG_STATE_HOME || (homeDirectory ? path.join(homeDirectory, ".local", "state") : undefined); - xdgCache = env2.XDG_CACHE_HOME || (homeDirectory ? path.join(homeDirectory, ".cache") : undefined); - xdgRuntime = env2.XDG_RUNTIME_DIR || undefined; - xdgDataDirectories = (env2.XDG_DATA_DIRS || "/usr/local/share/:/usr/share/").split(":"); - if (xdgData) { - xdgDataDirectories.unshift(xdgData); - } - xdgConfigDirectories = (env2.XDG_CONFIG_DIRS || "/etc/xdg").split(":"); - if (xdgConfig) { - xdgConfigDirectories.unshift(xdgConfig); - } -}); - // node_modules/mime-db/db.json var require_db = __commonJS((exports, module2) => { module2.exports = { @@ -9488,11 +9466,11 @@ function extension(type) { } return exts[0]; } -function lookup(path2) { - if (!path2 || typeof path2 !== "string") { +function lookup(path) { + if (!path || typeof path !== "string") { return false; } - var extension2 = extname2("x." + path2).toLowerCase().slice(1); + var extension2 = extname2("x." + path).toLowerCase().slice(1); if (!extension2) { return false; } @@ -9566,7 +9544,7 @@ function ps(n) { return n.replace(as, fe).replace(ls, ue).replace(cs, qt).replace(fs2, de).replace(us, pe); } function ms(n) { - return n.replace(is, "\\").replace(rs, "{").replace(ns, "}").replace(os2, ",").replace(hs, "."); + return n.replace(is, "\\").replace(rs, "{").replace(ns, "}").replace(os, ",").replace(hs, "."); } function me(n) { if (!n) @@ -9690,7 +9668,7 @@ var Gt = (n, t, e) => { s.length && o !== undefined && (h = [r, o]); } return h; -}, fe, ue, qt, de, pe, is, rs, ns, os2, hs, as, ls, cs, fs2, us, ds = 1e5, at = (n) => { +}, fe, ue, qt, de, pe, is, rs, ns, os, hs, as, ls, cs, fs2, us, ds = 1e5, at = (n) => { if (typeof n != "string") throw new TypeError("invalid pattern"); if (n.length > 65536) @@ -10766,7 +10744,7 @@ var init_index_min = __esm(() => { is = new RegExp(fe, "g"); rs = new RegExp(ue, "g"); ns = new RegExp(qt, "g"); - os2 = new RegExp(de, "g"); + os = new RegExp(de, "g"); hs = new RegExp(pe, "g"); as = /\\\\/g; ls = /\\{/g; @@ -14378,7 +14356,7 @@ var minimatch = (p, pattern, options2 = {}) => { }, qmarksTestNoExtDot = ([$0]) => { const len = $0.length; return (f) => f.length === len && f !== "." && f !== ".."; -}, defaultPlatform, path2, sep, GLOBSTAR, qmark2 = "[^/]", star2, twoStarDot = "(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?", twoStarNoDot = "(?:(?!(?:\\/|^)\\.).)*?", filter = (pattern, options2 = {}) => (p) => minimatch(p, pattern, options2), ext = (a, b = {}) => Object.assign({}, a, b), defaults = (def) => { +}, defaultPlatform, path, sep, GLOBSTAR, qmark2 = "[^/]", star2, twoStarDot = "(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?", twoStarNoDot = "(?:(?!(?:\\/|^)\\.).)*?", filter = (pattern, options2 = {}) => (p) => minimatch(p, pattern, options2), ext = (a, b = {}) => Object.assign({}, a, b), defaults = (def) => { if (!def || typeof def !== "object" || !Object.keys(def).length) { return minimatch; } @@ -14436,11 +14414,11 @@ var init_esm2 = __esm(() => { starRE = /^\*+$/; qmarksRE = /^\?+([^+@!?*[(]*)?$/; defaultPlatform = typeof process === "object" && process ? typeof process.env === "object" && process.env && process.env.__MINIMATCH_TESTING_PLATFORM__ || process.platform : "posix"; - path2 = { + path = { win32: { sep: "\\" }, posix: { sep: "/" } }; - sep = defaultPlatform === "win32" ? path2.win32.sep : path2.posix.sep; + sep = defaultPlatform === "win32" ? path.win32.sep : path.posix.sep; minimatch.sep = sep; GLOBSTAR = Symbol("globstar **"); minimatch.GLOBSTAR = GLOBSTAR; @@ -14711,18 +14689,36 @@ var init_filesystem = __esm(() => { })(Filesystem ||= {}); }); -// packages/unifia/src/global/index.ts -import fs3 from "fs/promises"; -import path3 from "path"; +// node_modules/xdg-basedir/index.js +import os2 from "os"; +import path2 from "path"; +var homeDirectory, env2, xdgData, xdgConfig, xdgState, xdgCache, xdgRuntime, xdgDataDirectories, xdgConfigDirectories; +var init_xdg_basedir = __esm(() => { + homeDirectory = os2.homedir(); + ({ env: env2 } = process); + xdgData = env2.XDG_DATA_HOME || (homeDirectory ? path2.join(homeDirectory, ".local", "share") : undefined); + xdgConfig = env2.XDG_CONFIG_HOME || (homeDirectory ? path2.join(homeDirectory, ".config") : undefined); + xdgState = env2.XDG_STATE_HOME || (homeDirectory ? path2.join(homeDirectory, ".local", "state") : undefined); + xdgCache = env2.XDG_CACHE_HOME || (homeDirectory ? path2.join(homeDirectory, ".cache") : undefined); + xdgRuntime = env2.XDG_RUNTIME_DIR || undefined; + xdgDataDirectories = (env2.XDG_DATA_DIRS || "/usr/local/share/:/usr/share/").split(":"); + if (xdgData) { + xdgDataDirectories.unshift(xdgData); + } + xdgConfigDirectories = (env2.XDG_CONFIG_DIRS || "/etc/xdg").split(":"); + if (xdgConfig) { + xdgConfigDirectories.unshift(xdgConfig); + } +}); + +// packages/unifia/src/global/path.ts import os3 from "os"; -var app = "unifia", data, cache, config, state, Global, CACHE_VERSION = "21", version; -var init_global = __esm(async () => { +import path3 from "path"; +var app = "unifia", data, cache, Global; +var init_path = __esm(() => { init_xdg_basedir(); - init_filesystem(); data = path3.join(xdgData, app); cache = path3.join(xdgCache, app); - config = path3.join(xdgConfig, app); - state = path3.join(xdgState, app); ((Global) => { Global.Path = { get home() { @@ -14732,10 +14728,20 @@ var init_global = __esm(async () => { bin: path3.join(cache, "bin"), log: path3.join(data, "log"), cache, - config, - state + config: path3.join(xdgConfig, app), + state: path3.join(xdgState, app) }; })(Global ||= {}); +}); + +// packages/unifia/src/global/index.ts +import fs3 from "fs/promises"; +import path4 from "path"; +var CACHE_VERSION = "21", version; +var init_global = __esm(async () => { + init_filesystem(); + init_path(); + init_path(); await Promise.all([ fs3.mkdir(Global.Path.data, { recursive: true }), fs3.mkdir(Global.Path.config, { recursive: true }), @@ -14743,16 +14749,16 @@ var init_global = __esm(async () => { fs3.mkdir(Global.Path.log, { recursive: true }), fs3.mkdir(Global.Path.bin, { recursive: true }) ]); - version = await Filesystem.readText(path3.join(Global.Path.cache, "version")).catch(() => "0"); + version = await Filesystem.readText(path4.join(Global.Path.cache, "version")).catch(() => "0"); if (version !== CACHE_VERSION) { try { const contents = await fs3.readdir(Global.Path.cache); - await Promise.all(contents.map((item) => fs3.rm(path3.join(Global.Path.cache, item), { + await Promise.all(contents.map((item) => fs3.rm(path4.join(Global.Path.cache, item), { recursive: true, force: true }))); } catch (_e2) {} - await Filesystem.write(path3.join(Global.Path.cache, "version"), CACHE_VERSION); + await Filesystem.write(path4.join(Global.Path.cache, "version"), CACHE_VERSION); } }); @@ -14800,7 +14806,7 @@ function $constructor(name2, initializer, params) { Object.defineProperty(_2, "name", { value: name2 }); return _2; } -function config2(newConfig) { +function config(newConfig) { if (newConfig) Object.assign(globalConfig, newConfig); return globalConfig; @@ -14992,10 +14998,10 @@ function mergeDefs(...defs) { function cloneDef(schema) { return mergeDefs(schema._zod.def); } -function getElementAtPath(obj, path4) { - if (!path4) +function getElementAtPath(obj, path5) { + if (!path5) return obj; - return path4.reduce((acc, key) => acc?.[key], obj); + return path5.reduce((acc, key) => acc?.[key], obj); } function promiseAllObject(promisesObj) { const keys = Object.keys(promisesObj); @@ -15284,21 +15290,21 @@ function aborted(x2, startIndex = 0) { } return false; } -function prefixIssues(path4, issues) { +function prefixIssues(path5, issues) { return issues.map((iss) => { var _a3; (_a3 = iss).path ?? (_a3.path = []); - iss.path.unshift(path4); + iss.path.unshift(path5); return iss; }); } function unwrapMessage(message) { return typeof message === "string" ? message : message?.message; } -function finalizeIssue(iss, ctx, config3) { +function finalizeIssue(iss, ctx, config2) { const full = { ...iss, path: iss.path ?? [] }; if (!iss.message) { - const message = unwrapMessage(iss.inst?._zod.def?.error?.(iss)) ?? unwrapMessage(ctx?.error?.(iss)) ?? unwrapMessage(config3.customError?.(iss)) ?? unwrapMessage(config3.localeError?.(iss)) ?? "Invalid input"; + const message = unwrapMessage(iss.inst?._zod.def?.error?.(iss)) ?? unwrapMessage(ctx?.error?.(iss)) ?? unwrapMessage(config2.customError?.(iss)) ?? unwrapMessage(config2.localeError?.(iss)) ?? "Invalid input"; full.message = message; } delete full.inst; @@ -15511,7 +15517,7 @@ function treeifyError(error, _mapper) { return issue2.message; }; const result = { errors: [] }; - const processError = (error2, path4 = []) => { + const processError = (error2, path5 = []) => { var _a3, _b2; for (const issue2 of error2.issues) { if (issue2.code === "invalid_union" && issue2.errors.length) { @@ -15521,7 +15527,7 @@ function treeifyError(error, _mapper) { } else if (issue2.code === "invalid_element") { processError({ issues: issue2.issues }, issue2.path); } else { - const fullpath = [...path4, ...issue2.path]; + const fullpath = [...path5, ...issue2.path]; if (fullpath.length === 0) { result.errors.push(mapper(issue2)); continue; @@ -15553,8 +15559,8 @@ function treeifyError(error, _mapper) { } function toDotPath(_path) { const segs = []; - const path4 = _path.map((seg) => typeof seg === "object" ? seg.key : seg); - for (const seg of path4) { + const path5 = _path.map((seg) => typeof seg === "object" ? seg.key : seg); + for (const seg of path5) { if (typeof seg === "number") segs.push(`[${seg}]`); else if (typeof seg === "symbol") @@ -15611,7 +15617,7 @@ var _parse = (_Err) => (schema, value, _ctx, _params) => { throw new $ZodAsyncError; } if (result.issues.length) { - const e = new (_params?.Err ?? _Err)(result.issues.map((iss) => finalizeIssue(iss, ctx, config2()))); + const e = new (_params?.Err ?? _Err)(result.issues.map((iss) => finalizeIssue(iss, ctx, config()))); captureStackTrace(e, _params?.callee); throw e; } @@ -15622,7 +15628,7 @@ var _parse = (_Err) => (schema, value, _ctx, _params) => { if (result instanceof Promise) result = await result; if (result.issues.length) { - const e = new (params?.Err ?? _Err)(result.issues.map((iss) => finalizeIssue(iss, ctx, config2()))); + const e = new (params?.Err ?? _Err)(result.issues.map((iss) => finalizeIssue(iss, ctx, config()))); captureStackTrace(e, params?.callee); throw e; } @@ -15635,7 +15641,7 @@ var _parse = (_Err) => (schema, value, _ctx, _params) => { } return result.issues.length ? { success: false, - error: new (_Err ?? $ZodError)(result.issues.map((iss) => finalizeIssue(iss, ctx, config2()))) + error: new (_Err ?? $ZodError)(result.issues.map((iss) => finalizeIssue(iss, ctx, config()))) } : { success: true, data: result.value }; }, safeParse, _safeParseAsync = (_Err) => async (schema, value, _ctx) => { const ctx = _ctx ? Object.assign(_ctx, { async: true }) : { async: true }; @@ -15644,7 +15650,7 @@ var _parse = (_Err) => (schema, value, _ctx, _params) => { result = await result; return result.issues.length ? { success: false, - error: new _Err(result.issues.map((iss) => finalizeIssue(iss, ctx, config2()))) + error: new _Err(result.issues.map((iss) => finalizeIssue(iss, ctx, config()))) } : { success: true, data: result.value }; }, safeParseAsync, _encode = (_Err) => (schema, value, _ctx) => { const ctx = _ctx ? Object.assign(_ctx, { direction: "backward" }) : { direction: "backward" }; @@ -16554,7 +16560,7 @@ function handleUnionResults(results, final, inst, ctx) { code: "invalid_union", input: final.value, inst, - errors: results.map((result) => result.issues.map((iss) => finalizeIssue(iss, ctx, config2()))) + errors: results.map((result) => result.issues.map((iss) => finalizeIssue(iss, ctx, config()))) }); return final; } @@ -16634,7 +16640,7 @@ function handleMapResult(keyResult, valueResult, final, key, input, inst, ctx) { origin: "map", input, inst, - issues: keyResult.issues.map((iss) => finalizeIssue(iss, ctx, config2())) + issues: keyResult.issues.map((iss) => finalizeIssue(iss, ctx, config())) }); } } @@ -16648,7 +16654,7 @@ function handleMapResult(keyResult, valueResult, final, key, input, inst, ctx) { input, inst, key, - issues: valueResult.issues.map((iss) => finalizeIssue(iss, ctx, config2())) + issues: valueResult.issues.map((iss) => finalizeIssue(iss, ctx, config())) }); } } @@ -17721,7 +17727,7 @@ var init_schemas = __esm(() => { payload.issues.push({ code: "invalid_key", origin: "record", - issues: keyResult.issues.map((iss) => finalizeIssue(iss, ctx, config2())), + issues: keyResult.issues.map((iss) => finalizeIssue(iss, ctx, config())), input: key, path: [key], inst @@ -18008,7 +18014,7 @@ var init_schemas = __esm(() => { payload.value = def.catchValue({ ...payload, error: { - issues: result2.issues.map((iss) => finalizeIssue(iss, ctx, config2())) + issues: result2.issues.map((iss) => finalizeIssue(iss, ctx, config())) }, input: payload.value }); @@ -18022,7 +18028,7 @@ var init_schemas = __esm(() => { payload.value = def.catchValue({ ...payload, error: { - issues: result.issues.map((iss) => finalizeIssue(iss, ctx, config2())) + issues: result.issues.map((iss) => finalizeIssue(iss, ctx, config())) }, input: payload.value }); @@ -25753,7 +25759,7 @@ __export(exports_core2, { encode: () => encode, decodeAsync: () => decodeAsync, decode: () => decode, - config: () => config2, + config: () => config, clone: () => clone, _xid: () => _xid, _void: () => _void, @@ -27096,12 +27102,12 @@ var init_schemas2 = __esm(() => { // node_modules/zod/v4/classic/compat.js function setErrorMap(map2) { - config2({ + config({ customError: map2 }); } function getErrorMap() { - return config2().customError; + return config().customError; } var ZodIssueCode, ZodFirstPartyTypeKind; var init_compat = __esm(() => { @@ -27284,7 +27290,7 @@ __export(exports_external, { cuid2: () => cuid22, cuid: () => cuid3, core: () => exports_core2, - config: () => config2, + config: () => config, coerce: () => exports_coerce, codec: () => codec, clone: () => clone, @@ -27394,7 +27400,7 @@ var init_external = __esm(() => { init_errors2(); init_parse2(); init_compat(); - config2(en_default()); + config(en_default()); }); // node_modules/zod/index.js @@ -27406,7 +27412,7 @@ var init_zod = __esm(() => { }); // packages/unifia/src/util/log.ts -import path4 from "path"; +import path5 from "path"; import fs4 from "fs/promises"; import { createWriteStream as createWriteStream2 } from "fs"; var Log; @@ -27443,7 +27449,7 @@ var init_log = __esm(async () => { cleanup(Global.Path.log); if (options2.print) return; - logpath = path4.join(Global.Path.log, options2.dev ? "dev.log" : new Date().toISOString().split(".")[0].replace(/:/g, "") + ".log"); + logpath = path5.join(Global.Path.log, options2.dev ? "dev.log" : new Date().toISOString().split(".")[0].replace(/:/g, "") + ".log"); await fs4.truncate(logpath).catch(() => {}); const stream = createWriteStream2(logpath, { flags: "a" }); write = async (msg) => { @@ -27558,24 +27564,24 @@ var init_log = __esm(async () => { }); // node_modules/hono/dist/utils/url.js -var splitPath = (path5) => { - const paths = path5.split("/"); +var splitPath = (path6) => { + const paths = path6.split("/"); if (paths[0] === "") { paths.shift(); } return paths; }, splitRoutingPath = (routePath) => { - const { groups, path: path5 } = extractGroupsFromPath(routePath); - const paths = splitPath(path5); + const { groups, path: path6 } = extractGroupsFromPath(routePath); + const paths = splitPath(path6); return replaceGroupMarks(paths, groups); -}, extractGroupsFromPath = (path5) => { +}, extractGroupsFromPath = (path6) => { const groups = []; - path5 = path5.replace(/\{[^}]+\}/g, (match2, index) => { + path6 = path6.replace(/\{[^}]+\}/g, (match2, index) => { const mark = `@${index}`; groups.push([mark, match2]); return mark; }); - return { groups, path: path5 }; + return { groups, path: path6 }; }, replaceGroupMarks = (paths, groups) => { for (let i2 = groups.length - 1;i2 >= 0; i2--) { const [mark] = groups[i2]; @@ -27626,8 +27632,8 @@ var splitPath = (path5) => { const queryIndex = url2.indexOf("?", i2); const hashIndex = url2.indexOf("#", i2); const end = queryIndex === -1 ? hashIndex === -1 ? undefined : hashIndex : hashIndex === -1 ? queryIndex : Math.min(queryIndex, hashIndex); - const path5 = url2.slice(start2, end); - return tryDecodeURI(path5.includes("%25") ? path5.replace(/%25/g, "%2525") : path5); + const path6 = url2.slice(start2, end); + return tryDecodeURI(path6.includes("%25") ? path6.replace(/%25/g, "%2525") : path6); } else if (charCode === 63 || charCode === 35) { break; } @@ -27641,11 +27647,11 @@ var splitPath = (path5) => { sub = mergePath(sub, ...rest); } return `${base?.[0] === "/" ? "" : "/"}${base}${sub === "/" ? "" : `${base?.at(-1) === "/" ? "" : "/"}${sub?.[0] === "/" ? sub.slice(1) : sub}`}`; -}, checkOptionalParameter = (path5) => { - if (path5.charCodeAt(path5.length - 1) !== 63 || !path5.includes(":")) { +}, checkOptionalParameter = (path6) => { + if (path6.charCodeAt(path6.length - 1) !== 63 || !path6.includes(":")) { return null; } - const segments = path5.split("/"); + const segments = path6.split("/"); const results = []; let basePath = ""; segments.forEach((segment) => { @@ -27667,17 +27673,14 @@ var splitPath = (path5) => { } }); return results.filter((v2, i2, a) => a.indexOf(v2) === i2); -}, _decodeURI = (value) => { - if (!/[%+]/.test(value)) { - return value; - } +}, tryDecodeURIComponent = (str2) => str2.indexOf("%") !== -1 ? tryDecode(str2, decodeURIComponent_) : str2, _decodeURI = (value) => { if (value.indexOf("+") !== -1) { value = value.replace(/\+/g, " "); } - return value.indexOf("%") !== -1 ? tryDecode(value, decodeURIComponent_) : value; + return tryDecodeURIComponent(value); }, _getQueryParam = (url2, key, multiple) => { let encoded; - if (!multiple && key && !/[%+]/.test(key)) { + if (!multiple && key && key.indexOf("%") === -1 && key.indexOf("+") === -1) { let keyIndex2 = url2.indexOf("?", 8); if (keyIndex2 === -1) { return; @@ -27701,7 +27704,7 @@ var splitPath = (path5) => { return; } } - const results = {}; + const results = /* @__PURE__ */ Object.create(null); encoded ??= /[%+]/.test(url2); let keyIndex = url2.indexOf("?", 8); while (keyIndex !== -1) { @@ -27747,7 +27750,7 @@ var init_url = __esm(() => { }); // node_modules/hono/dist/utils/cookie.js -var validCookieNameRegEx, validCookieValueRegEx, trimCookieWhitespace = (value) => { +var relaxedCookieNameRegEx, validCookieValueRegEx, trimCookieWhitespace = (value) => { let start2 = 0; let end = value.length; while (start2 < end) { @@ -27770,14 +27773,14 @@ var validCookieNameRegEx, validCookieValueRegEx, trimCookieWhitespace = (value) return {}; } const pairs = cookie.split(";"); - const parsedCookie = {}; + const parsedCookie = /* @__PURE__ */ Object.create(null); for (const pairStr of pairs) { const valueStartPos = pairStr.indexOf("="); if (valueStartPos === -1) { continue; } const cookieName = trimCookieWhitespace(pairStr.substring(0, valueStartPos)); - if (name2 && name2 !== cookieName || !validCookieNameRegEx.test(cookieName)) { + if (name2 && name2 !== cookieName || !relaxedCookieNameRegEx.test(cookieName) || cookieName in parsedCookie) { continue; } let cookieValue = trimCookieWhitespace(pairStr.substring(valueStartPos + 1)); @@ -27785,7 +27788,7 @@ var validCookieNameRegEx, validCookieValueRegEx, trimCookieWhitespace = (value) cookieValue = cookieValue.slice(1, -1); } if (validCookieValueRegEx.test(cookieValue)) { - parsedCookie[cookieName] = cookieValue.indexOf("%") !== -1 ? tryDecode(cookieValue, decodeURIComponent_) : cookieValue; + parsedCookie[cookieName] = tryDecodeURIComponent(cookieValue); if (name2) { break; } @@ -27795,7 +27798,7 @@ var validCookieNameRegEx, validCookieValueRegEx, trimCookieWhitespace = (value) }; var init_cookie = __esm(() => { init_url(); - validCookieNameRegEx = /^[\w!#$%&'*.^`|~+-]+$/; + relaxedCookieNameRegEx = /^[!#-:<>-[\]-~]+$/; validCookieValueRegEx = /^[ !#-:<-[\]-~]*$/; }); @@ -27858,7 +27861,7 @@ var init_crypto = () => {}; var bufferToFormData = (arrayBuffer, contentType) => { const response = new Response(arrayBuffer, { headers: { - "Content-Type": contentType + "Content-Type": contentType.replace(/^[^;]+/, (mediaType) => mediaType.toLowerCase()) } }); return response.formData(); @@ -27944,9 +27947,9 @@ var init_validator = __esm(() => { init_cookie2(); init_http_exception(); init_buffer(); - jsonRegex = /^application\/([a-z-\.]+\+)?json(;\s*[a-zA-Z0-9\-]+\=([^;]+))*$/; - multipartRegex = /^multipart\/form-data(;\s?boundary=[a-zA-Z0-9'"()+_,\-./:=?]+)?$/; - urlencodedRegex = /^application\/x-www-form-urlencoded(;\s*[a-zA-Z0-9\-]+\=([^;]+))*$/; + jsonRegex = /^application\/([a-z-\.]+\+)?json(;\s*[a-zA-Z0-9\-]+\=([^;]+))*$/i; + multipartRegex = /^multipart\/form-data(;\s?boundary=[a-zA-Z0-9'"()+_,\-./:=?]+)?$/i; + urlencodedRegex = /^application\/x-www-form-urlencoded(;\s*[a-zA-Z0-9\-]+\=([^;]+))*$/i; }); // node_modules/hono/dist/validator/index.js @@ -27985,10 +27988,10 @@ function sanitizeArktypeIssues(issues, restrictedFields) { function sanitizeValibotIssues(issues, restrictedFields) { return issues.map((issue2) => { if (issue2 && typeof issue2 === "object" && "path" in issue2 && Array.isArray(issue2.path)) { - for (const path5 of issue2.path) { - if (typeof path5 === "object" && "input" in path5 && typeof path5.input === "object" && path5.input !== null && !Array.isArray(path5.input)) { + for (const path6 of issue2.path) { + if (typeof path6 === "object" && "input" in path6 && typeof path6.input === "object" && path6.input !== null && !Array.isArray(path6.input)) { for (const field of restrictedFields) { - delete path5.input[field]; + delete path6.input[field]; } } } @@ -29137,8 +29140,8 @@ ${ind(d)}}`; function formatPropertyKey(name2) { return typeof name2 === "string" ? JSON.stringify(name2) : String(name2); } -function formatPath(path5) { - return path5.map((key) => `[${formatPropertyKey(key)}]`).join(""); +function formatPath(path6) { + return path6.map((key) => `[${formatPropertyKey(key)}]`).join(""); } function formatDate(date5) { try { @@ -30049,15 +30052,15 @@ var none2 = () => none, some3, isOption2, isNone2, isSome2, match2, toRefinement }, zipWith, reduceCompact, toArray = (self2) => isNone2(self2) ? [] : [self2.value], partitionMap, filterMap, filter2, makeEquivalence = (isEquivalent) => make2((x2, y) => isNone2(x2) ? isNone2(y) : isNone2(y) ? false : isEquivalent(x2.value, y.value)), makeOrder = (O2) => make4((self2, that) => isSome2(self2) ? isSome2(that) ? O2(self2.value, that.value) : 1 : -1), lift2 = (f) => dual(2, (self2, that) => zipWith(self2, that, f)), liftPredicate, containsWith = (isEquivalent) => dual(2, (self2, a) => isNone2(self2) ? false : isEquivalent(self2.value, a)), contains, exists, bindTo2, let_2, bind2, Do, gen = (...args3) => { const f = args3.length === 1 ? args3[0] : args3[1].bind(args3[0]); const iterator = f(); - let state2 = iterator.next(); - while (!state2.done) { - const current = state2.value; + let state = iterator.next(); + while (!state.done) { + const current = state.value; if (isNone2(current)) { return current; } - state2 = iterator.next(current.value); + state = iterator.next(current.value); } - return some3(state2.value); + return some3(state.value); }; var init_Option = __esm(() => { init_Equal(); @@ -30221,15 +30224,15 @@ var succeed2, fail2, void_2, failVoid, fromNullishOr2, fromOption2, try_ = (eval }, flip5 = (self2) => isFailure2(self2) ? succeed2(self2.failure) : fail2(self2.success), gen2 = (...args3) => { const f = args3.length === 1 ? args3[0] : args3[1].bind(args3[0]); const iterator = f(); - let state2 = iterator.next(); - while (!state2.done) { - const current = state2.value; + let state = iterator.next(); + while (!state.done) { + const current = state.value; if (isFailure2(current)) { return current; } - state2 = iterator.next(current.success); + state = iterator.next(current.success); } - return succeed2(state2.value); + return succeed2(state.value); }, Do2, bind3, bindTo3, let_3, transposeOption = (self2) => { return isNone(self2) ? succeedNone : map3(self2.value, some2); }, transposeMapOption, succeedNone, succeedSome = (a) => succeed2(some2(a)), tap2; @@ -34418,11 +34421,11 @@ ${prefix}}`; const iterator = evaluate2(); let value = undefined; while (true) { - const state2 = iterator.next(value); - if (state2.done) { - return succeed3(state2.value); + const state = iterator.next(value); + if (state.done) { + return succeed3(state.value); } - const yieldable = state2.value; + const yieldable = state.value; const effect = yieldable.asEffect(); const primitive = effect; if (primitive && primitive._tag === "Success") { @@ -34677,15 +34680,15 @@ ${prefix}}`; }), whileLoop, forEach3, forEachSequential = (iterable, f, options2) => suspend(() => { const out2 = options2?.discard ? undefined : []; const iterator = iterable[Symbol.iterator](); - let state2 = iterator.next(); + let state = iterator.next(); let index = 0; return as3(whileLoop({ - while: () => !state2.done, - body: () => f(state2.value, index++), + while: () => !state.done, + body: () => f(state.value, index++), step: (b) => { if (out2) out2.push(b); - state2 = iterator.next(); + state = iterator.next(); } }), out2); }), filterOrElse, filterMapOrElse, filterMapOrFail, filter6, filterMap5, filterMapEffect, Do4, bindTo5, bind5, let_5, forkChild, forkUnsafe = (parent, effect, immediate = false, daemon = false, uninterruptible2 = false) => { @@ -35502,10 +35505,10 @@ var init_effect = __esm(() => { [contA](value, fiber2) { const iter = this[args2][0]; while (true) { - const state2 = iter.next(value); - if (state2.done) - return succeed3(state2.value); - const eff = state2.value.asEffect(); + const state = iter.next(value); + if (state.done) + return succeed3(state.value); + const eff = state.value.asEffect(); if (!effectIsExit(eff)) { fiber2._stack.push(this); return eff; @@ -38741,10 +38744,10 @@ var TypeId12 = "~effect/Schedule", randomNext, CurrentMetadata2, ScheduleProto, const decoded = fromInputUnsafe(duration4); return fromStepWithMetadata(succeed3((meta) => succeed3([meta.attempt - 1, decoded]))); }, tapInput, tapOutput, take3, unfold3 = (initial, next2) => fromStep(sync(() => { - let state2 = initial; - return constant(map8(suspend(() => next2(state2)), (nextState) => { - const prev2 = state2; - state2 = nextState; + let state = initial; + return constant(map8(suspend(() => next2(state)), (nextState) => { + const prev2 = state; + state = nextState; return [prev2, zero2]; })); })), while_, windowed = (interval) => { @@ -38852,22 +38855,22 @@ var init_Schedule = __esm(() => { }); modifyDelay = /* @__PURE__ */ dual(2, (self2, f) => fromStep(map8(toStep(self2), (step) => (now2, input) => flatMap5(step(now2, input), ([output, delay2]) => map8(f(output, delay2), (delay3) => [output, fromInputUnsafe(delay3)]))))); reduce4 = /* @__PURE__ */ dual(3, (self2, initial, combine6) => fromStep(map8(toStep(self2), (step) => { - let state2 = initial(); + let state = initial(); return (now2, input) => matchEffect2(step(now2, input), { onSuccess([output, delay2]) { - const next2 = combine6(state2, output); + const next2 = combine6(state, output); if (!isEffect(next2)) { - state2 = next2; + state = next2; return succeed3([next2, delay2]); } return map8(next2, (nextState) => { - state2 = nextState; + state = nextState; return [nextState, delay2]; }); }, onFailure: failCause, onDone(output) { - const next2 = combine6(state2, output); + const next2 = combine6(state, output); return isEffect(next2) ? flatMap5(next2, done2) : done2(next2); } }); @@ -39342,34 +39345,34 @@ var CurrentMetricAttributesKey = "effect/Metric/CurrentMetricAttributes", Curren const prefix = "state="; switch (metric.type) { case "Counter": { - const state2 = metric.state; - return `${prefix}[count: [${state2.count}]]`; + const state = metric.state; + return `${prefix}[count: [${state.count}]]`; } case "Frequency": { - const state2 = metric.state; - return `${prefix}[occurrences: ${renderKeyValues(state2.occurrences)}]`; + const state = metric.state; + return `${prefix}[occurrences: ${renderKeyValues(state.occurrences)}]`; } case "Gauge": { - const state2 = metric.state; - return `${prefix}[value: [${state2.value}]]`; + const state = metric.state; + return `${prefix}[value: [${state.value}]]`; } case "Histogram": { - const state2 = metric.state; - const buckets = `buckets: [${renderKeyValues(state2.buckets)}]`; - const count = `count: [${state2.count}]`; - const min9 = `min: [${state2.min}]`; - const max9 = `max: [${state2.max}]`; - const sum5 = `sum: [${state2.sum}]`; + const state = metric.state; + const buckets = `buckets: [${renderKeyValues(state.buckets)}]`; + const count = `count: [${state.count}]`; + const min9 = `min: [${state.min}]`; + const max9 = `max: [${state.max}]`; + const sum5 = `sum: [${state.sum}]`; return `${prefix}[${buckets}, ${count}, ${min9}, ${max9}, ${sum5}]`; } case "Summary": { - const state2 = metric.state; - const printableQuantiles = state2.quantiles.map(([key, value2]) => [key, value2 ?? 0]); + const state = metric.state; + const printableQuantiles = state.quantiles.map(([key, value2]) => [key, value2 ?? 0]); const quantiles = `quantiles: [${renderKeyValues(printableQuantiles)}]`; - const count = `count: [${state2.count}]`; - const min9 = `min: [${state2.min}]`; - const max9 = `max: [${state2.max}]`; - const sum5 = `sum: [${state2.sum}]`; + const count = `count: [${state.count}]`; + const min9 = `min: [${state.min}]`; + const max9 = `max: [${state.max}]`; + const sum5 = `sum: [${state.sum}]`; return `${prefix}[${quantiles}, ${count}, ${min9}, ${max9}, ${sum5}]`; } } @@ -39989,10 +39992,10 @@ __export(exports_Effect, { Transaction: () => Transaction, Do: () => Do5 }); -function commitTransaction(fiber3, state2) { +function commitTransaction(fiber3, state) { for (const [ref, { value: value2 - }] of state2.journal) { + }] of state.journal) { if (value2 !== ref.value) { ref.version = ref.version + 1; ref.value = value2; @@ -40003,50 +40006,50 @@ function commitTransaction(fiber3, state2) { ref.pending.clear(); } } -function clearTransaction(state2) { - state2.retry = false; - state2.journal.clear(); +function clearTransaction(state) { + state.retry = false; + state.journal.clear(); } var YieldableClass, isEffect2, all4, partition4, validate3, findFirst5, findFirstFilter2, forEach4, whileLoop2, promise3, tryPromise2, succeed8, succeedNone3, succeedSome3, suspend3, sync4, void_5, undefined_2, callback2, never3, Do5, bindTo6, let_6, bind6, gen4, fail8, failSync3, failCause5, failCauseSync3, die5, try_4, yieldNow2, yieldNowWith2, withFiber2, fromResult2, fromOption5, fromNullishOr5, fromYieldable2, flatMap7, flatten5, andThen5, tap5, result2, option2, exit2, map12, as4, asSome2, asVoid4, flip7, zip5, zipWith6, catch_3, catchTag3, catchTags2, catchReason2, catchReasons2, unwrapReason2, catchCause3, catchDefect2, catchIf2, catchFilter2, catchNoSuchElement2, catchCauseIf2, catchCauseFilter2, mapError4, mapBoth4, orDie3, tapError3, tapErrorTag2, tapCause3, tapCauseIf2, tapCauseFilter2, tapDefect2, eventually2, retry2, retryOrElse2, sandbox2, ignore2, ignoreCause2, withExecutionPlan2, withErrorReporting2, orElseSucceed2, timeout2, timeoutOption2, timeoutOrElse2, delay2, sleep2, timed2, raceAll2, raceAllFirst2, race2, raceFirst2, filter7, filterMap6, filterMapEffect2, filterOrElse2, filterMapOrElse2, filterOrFail3, filterMapOrFail2, when2, match12, matchEager2, matchCause2, matchCauseEager2, matchCauseEffectEager2, matchCauseEffect2, matchEffect3, isFailure5, isSuccess5, services2, servicesWith2, provide4, provideServices2, service2, serviceOption2, updateServices2, updateService3, provideService2, provideServiceEffect2, withConcurrency2, scope2, scoped2, scopedWith2, acquireRelease2, acquireUseRelease2, addFinalizer3, ensuring2, onError2, onErrorIf2, onErrorFilter2, onExitPrimitive2, onExit2, onExitIf2, onExitFilter2, cached3, cachedWithTTL2, cachedInvalidateWithTTL2, interrupt5, interruptible2, onInterrupt2, uninterruptible2, uninterruptibleMask2, interruptibleMask2, forever4, repeat4, repeatOrElse2, replicate4, replicateEffect2, schedule, scheduleFrom2, tracer2, withTracer2, withTracerEnabled2, withTracerTiming2, annotateSpans2, annotateCurrentSpan2, currentSpan2, currentParentSpan2, spanAnnotations2, spanLinks2, linkSpans2, makeSpan2, makeSpanScoped2, useSpan2, withSpan3, withSpanScoped2, withParentSpan3, request2, requestUnsafe2, forkChild2, forkIn2, forkScoped2, forkDetach2, awaitAllChildren2, fiber2, fiberId2, runFork2, runForkWith2, runCallbackWith2, runCallback2, runPromise2, runPromiseWith2, runPromiseExit2, runPromiseExitWith2, runSync2, runSyncWith2, runSyncExit2, runSyncExitWith2, fnUntraced2, fn2, clockWith3, logWithLevel2, log, logFatal, logWarning, logError, logInfo, logDebug, logTrace, withLogger, annotateLogs, annotateLogsScoped2, withLogSpan, track, trackSuccesses, trackErrors, trackDefects, trackDuration, Transaction, tx = (effect2) => withFiber2((fiber3) => { if (fiber3.services.mapUnsafe.has(Transaction.key)) { return effect2; } - const state2 = { + const state = { journal: new Map, retry: false }; let result3; return uninterruptibleMask2((restore) => flatMap7(whileLoop2({ while: () => !result3, - body: constant(restore(effect2).pipe(provideService2(Transaction, state2), tapCause3(() => { - if (!state2.retry) + body: constant(restore(effect2).pipe(provideService2(Transaction, state), tapCause3(() => { + if (!state.retry) return void_5; - return restore(awaitPendingTransaction(state2)); + return restore(awaitPendingTransaction(state)); }), exit2)), step(exit3) { - if (state2.retry || !isTransactionConsistent(state2)) { - return clearTransaction(state2); + if (state.retry || !isTransactionConsistent(state)) { + return clearTransaction(state); } if (isSuccess4(exit3)) { - commitTransaction(fiber3, state2); + commitTransaction(fiber3, state); } else { - clearTransaction(state2); + clearTransaction(state); } result3 = exit3; } }), () => result3)); -}), isTransactionConsistent = (state2) => { +}), isTransactionConsistent = (state) => { for (const [ref, { version: version4 - }] of state2.journal) { + }] of state.journal) { if (ref.version !== version4) { return false; } } return true; -}, awaitPendingTransaction = (state2) => suspend3(() => { +}, awaitPendingTransaction = (state) => suspend3(() => { const key = {}; - const refs = Array.from(state2.journal.keys()); + const refs = Array.from(state.journal.keys()); const clearPending = () => { for (const clear of refs) { clear.pending.delete(key); @@ -40337,8 +40340,8 @@ var init_Effect = __esm(() => { })); Transaction = class Transaction extends (/* @__PURE__ */ Service()("effect/Effect/Transaction")) { }; - txRetry = /* @__PURE__ */ flatMap7(/* @__PURE__ */ Transaction.asEffect(), (state2) => { - state2.retry = true; + txRetry = /* @__PURE__ */ flatMap7(/* @__PURE__ */ Transaction.asEffect(), (state) => { + state.retry = true; return interrupt5; }); mapEager2 = mapEager; @@ -40886,51 +40889,51 @@ function makeFormatterStandardSchemaV1(options2) { function getExpectedMessage(expected, actual) { return `Expected ${expected}, got ${actual}`; } -function toDefaultIssues(issue2, path5, leafHook, checkHook) { +function toDefaultIssues(issue2, path6, leafHook, checkHook) { switch (issue2._tag) { case "Filter": { const message = checkHook(issue2); if (message !== undefined) { return [{ - path: path5, + path: path6, message }]; } switch (issue2.issue._tag) { case "InvalidValue": return [{ - path: path5, + path: path6, message: getExpectedMessage(formatCheck(issue2.filter), format3(issue2.actual)) }]; default: - return toDefaultIssues(issue2.issue, path5, leafHook, checkHook); + return toDefaultIssues(issue2.issue, path6, leafHook, checkHook); } } case "Encoding": - return toDefaultIssues(issue2.issue, path5, leafHook, checkHook); + return toDefaultIssues(issue2.issue, path6, leafHook, checkHook); case "Pointer": - return toDefaultIssues(issue2.issue, [...path5, ...issue2.path], leafHook, checkHook); + return toDefaultIssues(issue2.issue, [...path6, ...issue2.path], leafHook, checkHook); case "Composite": - return issue2.issues.flatMap((issue3) => toDefaultIssues(issue3, path5, leafHook, checkHook)); + return issue2.issues.flatMap((issue3) => toDefaultIssues(issue3, path6, leafHook, checkHook)); case "AnyOf": { const message = findMessage(issue2); if (issue2.issues.length === 0) { if (message !== undefined) return [{ - path: path5, + path: path6, message }]; const expected = getExpectedMessage(getExpected(issue2.ast), format3(issue2.actual)); return [{ - path: path5, + path: path6, message: expected }]; } - return issue2.issues.flatMap((issue3) => toDefaultIssues(issue3, path5, leafHook, checkHook)); + return issue2.issues.flatMap((issue3) => toDefaultIssues(issue3, path6, leafHook, checkHook)); } default: return [{ - path: path5, + path: path6, message: leafHook(issue2) }]; } @@ -40953,9 +40956,9 @@ function makeFormatterDefault() { function formatDefaultIssue(issue2) { let out2 = issue2.message; if (issue2.path && issue2.path.length > 0) { - const path5 = formatPath(issue2.path); + const path6 = formatPath(issue2.path); out2 += ` - at ${path5}`; + at ${path6}`; } return out2; } @@ -41071,9 +41074,9 @@ var init_SchemaIssue = __esm(() => { _tag = "Pointer"; path; issue; - constructor(path5, issue2) { + constructor(path6, issue2) { super(); - this.path = path5; + this.path = path6; this.issue = issue2; } }; @@ -45834,9 +45837,9 @@ var TypeId24 = "~effect/PubSub", SubscriptionTypeId = "~effect/PubSub/Subscripti const scope3 = forkUnsafe2(self2.scope); const subscription = makeSubscriptionUnsafe(self2.pubsub, self2.subscribers, self2.strategy); return addFinalizer2(scope3, unsubscribe(subscription)).pipe(andThen5(addFinalizerExit(localScope2, (exit3) => close(scope3, exit3))), as4(subscription)); -})), unsubscribe = (self2) => uninterruptible2(withFiber2((state2) => { +})), unsubscribe = (self2) => uninterruptible2(withFiber2((state) => { set6(self2.shutdownFlag, true); - return forEach4(takeAll(self2.pollers), (d) => interruptWith(d, state2.id), { + return forEach4(takeAll(self2.pollers), (d) => interruptWith(d, state.id), { discard: true, concurrency: "unbounded" }).pipe(tap5(() => sync4(() => { @@ -46810,8 +46813,8 @@ var TypeId26 = "~effect/Channel", isChannel = (u) => hasProperty(u, TypeId26), C })), acquireRelease3, fromIterator = (iterator) => fromPull(sync4(() => { const iter = iterator(); return suspend3(() => { - const state2 = iter.next(); - return state2.done ? done2(state2.value) : succeed8(state2.value); + const state = iter.next(); + return state.done ? done2(state.value) : succeed8(state.value); }); })), fromArray = (array3) => fromPull(sync4(() => { let index = 0; @@ -46824,15 +46827,15 @@ var TypeId26 = "~effect/Channel", isChannel = (u) => hasProperty(u, TypeId26), C return done2(done4.value); const buffer = []; while (buffer.length < chunkSize) { - const state2 = iter.next(); - if (state2.done) { + const state = iter.next(); + if (state.done) { if (buffer.length === 0) { - return done2(state2.value); + return done2(state.value); } - done4 = some3(state2.value); + done4 = some3(state.value); break; } - buffer.push(state2.value); + buffer.push(state.value); } return succeed8(buffer); }); @@ -47148,11 +47151,11 @@ var init_Channel = __esm(() => { combine6 = /* @__PURE__ */ dual(4, (self2, that, s, f) => fromTransform(fnUntraced2(function* (upstream, scope3) { const leftPull = yield* toTransform(self2)(upstream, scope3); const rightPull = yield* toTransform(that)(upstream, scope3); - let state2 = s(); + let state = s(); return suspend3(() => { - const combinedPull = f(state2, leftPull, rightPull); + const combinedPull = f(state, leftPull, rightPull); return map12(combinedPull, ([a, s1]) => { - state2 = s1; + state = s1; return a; }); }); @@ -47227,18 +47230,18 @@ var init_Channel = __esm(() => { return flatMap7(filterMapEffect2(arr, filter11), (passes) => isReadonlyArrayNonEmpty(passes) ? succeed8(passes) : flatMap7(pull, loop)); })))); mapAccum3 = /* @__PURE__ */ dual((args3) => isChannel(args3[0]), (self2, initial, f, options2) => fromTransform((upstream, scope3) => map12(toTransform(self2)(upstream, scope3), (pull) => { - let state2 = initial(); + let state = initial(); let current; let index = 0; let cause; const pullNext = matchCauseEffect2(pull, { onFailure(cause_) { cause = cause_; - const b = options2?.onHalt && options2.onHalt(state2); - return b && b.length > 0 ? succeed8([state2, b]) : failCause5(cause_); + const b = options2?.onHalt && options2.onHalt(state); + return b && b.length > 0 ? succeed8([state, b]) : failCause5(cause_); }, onSuccess(a) { - const b = f(state2, a); + const b = f(state, a); return isArray(b) ? succeed8(b) : b; } }); @@ -47247,7 +47250,7 @@ var init_Channel = __esm(() => { if (cause) return failCause5(cause); return flatMap7(pullNext, ([newState, values4]) => { - state2 = newState; + state = newState; if (values4.length === 0) { return loop(); } else if (values4.length === 1) { @@ -47268,16 +47271,16 @@ var init_Channel = __esm(() => { }))); scan3 = /* @__PURE__ */ dual(3, (self2, initial, f) => scanEffect(self2, initial, (s, a) => succeed8(f(s, a)))); scanEffect = /* @__PURE__ */ dual(3, (self2, initial, f) => fromTransform((upstream, scope3) => map12(toTransform(self2)(upstream, scope3), (pull) => { - let state2 = initial; + let state = initial; let isFirst = true; return suspend3(() => { if (isFirst) { isFirst = false; - return succeed8(state2); + return succeed8(state); } - return map12(flatMap7(pull, (a) => f(state2, a)), (newState) => { - state2 = newState; - return state2; + return map12(flatMap7(pull, (a) => f(state, a)), (newState) => { + state = newState; + return state; }); }); }))); @@ -47543,24 +47546,24 @@ var init_Channel = __esm(() => { disableYield: true })))); runFold = /* @__PURE__ */ dual(3, (self2, initial, f) => suspend3(() => { - let state2 = initial(); + let state = initial(); return runWith(self2, (pull) => whileLoop2({ while: constTrue, body: () => pull, step: (value4) => { - state2 = f(state2, value4); + state = f(state, value4); } - }), () => succeed8(state2)); + }), () => succeed8(state)); })); runFoldEffect = /* @__PURE__ */ dual(3, (self2, initial, f) => suspend3(() => { - let state2 = initial(); + let state = initial(); return runWith(self2, (pull) => whileLoop2({ while: constTrue, - body: constant(pull.pipe(flatMap7((o) => f(state2, o)), map12((s) => { - state2 = s; + body: constant(pull.pipe(flatMap7((o) => f(state, o)), map12((s) => { + state = s; }))), step: constVoid - }), () => succeed8(state2)); + }), () => succeed8(state)); })); toPull2 = /* @__PURE__ */ fnUntraced2(function* (self2) { const semaphore = makeUnsafe7(1); @@ -48875,10 +48878,10 @@ var init_UndefinedOr = __esm(() => { }); // node_modules/effect/dist/internal/errors.js -function errorWithPath(message, path5) { - if (path5.length > 0) { +function errorWithPath(message, path6) { + if (path6.length > 0) { message += ` - at ${formatPath(path5)}`; + at ${formatPath(path6)}`; } return new Error(message); } @@ -48951,10 +48954,10 @@ function getFilters(checks3) { } return []; } -function recur(ast, path5) { +function recur(ast, path6) { const annotation = resolve5(ast)?.toArbitrary; if (annotation) { - const typeParameters = isDeclaration(ast) ? ast.typeParameters.map((tp) => recur(tp, path5)) : []; + const typeParameters = isDeclaration(ast) ? ast.typeParameters.map((tp) => recur(tp, path6)) : []; const filters = getFilters(ast.checks); const f = constraintContext(filters); return (fc, ctx) => applyChecks(ast, filters, annotation(typeParameters.map((tp) => tp(fc, resetContext(ctx))))(fc, f(ctx))); @@ -48962,16 +48965,16 @@ function recur(ast, path5) { if (ast.checks) { const filters = getFilters(ast.checks); const f = constraintContext(filters); - const lawc = recur(replaceChecks(ast, undefined), path5); + const lawc = recur(replaceChecks(ast, undefined), path6); return (fc, ctx) => applyChecks(ast, filters, lawc(fc, f(ctx))); } - return base(ast, path5); + return base(ast, path6); } -function base(ast, path5) { +function base(ast, path6) { switch (ast._tag) { case "Never": case "Declaration": - throw errorWithPath(`Unsupported AST ${ast._tag}`, path5); + throw errorWithPath(`Unsupported AST ${ast._tag}`, path6); case "Null": return (fc) => fc.constant(null); case "Void": @@ -49010,14 +49013,14 @@ function base(ast, path5) { case "ObjectKeyword": return (fc) => fc.oneof(fc.object(), fc.array(fc.anything())); case "Enum": - return recur(enumsToLiterals(ast), path5); + return recur(enumsToLiterals(ast), path6); case "TemplateLiteral": return (fc) => fc.stringMatching(getTemplateLiteralRegExp(ast)); case "Arrays": return (fc, ctx) => { const reset = resetContext(ctx); const elements = ast.elements.map((e, i2) => { - const out3 = recur(e, [...path5, i2])(fc, reset); + const out3 = recur(e, [...path6, i2])(fc, reset); if (!isOptional(e)) { return out3.map(some3); } @@ -49026,7 +49029,7 @@ function base(ast, path5) { let out2 = fc.tuple(...elements).map(getSomes3); if (isReadonlyArrayNonEmpty(ast.rest)) { const len = ast.elements.length; - const [head4, ...tail3] = ast.rest.map((r, i2) => recur(r, [...path5, len + i2])(fc, reset)); + const [head4, ...tail3] = ast.rest.map((r, i2) => recur(r, [...path6, len + i2])(fc, reset)); const rest = array3(fc, ast.elements.length === 0 ? ctx : reset, head4); out2 = out2.chain((as5) => { if (as5.length < len) { @@ -49056,13 +49059,13 @@ function base(ast, path5) { if (!isOptional(ps2.type)) { requiredKeys.push(name2); } - pss[name2] = recur(ps2.type, [...path5, name2])(fc, reset); + pss[name2] = recur(ps2.type, [...path6, name2])(fc, reset); } let out2 = fc.record(pss, { requiredKeys }); for (const is2 of ast.indexSignatures) { - const entry = fc.tuple(recur(is2.parameter, path5)(fc, reset), recur(is2.type, path5)(fc, reset)); + const entry = fc.tuple(recur(is2.parameter, path6)(fc, reset), recur(is2.type, path6)(fc, reset)); const entries4 = array3(fc, ast.propertySignatures.length === 0 ? ctx : reset, entry); out2 = out2.chain((o) => { return entries4.map((entries5) => { @@ -49076,12 +49079,12 @@ function base(ast, path5) { return out2; }; case "Union": - return (fc, ctx) => fc.oneof(...ast.types.map((ast2) => recur(ast2, path5)(fc, ctx))); + return (fc, ctx) => fc.oneof(...ast.types.map((ast2) => recur(ast2, path6)(fc, ctx))); case "Suspend": { const memo = arbitraryMemoMap.get(ast); if (memo) return memo; - const get12 = memoizeThunk(() => recur(ast.thunk(), path5)); + const get12 = memoizeThunk(() => recur(ast.thunk(), path6)); const out2 = (fc, ctx) => fc.constant(null).chain(() => get12()(fc, { ...ctx, isSuspend: true @@ -49420,14 +49423,14 @@ var init_SchemaParser = __esm(() => { }); // node_modules/effect/dist/internal/schema/equivalence.js -function recur3(ast, path5) { +function recur3(ast, path6) { const annotation = resolve5(ast)?.["toEquivalence"]; if (annotation) { - return annotation(isDeclaration(ast) ? ast.typeParameters.map((tp) => recur3(tp, path5)) : []); + return annotation(isDeclaration(ast) ? ast.typeParameters.map((tp) => recur3(tp, path6)) : []); } switch (ast._tag) { case "Never": - throw errorWithPath(`Unsupported AST ${ast._tag}`, path5); + throw errorWithPath(`Unsupported AST ${ast._tag}`, path6); case "Declaration": case "Null": case "Undefined": @@ -49446,9 +49449,9 @@ function recur3(ast, path5) { case "TemplateLiteral": return equals; case "Arrays": { - const elements = ast.elements.map((e, i2) => recur3(e, [...path5, i2])); + const elements = ast.elements.map((e, i2) => recur3(e, [...path6, i2])); const len = ast.elements.length; - const rest = ast.rest.map((r, i2) => recur3(r, [...path5, len + i2])); + const rest = ast.rest.map((r, i2) => recur3(r, [...path6, len + i2])); return make2((a, b) => { if (!Array.isArray(a) || !Array.isArray(b)) { return false; @@ -49484,8 +49487,8 @@ function recur3(ast, path5) { if (ast.propertySignatures.length === 0 && ast.indexSignatures.length === 0) { return equals; } - const propertySignatures = ast.propertySignatures.map((ps2) => recur3(ps2.type, [...path5, ps2.name])); - const indexSignatures = ast.indexSignatures.map((is3) => recur3(is3.type, path5)); + const propertySignatures = ast.propertySignatures.map((ps2) => recur3(ps2.type, [...path6, ps2.name])); + const indexSignatures = ast.indexSignatures.map((is3) => recur3(is3.type, path6)); return make2((a, b) => { if (!isObject2(a) || !isObject2(b)) { return false; @@ -49527,13 +49530,13 @@ function recur3(ast, path5) { for (let i2 = 0;i2 < candidates.length; i2++) { const is3 = types2[i2]; if (is3(a) && is3(b)) { - return recur3(candidates[i2], path5)(a, b); + return recur3(candidates[i2], path6)(a, b); } } return false; }); case "Suspend": { - const get12 = memoizeThunk(() => recur3(ast.thunk(), path5)); + const get12 = memoizeThunk(() => recur3(ast.thunk(), path6)); return make2((a, b) => get12()(a, b)); } } @@ -50574,10 +50577,10 @@ function get12(oldValue, newValue) { const len2 = newValue.length; const shared = Math.min(len1, len2); for (let i2 = 0;i2 < shared; i2++) { - const path5 = `/${i2}`; + const path6 = `/${i2}`; const patch = get12(oldValue[i2], newValue[i2]); for (const op of patch) { - prefixPathInPlace(op, path5); + prefixPathInPlace(op, path6); patches.push(op); } } @@ -50602,25 +50605,25 @@ function get12(oldValue, newValue) { const allKeys = Array.from(new Set([...keys1, ...keys22])).sort(); for (const key of allKeys) { const esc2 = escapeToken(key); - const path5 = `/${esc2}`; + const path6 = `/${esc2}`; const hasKey1 = Object.hasOwn(oldValue, key); const hasKey2 = Object.hasOwn(newValue, key); if (hasKey1 && hasKey2) { const patch = get12(oldValue[key], newValue[key]); for (const op of patch) { - prefixPathInPlace(op, path5); + prefixPathInPlace(op, path6); patches.push(op); } } else if (!hasKey1 && hasKey2) { patches.push({ op: "add", - path: path5, + path: path6, value: newValue[key] }); } else if (hasKey1 && !hasKey2) { patches.push({ op: "remove", - path: path5 + path: path6 }); } } @@ -51305,8 +51308,8 @@ class OptionalNode { class PathNode { _tag = "PathNode"; path; - constructor(path5) { - this.path = path5; + constructor(path6) { + this.path = path6; } } @@ -51635,24 +51638,24 @@ var init_Optic = __esm(() => { return { _tag: "LensNode", get: (s) => { - const path5 = node.path; + const path6 = node.path; let out2 = s; - for (let i2 = 0, n7 = path5.length;i2 < n7; i2++) { - out2 = out2[path5[i2]]; + for (let i2 = 0, n7 = path6.length;i2 < n7; i2++) { + out2 = out2[path6[i2]]; } return out2; }, set: (a, s) => { - const path5 = node.path; + const path6 = node.path; const out2 = cloneShallow(s); let current = out2; let i2 = 0; - for (;i2 < path5.length - 1; i2++) { - const key = path5[i2]; + for (;i2 < path6.length - 1; i2++) { + const key = path6[i2]; current[key] = cloneShallow(current[key]); current = current[key]; } - const finalKey = path5[i2]; + const finalKey = path6[i2]; current[finalKey] = a; return out2; } @@ -53080,18 +53083,18 @@ function* lazyToss(generator, seed, random2, examples) { function produce(producer) { return producer(); } -function pathWalk(path5, initialProducers, shrink) { +function pathWalk(path6, initialProducers, shrink) { const producers = initialProducers; - const segments = path5.split(":").map((text) => +text); + const segments = path6.split(":").map((text) => +text); if (segments.length === 0) return producers.map(produce); if (!segments.every((v2) => !Number.isNaN(v2))) - throw new Error(`Unable to replay, got invalid path=${path5}`); + throw new Error(`Unable to replay, got invalid path=${path6}`); let values6 = producers.drop(segments[0]).map(produce); for (const s of segments.slice(1)) { const valueToShrink = values6.getNthOrLast(0); if (valueToShrink === null) - throw new Error(`Unable to replay, got wrong path=${path5}`); + throw new Error(`Unable to replay, got wrong path=${path6}`); values6 = shrink(valueToShrink).drop(s); } return values6; @@ -55140,9 +55143,9 @@ function assertAcceptableRelations(relations) { } } } -function draftNextProductionState(state2, offset) { - const { producedLinks, toBeProducedEntities } = state2; - const nextIndex = state2.nextIndex + offset; +function draftNextProductionState(state, offset) { + const { producedLinks, toBeProducedEntities } = state; + const nextIndex = state.nextIndex + offset; const newProducedLinks = safeObjectAssign(safeObjectCreate$3(null), producedLinks); function getOrCreateProducedLinksFor(type) { if (newProducedLinks[type] === producedLinks[type]) @@ -55241,7 +55244,7 @@ function buildEntityStepArbitrary(relations, inversedRelations, lastState, offse if (subArbitraries.length === 0) return; return tuple3(...subArbitraries).map((results) => { - const state2 = draftNextProductionState(lastState, offset); + const state = draftNextProductionState(lastState, offset); for (let resultIndex = 0;resultIndex !== results.length; ++resultIndex) { const linkOrLinks = results[resultIndex]; const { name: name2, relation, sentinelLinkIndex } = linkContexts[resultIndex]; @@ -55250,37 +55253,37 @@ function buildEntityStepArbitrary(relations, inversedRelations, lastState, offse for (const link of links) { let newEntityIndexInType; if (link >= sentinelLinkIndex) - newEntityIndexInType = state2.enqueueNewEntity(relations, relation.type); + newEntityIndexInType = state.enqueueNewEntity(relations, relation.type); else newEntityIndexInType = link; safePush(effectiveLinks, newEntityIndexInType); const inversed = safeMapGet(inversedRelations, relation); if (inversed !== undefined) - state2.appendBackReference(relation.type, newEntityIndexInType, inversed.property); + state.appendBackReference(relation.type, newEntityIndexInType, inversed.property); } - state2.setOutboundLink(name2, { + state.setOutboundLink(name2, { type: relation.type, index: linkOrLinks === undefined ? undefined : typeof linkOrLinks === "number" ? effectiveLinks[0] : effectiveLinks }); } - return state2.commit(); + return state.commit(); }); } function onTheFlyLinksForEntityGraph(relations, defaultEntities) { assertAcceptableRelations(relations); const inversedRelations = buildInversedRelationsMapping(relations); - return chainUntil(constant3(buildInitialProductionState(relations, defaultEntities)), (state2) => { - if (state2.nextIndex >= state2.toBeProducedEntities.length) + return chainUntil(constant3(buildInitialProductionState(relations, defaultEntities)), (state) => { + if (state.nextIndex >= state.toBeProducedEntities.length) return; let offset = 0; let next2 = undefined; - while (next2 === undefined && state2.nextIndex + offset < state2.toBeProducedEntities.length) { - next2 = buildEntityStepArbitrary(relations, inversedRelations, state2, offset); + while (next2 === undefined && state.nextIndex + offset < state.toBeProducedEntities.length) { + next2 = buildEntityStepArbitrary(relations, inversedRelations, state, offset); offset += 1; } return next2; - }).map((state2) => { - return state2.producedLinks; + }).map((state) => { + return state.producedLinks; }); } function extractEnumerableKeys(instance2) { @@ -56212,10 +56215,10 @@ function webSegment(constraints = {}) { }); } function segmentsToPathMapper(segments) { - let path5 = ""; + let path6 = ""; for (let index2 = 0;index2 !== segments.length; ++index2) - path5 += "/" + segments[index2]; - return path5; + path6 += "/" + segments[index2]; + return path6; } function segmentsToPathUnmapper(value4) { if (typeof value4 !== "string") @@ -56254,8 +56257,8 @@ function webQueryParameters(constraints = {}) { return buildUriQueryOrFragmentArbitrary(constraints.size); } function partsToUrlMapper(data2) { - const [scheme, authority, path5] = data2; - return `${scheme}://${authority}${path5}${data2[3] === null ? "" : `?${data2[3]}`}${data2[4] === null ? "" : `#${data2[4]}`}`; + const [scheme, authority, path6] = data2; + return `${scheme}://${authority}${path6}${data2[3] === null ? "" : `?${data2[3]}`}${data2[4] === null ? "" : `#${data2[4]}`}`; } function partsToUrlUnmapper(value4) { if (typeof value4 !== "string") @@ -56265,13 +56268,13 @@ function partsToUrlUnmapper(value4) { throw new Error("Incompatible value received"); const scheme = m[1]; const authority = m[2]; - const path5 = m[3]; + const path6 = m[3]; const query = m[4]; const fragments = m[5]; return [ scheme, authority, - path5, + path6, query !== undefined ? query.substring(1) : null, fragments !== undefined ? fragments.substring(1) : null ]; @@ -57884,11 +57887,11 @@ var SharedFootPrint, PreconditionFailure, Nil, nil, safeSymbolIterator$1, Stream } return failures; } - static mergePaths(offsetPath, path5) { + static mergePaths(offsetPath, path6) { if (offsetPath.length === 0) - return path5; + return path6; const offsetItems = offsetPath.split(":"); - const remainingItems = path5.split(":"); + const remainingItems = path6.split(":"); const middle = +offsetItems[offsetItems.length - 1] + +remainingItems[0]; return [ ...offsetItems.slice(0, offsetItems.length - 1), @@ -58288,12 +58291,12 @@ var SharedFootPrint, PreconditionFailure, Nil, nil, safeSymbolIterator$1, Stream }, genericModelRun = (s, cmds, initialValue, runCmd, then) => { return s.then((o) => { const { model, real } = o; - let state2 = initialValue; + let state = initialValue; for (const c of cmds) - state2 = then(state2, () => { + state = then(state, () => { return runCmd(c, model, real); }); - return state2; + return state; }); }, internalModelRun = (s, cmds) => { const then = (_p, c) => c(); @@ -61465,12 +61468,12 @@ var init_fast_check = __esm(() => { } filterOnReplay(itemsRaw) { return itemsRaw.filter((c, idx) => { - const state2 = this.replayPath[this.replayPathPosition + idx]; - if (state2 === undefined) + const state = this.replayPath[this.replayPathPosition + idx]; + if (state === undefined) throw new Error(`Too short replayPath`); - if (!state2 && c.value_.hasRan) + if (!state && c.value_.hasRan) throw new Error(`Mismatch between replayPath and real execution`); - return state2; + return state; }); } filterForShrinkImpl(itemsRaw) { @@ -65463,29 +65466,29 @@ var TypeId31 = "~effect/Sink", endVoid, sinkVariance, SinkProto, isSink = (u) => endUnsafe(queue); return endVoid; }))), fromPubSub2 = (pubsub) => forEachArray((arr) => publishAll(pubsub, arr)), succeed11 = (a, leftovers) => fromEffectEnd(succeed8([a, leftovers])), sync6 = (a) => fromEffect2(sync4(a)), suspend6 = (evaluate2) => fromTransform2((upstream, scope3) => evaluate2().transform(upstream, scope3)), fail12 = (e) => fromEffectEnd(fail8(e)), failSync5 = (evaluate2) => fromEffectEnd(failSync3(evaluate2)), failCause8 = (cause) => fromEffectEnd(failCause5(cause)), failCauseSync5 = (evaluate2) => fromEffectEnd(failCauseSync3(evaluate2)), die7 = (defect) => fromEffectEnd(die5(defect)), never6, ignoreLeftover = (self2) => mapEnd(self2, ([a]) => [a]), drain2, fold = (s, contFn, f) => fromTransform2((upstream) => { - let state2 = s(); + let state = s(); return gen4(function* () { while (true) { const arr = yield* upstream; for (let i2 = 0;i2 < arr.length; i2++) { - state2 = yield* f(state2, arr[i2]); - if (contFn(state2)) + state = yield* f(state, arr[i2]); + if (contFn(state)) continue; - return [state2, i2 + 1 < arr.length ? arr.slice(i2 + 1) : undefined]; + return [state, i2 + 1 < arr.length ? arr.slice(i2 + 1) : undefined]; } } - }).pipe(catchDone(() => succeed8([state2]))); + }).pipe(catchDone(() => succeed8([state]))); }), foldArray = (s, contFn, f) => fromTransform2((upstream) => { - let state2 = s(); + let state = s(); return gen4(function* () { while (true) { const arr = yield* upstream; - state2 = yield* f(state2, arr); - if (contFn(state2)) + state = yield* f(state, arr); + if (contFn(state)) continue; - return [state2]; + return [state]; } - }).pipe(catchDone(() => succeed8([state2]))); + }).pipe(catchDone(() => succeed8([state]))); }), foldUntil = (s, max11, f) => fold(() => [s(), 0], (tuple4) => tuple4[1] < max11, ([output, count], input) => map12(f(output, input), (s2) => [s2, count + 1])).pipe(map22((tuple4) => tuple4[0])), every10 = (predicate) => fold(constTrue, identity, (_2, a) => succeed8(predicate(a))), some14 = (predicate) => fold(constFalse, (b) => !b, (_2, a) => succeed8(predicate(a))), map22, as5, mapInput6, mapInputEffect, mapInputArray, mapInputArrayEffect, mapEnd, transformEffect = (self2, f) => fromTransform2((upstream, scope3) => f(self2.transform(upstream, scope3))), mapEffectEnd, mapEffect2, mapError6, mapLeftover, take9 = (n7) => fromTransform2((upstream) => { const taken = []; if (n7 <= 0) { @@ -65514,15 +65517,15 @@ var TypeId31 = "~effect/Sink", endVoid, sinkVariance, SinkProto, isSink = (u) => disableYield: true }), catchDone(() => succeed8([taken, leftover]))); }), flatMap12, reduceWhile = (initial, predicate, f) => fromTransform2((upstream) => { - let state2 = initial(); + let state = initial(); let leftover = undefined; - if (!predicate(state2)) { - return succeed8([state2]); + if (!predicate(state)) { + return succeed8([state]); } return upstream.pipe(flatMap7((arr) => { for (let i2 = 0;i2 < arr.length; i2++) { - state2 = f(state2, arr[i2]); - if (!predicate(state2)) { + state = f(state, arr[i2]); + if (!predicate(state)) { if (i2 + 1 < arr.length) { leftover = arr.slice(i2 + 1); } @@ -65532,20 +65535,20 @@ var TypeId31 = "~effect/Sink", endVoid, sinkVariance, SinkProto, isSink = (u) => return void_5; }), forever4({ disableYield: true - }), catchDone(() => succeed8([state2, leftover]))); + }), catchDone(() => succeed8([state, leftover]))); }), reduceWhileEffect = (initial, predicate, f) => fromTransform2((upstream) => { - let state2 = initial(); + let state = initial(); let leftover = undefined; - if (!predicate(state2)) { - return succeed8([state2]); + if (!predicate(state)) { + return succeed8([state]); } return upstream.pipe(flatMap7((arr) => { let i2 = 0; return whileLoop2({ while: () => i2 < arr.length, - body: constant(flatMap7(suspend3(() => f(state2, arr[i2++])), (s) => { - state2 = s; - if (!predicate(state2)) { + body: constant(flatMap7(suspend3(() => f(state, arr[i2++])), (s) => { + state = s; + if (!predicate(state)) { if (i2 < arr.length) { leftover = arr.slice(i2); } @@ -65557,50 +65560,50 @@ var TypeId31 = "~effect/Sink", endVoid, sinkVariance, SinkProto, isSink = (u) => }); }), forever4({ disableYield: true - }), catchDone(() => succeed8([state2, leftover]))); + }), catchDone(() => succeed8([state, leftover]))); }), reduceWhileArray = (initial, contFn, f) => fromTransform2((upstream) => { - let state2 = initial(); - if (!contFn(state2)) { - return succeed8([state2]); + let state = initial(); + if (!contFn(state)) { + return succeed8([state]); } return upstream.pipe(flatMap7((arr) => { for (let i2 = 0;i2 < arr.length; i2++) { - state2 = f(state2, arr); - if (!contFn(state2)) { + state = f(state, arr); + if (!contFn(state)) { return done2(); } } return void_5; }), forever4({ disableYield: true - }), catchDone(() => succeed8([state2]))); + }), catchDone(() => succeed8([state]))); }), reduceWhileArrayEffect = (initial, predicate, f) => fromTransform2((upstream) => { - let state2 = initial(); - if (!predicate(state2)) { - return succeed8([state2]); + let state = initial(); + if (!predicate(state)) { + return succeed8([state]); } - return upstream.pipe(flatMap7((arr) => f(state2, arr)), flatMap7((s) => { - state2 = s; - if (!predicate(state2)) { + return upstream.pipe(flatMap7((arr) => f(state, arr)), flatMap7((s) => { + state = s; + if (!predicate(state)) { return done2(); } return void_5; }), forever4({ disableYield: true - }), catchDone(() => succeed8([state2]))); + }), catchDone(() => succeed8([state]))); }), reduce10 = (initial, f) => reduceArray(initial, (s, arr) => { for (let i2 = 0;i2 < arr.length; i2++) { s = f(s, arr[i2]); } return s; }), reduceArray = (initial, f) => fromTransform2((upstream) => { - let state2 = initial(); + let state = initial(); return upstream.pipe(flatMap7((arr) => { - state2 = f(state2, arr); + state = f(state, arr); return void_5; }), forever4({ disableYield: true - }), catchDone(() => succeed8([state2]))); + }), catchDone(() => succeed8([state]))); }), reduceEffect = (initial, f) => reduceWhileEffect(initial, constTrue, f), head_, head4 = () => head_, last_, last4 = () => last_, find = (predicate) => reduceWhile(none2, isNone2, (acc, in_) => predicate(in_) ? some3(in_) : acc), findEffect = (predicate) => reduceWhileEffect(none2, isNone2, (acc, in_) => map12(predicate(in_), (b) => b ? some3(in_) : acc)), sum5, count, collect4 = () => reduceArray(empty3, (s, arr) => { s.push(...arr); return s; @@ -65910,9 +65913,9 @@ var init_RcMap = __esm(() => { if (self2.state._tag === "Closed") { return interrupt5; } - const state2 = self2.state; + const state = self2.state; const parent = getCurrent(); - const o = get5(state2.map, key); + const o = get5(state.map, key); let entry; if (o._tag === "Some") { entry = o.value; @@ -65930,7 +65933,7 @@ var init_RcMap = __esm(() => { refCount: 1 }; entry.finalizer = release3(self2, key, entry); - set4(state2.map, key, entry); + set4(state.map, key, entry); const services3 = new Map(self2.services.mapUnsafe); parent.services.mapUnsafe.forEach((value4, key2) => { services3.set(key2, value4); @@ -65996,7 +65999,7 @@ var TypeId33 = "~effect/RcRef", stateEmpty, stateClosed, variance2, RcRefImpl, m case "Empty": { const scope3 = makeUnsafe3(); return self2.semaphore.withPermits(1)(restore(provideServices2(self2.acquire, add(self2.services, Scope, scope3))).pipe(map12((value4) => { - const state2 = { + const state = { _tag: "Acquired", value: value4, scope: scope3, @@ -66004,8 +66007,8 @@ var TypeId33 = "~effect/RcRef", stateEmpty, stateClosed, variance2, RcRefImpl, m refCount: 1, invalidated: false }; - self2.state = state2; - return state2; + self2.state = state; + return state; }))); } } @@ -66015,14 +66018,14 @@ var TypeId33 = "~effect/RcRef", stateEmpty, stateClosed, variance2, RcRefImpl, m if (self2.state._tag !== "Acquired") { return void_5; } - const state2 = self2.state; + const state = self2.state; self2.state = stateEmpty; - state2.invalidated = true; - if (state2.refCount > 0) { + state.invalidated = true; + if (state.refCount > 0) { return void_5; } - state2.fiber?.interruptUnsafe(); - return close(state2.scope, void_4); + state.fiber?.interruptUnsafe(); + return close(state.scope, void_4); })); }; var init_rcRef = __esm(() => { @@ -66065,34 +66068,34 @@ var init_rcRef = __esm(() => { }; get14 = /* @__PURE__ */ fnUntraced2(function* (self_) { const self2 = self_; - const state2 = yield* getState(self2); + const state = yield* getState(self2); const scope3 = yield* scope2; const isFinite4 = self2.idleTimeToLive !== undefined && isFinite2(self2.idleTimeToLive); yield* addFinalizerExit(scope3, () => { - state2.refCount--; - if (state2.refCount > 0) { + state.refCount--; + if (state.refCount > 0) { return void_5; } if (self2.idleTimeToLive === undefined) { self2.state = stateEmpty; - return close(state2.scope, void_4); - } else if (state2.invalidated) { - return close(state2.scope, void_4); + return close(state.scope, void_4); + } else if (state.invalidated) { + return close(state.scope, void_4); } else if (!isFinite4) { return void_5; } - state2.fiber = sleep2(self2.idleTimeToLive).pipe(flatMap7(() => { + state.fiber = sleep2(self2.idleTimeToLive).pipe(flatMap7(() => { if (self2.state._tag === "Acquired" && self2.state.refCount === 0) { self2.state = stateEmpty; - return close(state2.scope, void_4); + return close(state.scope, void_4); } return void_5; }), ensuring2(sync4(() => { - state2.fiber = undefined; + state.fiber = undefined; })), runForkWith2(self2.services), runIn(self2.scope)); return void_5; }); - return state2.value; + return state.value; }); }); @@ -66386,24 +66389,24 @@ var TypeId34 = "~effect/Stream", isStream = (u) => hasProperty(u, TypeId34), Def }, { bufferSize: typeof options2 === "object" ? options2.bufferSize : undefined }), unfold4 = (s, f) => fromPull2(sync4(() => { - let state2 = s; - return flatMap7(suspend3(() => f(state2)), (next2) => { + let state = s; + return flatMap7(suspend3(() => f(state)), (next2) => { if (next2 === undefined) return done2(); - state2 = next2[1]; + state = next2[1]; return succeed8(of2(next2[0])); }); })), paginate = (s, f) => fromPull2(sync4(() => { - let state2 = s; + let state = s; let done4 = false; return suspend3(function loop() { if (done4) return done2(); - return flatMap7(f(state2), ([a, s2]) => { + return flatMap7(f(state), ([a, s2]) => { if (isNone2(s2)) { done4 = true; } else { - state2 = s2.value; + state = s2.value; } if (!isReadonlyArrayNonEmpty(a)) return loop(); @@ -66447,8 +66450,8 @@ var TypeId34 = "~effect/Stream", isStream = (u) => hasProperty(u, TypeId34), Def } return [acc, pairs]; }, { - onHalt(state2) { - return state2._tag === "Some" ? [[state2.value, none2()]] : []; + onHalt(state) { + return state._tag === "Some" ? [[state.value, none2()]] : []; } }), zipWithPrevious = (self2) => mapAccumArray(self2, none2, (acc, arr) => { const pairs = empty3(); @@ -66808,24 +66811,24 @@ var init_Stream = __esm(() => { const fiberRight = yield* forkIn2(pullRight, scope3); return yield* joinAll([fiberLeft, fiberRight]); }); - let state2 = { + let state = { _tag: "PullBoth" }; const pull = gen4(function* () { - const [left3, right3] = state2._tag === "PullBoth" ? yield* pullBoth : state2._tag === "PullLeft" ? [yield* pullLeft, state2.rightArray] : [state2.leftArray, yield* pullRight]; + const [left3, right3] = state._tag === "PullBoth" ? yield* pullBoth : state._tag === "PullLeft" ? [yield* pullLeft, state.rightArray] : [state.leftArray, yield* pullRight]; const result4 = f(left3, right3); if (isReadonlyArrayNonEmpty(result4[1])) { - state2 = { + state = { _tag: "PullRight", leftArray: result4[1] }; } else if (isReadonlyArrayNonEmpty(result4[2])) { - state2 = { + state = { _tag: "PullLeft", rightArray: result4[2] }; } else { - state2 = { + state = { _tag: "PullBoth" }; } @@ -67255,56 +67258,56 @@ var init_Stream = __esm(() => { })); combine7 = /* @__PURE__ */ dual(4, (self2, that, s, f) => combine6(flattenArray(self2.channel), flattenArray(that.channel), s, f).pipe(map14(of2), fromChannel3)); combineArray = /* @__PURE__ */ dual(4, (self2, that, s, f) => fromChannel3(combine6(self2.channel, that.channel, s, f))); - mapAccum4 = /* @__PURE__ */ dual((args3) => isStream(args3[0]), (self2, initial, f, options2) => fromChannel3(mapAccum3(self2.channel, initial, (state2, arr) => { + mapAccum4 = /* @__PURE__ */ dual((args3) => isStream(args3[0]), (self2, initial, f, options2) => fromChannel3(mapAccum3(self2.channel, initial, (state, arr) => { const acc = empty3(); for (let index2 = 0;index2 < arr.length; index2++) { - const [newState, values6] = f(state2, arr[index2]); - state2 = newState; + const [newState, values6] = f(state, arr[index2]); + state = newState; acc.push(...values6); } - return [state2, isArrayNonEmpty2(acc) ? of2(acc) : emptyArr]; + return [state, isArrayNonEmpty2(acc) ? of2(acc) : emptyArr]; }, options2?.onHalt ? { - onHalt(state2) { - const arr = options2.onHalt(state2); + onHalt(state) { + const arr = options2.onHalt(state); return isReadonlyArrayNonEmpty(arr) ? of2(arr) : emptyArr; } } : undefined))); - mapAccumArray = /* @__PURE__ */ dual((args3) => isStream(args3[0]), (self2, initial, f, options2) => fromChannel3(mapAccum3(self2.channel, initial, (state2, arr) => { - const [newState, values6] = f(state2, arr); - state2 = newState; - return [state2, isReadonlyArrayNonEmpty(values6) ? of2(values6) : emptyArr]; + mapAccumArray = /* @__PURE__ */ dual((args3) => isStream(args3[0]), (self2, initial, f, options2) => fromChannel3(mapAccum3(self2.channel, initial, (state, arr) => { + const [newState, values6] = f(state, arr); + state = newState; + return [state, isReadonlyArrayNonEmpty(values6) ? of2(values6) : emptyArr]; }, options2?.onHalt ? { - onHalt(state2) { - const arr = options2.onHalt(state2); + onHalt(state) { + const arr = options2.onHalt(state); return isReadonlyArrayNonEmpty(arr) ? of2(arr) : emptyArr; } } : undefined))); emptyArr = /* @__PURE__ */ empty3(); - mapAccumEffect = /* @__PURE__ */ dual((args3) => isStream(args3[0]), (self2, initial, f, options2) => self2.channel.pipe(flattenArray, mapAccum3(initial, (state2, a) => map12(f(state2, a), ([state3, values6]) => [state3, isReadonlyArrayNonEmpty(values6) ? of2(values6) : empty3()]), options2?.onHalt ? { - onHalt(state2) { - const arr = options2.onHalt(state2); + mapAccumEffect = /* @__PURE__ */ dual((args3) => isStream(args3[0]), (self2, initial, f, options2) => self2.channel.pipe(flattenArray, mapAccum3(initial, (state, a) => map12(f(state, a), ([state2, values6]) => [state2, isReadonlyArrayNonEmpty(values6) ? of2(values6) : empty3()]), options2?.onHalt ? { + onHalt(state) { + const arr = options2.onHalt(state); return isReadonlyArrayNonEmpty(arr) ? of2(arr) : emptyArr; } } : undefined), fromChannel3)); - mapAccumArrayEffect = /* @__PURE__ */ dual((args3) => isStream(args3), (self2, initial, f, options2) => self2.channel.pipe(mapAccum3(initial, (state2, a) => map12(f(state2, a), ([state3, values6]) => [state3, isReadonlyArrayNonEmpty(values6) ? of2(values6) : emptyArr]), options2?.onHalt ? { - onHalt(state2) { - const arr = options2.onHalt(state2); + mapAccumArrayEffect = /* @__PURE__ */ dual((args3) => isStream(args3), (self2, initial, f, options2) => self2.channel.pipe(mapAccum3(initial, (state, a) => map12(f(state, a), ([state2, values6]) => [state2, isReadonlyArrayNonEmpty(values6) ? of2(values6) : emptyArr]), options2?.onHalt ? { + onHalt(state) { + const arr = options2.onHalt(state); return isReadonlyArrayNonEmpty(arr) ? of2(arr) : emptyArr; } } : undefined), fromChannel3)); scan4 = /* @__PURE__ */ dual(3, (self2, initial, f) => suspend7(() => { let isFirst = true; - return fromChannel3(mapAccum3(self2.channel, constant(initial), (state2, arr) => { + return fromChannel3(mapAccum3(self2.channel, constant(initial), (state, arr) => { const states = empty3(); if (isFirst) { isFirst = false; - states.push(state2); + states.push(state); } for (let index2 = 0;index2 < arr.length; index2++) { - state2 = f(state2, arr[index2]); - states.push(state2); + state = f(state, arr[index2]); + states.push(state); } - return [state2, of2(states)]; + return [state, of2(states)]; })); })); scanEffect2 = /* @__PURE__ */ dual(3, (self2, initial, f) => self2.channel.pipe(flattenArray, scanEffect(initial, f), map14(of2), fromChannel3)); @@ -67781,8 +67784,8 @@ __export(exports_FileSystem, { var TypeId35 = "~effect/platform/FileSystem", Size = (bytes) => typeof bytes === "bigint" ? bytes : BigInt(bytes), KiB = (n7) => Size(n7 * 1024), MiB = (n7) => Size(n7 * 1024 * 1024), GiB = (n7) => Size(n7 * 1024 * 1024 * 1024), TiB = (n7) => Size(n7 * 1024 * 1024 * 1024 * 1024), bigint1024, bigintPiB, PiB = (n7) => Size(BigInt(n7) * bigintPiB), FileSystem, make43 = (impl) => FileSystem.of({ ...impl, [TypeId35]: TypeId35, - exists: (path5) => pipe2(impl.access(path5), as4(true), catchTag3("PlatformError", (e) => e.reason._tag === "NotFound" ? succeed8(false) : fail8(e))), - readFileString: (path5, encoding) => flatMap7(impl.readFile(path5), (_2) => try_4({ + exists: (path6) => pipe2(impl.access(path6), as4(true), catchTag3("PlatformError", (e) => e.reason._tag === "NotFound" ? succeed8(false) : fail8(e))), + readFileString: (path6, encoding) => flatMap7(impl.readFile(path6), (_2) => try_4({ try: () => new TextDecoder(encoding).decode(_2), catch: (cause) => badArgument({ module: "FileSystem", @@ -67791,8 +67794,8 @@ var TypeId35 = "~effect/platform/FileSystem", Size = (bytes) => typeof bytes === cause }) })), - stream: fnUntraced2(function* (path5, options2) { - const file2 = yield* impl.open(path5, { + stream: fnUntraced2(function* (path6, options2) { + const file2 = yield* impl.open(path6, { flag: "r" }); if (options2?.offset) { @@ -67815,11 +67818,11 @@ var TypeId35 = "~effect/platform/FileSystem", Size = (bytes) => typeof bytes === } })))); }, unwrap4), - sink: (path5, options2) => pipe2(impl.open(path5, { + sink: (path6, options2) => pipe2(impl.open(path6, { flag: "w", ...options2 }), map12((file2) => forEach9((_2) => file2.writeAll(_2))), unwrap3), - writeFileString: (path5, data2, options2) => flatMap7(try_4({ + writeFileString: (path6, data2, options2) => flatMap7(try_4({ try: () => new TextEncoder().encode(data2), catch: (cause) => badArgument({ module: "FileSystem", @@ -67827,35 +67830,35 @@ var TypeId35 = "~effect/platform/FileSystem", Size = (bytes) => typeof bytes === description: "could not encode string", cause }) - }), (_2) => impl.writeFile(path5, _2, options2)) -}), notFound = (method, path5) => systemError({ + }), (_2) => impl.writeFile(path6, _2, options2)) +}), notFound = (method, path6) => systemError({ module: "FileSystem", method, _tag: "NotFound", description: "No such file or directory", - pathOrDescriptor: path5 + pathOrDescriptor: path6 }), makeNoop = (fileSystem) => FileSystem.of({ [TypeId35]: TypeId35, - access(path5) { - return fail8(notFound("access", path5)); + access(path6) { + return fail8(notFound("access", path6)); }, - chmod(path5) { - return fail8(notFound("chmod", path5)); + chmod(path6) { + return fail8(notFound("chmod", path6)); }, - chown(path5) { - return fail8(notFound("chown", path5)); + chown(path6) { + return fail8(notFound("chown", path6)); }, - copy(path5) { - return fail8(notFound("copy", path5)); + copy(path6) { + return fail8(notFound("copy", path6)); }, - copyFile(path5) { - return fail8(notFound("copyFile", path5)); + copyFile(path6) { + return fail8(notFound("copyFile", path6)); }, exists() { return succeed8(false); }, - link(path5) { - return fail8(notFound("link", path5)); + link(path6) { + return fail8(notFound("link", path6)); }, makeDirectory() { return die5("not implemented"); @@ -67872,23 +67875,23 @@ var TypeId35 = "~effect/platform/FileSystem", Size = (bytes) => typeof bytes === makeTempFileScoped() { return die5("not implemented"); }, - open(path5) { - return fail8(notFound("open", path5)); + open(path6) { + return fail8(notFound("open", path6)); }, - readDirectory(path5) { - return fail8(notFound("readDirectory", path5)); + readDirectory(path6) { + return fail8(notFound("readDirectory", path6)); }, - readFile(path5) { - return fail8(notFound("readFile", path5)); + readFile(path6) { + return fail8(notFound("readFile", path6)); }, - readFileString(path5) { - return fail8(notFound("readFileString", path5)); + readFileString(path6) { + return fail8(notFound("readFileString", path6)); }, - readLink(path5) { - return fail8(notFound("readLink", path5)); + readLink(path6) { + return fail8(notFound("readLink", path6)); }, - realPath(path5) { - return fail8(notFound("realPath", path5)); + realPath(path6) { + return fail8(notFound("realPath", path6)); }, remove() { return void_5; @@ -67896,32 +67899,32 @@ var TypeId35 = "~effect/platform/FileSystem", Size = (bytes) => typeof bytes === rename(oldPath) { return fail8(notFound("rename", oldPath)); }, - sink(path5) { - return fail12(notFound("sink", path5)); + sink(path6) { + return fail12(notFound("sink", path6)); }, - stat(path5) { - return fail8(notFound("stat", path5)); + stat(path6) { + return fail8(notFound("stat", path6)); }, - stream(path5) { - return fail13(notFound("stream", path5)); + stream(path6) { + return fail13(notFound("stream", path6)); }, symlink(fromPath) { return fail8(notFound("symlink", fromPath)); }, - truncate(path5) { - return fail8(notFound("truncate", path5)); + truncate(path6) { + return fail8(notFound("truncate", path6)); }, - utimes(path5) { - return fail8(notFound("utimes", path5)); + utimes(path6) { + return fail8(notFound("utimes", path6)); }, - watch(path5) { - return fail13(notFound("watch", path5)); + watch(path6) { + return fail13(notFound("watch", path6)); }, - writeFile(path5) { - return fail8(notFound("writeFile", path5)); + writeFile(path6) { + return fail8(notFound("writeFile", path6)); }, - writeFileString(path5) { - return fail8(notFound("writeFileString", path5)); + writeFileString(path6) { + return fail8(notFound("writeFileString", path6)); }, ...fileSystem }), layerNoop = (fileSystem) => succeed6(FileSystem)(makeNoop(fileSystem)), FileTypeId = "~effect/platform/FileSystem/File", isFile = (u) => hasProperty(u, FileTypeId), FileDescriptor, WatchBackend; @@ -67953,15 +67956,15 @@ __export(exports_Path, { TypeId: () => TypeId36, Path: () => Path }); -function normalizeStringPosix(path5, allowAboveRoot) { +function normalizeStringPosix(path6, allowAboveRoot) { let res = ""; let lastSegmentLength = 0; let lastSlash = -1; let dots = 0; let code; - for (let i2 = 0;i2 <= path5.length; ++i2) { - if (i2 < path5.length) { - code = path5.charCodeAt(i2); + for (let i2 = 0;i2 <= path6.length; ++i2) { + if (i2 < path6.length) { + code = path6.charCodeAt(i2); } else if (code === 47) { break; } else { @@ -68002,9 +68005,9 @@ function normalizeStringPosix(path5, allowAboveRoot) { } } else { if (res.length > 0) { - res += "/" + path5.slice(lastSlash + 1, i2); + res += "/" + path6.slice(lastSlash + 1, i2); } else { - res = path5.slice(lastSlash + 1, i2); + res = path6.slice(lastSlash + 1, i2); } lastSegmentLength = i2 - lastSlash - 1; } @@ -68092,21 +68095,21 @@ var TypeId36 = "~effect/platform/Path", Path, resolve7 = function resolve8() { let resolvedAbsolute = false; let cwd = undefined; for (let i2 = arguments.length - 1;i2 >= -1 && !resolvedAbsolute; i2--) { - let path5; + let path6; if (i2 >= 0) { - path5 = arguments[i2]; + path6 = arguments[i2]; } else { const process2 = globalThis.process; if (cwd === undefined && "process" in globalThis && typeof process2 === "object" && process2 !== null && typeof process2.cwd === "function") { cwd = process2.cwd(); } - path5 = cwd; + path6 = cwd; } - if (path5.length === 0) { + if (path6.length === 0) { continue; } - resolvedPath = path5 + "/" + resolvedPath; - resolvedAbsolute = path5.charCodeAt(0) === 47; + resolvedPath = path6 + "/" + resolvedPath; + resolvedAbsolute = path6.charCodeAt(0) === 47; } resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute); if (resolvedAbsolute) { @@ -68136,22 +68139,22 @@ var init_Path = __esm(() => { posixImpl = /* @__PURE__ */ Path.of({ [TypeId36]: TypeId36, resolve: resolve7, - normalize(path5) { - if (path5.length === 0) + normalize(path6) { + if (path6.length === 0) return "."; - const isAbsolute = path5.charCodeAt(0) === 47; - const trailingSeparator = path5.charCodeAt(path5.length - 1) === 47; - path5 = normalizeStringPosix(path5, !isAbsolute); - if (path5.length === 0 && !isAbsolute) - path5 = "."; - if (path5.length > 0 && trailingSeparator) - path5 += "/"; + const isAbsolute = path6.charCodeAt(0) === 47; + const trailingSeparator = path6.charCodeAt(path6.length - 1) === 47; + path6 = normalizeStringPosix(path6, !isAbsolute); + if (path6.length === 0 && !isAbsolute) + path6 = "."; + if (path6.length > 0 && trailingSeparator) + path6 += "/"; if (isAbsolute) - return "/" + path5; - return path5; + return "/" + path6; + return path6; }, - isAbsolute(path5) { - return path5.length > 0 && path5.charCodeAt(0) === 47; + isAbsolute(path6) { + return path6.length > 0 && path6.charCodeAt(0) === 47; }, join() { if (arguments.length === 0) { @@ -68244,15 +68247,15 @@ var init_Path = __esm(() => { return to.slice(toStart); } }, - dirname(path5) { - if (path5.length === 0) + dirname(path6) { + if (path6.length === 0) return "."; - let code = path5.charCodeAt(0); + let code = path6.charCodeAt(0); const hasRoot = code === 47; let end3 = -1; let matchedSlash = true; - for (let i2 = path5.length - 1;i2 >= 1; --i2) { - code = path5.charCodeAt(i2); + for (let i2 = path6.length - 1;i2 >= 1; --i2) { + code = path6.charCodeAt(i2); if (code === 47) { if (!matchedSlash) { end3 = i2; @@ -68266,20 +68269,20 @@ var init_Path = __esm(() => { return hasRoot ? "/" : "."; if (hasRoot && end3 === 1) return "//"; - return path5.slice(0, end3); + return path6.slice(0, end3); }, - basename(path5, ext2) { + basename(path6, ext2) { let start2 = 0; let end3 = -1; let matchedSlash = true; let i2; - if (ext2 !== undefined && ext2.length > 0 && ext2.length <= path5.length) { - if (ext2.length === path5.length && ext2 === path5) + if (ext2 !== undefined && ext2.length > 0 && ext2.length <= path6.length) { + if (ext2.length === path6.length && ext2 === path6) return ""; let extIdx = ext2.length - 1; let firstNonSlashEnd = -1; - for (i2 = path5.length - 1;i2 >= 0; --i2) { - const code = path5.charCodeAt(i2); + for (i2 = path6.length - 1;i2 >= 0; --i2) { + const code = path6.charCodeAt(i2); if (code === 47) { if (!matchedSlash) { start2 = i2 + 1; @@ -68305,11 +68308,11 @@ var init_Path = __esm(() => { if (start2 === end3) end3 = firstNonSlashEnd; else if (end3 === -1) - end3 = path5.length; - return path5.slice(start2, end3); + end3 = path6.length; + return path6.slice(start2, end3); } else { - for (i2 = path5.length - 1;i2 >= 0; --i2) { - if (path5.charCodeAt(i2) === 47) { + for (i2 = path6.length - 1;i2 >= 0; --i2) { + if (path6.charCodeAt(i2) === 47) { if (!matchedSlash) { start2 = i2 + 1; break; @@ -68321,17 +68324,17 @@ var init_Path = __esm(() => { } if (end3 === -1) return ""; - return path5.slice(start2, end3); + return path6.slice(start2, end3); } }, - extname(path5) { + extname(path6) { let startDot = -1; let startPart = 0; let end3 = -1; let matchedSlash = true; let preDotState = 0; - for (let i2 = path5.length - 1;i2 >= 0; --i2) { - const code = path5.charCodeAt(i2); + for (let i2 = path6.length - 1;i2 >= 0; --i2) { + const code = path6.charCodeAt(i2); if (code === 47) { if (!matchedSlash) { startPart = i2 + 1; @@ -68356,7 +68359,7 @@ var init_Path = __esm(() => { if (startDot === -1 || end3 === -1 || preDotState === 0 || preDotState === 1 && startDot === end3 - 1 && startDot === startPart + 1) { return ""; } - return path5.slice(startDot, end3); + return path6.slice(startDot, end3); }, format: function format8(pathObject) { if (pathObject === null || typeof pathObject !== "object") { @@ -68364,7 +68367,7 @@ var init_Path = __esm(() => { } return _format("/", pathObject); }, - parse(path5) { + parse(path6) { const ret = { root: "", dir: "", @@ -68372,9 +68375,9 @@ var init_Path = __esm(() => { ext: "", name: "" }; - if (path5.length === 0) + if (path6.length === 0) return ret; - let code = path5.charCodeAt(0); + let code = path6.charCodeAt(0); const isAbsolute = code === 47; let start2; if (isAbsolute) { @@ -68387,10 +68390,10 @@ var init_Path = __esm(() => { let startPart = 0; let end3 = -1; let matchedSlash = true; - let i2 = path5.length - 1; + let i2 = path6.length - 1; let preDotState = 0; for (;i2 >= start2; --i2) { - code = path5.charCodeAt(i2); + code = path6.charCodeAt(i2); if (code === 47) { if (!matchedSlash) { startPart = i2 + 1; @@ -68414,22 +68417,22 @@ var init_Path = __esm(() => { if (startDot === -1 || end3 === -1 || preDotState === 0 || preDotState === 1 && startDot === end3 - 1 && startDot === startPart + 1) { if (end3 !== -1) { if (startPart === 0 && isAbsolute) - ret.base = ret.name = path5.slice(1, end3); + ret.base = ret.name = path6.slice(1, end3); else - ret.base = ret.name = path5.slice(startPart, end3); + ret.base = ret.name = path6.slice(startPart, end3); } } else { if (startPart === 0 && isAbsolute) { - ret.name = path5.slice(1, startDot); - ret.base = path5.slice(1, end3); + ret.name = path6.slice(1, startDot); + ret.base = path6.slice(1, end3); } else { - ret.name = path5.slice(startPart, startDot); - ret.base = path5.slice(startPart, end3); + ret.name = path6.slice(startPart, startDot); + ret.base = path6.slice(startPart, end3); } - ret.ext = path5.slice(startDot, end3); + ret.ext = path6.slice(startDot, end3); } if (startPart > 0) - ret.dir = path5.slice(0, startPart - 1); + ret.dir = path6.slice(0, startPart - 1); else if (isAbsolute) ret.dir = "/"; return ret; @@ -68488,21 +68491,21 @@ function make44(get16, mapInput7, prefix) { self2.get = get16; self2.mapInput = mapInput7; self2.prefix = prefix; - self2.load = (path5) => { + self2.load = (path6) => { if (mapInput7) - path5 = mapInput7(path5); + path6 = mapInput7(path6); if (prefix) - path5 = [...prefix, ...path5]; - return get16(path5); + path6 = [...prefix, ...path6]; + return get16(path6); }; return self2; } function fromUnknown(root) { - return make44((path5) => succeed8(nodeAtJson(root, path5))); + return make44((path6) => succeed8(nodeAtJson(root, path6))); } -function nodeAtJson(root, path5) { +function nodeAtJson(root, path6) { let cur = root; - for (const seg of path5) { + for (const seg of path6) { if (cur === null || cur === undefined) return; if (Array.isArray(cur)) { @@ -68544,7 +68547,7 @@ function fromEnv(options2) { ...import.meta?.env }; const trie = buildEnvTrie(env3); - return make44((path5) => succeed8(nodeAtEnv(trie, env3, path5))); + return make44((path6) => succeed8(nodeAtEnv(trie, env3, path6))); } function buildEnvTrie(env3) { const root = {}; @@ -68561,10 +68564,10 @@ function buildEnvTrie(env3) { } return root; } -function nodeAtEnv(trie, env3, path5) { - const key = path5.map(String).join("_"); +function nodeAtEnv(trie, env3, path6) { + const key = path6.map(String).join("_"); const leafValue = env3[key]; - const trieNode = trieNodeAt(trie, path5); + const trieNode = trieNodeAt(trie, path6); const children = trieNode?.children ? Object.keys(trieNode.children) : []; if (children.length === 0) { return leafValue === undefined ? undefined : makeValue(leafValue); @@ -68576,11 +68579,11 @@ function nodeAtEnv(trie, env3, path5) { } return makeRecord(new Set(children), leafValue); } -function trieNodeAt(root, path5) { - if (path5.length === 0) +function trieNodeAt(root, path6) { + if (path6.length === 0) return root; let node = root; - for (const seg of path5) { + for (const seg of path6) { node = node?.children?.[String(seg)]; if (!node) return; @@ -68670,14 +68673,14 @@ var init_ConfigProvider = __esm(() => { }; } }; - orElse4 = /* @__PURE__ */ dual(2, (self2, that) => make44((path5) => flatMap7(self2.get(path5), (node) => node ? succeed8(node) : that.get(path5)))); + orElse4 = /* @__PURE__ */ dual(2, (self2, that) => make44((path6) => flatMap7(self2.get(path6), (node) => node ? succeed8(node) : that.get(path6)))); mapInput7 = /* @__PURE__ */ dual(2, (self2, f) => { return make44(self2.get, self2.mapInput ? flow(self2.mapInput, f) : f, self2.prefix ? f(self2.prefix) : undefined); }); - constantCase2 = /* @__PURE__ */ mapInput7((path5) => path5.map((seg) => typeof seg === "number" ? seg : constantCase(seg))); + constantCase2 = /* @__PURE__ */ mapInput7((path6) => path6.map((seg) => typeof seg === "number" ? seg : constantCase(seg))); nested = /* @__PURE__ */ dual(2, (self2, prefix) => { - const path5 = typeof prefix === "string" ? [prefix] : prefix; - return make44(self2.get, self2.mapInput, self2.prefix ? [...self2.prefix, ...path5] : path5); + const path6 = typeof prefix === "string" ? [prefix] : prefix; + return make44(self2.get, self2.mapInput, self2.prefix ? [...self2.prefix, ...path6] : path6); }); NUMERIC_INDEX = /^(0|[1-9][0-9]*)$/; DOT_ENV_LINE = /(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg; @@ -68692,15 +68695,15 @@ var init_ConfigProvider = __esm(() => { const platformPath = yield* Path; const fs5 = yield* FileSystem; const rootPath = options2?.rootPath ?? "/"; - return make44((path5) => { - const fullPath = platformPath.join(rootPath, ...path5.map(String)); + return make44((path6) => { + const fullPath = platformPath.join(rootPath, ...path6.map(String)); const asFile = fs5.readFileString(fullPath).pipe(map12((content) => makeValue(content.trim()))); const asDirectory = fs5.readDirectory(fullPath).pipe(map12((entries5) => { const keys8 = entries5.map((e) => typeof e === "string" ? platformPath.basename(e) : format3(e?.name ?? "")); return makeRecord(new Set(keys8)); })); return asFile.pipe(catch_3(() => asDirectory), mapError4((cause) => new SourceError({ - message: `Failed to read file at ${platformPath.join(rootPath, ...path5.map(String))}`, + message: `Failed to read file at ${platformPath.join(rootPath, ...path6.map(String))}`, cause }))); }); @@ -68797,9 +68800,9 @@ function make45(parse9) { function all6(arg) { const configs = Array.isArray(arg) ? arg : (Symbol.iterator in arg) ? [...arg] : arg; if (Array.isArray(configs)) { - return make45((provider) => all4(configs.map((config3) => config3.parse(provider)))); + return make45((provider) => all4(configs.map((config2) => config2.parse(provider)))); } else { - return make45((provider) => all4(map6(configs, (config3) => config3.parse(provider)))); + return make45((provider) => all4(map6(configs, (config2) => config2.parse(provider)))); } } function isMissingDataOnly(issue2) { @@ -68825,14 +68828,14 @@ function isMissingDataOnly(issue2) { return issue2.issues.every(isMissingDataOnly); } } -function schema(codec2, path5) { +function schema(codec2, path6) { const codecStringTree = toCodecStringTree(codec2); const decodeUnknownEffect3 = decodeUnknownEffect(codecStringTree); const codecStringTreeEncoded = toEncoded(codecStringTree.ast); - const defaultPath = typeof path5 === "string" ? [path5] : path5 ?? []; + const defaultPath = typeof path6 === "string" ? [path6] : path6 ?? []; return make45((provider) => { - const path6 = provider.prefix ? [...provider.prefix, ...defaultPath] : defaultPath; - return recur5(codecStringTreeEncoded, provider, defaultPath).pipe(flatMapEager2((tree) => decodeUnknownEffect3(tree).pipe(mapErrorEager2((issue2) => new SchemaError(path6.length > 0 ? new Pointer(path6, issue2) : issue2)))), mapErrorEager2((cause) => new ConfigError(cause))); + const path7 = provider.prefix ? [...provider.prefix, ...defaultPath] : defaultPath; + return recur5(codecStringTreeEncoded, provider, defaultPath).pipe(flatMapEager2((tree) => decodeUnknownEffect3(tree).pipe(mapErrorEager2((issue2) => new SchemaError(path7.length > 0 ? new Pointer(path7, issue2) : issue2)))), mapErrorEager2((cause) => new ConfigError(cause))); }); } function fail14(err2) { @@ -68885,7 +68888,7 @@ var TypeId37 = "~effect/Config", isConfig = (u) => hasProperty(u, TypeId37), Pro return wrapped; return make45((provider) => { const entries5 = Object.entries(wrapped); - const configs = entries5.map(([key, config3]) => unwrap5(config3).parse(provider).pipe(map12((value4) => [key, value4]))); + const configs = entries5.map(([key, config2]) => unwrap5(config2).parse(provider).pipe(map12((value4) => [key, value4]))); return all4(configs).pipe(map12(Object.fromEntries)); }); }, dump2, recur5, TrueValues, FalseValues, Boolean8, Duration2, Port, LogLevel, Record4 = (key, value4, options2) => { @@ -68942,8 +68945,8 @@ var init_Config = __esm(() => { return fail14(err2.cause); }); }); - dump2 = /* @__PURE__ */ fnUntraced2(function* (provider, path5) { - const stat = yield* provider.load(path5); + dump2 = /* @__PURE__ */ fnUntraced2(function* (provider, path6) { + const stat = yield* provider.load(path6); if (stat === undefined) return; switch (stat._tag) { @@ -68954,7 +68957,7 @@ var init_Config = __esm(() => { return stat.value; const out2 = {}; for (const key of stat.keys) { - const child = yield* dump2(provider, [...path5, key]); + const child = yield* dump2(provider, [...path6, key]); if (child !== undefined) out2[key] = child; } @@ -68965,32 +68968,32 @@ var init_Config = __esm(() => { return stat.value; const out2 = []; for (let i2 = 0;i2 < stat.length; i2++) { - out2.push(yield* dump2(provider, [...path5, i2])); + out2.push(yield* dump2(provider, [...path6, i2])); } return out2; } } }); - recur5 = /* @__PURE__ */ fnUntraced2(function* (ast, provider, path5) { + recur5 = /* @__PURE__ */ fnUntraced2(function* (ast, provider, path6) { switch (ast._tag) { case "Objects": { const out2 = {}; for (const ps2 of ast.propertySignatures) { const name2 = ps2.name; if (typeof name2 === "string") { - const value4 = yield* recur5(ps2.type, provider, [...path5, name2]); + const value4 = yield* recur5(ps2.type, provider, [...path6, name2]); if (value4 !== undefined) out2[name2] = value4; } } if (ast.indexSignatures.length > 0) { - const stat = yield* provider.load(path5); + const stat = yield* provider.load(path6); if (stat && stat._tag === "Record") { for (const is4 of ast.indexSignatures) { const matches = _is(is4.parameter); for (const key of stat.keys) { if (!Object.hasOwn(out2, key) && matches(key)) { - const value4 = yield* recur5(is4.type, provider, [...path5, key]); + const value4 = yield* recur5(is4.type, provider, [...path6, key]); if (value4 !== undefined) out2[key] = value4; } @@ -69001,21 +69004,21 @@ var init_Config = __esm(() => { return out2; } case "Arrays": { - const stat = yield* provider.load(path5); + const stat = yield* provider.load(path6); if (stat && stat._tag === "Value") return stat.value; const out2 = []; for (let i2 = 0;i2 < ast.elements.length; i2++) { - out2.push(yield* recur5(ast.elements[i2], provider, [...path5, i2])); + out2.push(yield* recur5(ast.elements[i2], provider, [...path6, i2])); } return out2; } case "Union": - return yield* dump2(provider, path5); + return yield* dump2(provider, path6); case "Suspend": - return yield* recur5(ast.thunk(), provider, path5); + return yield* recur5(ast.thunk(), provider, path6); default: { - const stat = yield* provider.load(path5); + const stat = yield* provider.load(path6); if (stat === undefined) return; if (stat._tag === "Value") @@ -69249,13 +69252,13 @@ var TypeId39 = "~effect/FiberHandle", isFiberHandle = (u) => hasProperty(u, Type self2.deferred = makeUnsafe2(); return self2; }, make47 = () => acquireRelease2(sync4(() => makeUnsafe10()), (handle2) => { - const state2 = handle2.state; - if (state2._tag === "Closed") + const state = handle2.state; + if (state._tag === "Closed") return void_5; handle2.state = { _tag: "Closed" }; - return state2.fiber ? into(asVoid4(interruptAs(state2.fiber, internalFiberId)), handle2.deferred) : done3(handle2.deferred, void_4); + return state.fiber ? into(asVoid4(interruptAs(state.fiber, internalFiberId)), handle2.deferred) : done3(handle2.deferred, void_4); }), makeRuntime = () => flatMap7(make47(), (self2) => runtime(self2)()), makeRuntimePromise = () => flatMap7(make47(), (self2) => runtimePromise(self2)()), internalFiberId = -1, isInternalInterruption, setUnsafe, set10, clear5 = (self2) => uninterruptibleMask2((restore) => { if (self2.state._tag === "Closed" || self2.state.fiber === undefined) { return void_5; @@ -69397,13 +69400,13 @@ var TypeId40 = "~effect/FiberMap", isFiberMap = (u) => hasProperty(u, TypeId40), self2.deferred = deferred; return self2; }, make48 = () => acquireRelease2(sync4(() => makeUnsafe11(empty8(), makeUnsafe2())), (map25) => suspend3(() => { - const state2 = map25.state; - if (state2._tag === "Closed") + const state = map25.state; + if (state._tag === "Closed") return void_5; map25.state = { _tag: "Closed" }; - return interruptAll(values2(state2.backing)).pipe(into(map25.deferred)); + return interruptAll(values2(state.backing)).pipe(into(map25.deferred)); })), makeRuntime2 = () => flatMap7(make48(), (self2) => runtime2(self2)()), makeRuntimePromise2 = () => flatMap7(make48(), (self2) => runtimePromise2(self2)()), internalFiberId2 = -1, isInternalInterruption2, setUnsafe2, set11, getUnsafe7, get17, hasUnsafe, has10, remove10, clear6 = (self2) => suspend3(() => { if (self2.state._tag === "Closed") { return void_5; @@ -69562,13 +69565,13 @@ var TypeId41 = "~effect/FiberSet", isFiberSet = (u) => hasProperty(u, TypeId41), self2.deferred = deferred; return self2; }, make49 = () => acquireRelease2(sync4(() => makeUnsafe12(new Set, makeUnsafe2())), (set12) => suspend3(() => { - const state2 = set12.state; - if (state2._tag === "Closed") + const state = set12.state; + if (state._tag === "Closed") return void_5; set12.state = { _tag: "Closed" }; - const fibers = state2.backing; + const fibers = state.backing; return interruptAll(fibers).pipe(into(set12.deferred)); })), makeRuntime3 = () => flatMap7(make49(), (self2) => runtime3(self2)()), makeRuntimePromise3 = () => flatMap7(make49(), (self2) => runtimePromise3(self2)()), internalFiberId3 = -1, isInternalInterruption3, addUnsafe, add6, clear7 = (self2) => suspend3(() => { if (self2.state._tag === "Closed") { @@ -70477,16 +70480,16 @@ var init_Graph = __esm(() => { return lines.join(` `); }); - dijkstra = /* @__PURE__ */ dual(2, (graph, config3) => { - if (!graph.nodes.has(config3.source)) { - throw missingNode(config3.source); + dijkstra = /* @__PURE__ */ dual(2, (graph, config2) => { + if (!graph.nodes.has(config2.source)) { + throw missingNode(config2.source); } - if (!graph.nodes.has(config3.target)) { - throw missingNode(config3.target); + if (!graph.nodes.has(config2.target)) { + throw missingNode(config2.target); } - if (config3.source === config3.target) { + if (config2.source === config2.target) { return some3({ - path: [config3.source], + path: [config2.source], distance: 0, costs: [] }); @@ -70495,11 +70498,11 @@ var init_Graph = __esm(() => { const previous = new Map; const visited = new Set; for (const node of graph.nodes.keys()) { - distances.set(node, node === config3.source ? 0 : Infinity); + distances.set(node, node === config2.source ? 0 : Infinity); previous.set(node, null); } const priorityQueue = [{ - node: config3.source, + node: config2.source, distance: 0 }]; while (priorityQueue.length > 0) { @@ -70515,7 +70518,7 @@ var init_Graph = __esm(() => { continue; } visited.add(currentNode2); - if (currentNode2 === config3.target) { + if (currentNode2 === config2.target) { break; } const currentDistance = distances.get(currentNode2); @@ -70525,7 +70528,7 @@ var init_Graph = __esm(() => { const edge = graph.edges.get(edgeIndex); if (edge !== undefined) { const neighbor = edge.target; - const cost = config3.cost(edge.data); + const cost = config2.cost(edge.data); if (cost < 0) { throw new GraphError({ message: "Dijkstra's algorithm requires non-negative edge weights" @@ -70550,15 +70553,15 @@ var init_Graph = __esm(() => { } } } - const distance3 = distances.get(config3.target); + const distance3 = distances.get(config2.target); if (distance3 === Infinity) { return none2(); } - const path5 = []; + const path6 = []; const costs = []; - let currentNode = config3.target; + let currentNode = config2.target; while (currentNode !== null) { - path5.unshift(currentNode); + path6.unshift(currentNode); const prev2 = previous.get(currentNode); if (prev2 !== null) { costs.unshift(prev2.edgeData); @@ -70568,7 +70571,7 @@ var init_Graph = __esm(() => { } } return some3({ - path: path5, + path: path6, distance: distance3, costs }); @@ -70632,10 +70635,10 @@ var init_Graph = __esm(() => { paths.get(i2).set(j2, null); costs.get(i2).set(j2, []); } else { - const path5 = []; + const path6 = []; const weights = []; let current = i2; - path5.push(current); + path6.push(current); while (current !== j2) { const nextNode = next2.get(current).get(j2); if (nextNode === null) @@ -70645,9 +70648,9 @@ var init_Graph = __esm(() => { weights.push(edgeData); } current = nextNode; - path5.push(current); + path6.push(current); } - paths.get(i2).set(j2, path5); + paths.get(i2).set(j2, path6); costs.get(i2).set(j2, weights); } } @@ -70658,24 +70661,24 @@ var init_Graph = __esm(() => { costs }; }); - astar = /* @__PURE__ */ dual(2, (graph, config3) => { - if (!graph.nodes.has(config3.source)) { - throw missingNode(config3.source); + astar = /* @__PURE__ */ dual(2, (graph, config2) => { + if (!graph.nodes.has(config2.source)) { + throw missingNode(config2.source); } - if (!graph.nodes.has(config3.target)) { - throw missingNode(config3.target); + if (!graph.nodes.has(config2.target)) { + throw missingNode(config2.target); } - if (config3.source === config3.target) { + if (config2.source === config2.target) { return some3({ - path: [config3.source], + path: [config2.source], distance: 0, costs: [] }); } - const targetNodeData = getNode(graph, config3.target); + const targetNodeData = getNode(graph, config2.target); if (isNone2(targetNodeData)) { throw new GraphError({ - message: `Missing node data for target node ${config3.target}` + message: `Missing node data for target node ${config2.target}` }); } const gScore = new Map; @@ -70683,18 +70686,18 @@ var init_Graph = __esm(() => { const previous = new Map; const visited = new Set; for (const node of graph.nodes.keys()) { - gScore.set(node, node === config3.source ? 0 : Infinity); + gScore.set(node, node === config2.source ? 0 : Infinity); fScore.set(node, Infinity); previous.set(node, null); } - const sourceNodeData = getNode(graph, config3.source); + const sourceNodeData = getNode(graph, config2.source); if (isSome2(sourceNodeData)) { - const h2 = config3.heuristic(sourceNodeData.value, targetNodeData.value); - fScore.set(config3.source, h2); + const h2 = config2.heuristic(sourceNodeData.value, targetNodeData.value); + fScore.set(config2.source, h2); } const openSet = [{ - node: config3.source, - fScore: fScore.get(config3.source) + node: config2.source, + fScore: fScore.get(config2.source) }]; while (openSet.length > 0) { let minIndex = 0; @@ -70709,7 +70712,7 @@ var init_Graph = __esm(() => { continue; } visited.add(currentNode2); - if (currentNode2 === config3.target) { + if (currentNode2 === config2.target) { break; } const currentGScore = gScore.get(currentNode2); @@ -70719,7 +70722,7 @@ var init_Graph = __esm(() => { const edge = graph.edges.get(edgeIndex); if (edge !== undefined) { const neighbor = edge.target; - const weight = config3.cost(edge.data); + const weight = config2.cost(edge.data); if (weight < 0) { throw new GraphError({ message: "A* algorithm requires non-negative edge weights" @@ -70735,7 +70738,7 @@ var init_Graph = __esm(() => { }); const neighborNodeData = getNode(graph, neighbor); if (isSome2(neighborNodeData)) { - const h2 = config3.heuristic(neighborNodeData.value, targetNodeData.value); + const h2 = config2.heuristic(neighborNodeData.value, targetNodeData.value); const f = tentativeGScore + h2; fScore.set(neighbor, f); if (!visited.has(neighbor)) { @@ -70750,15 +70753,15 @@ var init_Graph = __esm(() => { } } } - const distance3 = gScore.get(config3.target); + const distance3 = gScore.get(config2.target); if (distance3 === Infinity) { return none2(); } - const path5 = []; + const path6 = []; const costs = []; - let currentNode = config3.target; + let currentNode = config2.target; while (currentNode !== null) { - path5.unshift(currentNode); + path6.unshift(currentNode); const prev2 = previous.get(currentNode) ?? null; if (prev2 !== null) { costs.unshift(prev2.edgeData); @@ -70768,21 +70771,21 @@ var init_Graph = __esm(() => { } } return some3({ - path: path5, + path: path6, distance: distance3, costs }); }); - bellmanFord = /* @__PURE__ */ dual(2, (graph, config3) => { - if (!graph.nodes.has(config3.source)) { - throw missingNode(config3.source); + bellmanFord = /* @__PURE__ */ dual(2, (graph, config2) => { + if (!graph.nodes.has(config2.source)) { + throw missingNode(config2.source); } - if (!graph.nodes.has(config3.target)) { - throw missingNode(config3.target); + if (!graph.nodes.has(config2.target)) { + throw missingNode(config2.target); } - if (config3.source === config3.target) { + if (config2.source === config2.target) { return some3({ - path: [config3.source], + path: [config2.source], distance: 0, costs: [] }); @@ -70790,12 +70793,12 @@ var init_Graph = __esm(() => { const distances = new Map; const previous = new Map; for (const node of graph.nodes.keys()) { - distances.set(node, node === config3.source ? 0 : Infinity); + distances.set(node, node === config2.source ? 0 : Infinity); previous.set(node, null); } const edges = []; for (const [, edgeData] of graph.edges) { - const weight = config3.cost(edgeData.data); + const weight = config2.cost(edgeData.data); edges.push({ source: edgeData.source, target: edgeData.target, @@ -70843,20 +70846,20 @@ var init_Graph = __esm(() => { } } } - if (affectedNodes.has(config3.target)) { + if (affectedNodes.has(config2.target)) { return none2(); } } } - const distance3 = distances.get(config3.target); + const distance3 = distances.get(config2.target); if (distance3 === Infinity) { return none2(); } - const path5 = []; + const path6 = []; const costs = []; - let currentNode = config3.target; + let currentNode = config2.target; while (currentNode !== null) { - path5.unshift(currentNode); + path6.unshift(currentNode); const prev2 = previous.get(currentNode); if (prev2 !== null) { costs.unshift(prev2.edgeData); @@ -70866,7 +70869,7 @@ var init_Graph = __esm(() => { } } return some3({ - path: path5, + path: path6, distance: distance3, costs }); @@ -70879,9 +70882,9 @@ var init_Graph = __esm(() => { this[Symbol.iterator] = visit((index2, data2) => [index2, data2])[Symbol.iterator]; } }; - dfs = /* @__PURE__ */ dual((args3) => isGraph(args3[0]), (graph, config3 = {}) => { - const start2 = config3.start ?? []; - const direction = config3.direction ?? "outgoing"; + dfs = /* @__PURE__ */ dual((args3) => isGraph(args3[0]), (graph, config2 = {}) => { + const start2 = config2.start ?? []; + const direction = config2.direction ?? "outgoing"; for (const nodeIndex of start2) { if (!hasNode(graph, nodeIndex)) { throw missingNode(nodeIndex); @@ -70925,9 +70928,9 @@ var init_Graph = __esm(() => { } })); }); - bfs = /* @__PURE__ */ dual((args3) => isGraph(args3[0]), (graph, config3 = {}) => { - const start2 = config3.start ?? []; - const direction = config3.direction ?? "outgoing"; + bfs = /* @__PURE__ */ dual((args3) => isGraph(args3[0]), (graph, config2 = {}) => { + const start2 = config2.start ?? []; + const direction = config2.direction ?? "outgoing"; for (const nodeIndex of start2) { if (!hasNode(graph, nodeIndex)) { throw missingNode(nodeIndex); @@ -70969,13 +70972,13 @@ var init_Graph = __esm(() => { } })); }); - topo = /* @__PURE__ */ dual((args3) => isGraph(args3[0]), (graph, config3 = {}) => { + topo = /* @__PURE__ */ dual((args3) => isGraph(args3[0]), (graph, config2 = {}) => { if (!isAcyclic(graph)) { throw new GraphError({ message: "Cannot perform topological sort on cyclic graph" }); } - const initials = config3.initials ?? []; + const initials = config2.initials ?? []; for (const nodeIndex of initials) { if (!hasNode(graph, nodeIndex)) { throw missingNode(nodeIndex); @@ -71038,9 +71041,9 @@ var init_Graph = __esm(() => { } })); }); - dfsPostOrder = /* @__PURE__ */ dual((args3) => isGraph(args3[0]), (graph, config3 = {}) => { - const start2 = config3.start ?? []; - const direction = config3.direction ?? "outgoing"; + dfsPostOrder = /* @__PURE__ */ dual((args3) => isGraph(args3[0]), (graph, config2 = {}) => { + const start2 = config2.start ?? []; + const direction = config2.direction ?? "outgoing"; for (const nodeIndex of start2) { if (!hasNode(graph, nodeIndex)) { throw missingNode(nodeIndex); @@ -71102,8 +71105,8 @@ var init_Graph = __esm(() => { } })); }); - externals = /* @__PURE__ */ dual((args3) => isGraph(args3[0]), (graph, config3 = {}) => { - const direction = config3.direction ?? "outgoing"; + externals = /* @__PURE__ */ dual((args3) => isGraph(args3[0]), (graph, config2 = {}) => { + const direction = config2.direction ?? "outgoing"; return new Walker((f) => ({ [Symbol.iterator]: () => { const nodeMap = graph.nodes; @@ -71552,9 +71555,9 @@ var init_Logger = __esm(() => { consoleStructured = /* @__PURE__ */ withConsoleLog(formatStructured); consoleJson = /* @__PURE__ */ withConsoleLog(formatJson2); tracerLogger2 = tracerLogger; - toFile = /* @__PURE__ */ dual((args3) => isLogger(args3[0]), (self2, path5, options2) => gen3(function* () { + toFile = /* @__PURE__ */ dual((args3) => isLogger(args3[0]), (self2, path6, options2) => gen3(function* () { const fs5 = yield* FileSystem; - const logFile = yield* fs5.open(path5, { + const logFile = yield* fs5.open(path6, { flag: "a+", ...options2 }); @@ -72118,15 +72121,15 @@ var PartitionedTypeId = "~effect/PartitionedSemaphore", makeUnsafe13 = (options2 totalPermits = Math.min(maxPermits, totalPermits + permits); return totalPermits; } - let state2 = iterator.next(); - if (state2.done) { + let state = iterator.next(); + if (state.done) { iterator = partitions[Symbol.iterator](); - state2 = iterator.next(); - if (state2.done) { + state = iterator.next(); + if (state.done) { return totalPermits; } } - const waiter = state2.value[1].values().next().value; + const waiter = state.value[1].values().next().value; if (waiter === undefined) { continue; } @@ -72282,7 +72285,7 @@ var TypeId49 = "~effect/Pool", isPool = (u) => hasProperty(u, TypeId49), make56 const scope3 = get4(services3, Scope); const acquire = updateServices2(options2.acquire, (input) => merge3(services3, input)); const concurrency = options2.concurrency ?? 1; - const config3 = { + const config2 = { acquire, concurrency, minSize: options2.min, @@ -72290,7 +72293,7 @@ var TypeId49 = "~effect/Pool", isPool = (u) => hasProperty(u, TypeId49), make56 strategy: options2.strategy, targetUtilization: Math.min(Math.max(options2.targetUtilization ?? 1, 0.1), 1) }; - const state2 = { + const state = { scope: scope3, isShuttingDown: false, semaphore: makeUnsafe7(concurrency * options2.max), @@ -72303,8 +72306,8 @@ var TypeId49 = "~effect/Pool", isPool = (u) => hasProperty(u, TypeId49), make56 }; const self2 = { [TypeId49]: TypeId49, - config: config3, - state: state2, + config: config2, + state, pipe() { return pipeArguments(this, arguments); } @@ -75107,11 +75110,11 @@ function topologicalSort(references) { }; const dependencies = new Map(identifiers.map((id2) => [id2, collectRefs(references[id2])])); const recursive = new Set; - const state2 = new Map; + const state = new Map; const stack = []; const indexInStack = new Map; const dfs2 = (id2) => { - const s = state2.get(id2) ?? 0; + const s = state.get(id2) ?? 0; if (s === 1) { const start2 = indexInStack.get(id2); if (start2 !== undefined) { @@ -75123,7 +75126,7 @@ function topologicalSort(references) { } if (s === 2) return; - state2.set(id2, 1); + state.set(id2, 1); indexInStack.set(id2, stack.length); stack.push(id2); for (const dep of dependencies.get(id2) ?? []) { @@ -75131,7 +75134,7 @@ function topologicalSort(references) { } stack.pop(); indexInStack.delete(id2); - state2.set(id2, 2); + state.set(id2, 2); }; for (const id2 of identifiers) dfs2(id2); @@ -75907,16 +75910,16 @@ var TypeId55 = "~effect/ScopedCache", makeWith3 = (options2) => servicesWith((se if (self2.state._tag === "Closed") { return interrupt; } - const state2 = self2.state; - const oentry = get5(state2.map, key); + const state = self2.state; + const oentry = get5(state.map, key); if (isNone2(oentry)) { return undefined_; } else if (hasExpired2(oentry.value, fiber3)) { - remove3(state2.map, key); + remove3(state.map, key); return as3(close(oentry.value.scope, exitVoid), undefined); } else if (isRead) { - remove3(state2.map, key); - set4(state2.map, key, oentry.value); + remove3(state.map, key); + set4(state.map, key, oentry.value); } return succeed3(oentry.value); }, getSuccess6, set15, has13, invalidate6, invalidateWhen2, refresh3, invalidateAll2 = (self2) => withFiber((parent) => { @@ -75934,15 +75937,15 @@ var TypeId55 = "~effect/ScopedCache", makeWith3 = (options2) => servicesWith((se }, size15 = (self2) => sync(() => self2.state._tag === "Closed" ? 0 : size3(self2.state.map)), keys8 = (self2) => withFiber((fiber3) => { if (self2.state._tag === "Closed") return succeed3([]); - const state2 = self2.state; + const state = self2.state; const now3 = fiber3.getRef(ClockRef).currentTimeMillisUnsafe(); const fibers = empty3(); const keys9 = []; - for (const [key, entry] of state2.map) { + for (const [key, entry] of state.map) { if (entry.expiresAt === undefined || entry.expiresAt > now3) { keys9.push(key); } else { - remove3(state2.map, key); + remove3(state.map, key); fibers.push(forkUnsafe(fiber3, close(entry.scope, exitVoid), true, true)); } } @@ -75950,18 +75953,18 @@ var TypeId55 = "~effect/ScopedCache", makeWith3 = (options2) => servicesWith((se }), values8 = (self2) => map8(entries6(self2), map7(([, value8]) => value8)), entries6 = (self2) => withFiber((fiber3) => { if (self2.state._tag === "Closed") return succeed3([]); - const state2 = self2.state; + const state = self2.state; const now3 = fiber3.getRef(ClockRef).currentTimeMillisUnsafe(); const fibers = empty3(); const arr = []; - for (const [key, entry] of state2.map) { + for (const [key, entry] of state.map) { if (entry.expiresAt === undefined || entry.expiresAt > now3) { const exit3 = entry.deferred.effect; if (isExit(exit3) && !exitIsFailure(exit3)) { arr.push([key, exit3.value]); } } else { - remove3(state2.map, key); + remove3(state.map, key); fibers.push(forkUnsafe(fiber3, close(entry.scope, exitVoid), true, true)); } } @@ -75993,14 +75996,14 @@ var init_ScopedCache = __esm(() => { } }; get24 = /* @__PURE__ */ dual(2, (self2, key) => uninterruptibleMask((restore) => withFiber((fiber3) => { - const state2 = self2.state; - if (state2._tag === "Closed") { + const state = self2.state; + if (state._tag === "Closed") { return interrupt; } - const oentry = get5(state2.map, key); + const oentry = get5(state.map, key); if (isSome2(oentry) && !hasExpired2(oentry.value, fiber3)) { - remove3(state2.map, key); - set4(state2.map, key, oentry.value); + remove3(state.map, key); + set4(state.map, key, oentry.value); return restore(_await(oentry.value.deferred)); } const scope3 = makeUnsafe3(); @@ -76010,8 +76013,8 @@ var init_ScopedCache = __esm(() => { deferred, scope: scope3 }; - set4(state2.map, key, entry); - return checkCapacity2(fiber3, state2.map, self2.capacity).pipe(isSome2(oentry) ? flatMap5(() => close(oentry.value.scope, exitVoid)) : identity, flatMap5(() => provide(restore(self2.lookup(key)), scope3)), onExit((exit3) => { + set4(state.map, key, entry); + return checkCapacity2(fiber3, state.map, self2.capacity).pipe(isSome2(oentry) ? flatMap5(() => close(oentry.value.scope, exitVoid)) : identity, flatMap5(() => provide(restore(self2.lookup(key)), scope3)), onExit((exit3) => { doneUnsafe(deferred, exit3); const ttl = self2.timeToLive(exit3, key); if (isFinite2(ttl)) { @@ -76033,17 +76036,17 @@ var init_ScopedCache = __esm(() => { return interrupt; } const oentry = get5(self2.state.map, key); - const state2 = self2.state; + const state = self2.state; const exit3 = exitSucceed(value8); const deferred = makeUnsafe2(); doneUnsafe(deferred, exit3); const ttl = self2.timeToLive(exit3, key); - set4(state2.map, key, { + set4(state.map, key, { scope: makeUnsafe3(), deferred, expiresAt: isFinite2(ttl) ? fiber3.getRef(ClockRef).currentTimeMillisUnsafe() + toMillis(ttl) : undefined }); - const check5 = checkCapacity2(fiber3, state2.map, self2.capacity); + const check5 = checkCapacity2(fiber3, state.map, self2.capacity); return isSome2(oentry) ? flatMap5(close(oentry.value.scope, exitVoid), () => check5) : check5; }))); has13 = /* @__PURE__ */ dual(2, (self2, key) => uninterruptible(withFiber((fiber3) => map8(getImpl2(self2, key, fiber3, false), isNotUndefined)))); @@ -76923,14 +76926,14 @@ var init_TxRef = __esm(() => { init_Effect(); init_Function(); init_Pipeable(); - modify13 = /* @__PURE__ */ dual(2, (self2, f) => Transaction.asEffect().pipe(flatMap7((state2) => sync4(() => { - if (!state2.journal.has(self2)) { - state2.journal.set(self2, { + modify13 = /* @__PURE__ */ dual(2, (self2, f) => Transaction.asEffect().pipe(flatMap7((state) => sync4(() => { + if (!state.journal.has(self2)) { + state.journal.set(self2, { version: self2.version, value: self2.value }); } - const current = state2.journal.get(self2); + const current = state.journal.get(self2); const [returnValue, next3] = f(current.value); current.value = next3; return returnValue; @@ -77584,9 +77587,9 @@ var EnqueueTypeId2 = "~effect/transactions/TxQueue/Enqueue", DequeueTypeId2 = "~ txQueue.stateRef = stateRef; return txQueue; }).pipe(tx), offer3, offerAll3, take14 = (self2) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - if (state2._tag === "Done") { - return yield* failCause5(state2.cause); + const state = yield* get28(self2.stateRef); + if (state._tag === "Done") { + return yield* failCause5(state.cause); } if (yield* isEmpty16(self2)) { return yield* txRetry; @@ -77597,16 +77600,16 @@ var EnqueueTypeId2 = "~effect/transactions/TxQueue/Enqueue", DequeueTypeId2 = "~ return yield* txRetry; } yield* drop5(self2.items, 1); - if (state2._tag === "Closing" && (yield* isEmpty16(self2))) { + if (state._tag === "Closing" && (yield* isEmpty16(self2))) { yield* set17(self2.stateRef, { _tag: "Done", - cause: state2.cause + cause: state.cause }); } return head5.value; }).pipe(tx), poll4 = (self2) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - if (state2._tag === "Done") { + const state = yield* get28(self2.stateRef); + if (state._tag === "Done") { return none2(); } const chunk = yield* get29(self2.items); @@ -77617,9 +77620,9 @@ var EnqueueTypeId2 = "~effect/transactions/TxQueue/Enqueue", DequeueTypeId2 = "~ yield* drop5(self2.items, 1); return some3(head5.value); }).pipe(tx), takeAll5 = (self2) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - if (state2._tag === "Done") { - return yield* failCause5(state2.cause); + const state = yield* get28(self2.stateRef); + if (state._tag === "Done") { + return yield* failCause5(state.cause); } if (yield* isEmpty16(self2)) { return yield* txRetry; @@ -77627,17 +77630,17 @@ var EnqueueTypeId2 = "~effect/transactions/TxQueue/Enqueue", DequeueTypeId2 = "~ const chunk = yield* get29(self2.items); const items2 = toArray2(chunk); yield* set18(self2.items, empty9()); - if (state2._tag === "Closing") { + if (state._tag === "Closing") { yield* set17(self2.stateRef, { _tag: "Done", - cause: state2.cause + cause: state.cause }); } return items2; }).pipe(tx), takeN3, takeBetween3, peek3 = (self2) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - if (state2._tag === "Done") { - return yield* failCause5(state2.cause); + const state = yield* get28(self2.stateRef); + if (state._tag === "Done") { + return yield* failCause5(state.cause); } const chunk = yield* get29(self2.items); const head5 = head3(chunk); @@ -77646,12 +77649,12 @@ var EnqueueTypeId2 = "~effect/transactions/TxQueue/Enqueue", DequeueTypeId2 = "~ } return head5.value; }).pipe(tx), size22 = (self2) => size18(self2.items), isEmpty16 = (self2) => isEmpty12(self2.items), isFull3 = (self2) => self2.capacity === Number.POSITIVE_INFINITY ? succeed8(false) : map12(size22(self2), (currentSize) => currentSize >= self2.capacity), interrupt8 = (self2) => withFiber2((fiber3) => failCause10(self2, interrupt2(fiber3.id))), fail16, failCause10, end3 = (self2) => failCause10(self2, fail4(Done2())), clear11 = (self2) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - if (state2._tag === "Done") { - if (isDoneCause(state2.cause)) { + const state = yield* get28(self2.stateRef); + if (state._tag === "Done") { + if (isDoneCause(state.cause)) { return []; } - return yield* failCause5(state2.cause); + return yield* failCause5(state.cause); } const chunk = yield* get29(self2.items); yield* set18(self2.items, empty9()); @@ -77659,9 +77662,9 @@ var EnqueueTypeId2 = "~effect/transactions/TxQueue/Enqueue", DequeueTypeId2 = "~ }).pipe(tx), shutdown4 = (self2) => gen4(function* () { yield* ignore2(clear11(self2)); return yield* interrupt8(self2); -}).pipe(tx), isOpen = (self2) => map12(get28(self2.stateRef), (state2) => state2._tag === "Open"), isClosing = (self2) => map12(get28(self2.stateRef), (state2) => state2._tag === "Closing"), isDone4 = (self2) => map12(get28(self2.stateRef), (state2) => state2._tag === "Done"), isShutdown2 = (self2) => isDone4(self2), awaitCompletion = (self2) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - if (state2._tag === "Done") { +}).pipe(tx), isOpen = (self2) => map12(get28(self2.stateRef), (state) => state._tag === "Open"), isClosing = (self2) => map12(get28(self2.stateRef), (state) => state._tag === "Closing"), isDone4 = (self2) => map12(get28(self2.stateRef), (state) => state._tag === "Done"), isShutdown2 = (self2) => isDone4(self2), awaitCompletion = (self2) => gen4(function* () { + const state = yield* get28(self2.stateRef); + if (state._tag === "Done") { return; } return yield* txRetry; @@ -77705,8 +77708,8 @@ var init_TxQueue = __esm(() => { } }; offer3 = /* @__PURE__ */ dual(2, (self2, value8) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - if (state2._tag === "Done" || state2._tag === "Closing") { + const state = yield* get28(self2.stateRef); + if (state._tag === "Done" || state._tag === "Closing") { return false; } const currentSize = yield* size22(self2); @@ -77739,9 +77742,9 @@ var init_TxQueue = __esm(() => { return rejected; }).pipe(tx)); takeN3 = /* @__PURE__ */ dual(2, (self2, n7) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - if (state2._tag === "Done") { - return yield* failCause5(state2.cause); + const state = yield* get28(self2.stateRef); + if (state._tag === "Done") { + return yield* failCause5(state.cause); } const currentSize = yield* size22(self2); const requestedCount = n7; @@ -77749,11 +77752,11 @@ var init_TxQueue = __esm(() => { const shouldWaitForFull = requestedCount <= self2.capacity; const minimumRequired = shouldWaitForFull ? requestedCount : maxPossible; if (currentSize < minimumRequired) { - if (state2._tag === "Closing") { + if (state._tag === "Closing") { if (yield* isEmpty16(self2)) { yield* set17(self2.stateRef, { _tag: "Done", - cause: state2.cause + cause: state.cause }); return []; } @@ -77762,7 +77765,7 @@ var init_TxQueue = __esm(() => { yield* set18(self2.items, empty9()); yield* set17(self2.stateRef, { _tag: "Done", - cause: state2.cause + cause: state.cause }); return taken2; } @@ -77772,29 +77775,29 @@ var init_TxQueue = __esm(() => { const chunk = yield* get29(self2.items); const taken = take4(chunk, toTake); yield* drop5(self2.items, toTake); - if (state2._tag === "Closing" && (yield* isEmpty16(self2))) { + if (state._tag === "Closing" && (yield* isEmpty16(self2))) { yield* set17(self2.stateRef, { _tag: "Done", - cause: state2.cause + cause: state.cause }); } return toArray2(taken); }).pipe(tx)); takeBetween3 = /* @__PURE__ */ dual(3, (self2, min11, max11) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - if (state2._tag === "Done") { - return yield* failCause5(state2.cause); + const state = yield* get28(self2.stateRef); + if (state._tag === "Done") { + return yield* failCause5(state.cause); } if (min11 <= 0 || max11 <= 0 || min11 > max11) { return []; } const currentSize = yield* size22(self2); if (currentSize < min11) { - if (state2._tag === "Closing") { + if (state._tag === "Closing") { if (yield* isEmpty16(self2)) { yield* set17(self2.stateRef, { _tag: "Done", - cause: state2.cause + cause: state.cause }); return []; } @@ -77803,7 +77806,7 @@ var init_TxQueue = __esm(() => { yield* set18(self2.items, empty9()); yield* set17(self2.stateRef, { _tag: "Done", - cause: state2.cause + cause: state.cause }); return taken2; } @@ -77813,17 +77816,17 @@ var init_TxQueue = __esm(() => { const chunk = yield* get29(self2.items); const taken = take4(chunk, toTake); yield* drop5(self2.items, toTake); - if (state2._tag === "Closing" && (yield* isEmpty16(self2))) { + if (state._tag === "Closing" && (yield* isEmpty16(self2))) { yield* set17(self2.stateRef, { _tag: "Done", - cause: state2.cause + cause: state.cause }); } return toArray2(taken); }).pipe(tx)); fail16 = /* @__PURE__ */ dual(2, (self2, error46) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - if (state2._tag !== "Open") { + const state = yield* get28(self2.stateRef); + if (state._tag !== "Open") { return false; } yield* set18(self2.items, empty9()); @@ -77834,8 +77837,8 @@ var init_TxQueue = __esm(() => { return true; }).pipe(tx)); failCause10 = /* @__PURE__ */ dual(2, (self2, cause) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - if (state2._tag !== "Open") { + const state = yield* get28(self2.stateRef); + if (state._tag !== "Open") { return false; } if (yield* isEmpty16(self2)) { @@ -78028,64 +78031,64 @@ var TypeId67 = "~effect/transactions/TxReentrantLock", emptyState, TxReentrantLo self2.stateRef = stateRef; return self2; }).pipe(tx), acquireRead = (self2) => withFiber2((fiber3) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); + const state = yield* get28(self2.stateRef); const fiberId3 = fiber3.id; - if (isSome2(state2.writer) && state2.writer.value[0] !== fiberId3) { + if (isSome2(state.writer) && state.writer.value[0] !== fiberId3) { return yield* txRetry; } - const currentCount = getOrElse(get10(state2.readers, fiberId3), () => 0); + const currentCount = getOrElse(get10(state.readers, fiberId3), () => 0); const newCount = currentCount + 1; yield* set17(self2.stateRef, { - ...state2, - readers: set8(state2.readers, fiberId3, newCount) + ...state, + readers: set8(state.readers, fiberId3, newCount) }); return newCount; }).pipe(tx)), acquireWrite = (self2) => withFiber2((fiber3) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); + const state = yield* get28(self2.stateRef); const fiberId3 = fiber3.id; - if (isSome2(state2.writer) && state2.writer.value[0] !== fiberId3) { + if (isSome2(state.writer) && state.writer.value[0] !== fiberId3) { return yield* txRetry; } - for (const [readerId] of state2.readers) { - if (readerId !== fiberId3 && getOrElse(get10(state2.readers, readerId), () => 0) > 0) { + for (const [readerId] of state.readers) { + if (readerId !== fiberId3 && getOrElse(get10(state.readers, readerId), () => 0) > 0) { return yield* txRetry; } } - if (isSome2(state2.writer)) { - const newCount = state2.writer.value[1] + 1; + if (isSome2(state.writer)) { + const newCount = state.writer.value[1] + 1; yield* set17(self2.stateRef, { - ...state2, + ...state, writer: some3([fiberId3, newCount]) }); return newCount; } yield* set17(self2.stateRef, { - ...state2, + ...state, writer: some3([fiberId3, 1]) }); return 1; }).pipe(tx)), releaseRead = (self2) => withFiber2((fiber3) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); + const state = yield* get28(self2.stateRef); const fiberId3 = fiber3.id; - const currentCount = getOrElse(get10(state2.readers, fiberId3), () => 0); + const currentCount = getOrElse(get10(state.readers, fiberId3), () => 0); if (currentCount <= 0) return 0; const newCount = currentCount - 1; - const newReaders = newCount === 0 ? remove7(state2.readers, fiberId3) : set8(state2.readers, fiberId3, newCount); + const newReaders = newCount === 0 ? remove7(state.readers, fiberId3) : set8(state.readers, fiberId3, newCount); yield* set17(self2.stateRef, { - ...state2, + ...state, readers: newReaders }); return newCount; }).pipe(tx)), releaseWrite = (self2) => withFiber2((fiber3) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); + const state = yield* get28(self2.stateRef); const fiberId3 = fiber3.id; - if (isNone2(state2.writer) || state2.writer.value[0] !== fiberId3) + if (isNone2(state.writer) || state.writer.value[0] !== fiberId3) return 0; - const newCount = state2.writer.value[1] - 1; + const newCount = state.writer.value[1] - 1; const newWriter = newCount <= 0 ? none2() : some3([fiberId3, newCount]); yield* set17(self2.stateRef, { - ...state2, + ...state, writer: newWriter }); return newCount; @@ -78104,24 +78107,24 @@ var TypeId67 = "~effect/transactions/TxReentrantLock", emptyState, TxReentrantLo const [self2, effect2] = args3; return acquireUseRelease2(acquireWrite(self2), () => effect2, () => releaseWrite(self2)); }, withLock, readLocks = (self2) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); + const state = yield* get28(self2.stateRef); let total = 0; - for (const [, count3] of state2.readers) { + for (const [, count3] of state.readers) { total += count3; } return total; }), writeLocks = (self2) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - return isSome2(state2.writer) ? state2.writer.value[1] : 0; + const state = yield* get28(self2.stateRef); + return isSome2(state.writer) ? state.writer.value[1] : 0; }), locked = (self2) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - return size9(state2.readers) > 0 || isSome2(state2.writer); + const state = yield* get28(self2.stateRef); + return size9(state.readers) > 0 || isSome2(state.writer); }), readLocked = (self2) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - return size9(state2.readers) > 0; + const state = yield* get28(self2.stateRef); + return size9(state.readers) > 0; }), writeLocked = (self2) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - return isSome2(state2.writer); + const state = yield* get28(self2.stateRef); + return isSome2(state.writer); }), isTxReentrantLock = (u) => hasProperty(u, TypeId67); var init_TxReentrantLock = __esm(() => { init_Effect(); @@ -79207,8 +79210,8 @@ class ParseStatus { } } var makeIssue = (params) => { - const { data: data2, path: path5, errorMaps, issueData } = params; - const fullPath = [...path5, ...issueData.path || []]; + const { data: data2, path: path6, errorMaps, issueData } = params; + const fullPath = [...path6, ...issueData.path || []]; const fullIssue = { ...issueData, path: fullPath @@ -79253,11 +79256,11 @@ var init_errorUtil = __esm(() => { // node_modules/zod-to-json-schema/node_modules/zod/v3/types.js class ParseInputLazyPath { - constructor(parent, value8, path5, key) { + constructor(parent, value8, path6, key) { this._cachedPath = []; this.parent = parent; this.data = value8; - this._path = path5; + this._path = path6; this._key = key; } get path() { @@ -84213,10 +84216,10 @@ function mergeParameters(...params) { }, /* @__PURE__ */ new Map); return Array.from(merged.values()); } -function getPathContext(path5) { +function getPathContext(path6) { const context2 = []; for (const [key, data2] of specsByPathContext) { - if (data2 && path5.match(key)) { + if (data2 && path6.match(key)) { context2.push(data2); } } @@ -84268,24 +84271,24 @@ function registerSchemaPath({ specs, paths }) { - const path5 = toOpenAPIPath(route.path); + const path6 = toOpenAPIPath(route.path); const method = route.method.toLowerCase(); if (method === "all") { if (!specs) return; - if (specsByPathContext.has(path5)) { - const prev2 = specsByPathContext.get(path5) ?? {}; - specsByPathContext.set(path5, mergeSpecs(route, prev2, specs)); + if (specsByPathContext.has(path6)) { + const prev2 = specsByPathContext.get(path6) ?? {}; + specsByPathContext.set(path6, mergeSpecs(route, prev2, specs)); } else { - specsByPathContext.set(path5, specs); + specsByPathContext.set(path6, specs); } } else { - const pathContext = getPathContext(path5); - if (!(path5 in paths)) { - paths[path5] = {}; + const pathContext = getPathContext(path6); + if (!(path6 in paths)) { + paths[path6] = {}; } - if (paths[path5]) { - paths[path5][method] = mergeSpecs(route, ...pathContext, paths[path5]?.[method], specs); + if (paths[path6]) { + paths[path6][method] = mergeSpecs(route, ...pathContext, paths[path6]?.[method], specs); } } } @@ -84376,16 +84379,16 @@ async function generateSpecs(hono, options2 = DEFAULT_OPTIONS, c) { const _documentation = ctx.options.documentation ?? {}; clearSpecsContext(); const paths = await generatePaths(hono, ctx); - for (const path5 in paths) { - for (const method in paths[path5]) { + for (const path6 in paths) { + for (const method in paths[path6]) { const isHidden = getHiddenValue({ - valueOrFunc: paths[path5][method]?.hide, + valueOrFunc: paths[path6][method]?.hide, method, - path: path5, + path: path6, c }); if (isHidden) { - paths[path5][method] = undefined; + paths[path6][method] = undefined; } } } @@ -84441,13 +84444,13 @@ async function generatePaths(hono, ctx) { return paths; } function getHiddenValue(options2) { - const { valueOrFunc, c, method, path: path5 } = options2; + const { valueOrFunc, c, method, path: path6 } = options2; if (valueOrFunc != null) { if (typeof valueOrFunc === "boolean") { return valueOrFunc; } if (typeof valueOrFunc === "function") { - return valueOrFunc({ c, method, path: path5 }); + return valueOrFunc({ c, method, path: path6 }); } } return false; @@ -84592,7 +84595,7 @@ function describeRoute(spec) { } }); } -var uniqueSymbol, ALLOWED_METHODS, toOpenAPIPath = (path5) => path5.split("/").map((x2) => { +var uniqueSymbol, ALLOWED_METHODS, toOpenAPIPath = (path6) => path6.split("/").map((x2) => { let tmp = x2; if (tmp.startsWith(":")) { const match16 = tmp.match(/^:([^{?]+)(?:{(.+)})?(\?)?$/); @@ -84698,7 +84701,16 @@ var init_constants = __esm(() => { // node_modules/hono/dist/utils/body.js async function parseFormData(request3, options2) { - const formData = await request3.formData(); + if (!isRawRequest(request3) && request3.bodyCache.formData) { + return convertFormDataToBodyData(await request3.bodyCache.formData, options2); + } + const headers = isRawRequest(request3) ? request3.headers : request3.raw.headers; + const arrayBuffer = await request3.arrayBuffer(); + const formDataPromise = bufferToFormData(arrayBuffer, headers.get("Content-Type") || ""); + if (!isRawRequest(request3)) { + request3.bodyCache.formData = formDataPromise; + } + const formData = await formDataPromise; if (formData) { return convertFormDataToBodyData(formData, options2); } @@ -84725,11 +84737,12 @@ function convertFormDataToBodyData(formData, options2) { } return form; } -var parseBody = async (request3, options2 = /* @__PURE__ */ Object.create(null)) => { +var isRawRequest = (request3) => ("headers" in request3), parseBody = async (request3, options2 = /* @__PURE__ */ Object.create(null)) => { const { all: all7 = false, dot = false } = options2; - const headers = request3 instanceof HonoRequest ? request3.raw.headers : request3.headers; + const headers = isRawRequest(request3) ? request3.headers : request3.raw.headers; const contentType = headers.get("Content-Type"); - if (contentType?.startsWith("multipart/form-data") || contentType?.startsWith("application/x-www-form-urlencoded")) { + const mediaType = contentType?.split(";")[0].trim().toLowerCase(); + if (mediaType === "multipart/form-data" || mediaType === "application/x-www-form-urlencoded") { return parseFormData(request3, { all: all7, dot }); } return {}; @@ -84765,11 +84778,11 @@ var parseBody = async (request3, options2 = /* @__PURE__ */ Object.create(null)) }); }; var init_body = __esm(() => { - init_request2(); + init_buffer(); }); // node_modules/hono/dist/request.js -var tryDecodeURIComponent = (str2) => tryDecode(str2, decodeURIComponent_), HonoRequest; +var HonoRequest; var init_request2 = __esm(() => { init_http_exception(); init_constants(); @@ -84782,11 +84795,10 @@ var init_request2 = __esm(() => { routeIndex = 0; path; bodyCache = {}; - constructor(request3, path5 = "/", matchResult = [[]]) { + constructor(request3, path6 = "/", matchResult = [[]]) { this.raw = request3; - this.path = path5; + this.path = path6; this.#matchResult = matchResult; - this.#validatedData = {}; } param(key) { return key ? this.#getDecodedParam(key) : this.#getAllDecodedParams(); @@ -84794,7 +84806,7 @@ var init_request2 = __esm(() => { #getDecodedParam(key) { const paramKey2 = this.#matchResult[0][this.routeIndex][1][key]; const param = this.#getParamValue(paramKey2); - return param && /\%/.test(param) ? tryDecodeURIComponent(param) : param; + return param && tryDecodeURIComponent(param); } #getAllDecodedParams() { const decoded = {}; @@ -84802,7 +84814,7 @@ var init_request2 = __esm(() => { for (const key of keys12) { const value8 = this.#getParamValue(this.#matchResult[0][this.routeIndex][1][key]); if (value8 !== undefined) { - decoded[key] = /\%/.test(value8) ? tryDecodeURIComponent(value8) : value8; + decoded[key] = tryDecodeURIComponent(value8); } } return decoded; @@ -84820,7 +84832,7 @@ var init_request2 = __esm(() => { if (name2) { return this.raw.headers.get(name2) ?? undefined; } - const headerData = {}; + const headerData = /* @__PURE__ */ Object.create(null); this.raw.headers.forEach((value8, key) => { headerData[key] = value8; }); @@ -84835,8 +84847,7 @@ var init_request2 = __esm(() => { if (cachedBody) { return cachedBody; } - const anyCachedKey = Object.keys(bodyCache)[0]; - if (anyCachedKey) { + for (const anyCachedKey in bodyCache) { return bodyCache[anyCachedKey].then((body2) => { if (anyCachedKey === "json") { body2 = JSON.stringify(body2); @@ -84855,6 +84866,9 @@ var init_request2 = __esm(() => { arrayBuffer() { return this.#cachedBody("arrayBuffer"); } + bytes() { + return this.#cachedBody("arrayBuffer").then((buffer3) => new Uint8Array(buffer3)); + } blob() { return this.#cachedBody("blob"); } @@ -84862,10 +84876,10 @@ var init_request2 = __esm(() => { return this.#cachedBody("formData"); } addValidatedData(target, data2) { - this.#validatedData[target] = data2; + (this.#validatedData ??= {})[target] = data2; } valid(target) { - return this.#validatedData[target]; + return this.#validatedData?.[target]; } get url() { return this.raw.url; @@ -85039,11 +85053,11 @@ var TEXT_PLAIN = "text/plain; charset=UTF-8", setDefaultContentType = (contentTy return Object.fromEntries(this.#var); } #newResponse(data2, arg, headers) { - const responseHeaders = this.#res ? new Headers(this.#res.headers) : this.#preparedHeaders ?? new Headers; - if (typeof arg === "object" && "headers" in arg) { - const argHeaders = arg.headers instanceof Headers ? arg.headers : new Headers(arg.headers); - for (const [key, value8] of argHeaders) { - if (key.toLowerCase() === "set-cookie") { + let responseHeaders = this.#res ? new Headers(this.#res.headers) : this.#preparedHeaders; + if (typeof arg === "object" && arg.headers) { + responseHeaders ??= new Headers; + for (const [key, value8] of new Headers(arg.headers)) { + if (key === "set-cookie") { responseHeaders.append(key, value8); } else { responseHeaders.set(key, value8); @@ -85051,19 +85065,34 @@ var TEXT_PLAIN = "text/plain; charset=UTF-8", setDefaultContentType = (contentTy } } if (headers) { - for (const [k2, v2] of Object.entries(headers)) { - if (typeof v2 === "string") { - responseHeaders.set(k2, v2); - } else { - responseHeaders.delete(k2); - for (const v22 of v2) { - responseHeaders.append(k2, v22); + if (!responseHeaders) { + let count3 = 0; + for (const k2 in headers) { + if (++count3 > 1 || typeof headers[k2] !== "string") { + responseHeaders = new Headers; + break; + } + } + } + if (responseHeaders) { + for (const k2 in headers) { + const v2 = headers[k2]; + if (typeof v2 === "string") { + responseHeaders.set(k2, v2); + } else { + responseHeaders.delete(k2); + for (const v22 of v2) { + responseHeaders.append(k2, v22); + } } } } } const status = typeof arg === "number" ? arg : arg?.status ?? this.#status; - return createResponseInstance(data2, { status, headers: responseHeaders }); + return createResponseInstance(data2, { + status, + headers: responseHeaders ?? headers + }); } newResponse = (...args3) => this.#newResponse(...args3); body = (data2, arg, headers) => this.#newResponse(data2, arg, headers); @@ -85095,7 +85124,7 @@ var init_context = __esm(() => { // node_modules/hono/dist/router.js var METHOD_NAME_ALL = "ALL", METHOD_NAME_ALL_LOWERCASE = "all", METHODS, MESSAGE_MATCHER_IS_ALREADY_BUILT = "Can not add a route since the matcher is already built.", UnsupportedPathError; var init_router = __esm(() => { - METHODS = ["get", "post", "put", "delete", "options", "patch"]; + METHODS = ["get", "post", "put", "delete", "options", "patch", "query"]; UnsupportedPathError = class extends Error { }; }); @@ -85121,6 +85150,7 @@ var notFoundHandler = (c) => { delete; options; patch; + query; all; on; use; @@ -85144,8 +85174,8 @@ var notFoundHandler = (c) => { return this; }; }); - this.on = (method, path5, ...handlers) => { - for (const p of [path5].flat()) { + this.on = (method, path6, ...handlers) => { + for (const p of [path6].flat()) { this.#path = p; for (const m of [method].flat()) { handlers.map((handler) => { @@ -85183,8 +85213,8 @@ var notFoundHandler = (c) => { } #notFoundHandler = notFoundHandler; errorHandler = errorHandler; - route(path5, app2) { - const subApp = this.basePath(path5); + route(path6, app2) { + const subApp = this.basePath(path6); app2.routes.map((r) => { let handler; if (app2.errorHandler === errorHandler) { @@ -85193,13 +85223,13 @@ var notFoundHandler = (c) => { handler = async (c, next3) => (await compose5([], app2.errorHandler)(c, () => r.handler(c, next3))).res; handler[COMPOSED_HANDLER] = r.handler; } - subApp.#addRoute(r.method, r.path, handler); + subApp.#addRoute(r.method, r.path, handler, r.basePath); }); return this; } - basePath(path5) { + basePath(path6) { const subApp = this.#clone(); - subApp._basePath = mergePath(this._basePath, path5); + subApp._basePath = mergePath(this._basePath, path6); return subApp; } onError = (handler) => { @@ -85210,7 +85240,7 @@ var notFoundHandler = (c) => { this.#notFoundHandler = handler; return this; }; - mount(path5, applicationHandler, options2) { + mount(path6, applicationHandler, options2) { let replaceRequest; let optionHandler; if (options2) { @@ -85236,11 +85266,11 @@ var notFoundHandler = (c) => { return [c.env, executionContext]; }; replaceRequest ||= (() => { - const mergedPath = mergePath(this._basePath, path5); + const mergedPath = mergePath(this._basePath, path6); const pathPrefixLength = mergedPath === "/" ? 0 : mergedPath.length; return (request3) => { const url3 = new URL(request3.url); - url3.pathname = url3.pathname.slice(pathPrefixLength) || "/"; + url3.pathname = this.getPath(request3).slice(pathPrefixLength) || "/"; return new Request(url3, request3); }; })(); @@ -85251,14 +85281,19 @@ var notFoundHandler = (c) => { } await next3(); }; - this.#addRoute(METHOD_NAME_ALL, mergePath(path5, "*"), handler); + this.#addRoute(METHOD_NAME_ALL, mergePath(path6, "*"), handler); return this; } - #addRoute(method, path5, handler) { + #addRoute(method, path6, handler, baseRoutePath) { method = method.toUpperCase(); - path5 = mergePath(this._basePath, path5); - const r = { basePath: this._basePath, path: path5, method, handler }; - this.router.add(method, path5, [handler, r]); + path6 = mergePath(this._basePath, path6); + const r = { + basePath: baseRoutePath !== undefined ? mergePath(this._basePath, baseRoutePath) : this._basePath, + path: path6, + method, + handler + }; + this.router.add(method, path6, [handler, r]); this.routes.push(r); } #handleError(err2, c) { @@ -85271,10 +85306,10 @@ var notFoundHandler = (c) => { if (method === "HEAD") { return (async () => new Response(null, await this.#dispatch(request3, executionCtx, env3, "GET")))(); } - const path5 = this.getPath(request3, { env: env3 }); - const matchResult = this.router.match(method, path5); + const path6 = this.getPath(request3, { env: env3 }); + const matchResult = this.router.match(method, path6); const c = new Context2(request3, { - path: path5, + path: path6, matchResult, env: env3, executionCtx, @@ -85329,7 +85364,7 @@ var init_hono_base = __esm(() => { }); // node_modules/hono/dist/router/reg-exp-router/matcher.js -function match16(method, path5) { +function match16(method, path6) { const matchers = this.buildAllMatchers(); const match22 = (method2, path22) => { const matcher = matchers[method2] || matchers[METHOD_NAME_ALL]; @@ -85345,7 +85380,7 @@ function match16(method, path5) { return [matcher[1][index2], match32]; }; this.match = match22; - return match22(method, path5); + return match22(method, path6); } var emptyParam; var init_matcher2 = __esm(() => { @@ -85362,7 +85397,7 @@ function compareKey(a, b) { return 1; } if (a === ONLY_WILDCARD_REG_EXP_STR || a === TAIL_WILDCARD_REG_EXP_STR) { - return 1; + return b === TAIL_WILDCARD_REG_EXP_STR ? -1 : 1; } else if (b === ONLY_WILDCARD_REG_EXP_STR || b === TAIL_WILDCARD_REG_EXP_STR) { return -1; } @@ -85377,69 +85412,68 @@ var LABEL_REG_EXP_STR = "[^/]+", ONLY_WILDCARD_REG_EXP_STR = ".*", TAIL_WILDCARD #index; #varIndex; #children = /* @__PURE__ */ Object.create(null); - insert(tokens, index2, paramMap, context2, pathErrorCheckOnly) { - if (tokens.length === 0) { - if (this.#index !== undefined) { - throw PATH_ERROR; - } - if (pathErrorCheckOnly) { - return; - } - this.#index = index2; - return; - } - const [token, ...restTokens] = tokens; - const pattern = token === "*" ? restTokens.length === 0 ? ["", "", ONLY_WILDCARD_REG_EXP_STR] : ["", "", LABEL_REG_EXP_STR] : token === "/*" ? ["", "", TAIL_WILDCARD_REG_EXP_STR] : token.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/); - let node; - if (pattern) { - const name2 = pattern[1]; - let regexpStr = pattern[2] || LABEL_REG_EXP_STR; - if (name2 && pattern[2]) { - if (regexpStr === ".*") { - throw PATH_ERROR; - } - regexpStr = regexpStr.replace(/^\((?!\?:)(?=[^)]+\)$)/, "(?:"); - if (/\((?!\?:)/.test(regexpStr)) { - throw PATH_ERROR; - } - } - node = this.#children[regexpStr]; - if (!node) { - if (Object.keys(this.#children).some((k2) => k2 !== ONLY_WILDCARD_REG_EXP_STR && k2 !== TAIL_WILDCARD_REG_EXP_STR)) { - throw PATH_ERROR; - } - if (pathErrorCheckOnly) { - return; + insert(tokens, index2, paramMap, context2, isStatic) { + let node = this; + for (let i2 = 0, len = tokens.length;i2 < len; i2++) { + const token = tokens[i2]; + const pattern = token.length === 1 ? token === "*" ? i2 === len - 1 ? ["", "", ONLY_WILDCARD_REG_EXP_STR] : ["", "", LABEL_REG_EXP_STR] : null : token === "/*" ? ["", "", TAIL_WILDCARD_REG_EXP_STR] : token.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/); + let nextNode; + if (pattern) { + const name2 = pattern[1]; + let regexpStr = pattern[2] || LABEL_REG_EXP_STR; + if (name2 && pattern[2]) { + if (regexpStr === ".*") { + throw PATH_ERROR; + } + regexpStr = regexpStr.replace(/^\((?!\?:)(?=[^)]+\)$)/, "(?:"); + if (/\((?!\?:)/.test(regexpStr)) { + throw PATH_ERROR; + } + if (regexpStr.length === 1 && regExpMetaChars.has(regexpStr)) { + throw PATH_ERROR; + } + } + nextNode = node.#children[regexpStr]; + if (!nextNode) { + if (regexpStr !== ONLY_WILDCARD_REG_EXP_STR && regexpStr !== TAIL_WILDCARD_REG_EXP_STR) { + for (const k2 in node.#children) { + if ((regexpStr.length > 1 || k2.length > 1) && k2 !== ONLY_WILDCARD_REG_EXP_STR && k2 !== TAIL_WILDCARD_REG_EXP_STR) { + throw PATH_ERROR; + } + } + } + nextNode = node.#children[regexpStr] = new _Node; } - node = this.#children[regexpStr] = new _Node; if (name2 !== "") { - node.#varIndex = context2.varIndex++; - } - } - if (!pathErrorCheckOnly && name2 !== "") { - paramMap.push([name2, node.#varIndex]); - } - } else { - node = this.#children[token]; - if (!node) { - if (Object.keys(this.#children).some((k2) => k2.length > 1 && k2 !== ONLY_WILDCARD_REG_EXP_STR && k2 !== TAIL_WILDCARD_REG_EXP_STR)) { - throw PATH_ERROR; + nextNode.#varIndex ??= context2.varIndex++; + paramMap.push([name2, nextNode.#varIndex]); } - if (pathErrorCheckOnly) { - return; + } else { + nextNode = node.#children[token]; + if (!nextNode) { + for (const k2 in node.#children) { + if (k2.length > 1 && k2 !== ONLY_WILDCARD_REG_EXP_STR && k2 !== TAIL_WILDCARD_REG_EXP_STR) { + throw PATH_ERROR; + } + } + nextNode = node.#children[token] = new _Node; } - node = this.#children[token] = new _Node; } + node = nextNode; } - node.insert(restTokens, index2, paramMap, context2, pathErrorCheckOnly); + if (node.#index !== undefined) { + throw PATH_ERROR; + } + node.#index = isStatic ? -1 : index2; } buildRegExpStr() { const childKeys = Object.keys(this.#children).sort(compareKey); const strList = childKeys.map((k2) => { const c = this.#children[k2]; - return (typeof c.#varIndex === "number" ? `(${k2})@${c.#varIndex}` : regExpMetaChars.has(k2) ? `\\${k2}` : k2) + c.buildRegExpStr(); - }); - if (typeof this.#index === "number") { + const childStr = c.buildRegExpStr(); + return childStr === "" ? "" : (typeof c.#varIndex === "number" ? `(${k2})@${c.#varIndex}` : regExpMetaChars.has(k2) ? `\\${k2}` : k2) + childStr; + }).filter(Boolean); + if (typeof this.#index === "number" && this.#index !== -1) { strList.unshift(`#${this.#index}`); } if (strList.length === 0) { @@ -85460,12 +85494,19 @@ var init_node = __esm(() => { var Trie = class { #context = { varIndex: 0 }; #root = new Node2; - insert(path5, index2, pathErrorCheckOnly) { + #index = 0; + paths = /* @__PURE__ */ Object.create(null); + insert(path6, isStatic) { + if (isStatic) { + this.#root.insert(path6.split(""), 0, [], this.#context, true); + return; + } const paramAssoc = []; const groups = []; + let markedPath = path6; for (let i2 = 0;; ) { let replaced = false; - path5 = path5.replace(/\{[^}]+\}/g, (m) => { + markedPath = markedPath.replace(/\{[^}]+\}/g, (m) => { const mark = `@\\${i2}`; groups[i2] = [mark, m]; i2++; @@ -85476,7 +85517,7 @@ var Trie = class { break; } } - const tokens = path5.match(/(?::[^\/]+)|(?:\/\*$)|./g) || []; + const tokens = markedPath.match(/(?::[^\/]+)|(?:\/\*$)|./g) || []; for (let i2 = groups.length - 1;i2 >= 0; i2--) { const [mark] = groups[i2]; for (let j2 = tokens.length - 1;j2 >= 0; j2--) { @@ -85486,8 +85527,8 @@ var Trie = class { } } } - this.#root.insert(tokens, index2, paramAssoc, this.#context, pathErrorCheckOnly); - return paramAssoc; + this.#root.insert(tokens, this.#index, paramAssoc, this.#context, false); + this.paths[path6] = [this.#index++, paramAssoc]; } buildRegExp() { let regexp = this.#root.buildRegExpStr(); @@ -85516,111 +85557,68 @@ var init_trie2 = __esm(() => { }); // node_modules/hono/dist/router/reg-exp-router/router.js -function buildWildcardRegExp(path5) { - return wildcardRegExpCache[path5] ??= new RegExp(path5 === "*" ? "" : `^${path5.replace(/\/\*$|([.\\+*[^\]$()])/g, (_2, metaChar) => metaChar ? `\\${metaChar}` : "(?:|/.*)")}$`); +function buildWildcardRegExp(path6) { + return wildcardRegExpCache[path6] ??= new RegExp(path6 === "*" ? "" : `^${path6.replace(/\/\*$|([.\\+*[^\]$()])/g, (_2, metaChar) => metaChar ? `\\${metaChar}` : "(?:|/.*)")}$`); } function clearWildcardRegExpCache() { wildcardRegExpCache = /* @__PURE__ */ Object.create(null); } -function buildMatcherFromPreprocessedRoutes(routes) { - const trie = new Trie; - const handlerData = []; - if (routes.length === 0) { - return nullMatcher; - } - const routesWithStaticPathFlag = routes.map((route) => [!/\*|\/:/.test(route[0]), ...route]).sort(([isStaticA, pathA], [isStaticB, pathB]) => isStaticA ? 1 : isStaticB ? -1 : pathA.length - pathB.length); - const staticMap = /* @__PURE__ */ Object.create(null); - for (let i2 = 0, j2 = -1, len = routesWithStaticPathFlag.length;i2 < len; i2++) { - const [pathErrorCheckOnly, path5, handlers] = routesWithStaticPathFlag[i2]; - if (pathErrorCheckOnly) { - staticMap[path5] = [handlers.map(([h2]) => [h2, /* @__PURE__ */ Object.create(null)]), emptyParam]; - } else { - j2++; - } - let paramAssoc; - try { - paramAssoc = trie.insert(path5, j2, pathErrorCheckOnly); - } catch (e) { - throw e === PATH_ERROR ? new UnsupportedPathError(path5) : e; - } - if (pathErrorCheckOnly) { - continue; - } - handlerData[j2] = handlers.map(([h2, paramCount]) => { - const paramIndexMap = /* @__PURE__ */ Object.create(null); - paramCount -= 1; - for (;paramCount >= 0; paramCount--) { - const [key, value8] = paramAssoc[paramCount]; - paramIndexMap[key] = value8; - } - return [h2, paramIndexMap]; - }); - } - const [regexp, indexReplacementMap, paramReplacementMap] = trie.buildRegExp(); - for (let i2 = 0, len = handlerData.length;i2 < len; i2++) { - for (let j2 = 0, len2 = handlerData[i2].length;j2 < len2; j2++) { - const map32 = handlerData[i2][j2]?.[1]; - if (!map32) { - continue; - } - const keys12 = Object.keys(map32); - for (let k2 = 0, len3 = keys12.length;k2 < len3; k2++) { - map32[keys12[k2]] = paramReplacementMap[map32[keys12[k2]]]; - } - } - } - const handlerMap = []; - for (const i2 in indexReplacementMap) { - handlerMap[i2] = handlerData[indexReplacementMap[i2]]; - } - return [regexp, handlerMap, staticMap]; -} -function findMiddleware(middleware, path5) { +function findMiddleware(middleware, path6) { if (!middleware) { return; } for (const k2 of Object.keys(middleware).sort((a, b) => b.length - a.length)) { - if (buildWildcardRegExp(k2).test(path5)) { + if (buildWildcardRegExp(k2).test(path6)) { return [...middleware[k2]]; } } return; } -var nullMatcher, wildcardRegExpCache, RegExpRouter = class { +var wildcardRegExpCache, RegExpRouter = class { name = "RegExpRouter"; #middleware; #routes; + #tries; constructor() { this.#middleware = { [METHOD_NAME_ALL]: /* @__PURE__ */ Object.create(null) }; this.#routes = { [METHOD_NAME_ALL]: /* @__PURE__ */ Object.create(null) }; + this.#tries = { [METHOD_NAME_ALL]: new Trie }; } - add(method, path5, handler) { + #insertPath(method, path6) { + try { + this.#tries[method].insert(path6, !/\*|\/:/.test(path6)); + } catch (e) { + throw e === PATH_ERROR ? new UnsupportedPathError(path6) : e; + } + } + add(method, path6, handler) { const middleware = this.#middleware; const routes = this.#routes; if (!middleware || !routes) { throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT); } if (!middleware[method]) { + this.#tries[method] = new Trie; [middleware, routes].forEach((handlerMap) => { handlerMap[method] = /* @__PURE__ */ Object.create(null); Object.keys(handlerMap[METHOD_NAME_ALL]).forEach((p) => { handlerMap[method][p] = [...handlerMap[METHOD_NAME_ALL][p]]; + this.#insertPath(method, p); }); }); } - if (path5 === "/*") { - path5 = "*"; + if (path6 === "/*") { + path6 = "*"; } - const paramCount = (path5.match(/\/:/g) || []).length; - if (/\*$/.test(path5)) { - const re2 = buildWildcardRegExp(path5); - if (method === METHOD_NAME_ALL) { - Object.keys(middleware).forEach((m) => { - middleware[m][path5] ||= findMiddleware(middleware[m], path5) || findMiddleware(middleware[METHOD_NAME_ALL], path5) || []; - }); - } else { - middleware[method][path5] ||= findMiddleware(middleware[method], path5) || findMiddleware(middleware[METHOD_NAME_ALL], path5) || []; - } + const paramCount = (path6.match(/\/:/g) || []).length; + if (/\*$/.test(path6)) { + const re2 = buildWildcardRegExp(path6); + Object.keys(middleware).forEach((m) => { + if ((method === METHOD_NAME_ALL || method === m) && !middleware[m][path6]) { + this.#insertPath(m, path6); + middleware[m][path6] = findMiddleware(middleware[m], path6) || findMiddleware(middleware[METHOD_NAME_ALL], path6) || []; + } + }); Object.keys(middleware).forEach((m) => { if (method === METHOD_NAME_ALL || method === m) { Object.keys(middleware[m]).forEach((p) => { @@ -85635,14 +85633,17 @@ var nullMatcher, wildcardRegExpCache, RegExpRouter = class { }); return; } - const paths = checkOptionalParameter(path5) || [path5]; + const paths = checkOptionalParameter(path6) || [path6]; for (let i2 = 0, len = paths.length;i2 < len; i2++) { const path22 = paths[i2]; Object.keys(routes).forEach((m) => { if (method === METHOD_NAME_ALL || method === m) { - routes[m][path22] ||= [ - ...findMiddleware(middleware[m], path22) || findMiddleware(middleware[METHOD_NAME_ALL], path22) || [] - ]; + if (!routes[m][path22]) { + this.#insertPath(m, path22); + routes[m][path22] = [ + ...findMiddleware(middleware[m], path22) || findMiddleware(middleware[METHOD_NAME_ALL], path22) || [] + ]; + } routes[m][path22].push([handler, paramCount - len + i2 + 1]); } }); @@ -85654,27 +85655,54 @@ var nullMatcher, wildcardRegExpCache, RegExpRouter = class { Object.keys(this.#routes).concat(Object.keys(this.#middleware)).forEach((method) => { matchers[method] ||= this.#buildMatcher(method); }); - this.#middleware = this.#routes = undefined; + this.#middleware = this.#routes = this.#tries = undefined; clearWildcardRegExpCache(); return matchers; } #buildMatcher(method) { - const routes = []; - let hasOwnRoute = method === METHOD_NAME_ALL; - [this.#middleware, this.#routes].forEach((r) => { - const ownRoute = r[method] ? Object.keys(r[method]).map((path5) => [path5, r[method][path5]]) : []; - if (ownRoute.length !== 0) { - hasOwnRoute ||= true; - routes.push(...ownRoute); - } else if (method !== METHOD_NAME_ALL) { - routes.push(...Object.keys(r[METHOD_NAME_ALL]).map((path5) => [path5, r[METHOD_NAME_ALL][path5]])); - } - }); - if (!hasOwnRoute) { - return null; - } else { - return buildMatcherFromPreprocessedRoutes(routes); + const middleware = this.#middleware[method]; + const routes = this.#routes[method]; + const trie = this.#tries[method]; + const staticMap = /* @__PURE__ */ Object.create(null); + const handlerData = []; + [middleware, routes].forEach((r) => { + for (const path6 in r) { + const handlers = r[path6]; + const pathData = trie.paths[path6]; + if (!pathData) { + staticMap[path6] = [handlers.map(([h2]) => [h2, /* @__PURE__ */ Object.create(null)]), emptyParam]; + continue; + } + const paramAssoc = pathData[1]; + handlerData[pathData[0]] = handlers.map(([h2, paramCount]) => { + const paramIndexMap = /* @__PURE__ */ Object.create(null); + paramCount -= 1; + for (;paramCount >= 0; paramCount--) { + const [key, value8] = paramAssoc[paramCount]; + paramIndexMap[key] = value8; + } + return [h2, paramIndexMap]; + }); + } + }); + const [regexp, indexReplacementMap, paramReplacementMap] = trie.buildRegExp(); + for (let i2 = 0, len = handlerData.length;i2 < len; i2++) { + for (let j2 = 0, len2 = handlerData[i2].length;j2 < len2; j2++) { + const map32 = handlerData[i2][j2]?.[1]; + if (!map32) { + continue; + } + const keys12 = Object.keys(map32); + for (let k2 = 0, len3 = keys12.length;k2 < len3; k2++) { + map32[keys12[k2]] = paramReplacementMap[map32[keys12[k2]]]; + } + } + } + const handlerMap = []; + for (const i2 in indexReplacementMap) { + handlerMap[i2] = handlerData[indexReplacementMap[i2]]; } + return [regexp, handlerMap, staticMap]; } }; var init_router2 = __esm(() => { @@ -85683,7 +85711,6 @@ var init_router2 = __esm(() => { init_matcher2(); init_node(); init_trie2(); - nullMatcher = [/^$/, [], /* @__PURE__ */ Object.create(null)]; wildcardRegExpCache = /* @__PURE__ */ Object.create(null); }); @@ -85701,21 +85728,21 @@ var PreparedRegExpRouter = class { matcher[1].forEach((list) => list && list.push(handlerData)); Object.values(matcher[2]).forEach((list) => list[0].push(handlerData)); } - #addPath(method, path5, handler, indexes, map32) { + #addPath(method, path6, handler, indexes, map32) { const matcher = this.#matchers[method]; if (!map32) { - matcher[2][path5][0].push([handler, {}]); + matcher[2][path6][0].push([handler, {}]); } else { indexes.forEach((index2) => { if (typeof index2 === "number") { matcher[1][index2].push([handler, map32]); } else { - matcher[2][index2 || path5][0].push([handler, map32]); + matcher[2][index2 || path6][0].push([handler, map32]); } }); } } - add(method, path5, handler) { + add(method, path6, handler) { if (!this.#matchers[method]) { const all7 = this.#matchers[METHOD_NAME_ALL]; const staticMap = {}; @@ -85728,7 +85755,7 @@ var PreparedRegExpRouter = class { staticMap ]; } - if (path5 === "/*" || path5 === "*") { + if (path6 === "/*" || path6 === "*") { const handlerData = [handler, {}]; if (method === METHOD_NAME_ALL) { for (const m in this.#matchers) { @@ -85739,17 +85766,17 @@ var PreparedRegExpRouter = class { } return; } - const data2 = this.#relocateMap[path5]; + const data2 = this.#relocateMap[path6]; if (!data2) { - throw new Error(`Path ${path5} is not registered`); + throw new Error(`Path ${path6} is not registered`); } for (const [indexes, map32] of data2) { if (method === METHOD_NAME_ALL) { for (const m in this.#matchers) { - this.#addPath(m, path5, handler, indexes, map32); + this.#addPath(m, path6, handler, indexes, map32); } } else { - this.#addPath(method, path5, handler, indexes, map32); + this.#addPath(method, path6, handler, indexes, map32); } } } @@ -85778,13 +85805,13 @@ var SmartRouter = class { constructor(init3) { this.#routers = init3.routers; } - add(method, path5, handler) { + add(method, path6, handler) { if (!this.#routes) { throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT); } - this.#routes.push([method, path5, handler]); + this.#routes.push([method, path6, handler]); } - match(method, path5) { + match(method, path6) { if (!this.#routes) { throw new Error("Fatal error"); } @@ -85799,7 +85826,7 @@ var SmartRouter = class { for (let i22 = 0, len2 = routes.length;i22 < len2; i22++) { router.add(...routes[i22]); } - res = router.match(method, path5); + res = router.match(method, path6); } catch (e) { if (e instanceof UnsupportedPathError) { continue; @@ -85855,10 +85882,10 @@ var emptyParams, hasChildren = (children) => { } this.#patterns = []; } - insert(method, path5, handler) { + insert(method, path6, handler) { this.#order = ++this.#order; let curNode = this; - const parts3 = splitRoutingPath(path5); + const parts3 = splitRoutingPath(path6); const possibleKeys = []; for (let i2 = 0, len = parts3.length;i2 < len; i2++) { const p = parts3[i2]; @@ -85907,12 +85934,12 @@ var emptyParams, hasChildren = (children) => { } } } - search(method, path5) { + search(method, path6) { const handlerSets = []; this.#params = emptyParams; const curNode = this; let curNodes = [curNode]; - const parts3 = splitPath(path5); + const parts3 = splitPath(path6); const curNodesQueue = []; const len = parts3.length; let partOffsets = null; @@ -85954,20 +85981,23 @@ var emptyParams, hasChildren = (children) => { if (matcher instanceof RegExp) { if (partOffsets === null) { partOffsets = new Array(len); - let offset = path5[0] === "/" ? 1 : 0; + let offset = path6[0] === "/" ? 1 : 0; for (let p = 0;p < len; p++) { partOffsets[p] = offset; offset += parts3[p].length + 1; } } - const restPathString = path5.substring(partOffsets[i2]); + const restPathString = path6.substring(partOffsets[i2]); const m = matcher.exec(restPathString); if (m) { params[name2] = m[0]; this.#pushHandlerSets(handlerSets, child, method, node.#params, params); + if (m[0].length === restPathString.length && child.#children["*"]) { + this.#pushHandlerSets(handlerSets, child.#children["*"], method, node.#params, params); + } if (hasChildren(child.#children)) { child.#params = params; - const componentCount = m[0].match(/\//)?.length ?? 0; + const componentCount = m[0].match(/\//g)?.length ?? 0; const targetCurNodes = curNodesQueue[componentCount] ||= []; targetCurNodes.push(child); } @@ -86012,18 +86042,18 @@ var TrieRouter = class { constructor() { this.#node = new Node3; } - add(method, path5, handler) { - const results = checkOptionalParameter(path5); + add(method, path6, handler) { + const results = checkOptionalParameter(path6); if (results) { for (let i2 = 0, len = results.length;i2 < len; i2++) { this.#node.insert(method, results[i2], handler); } return; } - this.#node.insert(method, path5, handler); + this.#node.insert(method, path6, handler); } - match(method, path5) { - return this.#node.search(method, path5); + match(method, path6) { + return this.#node.search(method, path6); } }; var init_router4 = __esm(() => { @@ -86056,25 +86086,265 @@ var init_hono = __esm(() => { // node_modules/hono/dist/index.js var init_dist7 = __esm(() => { init_hono(); + init_context(); }); +// node_modules/hono/dist/utils/accept.js +var isWhitespace = (char) => char === 32 || char === 9 || char === 10 || char === 13, consumeWhitespace = (acceptHeader, startIndex) => { + while (startIndex < acceptHeader.length) { + if (!isWhitespace(acceptHeader.charCodeAt(startIndex))) { + break; + } + startIndex++; + } + return startIndex; +}, ignoreTrailingWhitespace = (acceptHeader, startIndex) => { + while (startIndex > 0) { + if (!isWhitespace(acceptHeader.charCodeAt(startIndex - 1))) { + break; + } + startIndex--; + } + return startIndex; +}, skipInvalidParam = (acceptHeader, startIndex) => { + while (startIndex < acceptHeader.length) { + const char = acceptHeader.charCodeAt(startIndex); + if (char === 59) { + return [startIndex + 1, true]; + } + if (char === 44) { + return [startIndex + 1, false]; + } + startIndex++; + } + return [startIndex, false]; +}, skipInvalidAcceptValue = (acceptHeader, startIndex) => { + let i2 = startIndex; + let inQuotes = false; + while (i2 < acceptHeader.length) { + const char = acceptHeader.charCodeAt(i2); + if (inQuotes && char === 92) { + i2++; + } else if (char === 34) { + inQuotes = !inQuotes; + } else if (!inQuotes && char === 44) { + return i2 + 1; + } + i2++; + } + return i2; +}, getNextParam = (acceptHeader, startIndex) => { + startIndex = consumeWhitespace(acceptHeader, startIndex); + let i2 = startIndex; + let key; + let value8; + let hasNext = false; + while (i2 < acceptHeader.length) { + const char = acceptHeader.charCodeAt(i2); + if (char === 61) { + key = acceptHeader.slice(startIndex, ignoreTrailingWhitespace(acceptHeader, i2)); + i2++; + break; + } + if (char === 59) { + return [i2 + 1, undefined, undefined, true]; + } + if (char === 44) { + return [i2 + 1, undefined, undefined, false]; + } + i2++; + } + if (key === undefined) { + return [i2, undefined, undefined, false]; + } + i2 = consumeWhitespace(acceptHeader, i2); + if (acceptHeader.charCodeAt(i2) === 61) { + const skipResult = skipInvalidParam(acceptHeader, i2 + 1); + return [skipResult[0], key, undefined, skipResult[1]]; + } + let inQuotes = false; + const paramStartIndex = i2; + while (i2 < acceptHeader.length) { + const char = acceptHeader.charCodeAt(i2); + if (inQuotes && char === 92) { + i2++; + } else if (char === 34) { + if (inQuotes) { + let nextIndex = consumeWhitespace(acceptHeader, i2 + 1); + const nextChar = acceptHeader.charCodeAt(nextIndex); + if (nextIndex < acceptHeader.length && !(nextChar === 59 || nextChar === 44)) { + const skipResult = skipInvalidParam(acceptHeader, nextIndex); + return [skipResult[0], key, undefined, skipResult[1]]; + } + value8 = acceptHeader.slice(paramStartIndex + 1, i2); + if (value8.includes("\\")) { + value8 = value8.replace(/\\(.)/g, "$1"); + } + if (nextChar === 44) { + return [nextIndex + 1, key, value8, false]; + } + if (nextChar === 59) { + hasNext = true; + nextIndex++; + } + i2 = nextIndex; + break; + } + inQuotes = true; + } else if (!inQuotes && (char === 59 || char === 44)) { + value8 = acceptHeader.slice(paramStartIndex, ignoreTrailingWhitespace(acceptHeader, i2)); + if (char === 59) { + hasNext = true; + } + i2++; + break; + } + i2++; + } + return [ + i2, + key, + value8 ?? acceptHeader.slice(paramStartIndex, ignoreTrailingWhitespace(acceptHeader, i2)), + hasNext + ]; +}, getNextAcceptValue = (acceptHeader, startIndex) => { + const accept = { + type: "", + params: /* @__PURE__ */ Object.create(null), + q: 1 + }; + startIndex = consumeWhitespace(acceptHeader, startIndex); + let i2 = startIndex; + while (i2 < acceptHeader.length) { + const char = acceptHeader.charCodeAt(i2); + if (char === 59 || char === 44) { + accept.type = acceptHeader.slice(startIndex, ignoreTrailingWhitespace(acceptHeader, i2)); + i2++; + if (char === 44) { + return [i2, accept.type ? accept : undefined]; + } + if (!accept.type) { + return [skipInvalidAcceptValue(acceptHeader, i2), undefined]; + } + break; + } + i2++; + } + if (!accept.type) { + accept.type = acceptHeader.slice(startIndex, ignoreTrailingWhitespace(acceptHeader, acceptHeader.length)); + return [acceptHeader.length, accept.type ? accept : undefined]; + } + let param; + let value8; + let hasNext; + while (i2 < acceptHeader.length) { + [i2, param, value8, hasNext] = getNextParam(acceptHeader, i2); + if (param && value8) { + accept.params[param] = value8; + } + if (!hasNext) { + break; + } + } + return [i2, accept]; +}, parseAccept = (acceptHeader) => { + if (!acceptHeader) { + return []; + } + const values12 = []; + let i2 = 0; + let accept; + let requiresSort = false; + let lastAccept; + while (i2 < acceptHeader.length) { + [i2, accept] = getNextAcceptValue(acceptHeader, i2); + if (accept) { + accept.q = parseQuality(accept.params.q); + values12.push(accept); + if (lastAccept && lastAccept.q < accept.q) { + requiresSort = true; + } + lastAccept = accept; + } + } + if (requiresSort) { + values12.sort((a, b) => b.q - a.q); + } + return values12; +}, parseQuality = (qVal) => { + if (qVal === undefined) { + return 1; + } + if (qVal === "") { + return 1; + } + if (qVal === "NaN") { + return 0; + } + const num = Number(qVal); + if (num === Infinity) { + return 1; + } + if (num === -Infinity) { + return 0; + } + if (Number.isNaN(num)) { + return 1; + } + if (num < 0 || num > 1) { + return 1; + } + return num; +}; +var init_accept = () => {}; + // node_modules/hono/dist/utils/compress.js var COMPRESSIBLE_CONTENT_TYPE_REGEX; var init_compress = __esm(() => { - COMPRESSIBLE_CONTENT_TYPE_REGEX = /^\s*(?:text\/(?!event-stream(?:[;\s]|$))[^;\s]+|application\/(?:javascript|json|xml|xml-dtd|ecmascript|dart|postscript|rtf|tar|toml|vnd\.dart|vnd\.ms-fontobject|vnd\.ms-opentype|wasm|x-httpd-php|x-javascript|x-ns-proxy-autoconfig|x-sh|x-tar|x-virtualbox-hdd|x-virtualbox-ova|x-virtualbox-ovf|x-virtualbox-vbox|x-virtualbox-vdi|x-virtualbox-vhd|x-virtualbox-vmdk|x-www-form-urlencoded)|font\/(?:otf|ttf)|image\/(?:bmp|vnd\.adobe\.photoshop|vnd\.microsoft\.icon|vnd\.ms-dds|x-icon|x-ms-bmp)|message\/rfc822|model\/gltf-binary|x-shader\/x-fragment|x-shader\/x-vertex|[^;\s]+?\+(?:json|text|xml|yaml))(?:[;\s]|$)/i; + COMPRESSIBLE_CONTENT_TYPE_REGEX = /^\s*(?:text\/(?!event-stream(?:[;\s]|$))[^;\s]+|application\/(?:javascript|json|xml|xml-dtd|ecmascript|dart|msgpack|postscript|rtf|tar|toml|vnd\.dart|vnd\.ms-fontobject|vnd\.ms-opentype|vnd\.msgpack|wasm|x-httpd-php|x-javascript|x-msgpack|x-ns-proxy-autoconfig|x-sh|x-tar|x-virtualbox-hdd|x-virtualbox-ova|x-virtualbox-ovf|x-virtualbox-vbox|x-virtualbox-vdi|x-virtualbox-vhd|x-virtualbox-vmdk|x-www-form-urlencoded)|font\/(?:otf|ttf)|image\/(?:bmp|vnd\.adobe\.photoshop|vnd\.microsoft\.icon|vnd\.ms-dds|x-icon|x-ms-bmp)|message\/rfc822|model\/gltf-binary|x-shader\/x-fragment|x-shader\/x-vertex|[^;\s]+?\+(?:json|text|xml|yaml|msgpack))(?:[;\s]|$)/i; }); // node_modules/hono/dist/middleware/compress/index.js -var ENCODING_TYPES, cacheControlNoTransformRegExp, compress = (options2) => { +var ENCODING_TYPES, cacheControlNoTransformRegExp, selectEncoding = (header, candidates) => { + if (header === undefined) { + return; + } + const accepts = parseAccept(header); + const wildcardQ = accepts.find((a) => a.type === "*")?.q; + let best; + for (const enc of candidates) { + const explicit = accepts.find((a) => a.type.toLowerCase() === enc); + const q2 = explicit ? explicit.q : wildcardQ ?? 0; + if (q2 === 1) { + return enc; + } else if (q2 > 0 && (!best || q2 > best.q)) { + best = { encoding: enc, q: q2 }; + } + } + return best?.encoding; +}, varyAcceptEncodingRegExp, compress = (options2) => { const threshold = options2?.threshold ?? 1024; + const candidates = options2?.encoding ? [options2.encoding] : ENCODING_TYPES; + const contentTypeFilter = options2?.contentTypeFilter ?? COMPRESSIBLE_CONTENT_TYPE_REGEX; + const shouldCompress = typeof contentTypeFilter === "function" ? (res) => { + const type3 = res.headers.get("Content-Type"); + return type3 && contentTypeFilter(type3); + } : (res) => { + const type3 = res.headers.get("Content-Type"); + return type3 && contentTypeFilter.test(type3); + }; return async function compress2(ctx, next3) { await next3(); const contentLength = ctx.res.headers.get("Content-Length"); - if (ctx.res.headers.has("Content-Encoding") || ctx.res.headers.has("Transfer-Encoding") || ctx.req.method === "HEAD" || contentLength && Number(contentLength) < threshold || !shouldCompress(ctx.res) || !shouldTransform(ctx.res)) { + if (ctx.res.status === 206 || ctx.res.headers.has("Content-Encoding") || ctx.res.headers.has("Transfer-Encoding") || ctx.req.method === "HEAD" || contentLength && Number(contentLength) < threshold || !shouldCompress(ctx.res) || !shouldTransform(ctx.res)) { return; } + const current = ctx.res.headers.get("Vary"); + if (current !== "*" && !(current && varyAcceptEncodingRegExp.test(current))) { + ctx.header("Vary", current ? `${current}, Accept-Encoding` : "Accept-Encoding"); + } const accepted = ctx.req.header("Accept-Encoding"); - const encoding = options2?.encoding ?? ENCODING_TYPES.find((encoding2) => accepted?.includes(encoding2)); + const encoding = selectEncoding(accepted, candidates); if (!encoding || !ctx.res.body) { return; } @@ -86087,24 +86357,23 @@ var ENCODING_TYPES, cacheControlNoTransformRegExp, compress = (options2) => { ctx.res.headers.set("ETag", `W/${etag}`); } }; -}, shouldCompress = (res) => { - const type3 = res.headers.get("Content-Type"); - return type3 && COMPRESSIBLE_CONTENT_TYPE_REGEX.test(type3); }, shouldTransform = (res) => { const cacheControl = res.headers.get("Cache-Control"); return !cacheControl || !cacheControlNoTransformRegExp.test(cacheControl); }; var init_compress2 = __esm(() => { + init_accept(); init_compress(); ENCODING_TYPES = ["gzip", "deflate"]; cacheControlNoTransformRegExp = /(?:^|,)\s*?no-transform\s*?(?:,|$)/i; + varyAcceptEncodingRegExp = /(?:^|,)\s*accept-encoding\s*(?:,|$)/i; }); // node_modules/hono/dist/middleware/cors/index.js var cors = (options2) => { const opts = { origin: "*", - allowMethods: ["GET", "HEAD", "PUT", "POST", "DELETE", "PATCH"], + allowMethods: ["GET", "HEAD", "PUT", "POST", "DELETE", "PATCH", "QUERY"], allowHeaders: [], exposeHeaders: [], ...options2 @@ -86112,9 +86381,6 @@ var cors = (options2) => { const findAllowOrigin = ((optsOrigin) => { if (typeof optsOrigin === "string") { if (optsOrigin === "*") { - if (opts.credentials) { - return (origin) => origin || null; - } return () => optsOrigin; } else { return (origin) => optsOrigin === origin ? origin : null; @@ -86149,7 +86415,7 @@ var cors = (options2) => { set22("Access-Control-Expose-Headers", opts.exposeHeaders.join(",")); } if (c.req.method === "OPTIONS") { - if (opts.origin !== "*" || opts.credentials) { + if (opts.origin !== "*") { set22("Vary", "Origin"); } if (opts.maxAge != null) { @@ -86163,7 +86429,7 @@ var cors = (options2) => { if (!headers?.length) { const requestHeaders = c.req.header("Access-Control-Request-Headers"); if (requestHeaders) { - headers = requestHeaders.split(/\s*,\s*/); + headers = requestHeaders.split(",").map((h2) => h2.trim()); } } if (headers?.length) { @@ -86179,7 +86445,7 @@ var cors = (options2) => { }); } await next3(); - if (opts.origin !== "*" || opts.credentials) { + if (opts.origin !== "*") { c.header("Vary", "Origin", { append: true }); } }; @@ -86207,10 +86473,10 @@ var init_migrator_utils = () => {}; import crypto2 from "crypto"; import fs5, { existsSync as existsSync2, readdirSync as readdirSync3 } from "fs"; import { join as join9 } from "path"; -function readMigrationFiles(config3) { - if (fs5.existsSync(`${config3.migrationsFolder}/meta/_journal.json`)) +function readMigrationFiles(config2) { + if (fs5.existsSync(`${config2.migrationsFolder}/meta/_journal.json`)) throw Error('We detected that you have old drizzle-kit migration folders. You must upgrade drizzle-kit and run "drizzle-kit up"'); - const migrationFolderTo = config3.migrationsFolder; + const migrationFolderTo = config2.migrationsFolder; const migrationQueries = []; const migrations = readdirSync3(migrationFolderTo).map((subdir) => ({ path: join9(migrationFolderTo, subdir, "migration.sql"), @@ -86240,10 +86506,10 @@ var init_migrator = __esm(() => { }); // node_modules/drizzle-orm/bun-sqlite/migrator.js -function migrate(db2, config3) { - if (Array.isArray(config3) || "migrationsJournal" in config3) { - const journal = Array.isArray(config3) ? config3 : config3.migrationsJournal; - const migrationsTable = Array.isArray(config3) ? undefined : config3.migrationsTable; +function migrate(db2, config2) { + if (Array.isArray(config2) || "migrationsJournal" in config2) { + const journal = Array.isArray(config2) ? config2 : config2.migrationsJournal; + const migrationsTable = Array.isArray(config2) ? undefined : config2.migrationsTable; const migrations2 = journal.map((d) => ({ sql: d.sql.split("--> statement-breakpoint"), folderMillis: d.timestamp, @@ -86253,19 +86519,13 @@ function migrate(db2, config3) { })); return db2.dialect.migrate(migrations2, db2.session, { migrationsTable }); } - const migrations = readMigrationFiles(config3); - return db2.dialect.migrate(migrations, db2.session, config3); + const migrations = readMigrationFiles(config2); + return db2.dialect.migrate(migrations, db2.session, config2); } var init_migrator2 = __esm(() => { init_migrator(); }); -// node_modules/drizzle-orm/column-common.js -var OriginalColumn; -var init_column_common = __esm(() => { - OriginalColumn = Symbol.for("drizzle:OriginalColumn"); -}); - // node_modules/drizzle-orm/entity.js function is6(value8, type3) { if (!value8 || typeof value8 !== "object") @@ -86289,6 +86549,46 @@ var init_entity = __esm(() => { hasOwnEntityKind = Symbol.for("drizzle:hasOwnEntityKind"); }); +// node_modules/drizzle-orm/logger.js +var ConsoleLogWriter, DefaultLogger, NoopLogger; +var init_logger = __esm(() => { + init_entity(); + ConsoleLogWriter = class { + static [entityKind] = "ConsoleLogWriter"; + write(message) { + console.log(message); + } + }; + DefaultLogger = class { + static [entityKind] = "DefaultLogger"; + writer; + constructor(config2) { + this.writer = config2?.writer ?? new ConsoleLogWriter; + } + logQuery(query, params) { + const stringifiedParams = params.map((p) => { + try { + return JSON.stringify(p); + } catch { + return String(p); + } + }); + const paramsStr = stringifiedParams.length ? ` -- params: [${stringifiedParams.join(", ")}]` : ""; + this.writer.write(`Query: ${query}${paramsStr}`); + } + }; + NoopLogger = class { + static [entityKind] = "NoopLogger"; + logQuery() {} + }; +}); + +// node_modules/drizzle-orm/column-common.js +var OriginalColumn; +var init_column_common = __esm(() => { + OriginalColumn = Symbol.for("drizzle:OriginalColumn"); +}); + // node_modules/drizzle-orm/column.js var Column; var init_column = __esm(() => { @@ -86318,28 +86618,28 @@ var init_column = __esm(() => { config; table; onInit() {} - constructor(table2, config3) { - this.config = config3; + constructor(table2, config2) { + this.config = config2; this.onInit(); this.table = table2; - this.name = config3.name; + this.name = config2.name; this.isAlias = false; - this.keyAsName = config3.keyAsName; - this.notNull = config3.notNull; - this.default = config3.default; - this.defaultFn = config3.defaultFn; - this.onUpdateFn = config3.onUpdateFn; - this.hasDefault = config3.hasDefault; - this.primary = config3.primaryKey; - this.isUnique = config3.isUnique; - this.uniqueName = config3.uniqueName; - this.uniqueType = config3.uniqueType; - this.dataType = config3.dataType; - this.columnType = config3.columnType; - this.generated = config3.generated; - this.generatedIdentity = config3.generatedIdentity; - this.length = config3["length"]; - this.isLengthExact = config3["isLengthExact"]; + this.keyAsName = config2.keyAsName; + this.notNull = config2.notNull; + this.default = config2.default; + this.defaultFn = config2.defaultFn; + this.onUpdateFn = config2.onUpdateFn; + this.hasDefault = config2.hasDefault; + this.primary = config2.primaryKey; + this.isUnique = config2.isUnique; + this.uniqueName = config2.uniqueName; + this.uniqueType = config2.uniqueType; + this.dataType = config2.dataType; + this.columnType = config2.columnType; + this.generated = config2.generated; + this.generatedIdentity = config2.generatedIdentity; + this.length = config2["length"]; + this.isLengthExact = config2["isLengthExact"]; } mapFromDriverValue(value8) { return value8; @@ -86534,9 +86834,9 @@ var init_sql = __esm(() => { this.queryChunks.push(...query.queryChunks); return this; } - toQuery(config3) { + toQuery(config2) { return tracer3.startActiveSpan("drizzle.buildSQL", (span3) => { - const query = this.buildQueryFromSourceParams(this.queryChunks, config3); + const query = this.buildQueryFromSourceParams(this.queryChunks, config2); span3?.setAttributes({ "drizzle.query.text": query.sql, "drizzle.query.params": JSON.stringify(query.params) @@ -86545,11 +86845,11 @@ var init_sql = __esm(() => { }); } buildQueryFromSourceParams(chunks2, _config) { - const config3 = Object.assign({}, _config, { + const config2 = Object.assign({}, _config, { inlineParams: _config.inlineParams || this.shouldInlineParams, paramStartIndex: _config.paramStartIndex || { value: 0 } }); - const { casing, escapeName, escapeParam, prepareTyping, inlineParams, paramStartIndex, invokeSource } = config3; + const { casing, escapeName, escapeParam, prepareTyping, inlineParams, paramStartIndex, invokeSource } = config2; return mergeQueries(chunks2.map((chunk) => { if (is6(chunk, StringChunk)) return { @@ -86574,11 +86874,11 @@ var init_sql = __esm(() => { result6.push(new StringChunk(", ")); } result6.push(new StringChunk(")")); - return this.buildQueryFromSourceParams(result6, config3); + return this.buildQueryFromSourceParams(result6, config2); } if (is6(chunk, SQL2)) return this.buildQueryFromSourceParams(chunk.queryChunks, { - ...config3, + ...config2, inlineParams: inlineParams || chunk.shouldInlineParams }); if (is6(chunk, Table)) { @@ -86624,10 +86924,10 @@ var init_sql = __esm(() => { }; const mappedValue = chunk.value === null ? null : chunk.encoder.mapToDriverValue(chunk.value); if (is6(mappedValue, SQL2)) - return this.buildQueryFromSourceParams([mappedValue], config3); + return this.buildQueryFromSourceParams([mappedValue], config2); if (inlineParams) return { - sql: this.mapInlineParam(mappedValue, config3), + sql: this.mapInlineParam(mappedValue, config2), params: [] }; let typings = ["none"]; @@ -86661,7 +86961,7 @@ var init_sql = __esm(() => { chunk._.sql, new StringChunk(") "), new Name(chunk._.alias) - ], config3); + ], config2); } if (typeof chunk === "function" && "enumName" in chunk) { if ("schema" in chunk && chunk.schema) @@ -86676,16 +86976,16 @@ var init_sql = __esm(() => { } if (isSQLWrapper(chunk)) { if (chunk.shouldOmitSQLParens?.()) - return this.buildQueryFromSourceParams([chunk.getSQL()], config3); + return this.buildQueryFromSourceParams([chunk.getSQL()], config2); return this.buildQueryFromSourceParams([ new StringChunk("("), chunk.getSQL(), new StringChunk(")") - ], config3); + ], config2); } if (inlineParams) return { - sql: this.mapInlineParam(chunk, config3), + sql: this.mapInlineParam(chunk, config2), params: [] }; return { @@ -86861,6 +87161,251 @@ var init_sql = __esm(() => { }; }); +// node_modules/drizzle-orm/alias.js +function aliasedTable(table2, tableAlias) { + return new Proxy(table2, new TableAliasProxyHandler(tableAlias, false, false)); +} +function aliasedColumn(column, alias) { + return new Proxy(column, new ColumnAliasProxyHandler(alias)); +} +function aliasedTableColumn(column, tableAlias) { + return new Proxy(column, new ColumnTableAliasProxyHandler(new Proxy(column.table, new TableAliasProxyHandler(tableAlias, false, false)), false)); +} +function mapColumnsInAliasedSQLToAlias(query, alias) { + return new SQL.Aliased(mapColumnsInSQLToAlias(query.sql, alias), query.fieldAlias); +} +function mapColumnsInSQLToAlias(query, alias) { + return sql.join(query.queryChunks.map((c) => { + if (is6(c, Column)) + return aliasedTableColumn(c, alias); + if (is6(c, SQL)) + return mapColumnsInSQLToAlias(c, alias); + if (is6(c, SQL.Aliased)) + return mapColumnsInAliasedSQLToAlias(c, alias); + return c; + })); +} +function getOriginalColumnFromAlias(column) { + return column[OriginalColumn](); +} +var ColumnTableAliasProxyHandler, ViewSelectionAliasProxyHandler, TableAliasProxyHandler, ColumnAliasProxyHandler; +var init_alias = __esm(() => { + init_column_common(); + init_entity(); + init_column(); + init_table(); + init_sql(); + init_subquery(); + init_view_common(); + ColumnTableAliasProxyHandler = class { + static [entityKind] = "ColumnTableAliasProxyHandler"; + constructor(table2, ignoreColumnAlias) { + this.table = table2; + this.ignoreColumnAlias = ignoreColumnAlias; + } + get(columnObj, prop) { + if (prop === "table") + return this.table; + if (prop === "isAlias" && this.ignoreColumnAlias) + return false; + return columnObj[prop]; + } + }; + ViewSelectionAliasProxyHandler = class { + static [entityKind] = "ViewSelectionAliasProxyHandler"; + constructor(view, selection, ignoreColumnAlias) { + this.view = view; + this.selection = selection; + this.ignoreColumnAlias = ignoreColumnAlias; + } + get(selection, prop) { + const value8 = selection[prop]; + if (is6(value8, Column)) + return new Proxy(value8, new ColumnTableAliasProxyHandler(this.view, this.ignoreColumnAlias)); + if (is6(value8, Subquery) || is6(value8, SQL) || is6(value8, SQL.Aliased) || isSQLWrapper(value8) || typeof value8 !== "object" || value8 === null) + return value8; + return new Proxy(value8, this); + } + }; + TableAliasProxyHandler = class { + static [entityKind] = "TableAliasProxyHandler"; + constructor(alias, replaceOriginalName, ignoreColumnAlias) { + this.alias = alias; + this.replaceOriginalName = replaceOriginalName; + this.ignoreColumnAlias = ignoreColumnAlias; + } + get(target, prop) { + if (prop === Table.Symbol.IsAlias) + return true; + if (prop === Table.Symbol.Name) + return this.alias; + if (this.replaceOriginalName && prop === Table.Symbol.OriginalName) + return this.alias; + if (prop === ViewBaseConfig) + return { + ...target[ViewBaseConfig], + name: this.alias, + isAlias: true, + selectedFields: new Proxy(target[ViewBaseConfig].selectedFields, new ViewSelectionAliasProxyHandler(new Proxy(target, this), target[ViewBaseConfig].selectedFields, this.ignoreColumnAlias)) + }; + if (prop === Table.Symbol.Columns) { + const columns = target[Table.Symbol.Columns]; + if (!columns) + return columns; + if (is6(target, View)) + return new Proxy(target[Table.Symbol.Columns], new ViewSelectionAliasProxyHandler(new Proxy(target, this), target[Table.Symbol.Columns], this.ignoreColumnAlias)); + const proxiedColumns = {}; + Object.keys(columns).map((key) => { + proxiedColumns[key] = new Proxy(columns[key], new ColumnTableAliasProxyHandler(new Proxy(target, this), this.ignoreColumnAlias)); + }); + return proxiedColumns; + } + const value8 = target[prop]; + if (is6(value8, Column)) + return new Proxy(value8, new ColumnTableAliasProxyHandler(new Proxy(target, this), this.ignoreColumnAlias)); + return value8; + } + }; + ColumnAliasProxyHandler = class { + static [entityKind] = "ColumnAliasProxyHandler"; + constructor(alias) { + this.alias = alias; + } + get(target, prop) { + if (prop === "isAlias") + return true; + if (prop === "name") + return this.alias; + if (prop === "keyAsName") + return false; + if (prop === OriginalColumn) + return () => target; + return target[prop]; + } + }; + Column.prototype.as = function(alias) { + return aliasedColumn(this, alias); + }; +}); + +// node_modules/drizzle-orm/query-promise.js +var QueryPromise; +var init_query_promise = __esm(() => { + init_entity(); + QueryPromise = class { + static [entityKind] = "QueryPromise"; + [Symbol.toStringTag] = "QueryPromise"; + catch(onRejected) { + return this.then(undefined, onRejected); + } + finally(onFinally) { + return this.then((value8) => { + onFinally?.(); + return value8; + }, (reason2) => { + onFinally?.(); + throw reason2; + }); + } + then(onFulfilled, onRejected) { + return this.execute().then(onFulfilled, onRejected); + } + }; +}); + +// node_modules/drizzle-orm/column-builder.js +var ColumnBuilder; +var init_column_builder = __esm(() => { + init_entity(); + ColumnBuilder = class { + static [entityKind] = "ColumnBuilder"; + config; + constructor(name2, dataType, columnType) { + this.config = { + name: name2, + keyAsName: name2 === "", + notNull: false, + default: undefined, + hasDefault: false, + primaryKey: false, + isUnique: false, + uniqueName: undefined, + uniqueType: undefined, + dataType, + columnType, + generated: undefined + }; + } + $type() { + return this; + } + notNull() { + this.config.notNull = true; + return this; + } + default(value8) { + this.config.default = value8; + this.config.hasDefault = true; + return this; + } + $defaultFn(fn3) { + this.config.defaultFn = fn3; + this.config.hasDefault = true; + return this; + } + $default = this.$defaultFn; + $onUpdateFn(fn3) { + this.config.onUpdateFn = fn3; + this.config.hasDefault = true; + return this; + } + $onUpdate = this.$onUpdateFn; + primaryKey() { + this.config.primaryKey = true; + this.config.notNull = true; + return this; + } + setName(name2) { + if (this.config.name !== "") + return; + this.config.name = name2; + } + }; +}); + +// node_modules/drizzle-orm/errors.js +var DrizzleError, DrizzleQueryError, TransactionRollbackError; +var init_errors5 = __esm(() => { + init_entity(); + DrizzleError = class extends Error { + static [entityKind] = "DrizzleError"; + constructor({ message, cause }) { + super(message); + this.name = "DrizzleError"; + this.cause = cause; + } + }; + DrizzleQueryError = class DrizzleQueryError2 extends Error { + static [entityKind] = "DrizzleQueryError"; + constructor(query, params, cause) { + super(`Failed query: ${query} +params: ${params}`); + this.query = query; + this.params = params; + this.cause = cause; + Error.captureStackTrace(this, DrizzleQueryError2); + if (cause) + this.cause = cause; + } + }; + TransactionRollbackError = class extends DrizzleError { + static [entityKind] = "TransactionRollbackError"; + constructor() { + super({ message: "Rollback" }); + } + }; +}); + // node_modules/drizzle-orm/sql/expressions/conditions.js function bindIfParam(value8, column) { if (isDriverValueEncoder(column) && !isSQLWrapper(value8) && !is6(value8, Param) && !is6(value8, Placeholder) && !is6(value8, Column) && !is6(value8, Table) && !is6(value8, View)) @@ -86998,6 +87543,300 @@ var init_select = __esm(() => { init_sql(); }); +// node_modules/drizzle-orm/relations.js +function mapRelationalRow(row, buildQueryResultSelection, mapColumnValue = (value8) => value8, parseJson2 = false, parseJsonIfString = false, path6) { + for (const selectionItem of buildQueryResultSelection) { + if (selectionItem.selection) { + const currentPath = `${path6 ? `${path6}.` : ""}${selectionItem.key}`; + if (row[selectionItem.key] === null) + continue; + if (parseJson2) { + row[selectionItem.key] = JSON.parse(row[selectionItem.key]); + if (row[selectionItem.key] === null) + continue; + } + if (parseJsonIfString && typeof row[selectionItem.key] === "string") + row[selectionItem.key] = JSON.parse(row[selectionItem.key]); + if (selectionItem.isArray) { + for (const item of row[selectionItem.key]) + mapRelationalRow(item, selectionItem.selection, mapColumnValue, false, parseJsonIfString, currentPath); + continue; + } + mapRelationalRow(row[selectionItem.key], selectionItem.selection, mapColumnValue, false, parseJsonIfString, currentPath); + continue; + } + const field = selectionItem.field; + const value8 = mapColumnValue(row[selectionItem.key]); + if (value8 === null) + continue; + let decoder2; + if (is6(field, Column)) + decoder2 = field; + else if (is6(field, SQL)) + decoder2 = field.decoder; + else if (is6(field, SQL.Aliased)) + decoder2 = field.sql.decoder; + else if (is6(field, Table) || is6(field, View)) + decoder2 = noopDecoder; + else + decoder2 = field.getSQL().decoder; + row[selectionItem.key] = "mapFromJsonValue" in decoder2 ? decoder2.mapFromJsonValue(value8) : decoder2.mapFromDriverValue(value8); + } + return row; +} +function fieldSelectionToSQL(table2, target) { + const field = table2[TableColumns][target]; + return field ? is6(field, Column) ? field : is6(field, SQL.Aliased) ? sql`${table2}.${sql.identifier(field.fieldAlias)}` : sql`${table2}.${sql.identifier(target)}` : sql`${table2}.${sql.identifier(target)}`; +} +function relationsFieldFilterToSQL(column, filter21) { + if (typeof filter21 !== "object" || is6(filter21, Placeholder)) + return eq(column, filter21); + const entries10 = Object.entries(filter21); + if (!entries10.length) + return; + const parts3 = []; + for (const [target, value8] of entries10) { + if (value8 === undefined) + continue; + switch (target) { + case "NOT": { + const res = relationsFieldFilterToSQL(column, value8); + if (!res) + continue; + parts3.push(not5(res)); + continue; + } + case "OR": + if (!value8.length) + continue; + parts3.push(or5(...value8.map((subFilter) => relationsFieldFilterToSQL(column, subFilter)))); + continue; + case "AND": + if (!value8.length) + continue; + parts3.push(and3(...value8.map((subFilter) => relationsFieldFilterToSQL(column, subFilter)))); + continue; + case "isNotNull": + case "isNull": + if (!value8) + continue; + parts3.push(operators[target](column)); + continue; + case "in": + parts3.push(operators.inArray(column, value8)); + continue; + case "notIn": + parts3.push(operators.notInArray(column, value8)); + continue; + default: + parts3.push(operators[target](column, value8)); + continue; + } + } + if (!parts3.length) + return; + return and3(...parts3); +} +function relationsFilterToSQL(table2, filter21, tableRelations = {}, tablesRelations = {}, casing, depth = 0) { + const entries10 = Object.entries(filter21); + if (!entries10.length) + return; + const parts3 = []; + for (const [target, value8] of entries10) { + if (value8 === undefined) + continue; + switch (target) { + case "RAW": { + const processed = typeof value8 === "function" ? value8(table2, operators) : value8.getSQL(); + parts3.push(processed); + continue; + } + case "OR": + if (!value8?.length) + continue; + parts3.push(or5(...value8.map((subFilter) => relationsFilterToSQL(table2, subFilter, tableRelations, tablesRelations, casing, depth)))); + continue; + case "AND": + if (!value8?.length) + continue; + parts3.push(and3(...value8.map((subFilter) => relationsFilterToSQL(table2, subFilter, tableRelations, tablesRelations, casing, depth)))); + continue; + case "NOT": { + if (value8 === undefined) + continue; + const built = relationsFilterToSQL(table2, value8, tableRelations, tablesRelations, casing, depth); + if (!built) + continue; + parts3.push(not5(built)); + continue; + } + default: { + if (table2[TableColumns][target]) { + const colFilter = relationsFieldFilterToSQL(fieldSelectionToSQL(table2, target), value8); + if (colFilter) + parts3.push(colFilter); + continue; + } + const relation = tableRelations[target]; + if (!relation) + throw new DrizzleError({ message: `Unknown relational filter field: "${target}"` }); + const targetTable = aliasedTable(relation.targetTable, `f${depth}`); + const throughTable = relation.throughTable ? aliasedTable(relation.throughTable, `ft${depth}`) : undefined; + const targetConfig = tablesRelations[relation.targetTableName]; + const { filter: relationFilter, joinCondition } = relationToSQL(casing, relation, table2, targetTable, throughTable); + const filter22 = and3(relationFilter, typeof value8 === "boolean" ? undefined : relationsFilterToSQL(targetTable, value8, targetConfig.relations, tablesRelations, casing, depth + 1)); + const subquery = throughTable ? sql`(select * from ${getTableAsAliasSQL(targetTable)} inner join ${getTableAsAliasSQL(throughTable)} on ${joinCondition}${sql` where ${filter22}`.if(filter22)} limit 1)` : sql`(select * from ${getTableAsAliasSQL(targetTable)}${sql` where ${filter22}`.if(filter22)} limit 1)`; + if (filter22) + parts3.push((value8 ? exists2 : notExists)(subquery)); + } + } + } + return and3(...parts3); +} +function relationsOrderToSQL(table2, orders) { + if (typeof orders === "function") { + const data2 = orders(table2, orderByOperators); + return is6(data2, SQL) ? data2 : Array.isArray(data2) ? data2.length ? sql.join(data2.map((o) => is6(o, SQL) ? o : asc(o)), sql`, `) : undefined : is6(data2, Column) ? asc(data2) : undefined; + } + const entries10 = Object.entries(orders).filter(([_2, value8]) => value8); + if (!entries10.length) + return; + return sql.join(entries10.map(([target, value8]) => (value8 === "asc" ? asc : desc)(fieldSelectionToSQL(table2, target))), sql`, `); +} +function relationExtrasToSQL(table2, extras) { + const subqueries = []; + const selection = []; + for (const [key, field] of Object.entries(extras)) { + if (!field) + continue; + const extra = typeof field === "function" ? field(table2, { sql: operators.sql }) : field; + const query = sql`(${extra.getSQL()}) as ${sql.identifier(key)}`; + query.decoder = extra.getSQL().decoder; + subqueries.push(query); + selection.push({ + key, + field: query + }); + } + return { + sql: subqueries.length ? sql.join(subqueries, sql`, `) : undefined, + selection + }; +} +function relationToSQL(casing, relation, sourceTable, targetTable, throughTable) { + if (relation.through) { + const outerColumnWhere = relation.sourceColumns.map((s, i2) => { + const t = relation.through.source[i2]; + return eq(sql`${sourceTable}.${sql.identifier(casing.getColumnCasing(s))}`, sql`${throughTable}.${sql.identifier(is6(t._.column, Column) ? casing.getColumnCasing(t._.column) : t._.key)}`); + }); + const innerColumnWhere = relation.targetColumns.map((s, i2) => { + const t = relation.through.target[i2]; + return eq(sql`${throughTable}.${sql.identifier(is6(t._.column, Column) ? casing.getColumnCasing(t._.column) : t._.key)}`, sql`${targetTable}.${sql.identifier(casing.getColumnCasing(s))}`); + }); + return { + filter: and3(relation.where ? relationsFilterToSQL(relation.isReversed ? sourceTable : targetTable, relation.where) : undefined, ...outerColumnWhere), + joinCondition: and3(...innerColumnWhere) + }; + } + return { filter: and3(...relation.sourceColumns.map((s, i2) => { + const t = relation.targetColumns[i2]; + return eq(sql`${sourceTable}.${sql.identifier(casing.getColumnCasing(s))}`, sql`${targetTable}.${sql.identifier(casing.getColumnCasing(t))}`); + }), relation.where ? relationsFilterToSQL(relation.isReversed ? sourceTable : targetTable, relation.where) : undefined) }; +} +function getTableAsAliasSQL(table2) { + return sql`${table2[IsAlias] ? sql`${sql`${sql.identifier(table2[TableSchema] ?? "")}.`.if(table2[TableSchema])}${sql.identifier(table2[OriginalName])} as ${table2}` : table2}`; +} +var Relation, One, operators, orderByOperators; +var init_relations = __esm(() => { + init_entity(); + init_column(); + init_sql(); + init_alias(); + init_errors5(); + init_conditions(); + init_select(); + init_table(); + Relation = class { + static [entityKind] = "RelationV2"; + fieldName; + sourceColumns; + targetColumns; + alias; + where; + sourceTable; + targetTable; + through; + throughTable; + isReversed; + sourceColumnTableNames = []; + targetColumnTableNames = []; + constructor(targetTable, targetTableName) { + this.targetTableName = targetTableName; + this.targetTable = targetTable; + } + }; + One = class extends Relation { + static [entityKind] = "OneV2"; + relationType = "one"; + optional; + constructor(tables, targetTable, targetTableName, config2) { + super(targetTable, targetTableName); + this.alias = config2?.alias; + this.where = config2?.where; + if (config2?.from) + this.sourceColumns = (Array.isArray(config2.from) ? config2.from : [config2.from]).map((it2) => { + this.throughTable ??= it2._.through ? tables[it2._.through._.tableName] : undefined; + this.sourceColumnTableNames.push(it2._.tableName); + return it2._.column; + }); + if (config2?.to) + this.targetColumns = (Array.isArray(config2.to) ? config2.to : [config2.to]).map((it2) => { + this.throughTable ??= it2._.through ? tables[it2._.through._.tableName] : undefined; + this.targetColumnTableNames.push(it2._.tableName); + return it2._.column; + }); + if (this.throughTable) + this.through = { + source: (Array.isArray(config2?.from) ? config2.from : (config2?.from) ? [config2.from] : []).map((c) => c._.through), + target: (Array.isArray(config2?.to) ? config2.to : (config2?.to) ? [config2.to] : []).map((c) => c._.through) + }; + this.optional = config2?.optional ?? true; + } + }; + operators = { + and: and3, + between: between7, + eq, + exists: exists2, + gt: gt2, + gte: gte2, + ilike, + inArray, + arrayContains, + arrayContained, + arrayOverlaps, + isNull: isNull3, + isNotNull: isNotNull2, + like, + lt: lt2, + lte: lte2, + ne: ne2, + not: not5, + notBetween, + notExists, + notLike, + notIlike, + notInArray, + or: or5, + sql + }; + orderByOperators = { + sql, + asc, + desc + }; +}); + // node_modules/drizzle-orm/sql/functions/aggregate.js function count3(expression) { return sql`count(${expression || sql.raw("*")})`.mapWith(Number); @@ -87011,6 +87850,134 @@ var init_aggregate = __esm(() => { init_column(); }); +// node_modules/drizzle-orm/utils.js +function mapResultRow(columns, row, joinsNotNullableMap) { + const nullifyMap = {}; + const result6 = columns.reduce((result7, { path: path6, field }, columnIndex) => { + let decoder2; + if (is6(field, Column)) + decoder2 = field; + else if (is6(field, SQL)) + decoder2 = field.decoder; + else if (is6(field, Subquery)) + decoder2 = field._.sql.decoder; + else + decoder2 = field.sql.decoder; + let node = result7; + for (const [pathChunkIndex, pathChunk] of path6.entries()) + if (pathChunkIndex < path6.length - 1) { + if (!(pathChunk in node)) + node[pathChunk] = {}; + node = node[pathChunk]; + } else { + const rawValue = row[columnIndex]; + const value8 = node[pathChunk] = rawValue === null ? null : decoder2.mapFromDriverValue(rawValue); + if (joinsNotNullableMap && is6(field, Column) && path6.length === 2) { + const objectName = path6[0]; + if (!(objectName in nullifyMap)) + nullifyMap[objectName] = value8 === null ? getTableName(field.table) : false; + else if (typeof nullifyMap[objectName] === "string" && nullifyMap[objectName] !== getTableName(field.table)) + nullifyMap[objectName] = false; + } + } + return result7; + }, {}); + if (joinsNotNullableMap && Object.keys(nullifyMap).length > 0) { + for (const [objectName, tableName] of Object.entries(nullifyMap)) + if (typeof tableName === "string" && !joinsNotNullableMap[tableName]) + result6[objectName] = null; + } + return result6; +} +function orderSelectedFields(fields, pathPrefix) { + return Object.entries(fields).reduce((result6, [name2, field]) => { + if (typeof name2 !== "string") + return result6; + const newPath = pathPrefix ? [...pathPrefix, name2] : [name2]; + if (is6(field, Column) || is6(field, SQL) || is6(field, SQL.Aliased) || is6(field, Subquery)) + result6.push({ + path: newPath, + field + }); + else if (is6(field, Table)) + result6.push(...orderSelectedFields(field[Table.Symbol.Columns], newPath)); + else + result6.push(...orderSelectedFields(field, newPath)); + return result6; + }, []); +} +function haveSameKeys(left2, right2) { + const leftKeys = Object.keys(left2); + const rightKeys = Object.keys(right2); + if (leftKeys.length !== rightKeys.length) + return false; + for (const [index2, key] of leftKeys.entries()) + if (key !== rightKeys[index2]) + return false; + return true; +} +function mapUpdateSet(table2, values12) { + const entries10 = Object.entries(values12).filter(([, value8]) => value8 !== undefined).map(([key, value8]) => { + if (is6(value8, SQL) || is6(value8, Column)) + return [key, value8]; + else + return [key, new Param(value8, table2[Table.Symbol.Columns][key])]; + }); + if (entries10.length === 0) + throw new Error("No values to set"); + return Object.fromEntries(entries10); +} +function applyMixins(baseClass, extendedClasses) { + for (const extendedClass of extendedClasses) + for (const name2 of Object.getOwnPropertyNames(extendedClass.prototype)) { + if (name2 === "constructor") + continue; + Object.defineProperty(baseClass.prototype, name2, Object.getOwnPropertyDescriptor(extendedClass.prototype, name2) || Object.create(null)); + } +} +function getTableColumns(table2) { + return table2[Table.Symbol.Columns]; +} +function getTableLikeName(table2) { + return is6(table2, Subquery) ? table2._.alias : is6(table2, View) ? table2[ViewBaseConfig].name : is6(table2, SQL) ? undefined : table2[Table.Symbol.IsAlias] ? table2[Table.Symbol.Name] : table2[Table.Symbol.BaseName]; +} +function getColumnNameAndConfig(a, b) { + return { + name: typeof a === "string" && a.length > 0 ? a : "", + config: typeof a === "object" ? a : b + }; +} +var textDecoder, CONSTANTS; +var init_utils = __esm(() => { + init_entity(); + init_column(); + init_table(); + init_sql(); + init_subquery(); + init_view_common(); + textDecoder = typeof TextDecoder === "undefined" ? null : new TextDecoder; + CONSTANTS = { + INT8_MIN: -128, + INT8_MAX: 127, + INT8_UNSIGNED_MAX: 255, + INT16_MIN: -32768, + INT16_MAX: 32767, + INT16_UNSIGNED_MAX: 65535, + INT24_MIN: -8388608, + INT24_MAX: 8388607, + INT24_UNSIGNED_MAX: 16777215, + INT32_MIN: -2147483648, + INT32_MAX: 2147483647, + INT32_UNSIGNED_MAX: 4294967295, + INT48_MIN: -140737488355328, + INT48_MAX: 140737488355327, + INT48_UNSIGNED_MAX: 281474976710655, + INT64_MIN: -9223372036854775808n, + INT64_MAX: 9223372036854775807n, + INT64_UNSIGNED_MAX: 18446744073709551615n + }; +}); + // node_modules/drizzle-orm/index.js var init_drizzle_orm = __esm(() => { init_sql(); @@ -87240,7 +88207,6 @@ var init_flag = __esm(() => { Flag.UNIFIA_DISABLE_CLAUDE_CODE_PROMPT = unifiaTruthy("DISABLE_CLAUDE_CODE_PROMPT", Flag.OPENCODE_DISABLE_CLAUDE_CODE_PROMPT); Flag.UNIFIA_ENABLE_EXPERIMENTAL_MODELS = unifiaTruthy("ENABLE_EXPERIMENTAL_MODELS", Flag.OPENCODE_ENABLE_EXPERIMENTAL_MODELS); Flag.UNIFIA_FAKE_VCS = unifiaValue("FAKE_VCS", Flag.OPENCODE_FAKE_VCS); - Flag.UNIFIA_CALLER = unifiaValue("CALLER", process.env["OPENCODE_CALLER"]); Flag.UNIFIA_DISABLE_SHARE = unifiaTruthy("DISABLE_SHARE", truthy("OPENCODE_DISABLE_SHARE")); Flag.UNIFIA_CARGO_PROXY = unifiaTruthy("CARGO_PROXY", truthy("OPENCODE_CARGO_PROXY")); Flag.UNIFIA_CARGO_PROXY_URL = unifiaValue("CARGO_PROXY_URL", process.env["OPENCODE_CARGO_PROXY_URL"]); @@ -87262,8 +88228,8 @@ var init_flag = __esm(() => { Flag.UNIFIA_EXPERIMENTAL_FILEWATCHER = dualConfigBoolean("EXPERIMENTAL_FILEWATCHER"); Flag.UNIFIA_EXPERIMENTAL_DISABLE_FILEWATCHER = dualConfigBoolean("EXPERIMENTAL_DISABLE_FILEWATCHER"); Flag.UNIFIA_AUTH_STORAGE = isolatedValue("AUTH_STORAGE"); - Flag.UNIFIA_PTY_PORT = isolatedValue("PTY_PORT"); Flag.UNIFIA_DISABLE_LSP_DOWNLOAD = unifiaTruthy("DISABLE_LSP_DOWNLOAD", Flag.OPENCODE_DISABLE_LSP_DOWNLOAD); + Flag.UNIFIA_DISABLE_LSP = truthy("UNIFIA_DISABLE_LSP"); })(Flag ||= {}); Object.defineProperty(Flag, "OPENCODE_DISABLE_PROJECT_CONFIG", { get() { @@ -87317,7 +88283,9 @@ var init_flag = __esm(() => { defineDynamic("UNIFIA_KEYCHAIN_URL", () => isolatedValue("KEYCHAIN_URL")); defineDynamic("UNIFIA_KEYCHAIN_TOKEN", () => isolatedValue("KEYCHAIN_TOKEN")); defineDynamic("UNIFIA_CONFIG_DIR", () => isolatedValue("CONFIG_DIR")); + defineDynamic("UNIFIA_PTY_PORT", () => isolatedValue("PTY_PORT")); defineDynamic("UNIFIA_CLIENT", () => isolatedValue("CLIENT") ?? "cli"); + defineDynamic("UNIFIA_CALLER", () => process.env["UNIFIA_CALLER"] ?? process.env["OPENCODE_CALLER"]); defineDynamic("UNIFIA_PURE", () => truthy("UNIFIA_PURE") || Flag.OPENCODE_PURE); defineDynamic("UNIFIA_TUI_CONFIG", () => process.env["UNIFIA_TUI_CONFIG"] ?? Flag.OPENCODE_TUI_CONFIG); defineDynamic("UNIFIA_PLUGIN_META_FILE", () => process.env["UNIFIA_PLUGIN_META_FILE"] ?? Flag.OPENCODE_PLUGIN_META_FILE); @@ -87461,66 +88429,6 @@ function iife2(fn3) { return fn3(); } -// node_modules/drizzle-orm/column-builder.js -var ColumnBuilder2; -var init_column_builder = __esm(() => { - init_entity(); - ColumnBuilder2 = class { - static [entityKind] = "ColumnBuilder"; - config; - constructor(name3, dataType, columnType) { - this.config = { - name: name3, - keyAsName: name3 === "", - notNull: false, - default: undefined, - hasDefault: false, - primaryKey: false, - isUnique: false, - uniqueName: undefined, - uniqueType: undefined, - dataType, - columnType, - generated: undefined - }; - } - $type() { - return this; - } - notNull() { - this.config.notNull = true; - return this; - } - default(value8) { - this.config.default = value8; - this.config.hasDefault = true; - return this; - } - $defaultFn(fn3) { - this.config.defaultFn = fn3; - this.config.hasDefault = true; - return this; - } - $default = this.$defaultFn; - $onUpdateFn(fn3) { - this.config.onUpdateFn = fn3; - this.config.hasDefault = true; - return this; - } - $onUpdate = this.$onUpdateFn; - primaryKey() { - this.config.primaryKey = true; - this.config.notNull = true; - return this; - } - setName(name3) { - if (this.config.name !== "") - return; - this.config.name = name3; - } - }; -}); - // node_modules/drizzle-orm/sqlite-core/foreign-keys.js var ForeignKeyBuilder, ForeignKey; var init_foreign_keys = __esm(() => { @@ -87531,9 +88439,9 @@ var init_foreign_keys = __esm(() => { reference; _onUpdate; _onDelete; - constructor(config3, actions) { + constructor(config2, actions) { this.reference = () => { - const { name: name3, columns, foreignColumns } = config3(); + const { name: name3, columns, foreignColumns } = config2(); return { name: name3, columns, @@ -87594,7 +88502,7 @@ var init_common = __esm(() => { init_column(); init_column_builder(); init_foreign_keys(); - SQLiteColumnBuilder = class extends ColumnBuilder2 { + SQLiteColumnBuilder = class extends ColumnBuilder { static [entityKind] = "SQLiteColumnBuilder"; foreignKeyConfigs = []; references(ref, actions = {}) { @@ -87609,11 +88517,11 @@ var init_common = __esm(() => { this.config.uniqueName = name3; return this; } - generatedAlwaysAs(as6, config3) { + generatedAlwaysAs(as6, config2) { this.config.generated = { as: as6, type: "always", - mode: config3?.mode ?? "virtual" + mode: config2?.mode ?? "virtual" }; return this; } @@ -87639,141 +88547,13 @@ var init_common = __esm(() => { SQLiteColumn = class extends Column { static [entityKind] = "SQLiteColumn"; table; - constructor(table2, config3) { - super(table2, config3); + constructor(table2, config2) { + super(table2, config2); this.table = table2; } }; }); -// node_modules/drizzle-orm/utils.js -function mapResultRow2(columns, row, joinsNotNullableMap) { - const nullifyMap = {}; - const result6 = columns.reduce((result7, { path: path5, field }, columnIndex) => { - let decoder2; - if (is6(field, Column)) - decoder2 = field; - else if (is6(field, SQL)) - decoder2 = field.decoder; - else if (is6(field, Subquery)) - decoder2 = field._.sql.decoder; - else - decoder2 = field.sql.decoder; - let node = result7; - for (const [pathChunkIndex, pathChunk] of path5.entries()) - if (pathChunkIndex < path5.length - 1) { - if (!(pathChunk in node)) - node[pathChunk] = {}; - node = node[pathChunk]; - } else { - const rawValue = row[columnIndex]; - const value8 = node[pathChunk] = rawValue === null ? null : decoder2.mapFromDriverValue(rawValue); - if (joinsNotNullableMap && is6(field, Column) && path5.length === 2) { - const objectName = path5[0]; - if (!(objectName in nullifyMap)) - nullifyMap[objectName] = value8 === null ? getTableName(field.table) : false; - else if (typeof nullifyMap[objectName] === "string" && nullifyMap[objectName] !== getTableName(field.table)) - nullifyMap[objectName] = false; - } - } - return result7; - }, {}); - if (joinsNotNullableMap && Object.keys(nullifyMap).length > 0) { - for (const [objectName, tableName] of Object.entries(nullifyMap)) - if (typeof tableName === "string" && !joinsNotNullableMap[tableName]) - result6[objectName] = null; - } - return result6; -} -function orderSelectedFields2(fields, pathPrefix) { - return Object.entries(fields).reduce((result6, [name3, field]) => { - if (typeof name3 !== "string") - return result6; - const newPath = pathPrefix ? [...pathPrefix, name3] : [name3]; - if (is6(field, Column) || is6(field, SQL) || is6(field, SQL.Aliased) || is6(field, Subquery)) - result6.push({ - path: newPath, - field - }); - else if (is6(field, Table)) - result6.push(...orderSelectedFields2(field[Table.Symbol.Columns], newPath)); - else - result6.push(...orderSelectedFields2(field, newPath)); - return result6; - }, []); -} -function haveSameKeys2(left2, right2) { - const leftKeys = Object.keys(left2); - const rightKeys = Object.keys(right2); - if (leftKeys.length !== rightKeys.length) - return false; - for (const [index2, key] of leftKeys.entries()) - if (key !== rightKeys[index2]) - return false; - return true; -} -function mapUpdateSet2(table2, values12) { - const entries10 = Object.entries(values12).filter(([, value8]) => value8 !== undefined).map(([key, value8]) => { - if (is6(value8, SQL) || is6(value8, Column)) - return [key, value8]; - else - return [key, new Param(value8, table2[Table.Symbol.Columns][key])]; - }); - if (entries10.length === 0) - throw new Error("No values to set"); - return Object.fromEntries(entries10); -} -function applyMixins2(baseClass, extendedClasses) { - for (const extendedClass of extendedClasses) - for (const name3 of Object.getOwnPropertyNames(extendedClass.prototype)) { - if (name3 === "constructor") - continue; - Object.defineProperty(baseClass.prototype, name3, Object.getOwnPropertyDescriptor(extendedClass.prototype, name3) || Object.create(null)); - } -} -function getTableColumns2(table2) { - return table2[Table.Symbol.Columns]; -} -function getTableLikeName2(table2) { - return is6(table2, Subquery) ? table2._.alias : is6(table2, View) ? table2[ViewBaseConfig].name : is6(table2, SQL) ? undefined : table2[Table.Symbol.IsAlias] ? table2[Table.Symbol.Name] : table2[Table.Symbol.BaseName]; -} -function getColumnNameAndConfig2(a, b) { - return { - name: typeof a === "string" && a.length > 0 ? a : "", - config: typeof a === "object" ? a : b - }; -} -var textDecoder2, CONSTANTS2; -var init_utils = __esm(() => { - init_entity(); - init_column(); - init_table(); - init_sql(); - init_subquery(); - init_view_common(); - textDecoder2 = typeof TextDecoder === "undefined" ? null : new TextDecoder; - CONSTANTS2 = { - INT8_MIN: -128, - INT8_MAX: 127, - INT8_UNSIGNED_MAX: 255, - INT16_MIN: -32768, - INT16_MAX: 32767, - INT16_UNSIGNED_MAX: 65535, - INT24_MIN: -8388608, - INT24_MAX: 8388607, - INT24_UNSIGNED_MAX: 16777215, - INT32_MIN: -2147483648, - INT32_MAX: 2147483647, - INT32_UNSIGNED_MAX: 4294967295, - INT48_MIN: -140737488355328, - INT48_MAX: 140737488355327, - INT48_UNSIGNED_MAX: 281474976710655, - INT64_MIN: -9223372036854775808n, - INT64_MAX: 9223372036854775807n, - INT64_UNSIGNED_MAX: 18446744073709551615n - }; -}); - // node_modules/drizzle-orm/sqlite-core/columns/blob.js function hexToText(hexString) { let result6 = ""; @@ -87785,10 +88565,10 @@ function hexToText(hexString) { return result6; } function blob(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - if (config3?.mode === "json") + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + if (config2?.mode === "json") return new SQLiteBlobJsonBuilder(name3); - if (config3?.mode === "bigint") + if (config2?.mode === "bigint") return new SQLiteBigIntBuilder(name3); return new SQLiteBlobBufferBuilder(name3); } @@ -87818,7 +88598,7 @@ var init_blob = __esm(() => { const buf = Buffer.isBuffer(value8) ? value8 : value8 instanceof ArrayBuffer ? Buffer.from(value8) : value8.buffer ? Buffer.from(value8.buffer, value8.byteOffset, value8.byteLength) : Buffer.from(value8); return BigInt(buf.toString("utf8")); } - return BigInt(textDecoder2.decode(value8)); + return BigInt(textDecoder.decode(value8)); } mapToDriverValue(value8) { return Buffer.from(value8.toString()); @@ -87845,7 +88625,7 @@ var init_blob = __esm(() => { const buf = Buffer.isBuffer(value8) ? value8 : value8 instanceof ArrayBuffer ? Buffer.from(value8) : value8.buffer ? Buffer.from(value8.buffer, value8.byteOffset, value8.byteLength) : Buffer.from(value8); return JSON.parse(buf.toString("utf8")); } - return JSON.parse(textDecoder2.decode(value8)); + return JSON.parse(textDecoder.decode(value8)); } mapToDriverValue(value8) { return Buffer.from(JSON.stringify(value8)); @@ -87877,11 +88657,11 @@ var init_blob = __esm(() => { // node_modules/drizzle-orm/sqlite-core/columns/integer.js function integer3(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - if (config3?.mode === "timestamp" || config3?.mode === "timestamp_ms") - return new SQLiteTimestampBuilder(name3, config3.mode); - if (config3?.mode === "boolean") - return new SQLiteBooleanBuilder(name3, config3.mode); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + if (config2?.mode === "timestamp" || config2?.mode === "timestamp_ms") + return new SQLiteTimestampBuilder(name3, config2.mode); + if (config2?.mode === "boolean") + return new SQLiteBooleanBuilder(name3, config2.mode); return new SQLiteIntegerBuilder(name3); } var SQLiteBaseIntegerBuilder, SQLiteBaseInteger, SQLiteIntegerBuilder, SQLiteInteger, SQLiteTimestampBuilder, SQLiteTimestamp, SQLiteBooleanBuilder, SQLiteBoolean; @@ -87896,8 +88676,8 @@ var init_integer = __esm(() => { super(name3, dataType, columnType); this.config.autoIncrement = false; } - primaryKey(config3) { - if (config3?.autoIncrement) + primaryKey(config2) { + if (config2?.autoIncrement) this.config.autoIncrement = true; this.config.hasDefault = true; return super.primaryKey(); @@ -88003,10 +88783,10 @@ var init_real = __esm(() => { // node_modules/drizzle-orm/sqlite-core/columns/text.js function text(a, b = {}) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - if (config3.mode === "json") + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + if (config2.mode === "json") return new SQLiteTextJsonBuilder(name3); - return new SQLiteTextBuilder(name3, config3); + return new SQLiteTextBuilder(name3, config2); } var SQLiteTextBuilder, SQLiteText, SQLiteTextJsonBuilder, SQLiteTextJson; var init_text = __esm(() => { @@ -88015,10 +88795,10 @@ var init_text = __esm(() => { init_utils(); SQLiteTextBuilder = class extends SQLiteColumnBuilder { static [entityKind] = "SQLiteTextBuilder"; - constructor(name3, config3) { - super(name3, config3.enum?.length ? "string enum" : "string", "SQLiteText"); - this.config.enumValues = config3.enum; - this.config.length = config3.length; + constructor(name3, config2) { + super(name3, config2.enum?.length ? "string enum" : "string", "SQLiteText"); + this.config.enumValues = config2.enum; + this.config.length = config2.length; } build(table2) { return new SQLiteText(table2, this.config); @@ -88027,8 +88807,8 @@ var init_text = __esm(() => { SQLiteText = class extends SQLiteColumn { static [entityKind] = "SQLiteText"; enumValues = this.config.enumValues; - constructor(table2, config3) { - super(table2, config3); + constructor(table2, config2) { + super(table2, config2); } getSQLType() { return `text${this.config.length ? `(${this.config.length})` : ""}`; @@ -88100,12 +88880,12 @@ var init_indexes = __esm(() => { static [entityKind] = "SQLiteIndex"; config; isNameExplicit; - constructor(config3, table2) { + constructor(config2, table2) { this.config = { - ...config3, + ...config2, table: table2 }; - this.isNameExplicit = !!config3.name; + this.isNameExplicit = !!config2.name; } }; }); @@ -88113,8 +88893,8 @@ var init_indexes = __esm(() => { // node_modules/drizzle-orm/sqlite-core/columns/custom.js function customType(customTypeParams) { return (a, b) => { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - return new SQLiteCustomColumnBuilder(name3, config3, customTypeParams); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + return new SQLiteCustomColumnBuilder(name3, config2, customTypeParams); }; } var SQLiteCustomColumnBuilder, SQLiteCustomColumn; @@ -88140,13 +88920,13 @@ var init_custom = __esm(() => { mapFrom; mapJson; forJsonSelect; - constructor(table2, config3) { - super(table2, config3); - this.sqlName = config3.customTypeParams.dataType(config3.fieldConfig); - this.mapTo = config3.customTypeParams.toDriver; - this.mapFrom = config3.customTypeParams.fromDriver; - this.mapJson = config3.customTypeParams.fromJson; - this.forJsonSelect = config3.customTypeParams.forJsonSelect; + constructor(table2, config2) { + super(table2, config2); + this.sqlName = config2.customTypeParams.dataType(config2.fieldConfig); + this.mapTo = config2.customTypeParams.toDriver; + this.mapFrom = config2.customTypeParams.fromDriver; + this.mapJson = config2.customTypeParams.fromJson; + this.forJsonSelect = config2.customTypeParams.forJsonSelect; } getSQLType() { return this.sqlName; @@ -88181,8 +88961,8 @@ var init_custom = __esm(() => { // node_modules/drizzle-orm/sqlite-core/columns/numeric.js function numeric2(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - const mode = config3?.mode; + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + const mode = config2?.mode; return mode === "number" ? new SQLiteNumericNumberBuilder(name3) : mode === "bigint" ? new SQLiteNumericBigIntBuilder(name3) : new SQLiteNumericBuilder(name3); } var SQLiteNumericBuilder, SQLiteNumeric, SQLiteNumericNumberBuilder, SQLiteNumericNumber, SQLiteNumericBigIntBuilder, SQLiteNumericBigInt; @@ -88306,10 +89086,10 @@ var init_table2 = __esm(() => { }); // node_modules/drizzle-orm/sqlite-core/primary-keys.js -function primaryKey(...config3) { - if (config3[0].columns) - return new PrimaryKeyBuilder(config3[0].columns, config3[0].name); - return new PrimaryKeyBuilder(config3); +function primaryKey(...config2) { + if (config2[0].columns) + return new PrimaryKeyBuilder(config2[0].columns, config2[0].name); + return new PrimaryKeyBuilder(config2); } var PrimaryKeyBuilder, PrimaryKey; var init_primary_keys = __esm(() => { @@ -88424,9 +89204,9 @@ var init_foreign_keys2 = __esm(() => { reference; _onUpdate = "no action"; _onDelete = "no action"; - constructor(config3, actions) { + constructor(config2, actions) { this.reference = () => { - const { name: name3, columns, foreignColumns } = config3(); + const { name: name3, columns, foreignColumns } = config2(); return { name: name3, columns, @@ -88551,17 +89331,17 @@ var init_common2 = __esm(() => { this.config.dimensions = dim.length / 2; return this; } - references(ref, config3 = {}) { + references(ref, config2 = {}) { this.foreignKeyConfigs.push({ ref, - config: config3 + config: config2 }); return this; } - unique(name3, config3) { + unique(name3, config2) { this.config.isUnique = true; this.config.uniqueName = name3; - this.config.uniqueType = config3?.nulls; + this.config.uniqueType = config2?.nulls; return this; } generatedAlwaysAs(as6) { @@ -88573,22 +89353,22 @@ var init_common2 = __esm(() => { return this; } buildForeignKeys(column, table2) { - return this.foreignKeyConfigs.map(({ ref, config: config3 }) => { - return iife((ref2, config4) => { + return this.foreignKeyConfigs.map(({ ref, config: config2 }) => { + return iife((ref2, config3) => { const builder = new ForeignKeyBuilder2(() => { const foreignColumn = ref2(); return { - name: config4.name, + name: config3.name, columns: [column], foreignColumns: [foreignColumn] }; }); - if (config4.onUpdate) - builder.onUpdate(config4.onUpdate); - if (config4.onDelete) - builder.onDelete(config4.onDelete); + if (config3.onUpdate) + builder.onUpdate(config3.onUpdate); + if (config3.onDelete) + builder.onDelete(config3.onDelete); return builder.build(table2); - }, ref, config3); + }, ref, config2); }); } buildExtraConfigColumn(table2) { @@ -88602,10 +89382,10 @@ var init_common2 = __esm(() => { static [entityKind] = "PgColumn"; table; dimensions; - constructor(table2, config3) { - super(table2, config3); + constructor(table2, config2) { + super(table2, config2); this.table = table2; - this.dimensions = config3.dimensions ?? 0; + this.dimensions = config2.dimensions ?? 0; if (this.dimensions) { const originalFromDriver = this.mapFromDriverValue.bind(this); const originalToDriver = this.mapToDriverValue.bind(this); @@ -88706,10 +89486,10 @@ var init_int_common = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/bigint.js function bigint7(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - if (config3.mode === "number") + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + if (config2.mode === "number") return new PgBigInt53Builder(name3); - if (config3.mode === "string") + if (config2.mode === "string") return new PgBigIntStringBuilder(name3); return new PgBigInt64Builder(name3); } @@ -88781,8 +89561,8 @@ var init_bigint2 = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/bigserial.js function bigserial(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - if (config3.mode === "number") + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + if (config2.mode === "number") return new PgBigSerial53Builder(name3); return new PgBigSerial64Builder(name3); } @@ -88862,8 +89642,8 @@ var init_boolean = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/char.js function char(a, b = {}) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - return new PgCharBuilder(name3, config3); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + return new PgCharBuilder(name3, config2); } var PgCharBuilder, PgChar; var init_char = __esm(() => { @@ -88872,11 +89652,11 @@ var init_char = __esm(() => { init_utils(); PgCharBuilder = class extends PgColumnBuilder { static [entityKind] = "PgCharBuilder"; - constructor(name3, config3) { - super(name3, config3.enum?.length ? "string enum" : "string", "PgChar"); - this.config.length = config3.length ?? 1; - this.config.setLength = config3.length !== undefined; - this.config.enumValues = config3.enum; + constructor(name3, config2) { + super(name3, config2.enum?.length ? "string enum" : "string", "PgChar"); + this.config.length = config2.length ?? 1; + this.config.setLength = config2.length !== undefined; + this.config.enumValues = config2.enum; } build(table2) { return new PgChar(table2, this.config); @@ -88886,10 +89666,10 @@ var init_char = __esm(() => { static [entityKind] = "PgChar"; enumValues; setLength; - constructor(table2, config3) { - super(table2, config3); - this.enumValues = config3.enumValues; - this.setLength = config3.setLength; + constructor(table2, config2) { + super(table2, config2); + this.enumValues = config2.enumValues; + this.setLength = config2.setLength; } getSQLType() { return this.setLength ? `char(${this.length})` : `char`; @@ -88925,8 +89705,8 @@ var init_cidr = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/custom.js function customType2(customTypeParams) { return (a, b) => { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - return new PgCustomColumnBuilder(name3, config3, customTypeParams); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + return new PgCustomColumnBuilder(name3, config2, customTypeParams); }; } var PgCustomColumnBuilder, PgCustomColumn; @@ -88953,13 +89733,13 @@ var init_custom2 = __esm(() => { mapFrom; mapJson; forJsonSelect; - constructor(table2, config3) { - super(table2, config3); - this.sqlName = config3.customTypeParams.dataType(config3.fieldConfig); - this.mapTo = config3.customTypeParams.toDriver; - this.mapFrom = config3.customTypeParams.fromDriver; - this.mapJson = config3.customTypeParams.fromJson; - this.forJsonSelect = config3.customTypeParams.forJsonSelect; + constructor(table2, config2) { + super(table2, config2); + this.sqlName = config2.customTypeParams.dataType(config2.fieldConfig); + this.mapTo = config2.customTypeParams.toDriver; + this.mapFrom = config2.customTypeParams.fromDriver; + this.mapJson = config2.customTypeParams.fromJson; + this.forJsonSelect = config2.customTypeParams.forJsonSelect; if (this.dimensions) { const elementMapper = (value8) => { if (typeof this.mapJson === "function") @@ -89030,8 +89810,8 @@ var init_date_common = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/date.js function date10(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - if (config3?.mode === "date") + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + if (config2?.mode === "date") return new PgDateBuilder(name3); return new PgDateStringBuilder(name3); } @@ -89181,8 +89961,8 @@ var init_integer2 = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/interval.js function interval(a, b = {}) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - return new PgIntervalBuilder(name3, config3); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + return new PgIntervalBuilder(name3, config2); } var PgIntervalBuilder, PgInterval; var init_interval = __esm(() => { @@ -89203,10 +89983,10 @@ var init_interval = __esm(() => { static [entityKind] = "PgInterval"; fields; precision; - constructor(table2, config3) { - super(table2, config3); - this.fields = config3.intervalConfig.fields; - this.precision = config3.intervalConfig.precision; + constructor(table2, config2) { + super(table2, config2); + this.fields = config2.intervalConfig.fields; + this.precision = config2.intervalConfig.precision; } getSQLType() { return `interval${this.fields ? ` ${this.fields}` : ""}${this.precision ? `(${this.precision})` : ""}`; @@ -89233,8 +90013,8 @@ var init_json = __esm(() => { }; PgJson = class extends PgColumn { static [entityKind] = "PgJson"; - constructor(table2, config3) { - super(table2, config3); + constructor(table2, config2) { + super(table2, config2); } getSQLType() { return "json"; @@ -89273,8 +90053,8 @@ var init_jsonb = __esm(() => { }; PgJsonb = class extends PgColumn { static [entityKind] = "PgJsonb"; - constructor(table2, config3) { - super(table2, config3); + constructor(table2, config2) { + super(table2, config2); } getSQLType() { return "jsonb"; @@ -89296,8 +90076,8 @@ var init_jsonb = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/line.js function line(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - if (!config3?.mode || config3.mode === "tuple") + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + if (!config2?.mode || config2.mode === "tuple") return new PgLineBuilder(name3); return new PgLineABCBuilder(name3); } @@ -89414,9 +90194,9 @@ var init_macaddr8 = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/numeric.js function numeric3(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - const mode = config3?.mode; - return mode === "number" ? new PgNumericNumberBuilder(name3, config3?.precision, config3?.scale) : mode === "bigint" ? new PgNumericBigIntBuilder(name3, config3?.precision, config3?.scale) : new PgNumericBuilder(name3, config3?.precision, config3?.scale); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + const mode = config2?.mode; + return mode === "number" ? new PgNumericNumberBuilder(name3, config2?.precision, config2?.scale) : mode === "bigint" ? new PgNumericBigIntBuilder(name3, config2?.precision, config2?.scale) : new PgNumericBuilder(name3, config2?.precision, config2?.scale); } var PgNumericBuilder, PgNumeric, PgNumericNumberBuilder, PgNumericNumber, PgNumericBigIntBuilder, PgNumericBigInt; var init_numeric2 = __esm(() => { @@ -89438,10 +90218,10 @@ var init_numeric2 = __esm(() => { static [entityKind] = "PgNumeric"; precision; scale; - constructor(table2, config3) { - super(table2, config3); - this.precision = config3.precision; - this.scale = config3.scale; + constructor(table2, config2) { + super(table2, config2); + this.precision = config2.precision; + this.scale = config2.scale; } mapFromDriverValue(value8) { if (typeof value8 === "string") @@ -89472,10 +90252,10 @@ var init_numeric2 = __esm(() => { static [entityKind] = "PgNumericNumber"; precision; scale; - constructor(table2, config3) { - super(table2, config3); - this.precision = config3.precision; - this.scale = config3.scale; + constructor(table2, config2) { + super(table2, config2); + this.precision = config2.precision; + this.scale = config2.scale; } mapFromDriverValue(value8) { if (typeof value8 === "number") @@ -89509,10 +90289,10 @@ var init_numeric2 = __esm(() => { static [entityKind] = "PgNumericBigInt"; precision; scale; - constructor(table2, config3) { - super(table2, config3); - this.precision = config3.precision; - this.scale = config3.scale; + constructor(table2, config2) { + super(table2, config2); + this.precision = config2.precision; + this.scale = config2.scale; } mapFromDriverValue(value8) { return BigInt(value8); @@ -89533,8 +90313,8 @@ var init_numeric2 = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/point.js function point(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - if (!config3?.mode || config3.mode === "tuple") + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + if (!config2?.mode || config2.mode === "tuple") return new PgPointTupleBuilder(name3); return new PgPointObjectBuilder(name3); } @@ -89643,10 +90423,10 @@ var init_utils2 = () => {}; // node_modules/drizzle-orm/pg-core/columns/postgis_extension/geometry.js function geometry(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - if (!config3?.mode || config3.mode === "tuple") - return new PgGeometryBuilder(name3, config3?.srid); - return new PgGeometryObjectBuilder(name3, config3?.srid); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + if (!config2?.mode || config2.mode === "tuple") + return new PgGeometryBuilder(name3, config2?.srid); + return new PgGeometryObjectBuilder(name3, config2?.srid); } var PgGeometryBuilder, PgGeometry, PgGeometryObjectBuilder, PgGeometryObject; var init_geometry = __esm(() => { @@ -89730,8 +90510,8 @@ var init_real2 = __esm(() => { }; PgReal = class extends PgColumn { static [entityKind] = "PgReal"; - constructor(table2, config3) { - super(table2, config3); + constructor(table2, config2) { + super(table2, config2); } getSQLType() { return "real"; @@ -89831,8 +90611,8 @@ var init_smallserial = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/text.js function text2(a, b = {}) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - return new PgTextBuilder(name3, config3); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + return new PgTextBuilder(name3, config2); } var PgTextBuilder, PgText; var init_text2 = __esm(() => { @@ -89841,9 +90621,9 @@ var init_text2 = __esm(() => { init_utils(); PgTextBuilder = class extends PgColumnBuilder { static [entityKind] = "PgTextBuilder"; - constructor(name3, config3) { - super(name3, config3.enum?.length ? "string enum" : "string", "PgText"); - this.config.enumValues = config3.enum; + constructor(name3, config2) { + super(name3, config2.enum?.length ? "string enum" : "string", "PgText"); + this.config.enumValues = config2.enum; } build(table2) { return new PgText(table2, this.config, this.config.enumValues); @@ -89852,8 +90632,8 @@ var init_text2 = __esm(() => { PgText = class extends PgColumn { static [entityKind] = "PgText"; enumValues; - constructor(table2, config3, enumValues) { - super(table2, config3); + constructor(table2, config2, enumValues) { + super(table2, config2); this.enumValues = enumValues; } getSQLType() { @@ -89864,8 +90644,8 @@ var init_text2 = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/time.js function time4(a, b = {}) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - return new PgTimeBuilder(name3, config3.withTimezone ?? false, config3.precision); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + return new PgTimeBuilder(name3, config2.withTimezone ?? false, config2.precision); } var PgTimeBuilder, PgTime; var init_time = __esm(() => { @@ -89890,10 +90670,10 @@ var init_time = __esm(() => { static [entityKind] = "PgTime"; withTimezone; precision; - constructor(table2, config3) { - super(table2, config3); - this.withTimezone = config3.withTimezone; - this.precision = config3.precision; + constructor(table2, config2) { + super(table2, config2); + this.withTimezone = config2.withTimezone; + this.precision = config2.precision; } getSQLType() { return `time${this.precision === undefined ? "" : `(${this.precision})`}${this.withTimezone ? " with time zone" : ""}`; @@ -89903,10 +90683,10 @@ var init_time = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/timestamp.js function timestamp(a, b = {}) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - if (config3?.mode === "string") - return new PgTimestampStringBuilder(name3, config3.withTimezone ?? false, config3.precision); - return new PgTimestampBuilder(name3, config3?.withTimezone ?? false, config3?.precision); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + if (config2?.mode === "string") + return new PgTimestampStringBuilder(name3, config2.withTimezone ?? false, config2.precision); + return new PgTimestampBuilder(name3, config2?.withTimezone ?? false, config2?.precision); } var PgTimestampBuilder, PgTimestamp, PgTimestampStringBuilder, PgTimestampString; var init_timestamp = __esm(() => { @@ -89929,10 +90709,10 @@ var init_timestamp = __esm(() => { static [entityKind] = "PgTimestamp"; withTimezone; precision; - constructor(table2, config3) { - super(table2, config3); - this.withTimezone = config3.withTimezone; - this.precision = config3.precision; + constructor(table2, config2) { + super(table2, config2); + this.withTimezone = config2.withTimezone; + this.precision = config2.precision; } getSQLType() { return `timestamp${this.precision === undefined ? "" : ` (${this.precision})`}${this.withTimezone ? " with time zone" : ""}`; @@ -89963,10 +90743,10 @@ var init_timestamp = __esm(() => { static [entityKind] = "PgTimestampString"; withTimezone; precision; - constructor(table2, config3) { - super(table2, config3); - this.withTimezone = config3.withTimezone; - this.precision = config3.precision; + constructor(table2, config2) { + super(table2, config2); + this.withTimezone = config2.withTimezone; + this.precision = config2.precision; } getSQLType() { return `timestamp${this.precision === undefined ? "" : `(${this.precision})`}${this.withTimezone ? " with time zone" : ""}`; @@ -90018,8 +90798,8 @@ var init_uuid = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/varchar.js function varchar(a, b = {}) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - return new PgVarcharBuilder(name3, config3); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + return new PgVarcharBuilder(name3, config2); } var PgVarcharBuilder, PgVarchar; var init_varchar = __esm(() => { @@ -90028,10 +90808,10 @@ var init_varchar = __esm(() => { init_utils(); PgVarcharBuilder = class extends PgColumnBuilder { static [entityKind] = "PgVarcharBuilder"; - constructor(name3, config3) { - super(name3, config3.enum?.length ? "string enum" : "string", "PgVarchar"); - this.config.length = config3.length; - this.config.enumValues = config3.enum; + constructor(name3, config2) { + super(name3, config2.enum?.length ? "string enum" : "string", "PgVarchar"); + this.config.length = config2.length; + this.config.enumValues = config2.enum; } build(table2) { return new PgVarchar(table2, this.config); @@ -90040,9 +90820,9 @@ var init_varchar = __esm(() => { PgVarchar = class extends PgColumn { static [entityKind] = "PgVarchar"; enumValues; - constructor(table2, config3) { - super(table2, config3); - this.enumValues = config3.enumValues; + constructor(table2, config2) { + super(table2, config2); + this.enumValues = config2.enumValues; } getSQLType() { return this.length === undefined ? `varchar` : `varchar(${this.length})`; @@ -90052,8 +90832,8 @@ var init_varchar = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/vector_extension/bit.js function bit(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - return new PgBinaryVectorBuilder(name3, config3); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + return new PgBinaryVectorBuilder(name3, config2); } var PgBinaryVectorBuilder, PgBinaryVector; var init_bit = __esm(() => { @@ -90062,9 +90842,9 @@ var init_bit = __esm(() => { init_utils(); PgBinaryVectorBuilder = class extends PgColumnBuilder { static [entityKind] = "PgBinaryVectorBuilder"; - constructor(name3, config3) { + constructor(name3, config2) { super(name3, "string binary", "PgBinaryVector"); - this.config.length = config3.dimensions; + this.config.length = config2.dimensions; this.config.isLengthExact = true; } build(table2) { @@ -90081,8 +90861,8 @@ var init_bit = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/vector_extension/halfvec.js function halfvec(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - return new PgHalfVectorBuilder(name3, config3); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + return new PgHalfVectorBuilder(name3, config2); } var PgHalfVectorBuilder, PgHalfVector; var init_halfvec = __esm(() => { @@ -90091,9 +90871,9 @@ var init_halfvec = __esm(() => { init_utils(); PgHalfVectorBuilder = class extends PgColumnBuilder { static [entityKind] = "PgHalfVectorBuilder"; - constructor(name3, config3) { + constructor(name3, config2) { super(name3, "array halfvector", "PgHalfVector"); - this.config.length = config3.dimensions; + this.config.length = config2.dimensions; this.config.isLengthExact = true; } build(table2) { @@ -90116,8 +90896,8 @@ var init_halfvec = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/vector_extension/sparsevec.js function sparsevec(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - return new PgSparseVectorBuilder(name3, config3); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + return new PgSparseVectorBuilder(name3, config2); } var PgSparseVectorBuilder, PgSparseVector; var init_sparsevec = __esm(() => { @@ -90126,9 +90906,9 @@ var init_sparsevec = __esm(() => { init_utils(); PgSparseVectorBuilder = class extends PgColumnBuilder { static [entityKind] = "PgSparseVectorBuilder"; - constructor(name3, config3) { + constructor(name3, config2) { super(name3, "string sparsevec", "PgSparseVector"); - this.config.vectorDimensions = config3.dimensions; + this.config.vectorDimensions = config2.dimensions; } build(table2) { return new PgSparseVector(table2, this.config); @@ -90145,8 +90925,8 @@ var init_sparsevec = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/vector_extension/vector.js function vector(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - return new PgVectorBuilder(name3, config3); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + return new PgVectorBuilder(name3, config2); } var PgVectorBuilder, PgVector; var init_vector = __esm(() => { @@ -90155,9 +90935,9 @@ var init_vector = __esm(() => { init_utils(); PgVectorBuilder = class extends PgColumnBuilder { static [entityKind] = "PgVectorBuilder"; - constructor(name3, config3) { + constructor(name3, config2) { super(name3, "array vector", "PgVector"); - this.config.length = config3.dimensions; + this.config.length = config2.dimensions; this.config.isLengthExact = true; } build(table2) { @@ -90364,7 +91144,7 @@ function getOperators() { sql }; } -function getOrderByOperators2() { +function getOrderByOperators() { return { sql, asc, @@ -90419,13 +91199,13 @@ function extractTablesRelationalConfig(schema2, configHelpers) { }; } function createOne(sourceTable) { - return function one2(table2, config3) { - return new One2(sourceTable, table2, config3, config3?.fields.reduce((res, f) => res && f.notNull, true) ?? false); + return function one2(table2, config2) { + return new One2(sourceTable, table2, config2, config2?.fields.reduce((res, f) => res && f.notNull, true) ?? false); }; } function createMany(sourceTable) { - return function many(referencedTable, config3) { - return new Many2(sourceTable, referencedTable, config3); + return function many(referencedTable, config2) { + return new Many(sourceTable, referencedTable, config2); }; } function normalizeRelation(schema2, tableNamesMap, relation) { @@ -90485,7 +91265,7 @@ function mapRelationalRow2(tablesConfig, tableConfig, row, buildQueryResultSelec } return result6; } -var Relation2, Relations, One2, Many2; +var Relation2, Relations, One2, Many; var init__relations = __esm(() => { init_entity(); init_column(); @@ -90507,16 +91287,16 @@ var init__relations = __esm(() => { }; Relations = class { static [entityKind] = "Relations"; - constructor(table2, config3) { + constructor(table2, config2) { this.table = table2; - this.config = config3; + this.config = config2; } }; One2 = class One3 extends Relation2 { static [entityKind] = "One"; - constructor(sourceTable, referencedTable, config3, isNullable) { - super(sourceTable, referencedTable, config3?.relationName); - this.config = config3; + constructor(sourceTable, referencedTable, config2, isNullable) { + super(sourceTable, referencedTable, config2?.relationName); + this.config = config2; this.isNullable = isNullable; } withFieldName(fieldName) { @@ -90525,45 +91305,20 @@ var init__relations = __esm(() => { return relation; } }; - Many2 = class Many3 extends Relation2 { + Many = class Many2 extends Relation2 { static [entityKind] = "Many"; - constructor(sourceTable, referencedTable, config3) { - super(sourceTable, referencedTable, config3?.relationName); - this.config = config3; + constructor(sourceTable, referencedTable, config2) { + super(sourceTable, referencedTable, config2?.relationName); + this.config = config2; } withFieldName(fieldName) { - const relation = new Many3(this.sourceTable, this.referencedTable, this.config); + const relation = new Many2(this.sourceTable, this.referencedTable, this.config); relation.fieldName = fieldName; return relation; } }; }); -// node_modules/drizzle-orm/query-promise.js -var QueryPromise2; -var init_query_promise = __esm(() => { - init_entity(); - QueryPromise2 = class { - static [entityKind] = "QueryPromise"; - [Symbol.toStringTag] = "QueryPromise"; - catch(onRejected) { - return this.then(undefined, onRejected); - } - finally(onFinally) { - return this.then((value8) => { - onFinally?.(); - return value8; - }, (reason2) => { - onFinally?.(); - throw reason2; - }); - } - then(onFulfilled, onRejected) { - return this.execute().then(onFulfilled, onRejected); - } - }; -}); - // node_modules/drizzle-orm/sqlite-core/query-builders/_query.js var _RelationalQueryBuilder, SQLiteRelationalQuery, SQLiteSyncRelationalQuery; var init__query = __esm(() => { @@ -90582,23 +91337,23 @@ var init__query = __esm(() => { this.dialect = dialect; this.session = session; } - findMany(config3) { - return this.mode === "sync" ? new SQLiteSyncRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config3 ? config3 : {}, "many") : new SQLiteRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config3 ? config3 : {}, "many"); + findMany(config2) { + return this.mode === "sync" ? new SQLiteSyncRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config2 ? config2 : {}, "many") : new SQLiteRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config2 ? config2 : {}, "many"); } - findFirst(config3) { - return this.mode === "sync" ? new SQLiteSyncRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config3 ? { - ...config3, + findFirst(config2) { + return this.mode === "sync" ? new SQLiteSyncRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config2 ? { + ...config2, limit: 1 - } : { limit: 1 }, "first") : new SQLiteRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config3 ? { - ...config3, + } : { limit: 1 }, "first") : new SQLiteRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config2 ? { + ...config2, limit: 1 } : { limit: 1 }, "first"); } }; - SQLiteRelationalQuery = class extends QueryPromise2 { + SQLiteRelationalQuery = class extends QueryPromise { static [entityKind] = "SQLiteAsyncRelationalQuery"; mode; - constructor(fullSchema, schema2, tableNamesMap, table2, tableConfig, dialect, session, config3, mode) { + constructor(fullSchema, schema2, tableNamesMap, table2, tableConfig, dialect, session, config2, mode) { super(); this.fullSchema = fullSchema; this.schema = schema2; @@ -90607,7 +91362,7 @@ var init__query = __esm(() => { this.tableConfig = tableConfig; this.dialect = dialect; this.session = session; - this.config = config3; + this.config = config2; this.mode = mode; } getSQL() { @@ -90708,460 +91463,6 @@ var init_count = __esm(() => { }; }); -// node_modules/drizzle-orm/alias.js -function aliasedTable2(table2, tableAlias) { - return new Proxy(table2, new TableAliasProxyHandler2(tableAlias, false, false)); -} -function aliasedColumn2(column, alias) { - return new Proxy(column, new ColumnAliasProxyHandler2(alias)); -} -function aliasedTableColumn2(column, tableAlias) { - return new Proxy(column, new ColumnTableAliasProxyHandler2(new Proxy(column.table, new TableAliasProxyHandler2(tableAlias, false, false)), false)); -} -function mapColumnsInAliasedSQLToAlias2(query, alias) { - return new SQL.Aliased(mapColumnsInSQLToAlias2(query.sql, alias), query.fieldAlias); -} -function mapColumnsInSQLToAlias2(query, alias) { - return sql.join(query.queryChunks.map((c) => { - if (is6(c, Column)) - return aliasedTableColumn2(c, alias); - if (is6(c, SQL)) - return mapColumnsInSQLToAlias2(c, alias); - if (is6(c, SQL.Aliased)) - return mapColumnsInAliasedSQLToAlias2(c, alias); - return c; - })); -} -function getOriginalColumnFromAlias2(column) { - return column[OriginalColumn](); -} -var ColumnTableAliasProxyHandler2, ViewSelectionAliasProxyHandler2, TableAliasProxyHandler2, ColumnAliasProxyHandler2; -var init_alias = __esm(() => { - init_column_common(); - init_entity(); - init_column(); - init_table(); - init_sql(); - init_subquery(); - init_view_common(); - ColumnTableAliasProxyHandler2 = class { - static [entityKind] = "ColumnTableAliasProxyHandler"; - constructor(table2, ignoreColumnAlias) { - this.table = table2; - this.ignoreColumnAlias = ignoreColumnAlias; - } - get(columnObj, prop) { - if (prop === "table") - return this.table; - if (prop === "isAlias" && this.ignoreColumnAlias) - return false; - return columnObj[prop]; - } - }; - ViewSelectionAliasProxyHandler2 = class { - static [entityKind] = "ViewSelectionAliasProxyHandler"; - constructor(view, selection, ignoreColumnAlias) { - this.view = view; - this.selection = selection; - this.ignoreColumnAlias = ignoreColumnAlias; - } - get(selection, prop) { - const value8 = selection[prop]; - if (is6(value8, Column)) - return new Proxy(value8, new ColumnTableAliasProxyHandler2(this.view, this.ignoreColumnAlias)); - if (is6(value8, Subquery) || is6(value8, SQL) || is6(value8, SQL.Aliased) || isSQLWrapper(value8) || typeof value8 !== "object" || value8 === null) - return value8; - return new Proxy(value8, this); - } - }; - TableAliasProxyHandler2 = class { - static [entityKind] = "TableAliasProxyHandler"; - constructor(alias, replaceOriginalName, ignoreColumnAlias) { - this.alias = alias; - this.replaceOriginalName = replaceOriginalName; - this.ignoreColumnAlias = ignoreColumnAlias; - } - get(target, prop) { - if (prop === Table.Symbol.IsAlias) - return true; - if (prop === Table.Symbol.Name) - return this.alias; - if (this.replaceOriginalName && prop === Table.Symbol.OriginalName) - return this.alias; - if (prop === ViewBaseConfig) - return { - ...target[ViewBaseConfig], - name: this.alias, - isAlias: true, - selectedFields: new Proxy(target[ViewBaseConfig].selectedFields, new ViewSelectionAliasProxyHandler2(new Proxy(target, this), target[ViewBaseConfig].selectedFields, this.ignoreColumnAlias)) - }; - if (prop === Table.Symbol.Columns) { - const columns = target[Table.Symbol.Columns]; - if (!columns) - return columns; - if (is6(target, View)) - return new Proxy(target[Table.Symbol.Columns], new ViewSelectionAliasProxyHandler2(new Proxy(target, this), target[Table.Symbol.Columns], this.ignoreColumnAlias)); - const proxiedColumns = {}; - Object.keys(columns).map((key) => { - proxiedColumns[key] = new Proxy(columns[key], new ColumnTableAliasProxyHandler2(new Proxy(target, this), this.ignoreColumnAlias)); - }); - return proxiedColumns; - } - const value8 = target[prop]; - if (is6(value8, Column)) - return new Proxy(value8, new ColumnTableAliasProxyHandler2(new Proxy(target, this), this.ignoreColumnAlias)); - return value8; - } - }; - ColumnAliasProxyHandler2 = class { - static [entityKind] = "ColumnAliasProxyHandler"; - constructor(alias) { - this.alias = alias; - } - get(target, prop) { - if (prop === "isAlias") - return true; - if (prop === "name") - return this.alias; - if (prop === "keyAsName") - return false; - if (prop === OriginalColumn) - return () => target; - return target[prop]; - } - }; - Column.prototype.as = function(alias) { - return aliasedColumn2(this, alias); - }; -}); - -// node_modules/drizzle-orm/errors.js -var DrizzleError2, DrizzleQueryError2, TransactionRollbackError2; -var init_errors5 = __esm(() => { - init_entity(); - DrizzleError2 = class extends Error { - static [entityKind] = "DrizzleError"; - constructor({ message, cause }) { - super(message); - this.name = "DrizzleError"; - this.cause = cause; - } - }; - DrizzleQueryError2 = class DrizzleQueryError3 extends Error { - static [entityKind] = "DrizzleQueryError"; - constructor(query, params, cause) { - super(`Failed query: ${query} -params: ${params}`); - this.query = query; - this.params = params; - this.cause = cause; - Error.captureStackTrace(this, DrizzleQueryError3); - if (cause) - this.cause = cause; - } - }; - TransactionRollbackError2 = class extends DrizzleError2 { - static [entityKind] = "TransactionRollbackError"; - constructor() { - super({ message: "Rollback" }); - } - }; -}); - -// node_modules/drizzle-orm/relations.js -function mapRelationalRow3(row, buildQueryResultSelection, mapColumnValue = (value8) => value8, parseJson2 = false, parseJsonIfString = false, path5) { - for (const selectionItem of buildQueryResultSelection) { - if (selectionItem.selection) { - const currentPath = `${path5 ? `${path5}.` : ""}${selectionItem.key}`; - if (row[selectionItem.key] === null) - continue; - if (parseJson2) { - row[selectionItem.key] = JSON.parse(row[selectionItem.key]); - if (row[selectionItem.key] === null) - continue; - } - if (parseJsonIfString && typeof row[selectionItem.key] === "string") - row[selectionItem.key] = JSON.parse(row[selectionItem.key]); - if (selectionItem.isArray) { - for (const item of row[selectionItem.key]) - mapRelationalRow3(item, selectionItem.selection, mapColumnValue, false, parseJsonIfString, currentPath); - continue; - } - mapRelationalRow3(row[selectionItem.key], selectionItem.selection, mapColumnValue, false, parseJsonIfString, currentPath); - continue; - } - const field = selectionItem.field; - const value8 = mapColumnValue(row[selectionItem.key]); - if (value8 === null) - continue; - let decoder2; - if (is6(field, Column)) - decoder2 = field; - else if (is6(field, SQL)) - decoder2 = field.decoder; - else if (is6(field, SQL.Aliased)) - decoder2 = field.sql.decoder; - else if (is6(field, Table) || is6(field, View)) - decoder2 = noopDecoder; - else - decoder2 = field.getSQL().decoder; - row[selectionItem.key] = "mapFromJsonValue" in decoder2 ? decoder2.mapFromJsonValue(value8) : decoder2.mapFromDriverValue(value8); - } - return row; -} -function fieldSelectionToSQL2(table2, target) { - const field = table2[TableColumns][target]; - return field ? is6(field, Column) ? field : is6(field, SQL.Aliased) ? sql`${table2}.${sql.identifier(field.fieldAlias)}` : sql`${table2}.${sql.identifier(target)}` : sql`${table2}.${sql.identifier(target)}`; -} -function relationsFieldFilterToSQL(column, filter21) { - if (typeof filter21 !== "object" || is6(filter21, Placeholder)) - return eq(column, filter21); - const entries10 = Object.entries(filter21); - if (!entries10.length) - return; - const parts3 = []; - for (const [target, value8] of entries10) { - if (value8 === undefined) - continue; - switch (target) { - case "NOT": { - const res = relationsFieldFilterToSQL(column, value8); - if (!res) - continue; - parts3.push(not5(res)); - continue; - } - case "OR": - if (!value8.length) - continue; - parts3.push(or5(...value8.map((subFilter) => relationsFieldFilterToSQL(column, subFilter)))); - continue; - case "AND": - if (!value8.length) - continue; - parts3.push(and3(...value8.map((subFilter) => relationsFieldFilterToSQL(column, subFilter)))); - continue; - case "isNotNull": - case "isNull": - if (!value8) - continue; - parts3.push(operators2[target](column)); - continue; - case "in": - parts3.push(operators2.inArray(column, value8)); - continue; - case "notIn": - parts3.push(operators2.notInArray(column, value8)); - continue; - default: - parts3.push(operators2[target](column, value8)); - continue; - } - } - if (!parts3.length) - return; - return and3(...parts3); -} -function relationsFilterToSQL2(table2, filter21, tableRelations = {}, tablesRelations = {}, casing, depth = 0) { - const entries10 = Object.entries(filter21); - if (!entries10.length) - return; - const parts3 = []; - for (const [target, value8] of entries10) { - if (value8 === undefined) - continue; - switch (target) { - case "RAW": { - const processed = typeof value8 === "function" ? value8(table2, operators2) : value8.getSQL(); - parts3.push(processed); - continue; - } - case "OR": - if (!value8?.length) - continue; - parts3.push(or5(...value8.map((subFilter) => relationsFilterToSQL2(table2, subFilter, tableRelations, tablesRelations, casing, depth)))); - continue; - case "AND": - if (!value8?.length) - continue; - parts3.push(and3(...value8.map((subFilter) => relationsFilterToSQL2(table2, subFilter, tableRelations, tablesRelations, casing, depth)))); - continue; - case "NOT": { - if (value8 === undefined) - continue; - const built = relationsFilterToSQL2(table2, value8, tableRelations, tablesRelations, casing, depth); - if (!built) - continue; - parts3.push(not5(built)); - continue; - } - default: { - if (table2[TableColumns][target]) { - const colFilter = relationsFieldFilterToSQL(fieldSelectionToSQL2(table2, target), value8); - if (colFilter) - parts3.push(colFilter); - continue; - } - const relation = tableRelations[target]; - if (!relation) - throw new DrizzleError2({ message: `Unknown relational filter field: "${target}"` }); - const targetTable = aliasedTable2(relation.targetTable, `f${depth}`); - const throughTable = relation.throughTable ? aliasedTable2(relation.throughTable, `ft${depth}`) : undefined; - const targetConfig = tablesRelations[relation.targetTableName]; - const { filter: relationFilter, joinCondition } = relationToSQL2(casing, relation, table2, targetTable, throughTable); - const filter22 = and3(relationFilter, typeof value8 === "boolean" ? undefined : relationsFilterToSQL2(targetTable, value8, targetConfig.relations, tablesRelations, casing, depth + 1)); - const subquery = throughTable ? sql`(select * from ${getTableAsAliasSQL2(targetTable)} inner join ${getTableAsAliasSQL2(throughTable)} on ${joinCondition}${sql` where ${filter22}`.if(filter22)} limit 1)` : sql`(select * from ${getTableAsAliasSQL2(targetTable)}${sql` where ${filter22}`.if(filter22)} limit 1)`; - if (filter22) - parts3.push((value8 ? exists2 : notExists)(subquery)); - } - } - } - return and3(...parts3); -} -function relationsOrderToSQL2(table2, orders) { - if (typeof orders === "function") { - const data2 = orders(table2, orderByOperators2); - return is6(data2, SQL) ? data2 : Array.isArray(data2) ? data2.length ? sql.join(data2.map((o) => is6(o, SQL) ? o : asc(o)), sql`, `) : undefined : is6(data2, Column) ? asc(data2) : undefined; - } - const entries10 = Object.entries(orders).filter(([_2, value8]) => value8); - if (!entries10.length) - return; - return sql.join(entries10.map(([target, value8]) => (value8 === "asc" ? asc : desc)(fieldSelectionToSQL2(table2, target))), sql`, `); -} -function relationExtrasToSQL2(table2, extras) { - const subqueries = []; - const selection = []; - for (const [key, field] of Object.entries(extras)) { - if (!field) - continue; - const extra = typeof field === "function" ? field(table2, { sql: operators2.sql }) : field; - const query = sql`(${extra.getSQL()}) as ${sql.identifier(key)}`; - query.decoder = extra.getSQL().decoder; - subqueries.push(query); - selection.push({ - key, - field: query - }); - } - return { - sql: subqueries.length ? sql.join(subqueries, sql`, `) : undefined, - selection - }; -} -function relationToSQL2(casing, relation, sourceTable, targetTable, throughTable) { - if (relation.through) { - const outerColumnWhere = relation.sourceColumns.map((s, i2) => { - const t = relation.through.source[i2]; - return eq(sql`${sourceTable}.${sql.identifier(casing.getColumnCasing(s))}`, sql`${throughTable}.${sql.identifier(is6(t._.column, Column) ? casing.getColumnCasing(t._.column) : t._.key)}`); - }); - const innerColumnWhere = relation.targetColumns.map((s, i2) => { - const t = relation.through.target[i2]; - return eq(sql`${throughTable}.${sql.identifier(is6(t._.column, Column) ? casing.getColumnCasing(t._.column) : t._.key)}`, sql`${targetTable}.${sql.identifier(casing.getColumnCasing(s))}`); - }); - return { - filter: and3(relation.where ? relationsFilterToSQL2(relation.isReversed ? sourceTable : targetTable, relation.where) : undefined, ...outerColumnWhere), - joinCondition: and3(...innerColumnWhere) - }; - } - return { filter: and3(...relation.sourceColumns.map((s, i2) => { - const t = relation.targetColumns[i2]; - return eq(sql`${sourceTable}.${sql.identifier(casing.getColumnCasing(s))}`, sql`${targetTable}.${sql.identifier(casing.getColumnCasing(t))}`); - }), relation.where ? relationsFilterToSQL2(relation.isReversed ? sourceTable : targetTable, relation.where) : undefined) }; -} -function getTableAsAliasSQL2(table2) { - return sql`${table2[IsAlias] ? sql`${sql`${sql.identifier(table2[TableSchema] ?? "")}.`.if(table2[TableSchema])}${sql.identifier(table2[OriginalName])} as ${table2}` : table2}`; -} -var Relation3, One4, operators2, orderByOperators2; -var init_relations = __esm(() => { - init_entity(); - init_column(); - init_sql(); - init_alias(); - init_errors5(); - init_conditions(); - init_select(); - init_table(); - Relation3 = class { - static [entityKind] = "RelationV2"; - fieldName; - sourceColumns; - targetColumns; - alias; - where; - sourceTable; - targetTable; - through; - throughTable; - isReversed; - sourceColumnTableNames = []; - targetColumnTableNames = []; - constructor(targetTable, targetTableName) { - this.targetTableName = targetTableName; - this.targetTable = targetTable; - } - }; - One4 = class extends Relation3 { - static [entityKind] = "OneV2"; - relationType = "one"; - optional; - constructor(tables, targetTable, targetTableName, config3) { - super(targetTable, targetTableName); - this.alias = config3?.alias; - this.where = config3?.where; - if (config3?.from) - this.sourceColumns = (Array.isArray(config3.from) ? config3.from : [config3.from]).map((it2) => { - this.throughTable ??= it2._.through ? tables[it2._.through._.tableName] : undefined; - this.sourceColumnTableNames.push(it2._.tableName); - return it2._.column; - }); - if (config3?.to) - this.targetColumns = (Array.isArray(config3.to) ? config3.to : [config3.to]).map((it2) => { - this.throughTable ??= it2._.through ? tables[it2._.through._.tableName] : undefined; - this.targetColumnTableNames.push(it2._.tableName); - return it2._.column; - }); - if (this.throughTable) - this.through = { - source: (Array.isArray(config3?.from) ? config3.from : (config3?.from) ? [config3.from] : []).map((c) => c._.through), - target: (Array.isArray(config3?.to) ? config3.to : (config3?.to) ? [config3.to] : []).map((c) => c._.through) - }; - this.optional = config3?.optional ?? true; - } - }; - operators2 = { - and: and3, - between: between7, - eq, - exists: exists2, - gt: gt2, - gte: gte2, - ilike, - inArray, - arrayContains, - arrayContained, - arrayOverlaps, - isNull: isNull3, - isNotNull: isNotNull2, - like, - lt: lt2, - lte: lte2, - ne: ne2, - not: not5, - notBetween, - notExists, - notLike, - notIlike, - notInArray, - or: or5, - sql - }; - orderByOperators2 = { - sql, - asc, - desc - }; -}); - // node_modules/drizzle-orm/sqlite-core/query-builders/query.js var RelationalQueryBuilder, SQLiteRelationalQuery2, SQLiteSyncRelationalQuery2; var init_query = __esm(() => { @@ -91181,24 +91482,24 @@ var init_query = __esm(() => { this.rowMode = rowMode; this.forbidJsonb = forbidJsonb; } - findMany(config3) { - return this.mode === "sync" ? new SQLiteSyncRelationalQuery2(this.schema, this.table, this.tableConfig, this.dialect, this.session, config3 ?? true, "many", this.rowMode, this.forbidJsonb) : new SQLiteRelationalQuery2(this.schema, this.table, this.tableConfig, this.dialect, this.session, config3 ?? true, "many", this.rowMode, this.forbidJsonb); + findMany(config2) { + return this.mode === "sync" ? new SQLiteSyncRelationalQuery2(this.schema, this.table, this.tableConfig, this.dialect, this.session, config2 ?? true, "many", this.rowMode, this.forbidJsonb) : new SQLiteRelationalQuery2(this.schema, this.table, this.tableConfig, this.dialect, this.session, config2 ?? true, "many", this.rowMode, this.forbidJsonb); } - findFirst(config3) { - return this.mode === "sync" ? new SQLiteSyncRelationalQuery2(this.schema, this.table, this.tableConfig, this.dialect, this.session, config3 ?? true, "first", this.rowMode, this.forbidJsonb) : new SQLiteRelationalQuery2(this.schema, this.table, this.tableConfig, this.dialect, this.session, config3 ?? true, "first", this.rowMode, this.forbidJsonb); + findFirst(config2) { + return this.mode === "sync" ? new SQLiteSyncRelationalQuery2(this.schema, this.table, this.tableConfig, this.dialect, this.session, config2 ?? true, "first", this.rowMode, this.forbidJsonb) : new SQLiteRelationalQuery2(this.schema, this.table, this.tableConfig, this.dialect, this.session, config2 ?? true, "first", this.rowMode, this.forbidJsonb); } }; - SQLiteRelationalQuery2 = class extends QueryPromise2 { + SQLiteRelationalQuery2 = class extends QueryPromise { static [entityKind] = "SQLiteAsyncRelationalQueryV2"; mode; table; - constructor(schema2, table2, tableConfig, dialect, session, config3, mode, rowMode, forbidJsonb) { + constructor(schema2, table2, tableConfig, dialect, session, config2, mode, rowMode, forbidJsonb) { super(); this.schema = schema2; this.tableConfig = tableConfig; this.dialect = dialect; this.session = session; - this.config = config3; + this.config = config2; this.rowMode = rowMode; this.forbidJsonb = forbidJsonb; this.mode = mode; @@ -91217,7 +91518,7 @@ var init_query = __esm(() => { _prepare(isOneTimeQuery = true) { const { query, builtQuery } = this._toSQL(); return this.session[isOneTimeQuery ? "prepareOneTimeRelationalQuery" : "prepareRelationalQuery"](builtQuery, undefined, this.mode === "first" ? "get" : "all", (rawRows, mapColumnValue) => { - const rows = rawRows.map((row) => mapRelationalRow3(row, query.selection, mapColumnValue, !this.rowMode)); + const rows = rawRows.map((row) => mapRelationalRow(row, query.selection, mapColumnValue, !this.rowMode)); if (this.mode === "first") return rows[0]; return rows; @@ -91275,7 +91576,7 @@ var SQLiteRaw; var init_raw = __esm(() => { init_entity(); init_query_promise(); - SQLiteRaw = class extends QueryPromise2 { + SQLiteRaw = class extends QueryPromise { static [entityKind] = "SQLiteRaw"; config; constructor(execute, getSQL, action, dialect, mapBatchResult) { @@ -91316,8 +91617,8 @@ var init_selection_proxy = __esm(() => { SelectionProxyHandler = class SelectionProxyHandler2 { static [entityKind] = "SelectionProxyHandler"; config; - constructor(config3) { - this.config = { ...config3 }; + constructor(config2) { + this.config = { ...config2 }; } get(subquery, prop) { if (prop === "_") @@ -91348,7 +91649,7 @@ var init_selection_proxy = __esm(() => { } if (is6(value8, Column)) { if (this.config.alias) - return new Proxy(value8, new ColumnTableAliasProxyHandler2(new Proxy(value8.table, new TableAliasProxyHandler2(this.config.alias, this.config.replaceOriginalName ?? false, true)), true)); + return new Proxy(value8, new ColumnTableAliasProxyHandler(new Proxy(value8.table, new TableAliasProxyHandler(this.config.alias, this.config.replaceOriginalName ?? false, true)), true)); return value8; } if (typeof value8 !== "object" || value8 === null) @@ -91386,7 +91687,7 @@ var init_delete = __esm(() => { init_query_promise(); init_selection_proxy(); init_table2(); - SQLiteDeleteBase = class extends QueryPromise2 { + SQLiteDeleteBase = class extends QueryPromise { static [entityKind] = "SQLiteDelete"; config; constructor(table2, session, dialect, withList) { @@ -91422,7 +91723,7 @@ var init_delete = __esm(() => { return this; } returning(fields = this.table[SQLiteTable.Symbol.Columns]) { - this.config.returning = orderSelectedFields2(fields); + this.config.returning = orderSelectedFields(fields); return this; } getSQL() { @@ -91493,7 +91794,7 @@ function createSetOperator(type3, isAll) { rightSelect: select })); for (const setOperator of setOperators) - if (!haveSameKeys2(leftSelect.getSelectedFields(), setOperator.rightSelect.getSelectedFields())) + if (!haveSameKeys(leftSelect.getSelectedFields(), setOperator.rightSelect.getSelectedFields())) throw new Error("Set operator error (union / intersect / except): selected fields are not the same or are in a different order"); return leftSelect.addSetOperators(setOperators); }; @@ -91523,12 +91824,12 @@ var init_select2 = __esm(() => { dialect; withList; distinct; - constructor(config3) { - this.fields = config3.fields; - this.session = config3.session; - this.dialect = config3.dialect; - this.withList = config3.withList; - this.distinct = config3.distinct; + constructor(config2) { + this.fields = config2.fields; + this.session = config2.session; + this.dialect = config2.dialect; + this.withList = config2.withList; + this.distinct = config2.distinct; } from(source) { const isPartialSelect = !!this.fields; @@ -91542,7 +91843,7 @@ var init_select2 = __esm(() => { else if (is6(source, SQL)) fields = {}; else - fields = getTableColumns2(source); + fields = getTableColumns(source); return new SQLiteSelectBase({ table: source, fields, @@ -91581,7 +91882,7 @@ var init_select2 = __esm(() => { selectedFields: fields, config: this.config }; - this.tableName = getTableLikeName2(table2); + this.tableName = getTableLikeName(table2); this.joinsNotNullableMap = typeof this.tableName === "string" ? { [this.tableName]: true } : {}; for (const item of extractUsedTable(table2)) this.usedTables.add(item); @@ -91592,7 +91893,7 @@ var init_select2 = __esm(() => { createJoin(joinType) { return (table2, on) => { const baseTableName = this.tableName; - const tableName = getTableLikeName2(table2); + const tableName = getTableLikeName(table2); for (const item of extractUsedTable(table2)) this.usedTables.add(item); if (typeof tableName === "string" && this.config.joins?.some((join10) => join10.alias === tableName)) @@ -91647,7 +91948,7 @@ var init_select2 = __esm(() => { createSetOperator(type3, isAll) { return (rightSelection) => { const rightSelect = typeof rightSelection === "function" ? rightSelection(getSQLiteSetOperators()) : rightSelection; - if (!haveSameKeys2(this.getSelectedFields(), rightSelect.getSelectedFields())) + if (!haveSameKeys(this.getSelectedFields(), rightSelect.getSelectedFields())) throw new Error("Set operator error (union / intersect / except): selected fields are not the same or are in a different order"); this.config.setOperators.push({ type: type3, @@ -91763,7 +92064,7 @@ var init_select2 = __esm(() => { _prepare(isOneTimeQuery = true) { if (!this.session) throw new Error("Cannot execute a query on a query builder. Please use a database instance instead."); - const fieldsList = orderSelectedFields2(this.config.fields); + const fieldsList = orderSelectedFields(this.config.fields); const query = this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), fieldsList, "all", true, undefined, { type: "select", tables: [...this.usedTables] @@ -91771,15 +92072,15 @@ var init_select2 = __esm(() => { query.joinsNotNullableMap = this.joinsNotNullableMap; return query; } - $withCache(config3) { - this.cacheConfig = config3 === undefined ? { + $withCache(config2) { + this.cacheConfig = config2 === undefined ? { config: {}, enabled: true, autoInvalidate: true - } : config3 === false ? { enabled: false } : { + } : config2 === false ? { enabled: false } : { enabled: true, autoInvalidate: true, - ...config3 + ...config2 }; return this; } @@ -91802,7 +92103,7 @@ var init_select2 = __esm(() => { return this.all(); } }; - applyMixins2(SQLiteSelectBase, [QueryPromise2]); + applyMixins(SQLiteSelectBase, [QueryPromise]); union13 = createSetOperator("union", false); unionAll = createSetOperator("union", true); intersect = createSetOperator("intersect", false); @@ -91994,8 +92295,8 @@ var init_dialect = __esm(() => { SQLiteDialect = class { static [entityKind] = "SQLiteDialect"; casing; - constructor(config3) { - this.casing = new CasingCache(config3?.casing); + constructor(config2) { + this.casing = new CasingCache(config2?.casing); } escapeName(name3) { return `"${name3}"`; @@ -92069,13 +92370,13 @@ var init_dialect = __esm(() => { } else if (is6(field, Column)) if (field.columnType === "SQLiteNumericBigInt") if (isSingleTable) - chunk.push(field.isAlias ? sql`cast(${sql.identifier(this.casing.getColumnCasing(getOriginalColumnFromAlias2(field)))} as text) as ${field}` : sql`cast(${sql.identifier(this.casing.getColumnCasing(field))} as text)`); + chunk.push(field.isAlias ? sql`cast(${sql.identifier(this.casing.getColumnCasing(getOriginalColumnFromAlias(field)))} as text) as ${field}` : sql`cast(${sql.identifier(this.casing.getColumnCasing(field))} as text)`); else - chunk.push(field.isAlias ? sql`cast(${getOriginalColumnFromAlias2(field)} as text) as ${field}` : sql`cast(${field} as text)`); + chunk.push(field.isAlias ? sql`cast(${getOriginalColumnFromAlias(field)} as text) as ${field}` : sql`cast(${field} as text)`); else if (isSingleTable) - chunk.push(field.isAlias ? sql`${sql.identifier(this.casing.getColumnCasing(getOriginalColumnFromAlias2(field)))} as ${field}` : sql.identifier(this.casing.getColumnCasing(field))); + chunk.push(field.isAlias ? sql`${sql.identifier(this.casing.getColumnCasing(getOriginalColumnFromAlias(field)))} as ${field}` : sql.identifier(this.casing.getColumnCasing(field))); else - chunk.push(field.isAlias ? sql`${getOriginalColumnFromAlias2(field)} as ${field}` : field); + chunk.push(field.isAlias ? sql`${getOriginalColumnFromAlias(field)} as ${field}` : field); else if (is6(field, Subquery)) { const entries10 = Object.entries(field._.selectedFields); if (entries10.length === 1) { @@ -92140,7 +92441,7 @@ var init_dialect = __esm(() => { return table2; } buildSelectQuery({ withList, fields, fieldsFlat, where, having, table: table2, joins, orderBy, groupBy: groupBy4, limit, offset, distinct, setOperators }) { - const fieldsList = fieldsFlat ?? orderSelectedFields2(fields); + const fieldsList = fieldsFlat ?? orderSelectedFields(fields); for (const f of fieldsList) if (is6(f.field, Column) && getTableName(f.field.table) !== (is6(table2, Subquery) ? table2._.alias : is6(table2, SQLiteViewBase) ? table2[ViewBaseConfig].name : is6(table2, SQL) ? undefined : getTableName(table2)) && !((table3) => joins?.some(({ alias }) => alias === (table3[Table.Symbol.IsAlias] ? getTableName(table3) : table3[Table.Symbol.BaseName])))(f.field.table)) { const tableName = getTableName(f.field.table); @@ -92258,30 +92559,30 @@ var init_dialect = __esm(() => { invokeSource }); } - _buildRelationalQuery({ fullSchema, schema: schema2, tableNamesMap, table: table2, tableConfig, queryConfig: config3, tableAlias, nestedQueryRelation, joinOn }) { + _buildRelationalQuery({ fullSchema, schema: schema2, tableNamesMap, table: table2, tableConfig, queryConfig: config2, tableAlias, nestedQueryRelation, joinOn }) { let selection = []; let limit, offset, orderBy = [], where; const joins = []; - if (config3 === true) + if (config2 === true) selection = Object.entries(tableConfig.columns).map(([key, value8]) => ({ dbKey: value8.name, tsKey: key, - field: aliasedTableColumn2(value8, tableAlias), + field: aliasedTableColumn(value8, tableAlias), relationTableTsKey: undefined, isJson: false, selection: [] })); else { - const aliasedColumns = Object.fromEntries(Object.entries(tableConfig.columns).map(([key, value8]) => [key, aliasedTableColumn2(value8, tableAlias)])); - if (config3.where) { - const whereSql = typeof config3.where === "function" ? config3.where(aliasedColumns, getOperators()) : config3.where; - where = whereSql && mapColumnsInSQLToAlias2(whereSql, tableAlias); + const aliasedColumns = Object.fromEntries(Object.entries(tableConfig.columns).map(([key, value8]) => [key, aliasedTableColumn(value8, tableAlias)])); + if (config2.where) { + const whereSql = typeof config2.where === "function" ? config2.where(aliasedColumns, getOperators()) : config2.where; + where = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias); } const fieldsSelection = []; let selectedColumns = []; - if (config3.columns) { + if (config2.columns) { let isIncludeMode = false; - for (const [field, value8] of Object.entries(config3.columns)) { + for (const [field, value8] of Object.entries(config2.columns)) { if (value8 === undefined) continue; if (field in tableConfig.columns) { @@ -92291,7 +92592,7 @@ var init_dialect = __esm(() => { } } if (selectedColumns.length > 0) - selectedColumns = isIncludeMode ? selectedColumns.filter((c) => config3.columns?.[c] === true) : Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key)); + selectedColumns = isIncludeMode ? selectedColumns.filter((c) => config2.columns?.[c] === true) : Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key)); } else selectedColumns = Object.keys(tableConfig.columns); for (const field of selectedColumns) { @@ -92302,45 +92603,45 @@ var init_dialect = __esm(() => { }); } let selectedRelations = []; - if (config3.with) - selectedRelations = Object.entries(config3.with).filter((entry) => !!entry[1]).map(([tsKey, queryConfig]) => ({ + if (config2.with) + selectedRelations = Object.entries(config2.with).filter((entry) => !!entry[1]).map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey] })); let extras; - if (config3.extras) { - extras = typeof config3.extras === "function" ? config3.extras(aliasedColumns, { sql }) : config3.extras; + if (config2.extras) { + extras = typeof config2.extras === "function" ? config2.extras(aliasedColumns, { sql }) : config2.extras; for (const [tsKey, value8] of Object.entries(extras)) fieldsSelection.push({ tsKey, - value: mapColumnsInAliasedSQLToAlias2(value8, tableAlias) + value: mapColumnsInAliasedSQLToAlias(value8, tableAlias) }); } for (const { tsKey, value: value8 } of fieldsSelection) selection.push({ dbKey: is6(value8, SQL.Aliased) ? value8.fieldAlias : tableConfig.columns[tsKey].name, tsKey, - field: is6(value8, Column) ? aliasedTableColumn2(value8, tableAlias) : value8, + field: is6(value8, Column) ? aliasedTableColumn(value8, tableAlias) : value8, relationTableTsKey: undefined, isJson: false, selection: [] }); - let orderByOrig = typeof config3.orderBy === "function" ? config3.orderBy(aliasedColumns, getOrderByOperators2()) : config3.orderBy ?? []; + let orderByOrig = typeof config2.orderBy === "function" ? config2.orderBy(aliasedColumns, getOrderByOperators()) : config2.orderBy ?? []; if (!Array.isArray(orderByOrig)) orderByOrig = [orderByOrig]; orderBy = orderByOrig.map((orderByValue) => { if (is6(orderByValue, Column)) - return aliasedTableColumn2(orderByValue, tableAlias); - return mapColumnsInSQLToAlias2(orderByValue, tableAlias); + return aliasedTableColumn(orderByValue, tableAlias); + return mapColumnsInSQLToAlias(orderByValue, tableAlias); }); - limit = config3.limit; - offset = config3.offset; + limit = config2.limit; + offset = config2.offset; for (const { tsKey: selectedRelationTsKey, queryConfig: selectedRelationConfigValue, relation } of selectedRelations) { const normalizedRelation = normalizeRelation(schema2, tableNamesMap, relation); const relationTableTsName = tableNamesMap[getTableUniqueName(relation.referencedTable)]; const relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`; - const joinOn2 = and3(...normalizedRelation.fields.map((field2, i2) => eq(aliasedTableColumn2(normalizedRelation.references[i2], relationTableAlias), aliasedTableColumn2(field2, tableAlias)))); + const joinOn2 = and3(...normalizedRelation.fields.map((field2, i2) => eq(aliasedTableColumn(normalizedRelation.references[i2], relationTableAlias), aliasedTableColumn(field2, tableAlias)))); const builtRelation = this._buildRelationalQuery({ fullSchema, schema: schema2, @@ -92367,12 +92668,12 @@ var init_dialect = __esm(() => { } } if (selection.length === 0) - throw new DrizzleError2({ message: `No fields selected for table "${tableConfig.tsName}" ("${tableAlias}"). You need to have at least one item in "columns", "with" or "extras". If you need to select all columns, omit the "columns" key or set it to undefined.` }); + throw new DrizzleError({ message: `No fields selected for table "${tableConfig.tsName}" ("${tableAlias}"). You need to have at least one item in "columns", "with" or "extras". If you need to select all columns, omit the "columns" key or set it to undefined.` }); let result6; where = and3(joinOn, where); if (nestedQueryRelation) { let field = sql`json_array(${sql.join(selection.map(({ field: field2 }) => is6(field2, SQLiteColumn) ? sql.identifier(this.casing.getColumnCasing(field2)) : is6(field2, SQL.Aliased) ? field2.sql : field2), sql`, `)})`; - if (is6(nestedQueryRelation, Many2)) + if (is6(nestedQueryRelation, Many)) field = sql`coalesce(json_group_array(${field}), json_array())`; const nestedSelection = [{ dbKey: "data", @@ -92384,7 +92685,7 @@ var init_dialect = __esm(() => { }]; if (limit !== undefined || offset !== undefined || orderBy.length > 0) { result6 = this.buildSelectQuery({ - table: aliasedTable2(table2, tableAlias), + table: aliasedTable(table2, tableAlias), fields: {}, fieldsFlat: [{ path: [], @@ -92401,13 +92702,13 @@ var init_dialect = __esm(() => { offset = undefined; orderBy = undefined; } else - result6 = aliasedTable2(table2, tableAlias); + result6 = aliasedTable(table2, tableAlias); result6 = this.buildSelectQuery({ table: is6(result6, SQLiteTable) ? result6 : new Subquery(result6, {}, tableAlias), fields: {}, fieldsFlat: nestedSelection.map(({ field: field2 }) => ({ path: [], - field: is6(field2, Column) ? aliasedTableColumn2(field2, tableAlias) : field2 + field: is6(field2, Column) ? aliasedTableColumn(field2, tableAlias) : field2 })), joins, where, @@ -92418,11 +92719,11 @@ var init_dialect = __esm(() => { }); } else result6 = this.buildSelectQuery({ - table: aliasedTable2(table2, tableAlias), + table: aliasedTable(table2, tableAlias), fields: {}, fieldsFlat: selection.map(({ field }) => ({ path: [], - field: is6(field, Column) ? aliasedTableColumn2(field, tableAlias) : field + field: is6(field, Column) ? aliasedTableColumn(field, tableAlias) : field })), joins, where, @@ -92438,7 +92739,7 @@ var init_dialect = __esm(() => { }; } nestedSelectionerror() { - throw new DrizzleError2({ message: `Views with nested selections are not supported by the relational query builder` }); + throw new DrizzleError({ message: `Views with nested selections are not supported by the relational query builder` }); } buildRqbColumn(table2, column, key) { if (is6(column, Column)) { @@ -92509,20 +92810,20 @@ var init_dialect = __esm(() => { } return columnIdentifiers.length ? sql.join(columnIdentifiers, sql`, `) : undefined; })() : this.unwrapAllColumns(table2, selection); - buildRelationalQuery({ schema: schema2, table: table2, tableConfig, queryConfig: config3, relationWhere, mode, isNested, errorPath, depth, throughJoin, jsonb: jsonb2 }) { + buildRelationalQuery({ schema: schema2, table: table2, tableConfig, queryConfig: config2, relationWhere, mode, isNested, errorPath, depth, throughJoin, jsonb: jsonb2 }) { const selection = []; const isSingle = mode === "first"; - const params = config3 === true ? undefined : config3; + const params = config2 === true ? undefined : config2; const currentPath = errorPath ?? ""; const currentDepth = depth ?? 0; if (!currentDepth) - table2 = aliasedTable2(table2, `d${currentDepth}`); + table2 = aliasedTable(table2, `d${currentDepth}`); const limit = isSingle ? 1 : params?.limit; const offset = params?.offset; const columns = this.buildColumns(table2, selection, params); - const where = params?.where && relationWhere ? and3(relationsFilterToSQL2(table2, params.where, tableConfig.relations, schema2, this.casing), relationWhere) : params?.where ? relationsFilterToSQL2(table2, params.where, tableConfig.relations, schema2, this.casing) : relationWhere; - const order = params?.orderBy ? relationsOrderToSQL2(table2, params.orderBy) : undefined; - const extras = params?.extras ? relationExtrasToSQL2(table2, params.extras) : undefined; + const where = params?.where && relationWhere ? and3(relationsFilterToSQL(table2, params.where, tableConfig.relations, schema2, this.casing), relationWhere) : params?.where ? relationsFilterToSQL(table2, params.where, tableConfig.relations, schema2, this.casing) : relationWhere; + const order = params?.orderBy ? relationsOrderToSQL(table2, params.orderBy) : undefined; + const extras = params?.extras ? relationExtrasToSQL(table2, params.extras) : undefined; if (extras) selection.push(...extras.selection); const joins = params ? (() => { @@ -92534,11 +92835,11 @@ var init_dialect = __esm(() => { return; return sql.join(withEntries.map(([k2, join10]) => { const relation = tableConfig.relations[k2]; - const isSingle2 = is6(relation, One4); - const targetTable = aliasedTable2(relation.targetTable, `d${currentDepth + 1}`); - const throughTable = relation.throughTable ? aliasedTable2(relation.throughTable, `tr${currentDepth}`) : undefined; - const { filter: filter21, joinCondition } = relationToSQL2(this.casing, relation, table2, targetTable, throughTable); - const throughJoin2 = throughTable ? sql` inner join ${getTableAsAliasSQL2(throughTable)} on ${joinCondition}` : undefined; + const isSingle2 = is6(relation, One); + const targetTable = aliasedTable(relation.targetTable, `d${currentDepth + 1}`); + const throughTable = relation.throughTable ? aliasedTable(relation.throughTable, `tr${currentDepth}`) : undefined; + const { filter: filter21, joinCondition } = relationToSQL(this.casing, relation, table2, targetTable, throughTable); + const throughJoin2 = throughTable ? sql` inner join ${getTableAsAliasSQL(throughTable)} on ${joinCondition}` : undefined; const innerQuery = this.buildRelationalQuery({ table: targetTable, mode: isSingle2 ? "first" : "many", @@ -92572,17 +92873,17 @@ var init_dialect = __esm(() => { joins ].filter((e) => e !== undefined); if (!selectionArr.length) - throw new DrizzleError2({ message: `No fields selected for table "${tableConfig.name}"${currentPath ? ` ("${currentPath}")` : ""}` }); + throw new DrizzleError({ message: `No fields selected for table "${tableConfig.name}"${currentPath ? ` ("${currentPath}")` : ""}` }); return { - sql: sql`select ${sql.join(selectionArr, sql`, `)} from ${getTableAsAliasSQL2(table2)}${throughJoin}${sql` where ${where}`.if(where)}${sql` order by ${order}`.if(order)}${sql` limit ${limit}`.if(limit !== undefined)}${sql` offset ${offset}`.if(offset !== undefined)}`, + sql: sql`select ${sql.join(selectionArr, sql`, `)} from ${getTableAsAliasSQL(table2)}${throughJoin}${sql` where ${where}`.if(where)}${sql` order by ${order}`.if(order)}${sql` limit ${limit}`.if(limit !== undefined)}${sql` offset ${offset}`.if(offset !== undefined)}`, selection }; } }; SQLiteSyncDialect = class extends SQLiteDialect { static [entityKind] = "SQLiteSyncDialect"; - migrate(migrations, session, config3) { - const migrationsTable = config3 === undefined ? "__drizzle_migrations" : typeof config3 === "string" ? "__drizzle_migrations" : config3.migrationsTable ?? "__drizzle_migrations"; + migrate(migrations, session, config2) { + const migrationsTable = config2 === undefined ? "__drizzle_migrations" : typeof config2 === "string" ? "__drizzle_migrations" : config2.migrationsTable ?? "__drizzle_migrations"; const { newDb } = upgradeSyncIfNeeded(migrationsTable, session, migrations); if (newDb) { const migrationTableCreate = sql` @@ -92596,7 +92897,7 @@ var init_dialect = __esm(() => { session.run(migrationTableCreate); } const dbMigrations = session.all(sql`SELECT id, hash, created_at, name FROM ${sql.identifier(migrationsTable)}`); - if (typeof config3 === "object" && config3.init) { + if (typeof config2 === "object" && config2.init) { if (dbMigrations.length) return { exitCode: "databaseMigrations" }; if (migrations.length > 1) @@ -92739,12 +93040,12 @@ var init_insert = __esm(() => { } select(selectQuery) { const select = typeof selectQuery === "function" ? selectQuery(new QueryBuilder) : selectQuery; - if (!is6(select, SQL) && !haveSameKeys2(this.table[TableColumns], select._.selectedFields)) + if (!is6(select, SQL) && !haveSameKeys(this.table[TableColumns], select._.selectedFields)) throw new Error("Insert select error: selected fields are not the same or are in a different order compared to the table definition"); return new SQLiteInsertBase(this.table, select, this.session, this.dialect, this.withList, true); } }; - SQLiteInsertBase = class extends QueryPromise2 { + SQLiteInsertBase = class extends QueryPromise { static [entityKind] = "SQLiteInsert"; config; constructor(table2, values12, session, dialect, withList, select) { @@ -92759,31 +93060,31 @@ var init_insert = __esm(() => { }; } returning(fields = this.config.table[SQLiteTable.Symbol.Columns]) { - this.config.returning = orderSelectedFields2(fields); + this.config.returning = orderSelectedFields(fields); return this; } - onConflictDoNothing(config3 = {}) { + onConflictDoNothing(config2 = {}) { if (!this.config.onConflict) this.config.onConflict = []; - if (config3.target === undefined) + if (config2.target === undefined) this.config.onConflict.push(sql` on conflict do nothing`); else { - const targetSql = Array.isArray(config3.target) ? sql`${config3.target}` : sql`${[config3.target]}`; - const whereSql = config3.where ? sql` where ${config3.where}` : sql``; + const targetSql = Array.isArray(config2.target) ? sql`${config2.target}` : sql`${[config2.target]}`; + const whereSql = config2.where ? sql` where ${config2.where}` : sql``; this.config.onConflict.push(sql` on conflict ${targetSql} do nothing${whereSql}`); } return this; } - onConflictDoUpdate(config3) { - if (config3.where && (config3.targetWhere || config3.setWhere)) + onConflictDoUpdate(config2) { + if (config2.where && (config2.targetWhere || config2.setWhere)) throw new Error('You cannot use both "where" and "targetWhere"/"setWhere" at the same time - "where" is deprecated, use "targetWhere" or "setWhere" instead.'); if (!this.config.onConflict) this.config.onConflict = []; - const whereSql = config3.where ? sql` where ${config3.where}` : undefined; - const targetWhereSql = config3.targetWhere ? sql` where ${config3.targetWhere}` : undefined; - const setWhereSql = config3.setWhere ? sql` where ${config3.setWhere}` : undefined; - const targetSql = Array.isArray(config3.target) ? sql`${config3.target}` : sql`${[config3.target]}`; - const setSql = this.dialect.buildUpdateSet(this.config.table, mapUpdateSet2(this.config.table, config3.set)); + const whereSql = config2.where ? sql` where ${config2.where}` : undefined; + const targetWhereSql = config2.targetWhere ? sql` where ${config2.targetWhere}` : undefined; + const setWhereSql = config2.setWhere ? sql` where ${config2.setWhere}` : undefined; + const targetSql = Array.isArray(config2.target) ? sql`${config2.target}` : sql`${[config2.target]}`; + const setSql = this.dialect.buildUpdateSet(this.config.table, mapUpdateSet(this.config.table, config2.set)); this.config.onConflict.push(sql` on conflict ${targetSql}${targetWhereSql} do update set ${setSql}${whereSql}${setWhereSql}`); return this; } @@ -92846,10 +93147,10 @@ var init_update = __esm(() => { this.withList = withList; } set(values12) { - return new SQLiteUpdateBase(this.table, mapUpdateSet2(this.table, values12), this.session, this.dialect, this.withList); + return new SQLiteUpdateBase(this.table, mapUpdateSet(this.table, values12), this.session, this.dialect, this.withList); } }; - SQLiteUpdateBase = class extends QueryPromise2 { + SQLiteUpdateBase = class extends QueryPromise { static [entityKind] = "SQLiteUpdate"; config; constructor(table2, set22, session, dialect, withList) { @@ -92869,7 +93170,7 @@ var init_update = __esm(() => { } createJoin(joinType) { return (table2, on) => { - const tableName = getTableLikeName2(table2); + const tableName = getTableLikeName(table2); if (typeof tableName === "string" && this.config.joins.some((join10) => join10.alias === tableName)) throw new Error(`Alias "${tableName}" is already used in this query`); if (typeof on === "function") { @@ -92918,7 +93219,7 @@ var init_update = __esm(() => { return this; } returning(fields = this.config.table[SQLiteTable.Symbol.Columns]) { - this.config.returning = orderSelectedFields2(fields); + this.config.returning = orderSelectedFields(fields); return this; } getSQL() { @@ -93115,8 +93416,8 @@ var init_db = __esm(() => { return new SQLiteRaw(async () => this.session.values(sequel), () => sequel, "values", this.dialect, this.session.extractRawValuesValueFromBatchResult.bind(this.session)); return this.session.values(sequel); } - transaction(transaction, config3) { - return this.session.transaction(transaction, config3); + transaction(transaction, config2) { + return this.session.transaction(transaction, config2); } }; }); @@ -93153,7 +93454,7 @@ var init_session = __esm(() => { init_query_promise(); init_cache(); init_errors5(); - ExecuteResultSync = class extends QueryPromise2 { + ExecuteResultSync = class extends QueryPromise { static [entityKind] = "ExecuteResultSync"; constructor(resultCb) { super(); @@ -93189,26 +93490,26 @@ var init_session = __esm(() => { try { return await query(); } catch (e) { - throw new DrizzleQueryError2(queryString, params, e); + throw new DrizzleQueryError(queryString, params, e); } if (this.cacheConfig && !this.cacheConfig.enabled) try { return await query(); } catch (e) { - throw new DrizzleQueryError2(queryString, params, e); + throw new DrizzleQueryError(queryString, params, e); } if ((this.queryMetadata.type === "insert" || this.queryMetadata.type === "update" || this.queryMetadata.type === "delete") && this.queryMetadata.tables.length > 0) try { const [res] = await Promise.all([query(), this.cache.onMutate({ tables: this.queryMetadata.tables })]); return res; } catch (e) { - throw new DrizzleQueryError2(queryString, params, e); + throw new DrizzleQueryError(queryString, params, e); } if (!this.cacheConfig) try { return await query(); } catch (e) { - throw new DrizzleQueryError2(queryString, params, e); + throw new DrizzleQueryError(queryString, params, e); } if (this.queryMetadata.type === "select") { const fromCache = await this.cache.get(this.cacheConfig.tag ?? await hashQuery(queryString, params), this.queryMetadata.tables, this.cacheConfig.tag !== undefined, this.cacheConfig.autoInvalidate); @@ -93217,7 +93518,7 @@ var init_session = __esm(() => { try { result6 = await query(); } catch (e) { - throw new DrizzleQueryError2(queryString, params, e); + throw new DrizzleQueryError(queryString, params, e); } await this.cache.put(this.cacheConfig.tag ?? await hashQuery(queryString, params), result6, this.cacheConfig.autoInvalidate ? this.queryMetadata.tables : [], this.cacheConfig.tag !== undefined, this.cacheConfig.config); return result6; @@ -93227,7 +93528,7 @@ var init_session = __esm(() => { try { return await query(); } catch (e) { - throw new DrizzleQueryError2(queryString, params, e); + throw new DrizzleQueryError(queryString, params, e); } } getQuery() { @@ -93274,7 +93575,7 @@ var init_session = __esm(() => { try { return this.prepareOneTimeQuery(staticQuery, undefined, "run", false).run(); } catch (err2) { - throw new DrizzleError2({ + throw new DrizzleError({ cause: err2, message: `Failed to run the query '${staticQuery.sql}'` }); @@ -93314,7 +93615,7 @@ var init_session = __esm(() => { this.nestedIndex = nestedIndex; } rollback() { - throw new TransactionRollbackError2; + throw new TransactionRollbackError; } }; }); @@ -93627,8 +93928,8 @@ var require_lib = __commonJS((exports, module2) => { const p = getPathPart(envPart, cmd); for (const ext2 of pathExt) { const withExt = p + ext2; - const is8 = await isexe(withExt, { pathExt: pathExtExe, ignoreErrors: true }); - if (is8) { + const is7 = await isexe(withExt, { pathExt: pathExtExe, ignoreErrors: true }); + if (is7) { if (!opt.all) { return withExt; } @@ -93651,8 +93952,8 @@ var require_lib = __commonJS((exports, module2) => { const p = getPathPart(pathEnvPart, cmd); for (const ext2 of pathExt) { const withExt = p + ext2; - const is8 = isexeSync(withExt, { pathExt: pathExtExe, ignoreErrors: true }); - if (is8) { + const is7 = isexeSync(withExt, { pathExt: pathExtExe, ignoreErrors: true }); + if (is7) { if (!opt.all) { return withExt; } @@ -93673,10 +93974,10 @@ var require_lib = __commonJS((exports, module2) => { }); // packages/unifia/src/util/which.ts -import path5 from "path"; +import path6 from "path"; function which(cmd, env3) { const base2 = env3?.PATH ?? env3?.Path ?? process.env.PATH ?? process.env.Path ?? ""; - const full = base2 ? base2 + path5.delimiter + Global.Path.bin : Global.Path.bin; + const full = base2 ? base2 + path6.delimiter + Global.Path.bin : Global.Path.bin; const result6 = import_which.default.sync(cmd, { nothrow: true, path: full, @@ -93969,7 +94270,7 @@ var init_process = __esm(() => { }); // node_modules/@effect/platform-node-shared/dist/internal/utils.js -var handleErrnoException = (module2, method) => (err2, [path6]) => { +var handleErrnoException = (module2, method) => (err2, [path7]) => { let reason2 = "Unknown"; switch (err2.code) { case "ENOENT": @@ -93998,7 +94299,7 @@ var handleErrnoException = (module2, method) => (err2, [path6]) => { _tag: reason2, module: module2, method, - pathOrDescriptor: path6, + pathOrDescriptor: path7, syscall: err2.syscall, cause: err2 }); @@ -94025,14 +94326,14 @@ var handleBadArgument = (method) => (err2) => badArgument({ }); }, makeTempDirectory, removeFactory = (method) => { const nodeRm = effectify(NFS.rm, handleErrnoException("FileSystem", method), handleBadArgument(method)); - return (path6, options2) => nodeRm(path6, { + return (path7, options2) => nodeRm(path7, { recursive: options2?.recursive ?? false, force: options2?.force ?? false }); }, remove17, makeTempDirectoryScoped, openFactory = (method) => { const nodeOpen = effectify(NFS.open, handleErrnoException("FileSystem", method), handleBadArgument(method)); const nodeClose = effectify(NFS.close, handleErrnoException("FileSystem", method), handleBadArgument(method)); - return (path6, options2) => pipe2(acquireRelease2(nodeOpen(path6, options2?.flag ?? "r", options2?.mode), (fd) => orDie3(nodeClose(fd))), map12((fd) => makeFile(FileDescriptor(fd), options2?.flag?.startsWith("a") ?? false))); + return (path7, options2) => pipe2(acquireRelease2(nodeOpen(path7, options2?.flag ?? "r", options2?.mode), (fd) => orDie3(nodeClose(fd))), map12((fd) => makeFile(FileDescriptor(fd), options2?.flag?.startsWith("a") ?? false))); }, open3, makeFile, makeTempFileFactory = (method) => { const makeDirectory2 = makeTempDirectoryFactory(method); return fnUntraced2(function* (options2) { @@ -94042,16 +94343,16 @@ var handleBadArgument = (method) => (err2) => badArgument({ yield* writeFile4(name3, new Uint8Array(0)); return name3; }); -}, makeTempFile, makeTempFileScoped, readDirectory = (path6, options2) => tryPromise2({ - try: () => NFS.promises.readdir(path6, options2), - catch: (err2) => handleErrnoException("FileSystem", "readDirectory")(err2, [path6]) -}), readFile3 = (path6) => callback2((resume, signal) => { +}, makeTempFile, makeTempFileScoped, readDirectory = (path7, options2) => tryPromise2({ + try: () => NFS.promises.readdir(path7, options2), + catch: (err2) => handleErrnoException("FileSystem", "readDirectory")(err2, [path7]) +}), readFile3 = (path7) => callback2((resume, signal) => { try { - NFS.readFile(path6, { + NFS.readFile(path7, { signal }, (err2, data2) => { if (err2) { - resume(fail8(handleErrnoException("FileSystem", "readFile")(err2, [path6]))); + resume(fail8(handleErrnoException("FileSystem", "readFile")(err2, [path7]))); } else { resume(succeed8(data2)); } @@ -94074,22 +94375,22 @@ var handleBadArgument = (method) => (err2) => badArgument({ size: Size(stat2.size), blksize: stat2.blksize !== undefined ? some3(Size(stat2.blksize)) : none2(), blocks: fromNullishOr(stat2.blocks) -}), stat2, symlink2, truncate3, utimes2, watchNode = (path6) => callback4((queue) => acquireRelease2(sync4(() => { - const watcher = NFS.watch(path6, { +}), stat2, symlink2, truncate3, utimes2, watchNode = (path7) => callback4((queue) => acquireRelease2(sync4(() => { + const watcher = NFS.watch(path7, { recursive: true - }, (event, path7) => { - if (!path7) + }, (event, path8) => { + if (!path8) return; switch (event) { case "rename": { - runFork2(matchEffect3(stat2(path7), { + runFork2(matchEffect3(stat2(path8), { onSuccess: (_2) => offer(queue, { _tag: "Create", - path: path7 + path: path8 }), onFailure: (_2) => offer(queue, { _tag: "Remove", - path: path7 + path: path8 }) })); return; @@ -94097,7 +94398,7 @@ var handleBadArgument = (method) => (err2) => badArgument({ case "change": { offerUnsafe(queue, { _tag: "Update", - path: path7 + path: path8 }); return; } @@ -94108,7 +94409,7 @@ var handleBadArgument = (method) => (err2) => badArgument({ module: "FileSystem", _tag: "Unknown", method: "watch", - pathOrDescriptor: path6, + pathOrDescriptor: path7, cause: error46 }))); }); @@ -94116,15 +94417,15 @@ var handleBadArgument = (method) => (err2) => badArgument({ endUnsafe(queue); }); return watcher; -}), (watcher) => sync4(() => watcher.close()))), watch2 = (backend, path6) => stat2(path6).pipe(map12((stat3) => backend.pipe(flatMap((_2) => _2.register(path6, stat3)), getOrElse(() => watchNode(path6)))), unwrap4), writeFile4 = (path6, data2, options2) => callback2((resume, signal) => { +}), (watcher) => sync4(() => watcher.close()))), watch2 = (backend, path7) => stat2(path7).pipe(map12((stat3) => backend.pipe(flatMap((_2) => _2.register(path7, stat3)), getOrElse(() => watchNode(path7)))), unwrap4), writeFile4 = (path7, data2, options2) => callback2((resume, signal) => { try { - NFS.writeFile(path6, data2, { + NFS.writeFile(path7, data2, { signal, flag: options2?.flag, mode: options2?.mode }, (err2) => { if (err2) { - resume(fail8(handleErrnoException("FileSystem", "writeFile")(err2, [path6]))); + resume(fail8(handleErrnoException("FileSystem", "writeFile")(err2, [path7]))); } else { resume(void_5); } @@ -94147,7 +94448,7 @@ var init_NodeFileSystem = __esm(() => { init_utils4(); access2 = /* @__PURE__ */ (() => { const nodeAccess = /* @__PURE__ */ effectify(NFS.access, /* @__PURE__ */ handleErrnoException("FileSystem", "access"), /* @__PURE__ */ handleBadArgument("access")); - return (path6, options2) => { + return (path7, options2) => { let mode = NFS.constants.F_OK; if (options2?.readable) { mode |= NFS.constants.R_OK; @@ -94155,7 +94456,7 @@ var init_NodeFileSystem = __esm(() => { if (options2?.writable) { mode |= NFS.constants.W_OK; } - return nodeAccess(path6, mode); + return nodeAccess(path7, mode); }; })(); copy3 = /* @__PURE__ */ (() => { @@ -94172,11 +94473,11 @@ var init_NodeFileSystem = __esm(() => { })(); chmod3 = /* @__PURE__ */ (() => { const nodeChmod = /* @__PURE__ */ effectify(NFS.chmod, /* @__PURE__ */ handleErrnoException("FileSystem", "chmod"), /* @__PURE__ */ handleBadArgument("chmod")); - return (path6, mode) => nodeChmod(path6, mode); + return (path7, mode) => nodeChmod(path7, mode); })(); chown2 = /* @__PURE__ */ (() => { const nodeChown = /* @__PURE__ */ effectify(NFS.chown, /* @__PURE__ */ handleErrnoException("FileSystem", "chown"), /* @__PURE__ */ handleBadArgument("chown")); - return (path6, uid, gid) => nodeChown(path6, uid, gid); + return (path7, uid, gid) => nodeChown(path7, uid, gid); })(); link3 = /* @__PURE__ */ (() => { const nodeLink = /* @__PURE__ */ effectify(NFS.link, /* @__PURE__ */ handleErrnoException("FileSystem", "link"), /* @__PURE__ */ handleBadArgument("link")); @@ -94184,7 +94485,7 @@ var init_NodeFileSystem = __esm(() => { })(); makeDirectory = /* @__PURE__ */ (() => { const nodeMkdir = /* @__PURE__ */ effectify(NFS.mkdir, /* @__PURE__ */ handleErrnoException("FileSystem", "makeDirectory"), /* @__PURE__ */ handleBadArgument("makeDirectory")); - return (path6, options2) => nodeMkdir(path6, { + return (path7, options2) => nodeMkdir(path7, { recursive: options2?.recursive ?? false, mode: options2?.mode }); @@ -94330,11 +94631,11 @@ var init_NodeFileSystem = __esm(() => { })(); readLink = /* @__PURE__ */ (() => { const nodeReadLink = /* @__PURE__ */ effectify(NFS.readlink, /* @__PURE__ */ handleErrnoException("FileSystem", "readLink"), /* @__PURE__ */ handleBadArgument("readLink")); - return (path6) => nodeReadLink(path6); + return (path7) => nodeReadLink(path7); })(); realPath = /* @__PURE__ */ (() => { const nodeRealPath = /* @__PURE__ */ effectify(NFS.realpath, /* @__PURE__ */ handleErrnoException("FileSystem", "realPath"), /* @__PURE__ */ handleBadArgument("realPath")); - return (path6) => nodeRealPath(path6); + return (path7) => nodeRealPath(path7); })(); rename2 = /* @__PURE__ */ (() => { const nodeRename = /* @__PURE__ */ effectify(NFS.rename, /* @__PURE__ */ handleErrnoException("FileSystem", "rename"), /* @__PURE__ */ handleBadArgument("rename")); @@ -94342,19 +94643,19 @@ var init_NodeFileSystem = __esm(() => { })(); stat2 = /* @__PURE__ */ (() => { const nodeStat = /* @__PURE__ */ effectify(NFS.stat, /* @__PURE__ */ handleErrnoException("FileSystem", "stat"), /* @__PURE__ */ handleBadArgument("stat")); - return (path6) => map12(nodeStat(path6), makeFileInfo); + return (path7) => map12(nodeStat(path7), makeFileInfo); })(); symlink2 = /* @__PURE__ */ (() => { const nodeSymlink = /* @__PURE__ */ effectify(NFS.symlink, /* @__PURE__ */ handleErrnoException("FileSystem", "symlink"), /* @__PURE__ */ handleBadArgument("symlink")); - return (target, path6) => nodeSymlink(target, path6); + return (target, path7) => nodeSymlink(target, path7); })(); truncate3 = /* @__PURE__ */ (() => { const nodeTruncate = /* @__PURE__ */ effectify(NFS.truncate, /* @__PURE__ */ handleErrnoException("FileSystem", "truncate"), /* @__PURE__ */ handleBadArgument("truncate")); - return (path6, length3) => nodeTruncate(path6, length3 !== undefined ? Number(length3) : undefined); + return (path7, length3) => nodeTruncate(path7, length3 !== undefined ? Number(length3) : undefined); })(); utimes2 = /* @__PURE__ */ (() => { const nodeUtimes = /* @__PURE__ */ effectify(NFS.utimes, /* @__PURE__ */ handleErrnoException("FileSystem", "utime"), /* @__PURE__ */ handleBadArgument("utime")); - return (path6, atime, mtime) => nodeUtimes(path6, atime, mtime); + return (path7, atime, mtime) => nodeUtimes(path7, atime, mtime); })(); makeFileSystem = /* @__PURE__ */ map12(/* @__PURE__ */ serviceOption2(WatchBackend), (backend) => make43({ access: access2, @@ -94379,8 +94680,8 @@ var init_NodeFileSystem = __esm(() => { symlink: symlink2, truncate: truncate3, utimes: utimes2, - watch(path6) { - return watch2(backend, path6); + watch(path7) { + return watch2(backend, path7); }, writeFile: writeFile4 })); @@ -94408,8 +94709,8 @@ var fromFileUrl2 = (url3) => try_4({ method: "fromFileUrl", cause }) -}), toFileUrl2 = (path6) => try_4({ - try: () => NodeUrl.pathToFileURL(path6), +}), toFileUrl2 = (path7) => try_4({ + try: () => NodeUrl.pathToFileURL(path7), catch: (cause) => new BadArgument({ module: "Path", method: "toFileUrl", @@ -94812,15 +95113,15 @@ var init_filesystem2 = __esm(() => { AppFileSystem.Service = Service3; AppFileSystem.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const fs6 = yield* exports_FileSystem.FileSystem; - const existsSafe = exports_Effect.fn("FileSystem.existsSafe")(function* (path6) { - return yield* fs6.exists(path6).pipe(exports_Effect.orElseSucceed(() => false)); + const existsSafe = exports_Effect.fn("FileSystem.existsSafe")(function* (path7) { + return yield* fs6.exists(path7).pipe(exports_Effect.orElseSucceed(() => false)); }); - const isDir = exports_Effect.fn("FileSystem.isDir")(function* (path6) { - const info3 = yield* fs6.stat(path6).pipe(exports_Effect.catch(() => exports_Effect.void)); + const isDir = exports_Effect.fn("FileSystem.isDir")(function* (path7) { + const info3 = yield* fs6.stat(path7).pipe(exports_Effect.catch(() => exports_Effect.void)); return info3?.type === "Directory"; }); - const isFile2 = exports_Effect.fn("FileSystem.isFile")(function* (path6) { - const info3 = yield* fs6.stat(path6).pipe(exports_Effect.catch(() => exports_Effect.void)); + const isFile2 = exports_Effect.fn("FileSystem.isFile")(function* (path7) { + const info3 = yield* fs6.stat(path7).pipe(exports_Effect.catch(() => exports_Effect.void)); return info3?.type === "File"; }); const readDirectoryEntries = exports_Effect.fn("FileSystem.readDirectoryEntries")(function* (dirPath) { @@ -94848,27 +95149,27 @@ var init_filesystem2 = __esm(() => { catch: (cause) => new FileSystemError({ method: "readDirectoryEntries", cause }) }); }); - const readJson = exports_Effect.fn("FileSystem.readJson")(function* (path6) { - const text4 = yield* fs6.readFileString(path6); + const readJson = exports_Effect.fn("FileSystem.readJson")(function* (path7) { + const text4 = yield* fs6.readFileString(path7); return JSON.parse(text4); }); - const writeJson = exports_Effect.fn("FileSystem.writeJson")(function* (path6, data2, mode) { + const writeJson = exports_Effect.fn("FileSystem.writeJson")(function* (path7, data2, mode) { const content = JSON.stringify(data2, null, 2); - yield* fs6.writeFileString(path6, content); + yield* fs6.writeFileString(path7, content); if (mode) - yield* fs6.chmod(path6, mode); + yield* fs6.chmod(path7, mode); }); - const ensureDir = exports_Effect.fn("FileSystem.ensureDir")(function* (path6) { - yield* fs6.makeDirectory(path6, { recursive: true }); + const ensureDir = exports_Effect.fn("FileSystem.ensureDir")(function* (path7) { + yield* fs6.makeDirectory(path7, { recursive: true }); }); - const writeWithDirs = exports_Effect.fn("FileSystem.writeWithDirs")(function* (path6, content, mode) { - const write2 = typeof content === "string" ? fs6.writeFileString(path6, content) : fs6.writeFile(path6, content); + const writeWithDirs = exports_Effect.fn("FileSystem.writeWithDirs")(function* (path7, content, mode) { + const write2 = typeof content === "string" ? fs6.writeFileString(path7, content) : fs6.writeFile(path7, content); yield* write2.pipe(exports_Effect.catchIf((e) => e.reason._tag === "NotFound", () => exports_Effect.gen(function* () { - yield* fs6.makeDirectory(dirname5(path6), { recursive: true }); + yield* fs6.makeDirectory(dirname5(path7), { recursive: true }); yield* write2; }))); if (mode) - yield* fs6.chmod(path6, mode); + yield* fs6.chmod(path7, mode); }); const glob = exports_Effect.fn("FileSystem.glob")(function* (pattern, options2) { return yield* exports_Effect.tryPromise({ @@ -95005,7 +95306,7 @@ var require_windows = __commonJS((exports, module2) => { module2.exports = isexe; isexe.sync = sync8; var fs6 = __require("fs"); - function checkPathExt(path6, options2) { + function checkPathExt(path7, options2) { var pathext = options2.pathExt !== undefined ? options2.pathExt : process.env.PATHEXT; if (!pathext) { return true; @@ -95016,25 +95317,25 @@ var require_windows = __commonJS((exports, module2) => { } for (var i2 = 0;i2 < pathext.length; i2++) { var p = pathext[i2].toLowerCase(); - if (p && path6.substr(-p.length).toLowerCase() === p) { + if (p && path7.substr(-p.length).toLowerCase() === p) { return true; } } return false; } - function checkStat(stat3, path6, options2) { + function checkStat(stat3, path7, options2) { if (!stat3.isSymbolicLink() && !stat3.isFile()) { return false; } - return checkPathExt(path6, options2); + return checkPathExt(path7, options2); } - function isexe(path6, options2, cb) { - fs6.stat(path6, function(er, stat3) { - cb(er, er ? false : checkStat(stat3, path6, options2)); + function isexe(path7, options2, cb) { + fs6.stat(path7, function(er, stat3) { + cb(er, er ? false : checkStat(stat3, path7, options2)); }); } - function sync8(path6, options2) { - return checkStat(fs6.statSync(path6), path6, options2); + function sync8(path7, options2) { + return checkStat(fs6.statSync(path7), path7, options2); } }); @@ -95043,13 +95344,13 @@ var require_mode = __commonJS((exports, module2) => { module2.exports = isexe; isexe.sync = sync8; var fs6 = __require("fs"); - function isexe(path6, options2, cb) { - fs6.stat(path6, function(er, stat3) { + function isexe(path7, options2, cb) { + fs6.stat(path7, function(er, stat3) { cb(er, er ? false : checkStat(stat3, options2)); }); } - function sync8(path6, options2) { - return checkStat(fs6.statSync(path6), options2); + function sync8(path7, options2) { + return checkStat(fs6.statSync(path7), options2); } function checkStat(stat3, options2) { return stat3.isFile() && checkMode(stat3, options2); @@ -95080,7 +95381,7 @@ var require_isexe = __commonJS((exports, module2) => { } module2.exports = isexe; isexe.sync = sync8; - function isexe(path6, options2, cb) { + function isexe(path7, options2, cb) { if (typeof options2 === "function") { cb = options2; options2 = {}; @@ -95090,28 +95391,28 @@ var require_isexe = __commonJS((exports, module2) => { throw new TypeError("callback not provided"); } return new Promise(function(resolve9, reject) { - isexe(path6, options2 || {}, function(er, is8) { + isexe(path7, options2 || {}, function(er, is7) { if (er) { reject(er); } else { - resolve9(is8); + resolve9(is7); } }); }); } - core2(path6, options2 || {}, function(er, is8) { + core2(path7, options2 || {}, function(er, is7) { if (er) { if (er.code === "EACCES" || options2 && options2.ignoreErrors) { er = null; - is8 = false; + is7 = false; } } - cb(er, is8); + cb(er, is7); }); } - function sync8(path6, options2) { + function sync8(path7, options2) { try { - return core2.sync(path6, options2 || {}); + return core2.sync(path7, options2 || {}); } catch (er) { if (options2 && options2.ignoreErrors || er.code === "EACCES") { return false; @@ -95125,7 +95426,7 @@ var require_isexe = __commonJS((exports, module2) => { // node_modules/cross-spawn/node_modules/which/which.js var require_which = __commonJS((exports, module2) => { var isWindows = process.platform === "win32" || process.env.OSTYPE === "cygwin" || process.env.OSTYPE === "msys"; - var path6 = __require("path"); + var path7 = __require("path"); var COLON = isWindows ? ";" : ":"; var isexe = require_isexe(); var getNotFoundError = (cmd) => Object.assign(new Error(`not found: ${cmd}`), { code: "ENOENT" }); @@ -95161,7 +95462,7 @@ var require_which = __commonJS((exports, module2) => { return opt.all && found.length ? resolve9(found) : reject(getNotFoundError(cmd)); const ppRaw = pathEnv[i2]; const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw; - const pCmd = path6.join(pathPart, cmd); + const pCmd = path7.join(pathPart, cmd); const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd : pCmd; resolve9(subStep(p, i2, 0)); }); @@ -95169,8 +95470,8 @@ var require_which = __commonJS((exports, module2) => { if (ii2 === pathExt.length) return resolve9(step(i2 + 1)); const ext2 = pathExt[ii2]; - isexe(p + ext2, { pathExt: pathExtExe }, (er, is8) => { - if (!er && is8) { + isexe(p + ext2, { pathExt: pathExtExe }, (er, is7) => { + if (!er && is7) { if (opt.all) found.push(p + ext2); else @@ -95188,13 +95489,13 @@ var require_which = __commonJS((exports, module2) => { for (let i2 = 0;i2 < pathEnv.length; i2++) { const ppRaw = pathEnv[i2]; const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw; - const pCmd = path6.join(pathPart, cmd); + const pCmd = path7.join(pathPart, cmd); const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd : pCmd; for (let j2 = 0;j2 < pathExt.length; j2++) { const cur = p + pathExt[j2]; try { - const is8 = isexe.sync(cur, { pathExt: pathExtExe }); - if (is8) { + const is7 = isexe.sync(cur, { pathExt: pathExtExe }); + if (is7) { if (opt.all) found.push(cur); else @@ -95229,7 +95530,7 @@ var require_path_key = __commonJS((exports, module2) => { // node_modules/cross-spawn/lib/util/resolveCommand.js var require_resolveCommand = __commonJS((exports, module2) => { - var path6 = __require("path"); + var path7 = __require("path"); var which2 = require_which(); var getPathKey = require_path_key(); function resolveCommandAttempt(parsed, withoutPathExt) { @@ -95246,7 +95547,7 @@ var require_resolveCommand = __commonJS((exports, module2) => { try { resolved = which2.sync(parsed.command, { path: env3[getPathKey({ env: env3 })], - pathExt: withoutPathExt ? path6.delimiter : undefined + pathExt: withoutPathExt ? path7.delimiter : undefined }); } catch (e) {} finally { if (shouldSwitchCwd) { @@ -95254,7 +95555,7 @@ var require_resolveCommand = __commonJS((exports, module2) => { } } if (resolved) { - resolved = path6.resolve(hasCustomCwd ? parsed.options.cwd : "", resolved); + resolved = path7.resolve(hasCustomCwd ? parsed.options.cwd : "", resolved); } return resolved; } @@ -95299,8 +95600,8 @@ var require_shebang_command = __commonJS((exports, module2) => { if (!match17) { return null; } - const [path6, argument] = match17[0].replace(/#! ?/, "").split(" "); - const binary2 = path6.split("/").pop(); + const [path7, argument] = match17[0].replace(/#! ?/, "").split(" "); + const binary2 = path7.split("/").pop(); if (binary2 === "env") { return argument; } @@ -95328,7 +95629,7 @@ var require_readShebang = __commonJS((exports, module2) => { // node_modules/cross-spawn/lib/parse.js var require_parse = __commonJS((exports, module2) => { - var path6 = __require("path"); + var path7 = __require("path"); var resolveCommand = require_resolveCommand(); var escape4 = require_escape(); var readShebang = require_readShebang(); @@ -95353,7 +95654,7 @@ var require_parse = __commonJS((exports, module2) => { const needsShell = !isExecutableRegExp.test(commandFile); if (parsed.options.forceShell || needsShell) { const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile); - parsed.command = path6.normalize(parsed.command); + parsed.command = path7.normalize(parsed.command); parsed.command = escape4.command(parsed.command); parsed.args = parsed.args.map((arg) => escape4.argument(arg, needsDoubleEscapeMetaChars)); const shellCommand = [parsed.command].concat(parsed.args).join(" "); @@ -95530,12 +95831,12 @@ var init_cross_spawn_spawner = __esm(() => { import_cross_spawn = __toESM(require_cross_spawn(), 1); make79 = gen4(function* () { const fs6 = yield* FileSystem; - const path6 = yield* Path; + const path7 = yield* Path; const cwd = fnUntraced2(function* (opts) { if (isUndefined(opts.cwd)) return; yield* fs6.access(opts.cwd); - return path6.resolve(opts.cwd); + return path7.resolve(opts.cwd); }); const env3 = (opts) => opts.extendEnv ? { ...globalThis.process.env, ...opts.env } : opts.env; const input = (x2) => isStream(x2) ? "pipe" : x2; @@ -95567,9 +95868,9 @@ var init_cross_spawn_spawner = __esm(() => { const fds = (opts) => { if (isUndefined(opts.additionalFds)) return []; - return Object.entries(opts.additionalFds).flatMap(([name3, config3]) => { + return Object.entries(opts.additionalFds).flatMap(([name3, config2]) => { const fd = parseFdName(name3); - return isUndefined(fd) ? [] : [{ fd, config: config3 }]; + return isUndefined(fd) ? [] : [{ fd, config: config2 }]; }).toSorted((a, b) => a.fd - b.fd); }; const stdios = (sin, sout, serr, extra) => { @@ -96233,12 +96534,12 @@ var init_state = __esm(async () => { const exists3 = entries10.get(init3); if (exists3) return exists3.state; - const state2 = init3(); + const state = init3(); entries10.set(init3, { - state: state2, + state, dispose: dispose2 }); - return state2; + return state; }; } State.create = create; @@ -96258,7 +96559,7 @@ var init_state = __esm(async () => { if (!entry.dispose) continue; const label = typeof init3 === "function" ? init3.name : String(init3); - const task = Promise.resolve(entry.state).then((state2) => entry.dispose(state2)).catch((error46) => { + const task = Promise.resolve(entry.state).then((state) => entry.dispose(state)).catch((error46) => { log4.error("Error while disposing state:", { error: error46, key, init: label }); }); tasks.push(task); @@ -96489,40 +96790,6 @@ var init_instance_state = __esm(async () => { })(InstanceState ||= {}); }); -// node_modules/drizzle-orm/logger.js -var ConsoleLogWriter2, DefaultLogger2, NoopLogger2; -var init_logger = __esm(() => { - init_entity(); - ConsoleLogWriter2 = class { - static [entityKind] = "ConsoleLogWriter"; - write(message) { - console.log(message); - } - }; - DefaultLogger2 = class { - static [entityKind] = "DefaultLogger"; - writer; - constructor(config3) { - this.writer = config3?.writer ?? new ConsoleLogWriter2; - } - logQuery(query, params) { - const stringifiedParams = params.map((p) => { - try { - return JSON.stringify(p); - } catch { - return String(p); - } - }); - const paramsStr = stringifiedParams.length ? ` -- params: [${stringifiedParams.join(", ")}]` : ""; - this.writer.write(`Query: ${query}${paramsStr}`); - } - }; - NoopLogger2 = class { - static [entityKind] = "NoopLogger"; - logQuery() {} - }; -}); - // node_modules/drizzle-orm/bun-sqlite/session.js var SQLiteBunSession, SQLiteBunTransaction, PreparedQuery; var init_session2 = __esm(() => { @@ -96540,7 +96807,7 @@ var init_session2 = __esm(() => { this.client = client; this.relations = relations; this.schema = schema2; - this.logger = options2.logger ?? new NoopLogger2; + this.logger = options2.logger ?? new NoopLogger; } exec(query) { this.client.exec(query); @@ -96551,12 +96818,12 @@ var init_session2 = __esm(() => { prepareRelationalQuery(query, fields, executeMethod, customResultMapper) { return new PreparedQuery(this.client.prepare(query.sql), query, this.logger, fields, executeMethod, false, customResultMapper, true); } - transaction(transaction, config3 = {}) { + transaction(transaction, config2 = {}) { const tx2 = new SQLiteBunTransaction("sync", this.dialect, this, this.relations, this.schema); let result6; this.client.transaction(() => { result6 = transaction(tx2); - })[config3.behavior ?? "deferred"](); + })[config2.behavior ?? "deferred"](); return result6; } }; @@ -96604,7 +96871,7 @@ var init_session2 = __esm(() => { const rows = this.values(placeholderValues); if (customResultMapper) return customResultMapper(rows); - return rows.map((row) => mapResultRow2(fields, row, joinsNotNullableMap)); + return rows.map((row) => mapResultRow(fields, row, joinsNotNullableMap)); } get(placeholderValues) { if (this.isRqbV2Query) @@ -96623,7 +96890,7 @@ var init_session2 = __esm(() => { return; if (customResultMapper) return customResultMapper([row]); - return mapResultRow2(fields, row, joinsNotNullableMap); + return mapResultRow(fields, row, joinsNotNullableMap); } allRqbV2(placeholderValues) { const { query, logger, stmt, customResultMapper } = this; @@ -96653,23 +96920,23 @@ var init_session2 = __esm(() => { // node_modules/drizzle-orm/bun-sqlite/driver.js import { Database as Database2 } from "bun:sqlite"; -function construct(client, config3 = {}) { - const dialect = new SQLiteSyncDialect({ casing: config3.casing }); +function construct(client, config2 = {}) { + const dialect = new SQLiteSyncDialect({ casing: config2.casing }); let logger; - if (config3.logger === true) - logger = new DefaultLogger2; - else if (config3.logger !== false) - logger = config3.logger; + if (config2.logger === true) + logger = new DefaultLogger; + else if (config2.logger !== false) + logger = config2.logger; let schema2; - if (config3.schema) { - const tablesConfig = extractTablesRelationalConfig(config3.schema, createTableRelationsHelpers); + if (config2.schema) { + const tablesConfig = extractTablesRelationalConfig(config2.schema, createTableRelationsHelpers); schema2 = { - fullSchema: config3.schema, + fullSchema: config2.schema, schema: tablesConfig.tables, tableNamesMap: tablesConfig.tableNamesMap }; } - const relations = config3.relations ?? {}; + const relations = config2.relations ?? {}; const db2 = new SQLiteBunDatabase("sync", dialect, new SQLiteBunSession(client, dialect, relations, schema2, { logger }), relations, schema2); db2.$client = client; return db2; @@ -96698,8 +96965,8 @@ var init_driver = __esm(() => { static [entityKind] = "SQLiteBunDatabase"; }; (function(_drizzle) { - function mock2(config3) { - return construct({}, config3); + function mock2(config2) { + return construct({}, config2); } _drizzle.mock = mock2; })(drizzle || (drizzle = {})); @@ -96712,8 +96979,8 @@ var init_bun_sqlite = __esm(() => { // packages/unifia/src/storage/db.bun.ts import { Database as Database3 } from "bun:sqlite"; -function init3(path6) { - const sqlite = new Database3(path6, { create: true }); +function init3(path7) { + const sqlite = new Database3(path7, { create: true }); const db2 = drizzle({ client: sqlite }); return db2; } @@ -96721,9 +96988,33 @@ var init_db_bun = __esm(() => { init_bun_sqlite(); }); +// packages/unifia/src/storage/db-file.ts +var DATABASE_FILE = "unifia.db", LEGACY_DATABASE_FILE = "opencode.db"; + // packages/unifia/src/storage/db.ts -import path6 from "path"; -import { readFileSync as readFileSync4, readdirSync as readdirSync4, existsSync as existsSync3 } from "fs"; +import path7 from "path"; +import { readFileSync as readFileSync4, readdirSync as readdirSync4, existsSync as existsSync3, copyFileSync } from "fs"; +function channelFileNames() { + if (["latest", "beta"].includes(CHANNEL) || Flag.UNIFIA_DISABLE_CHANNEL_DB) { + return { current: DATABASE_FILE, legacy: LEGACY_DATABASE_FILE }; + } + const safe = CHANNEL.replace(/[^a-zA-Z0-9._-]/g, "-"); + return { current: `unifia-${safe}.db`, legacy: `opencode-${safe}.db` }; +} +function migrateLegacyDatabaseFile(newPath, oldPath) { + if (existsSync3(newPath)) + return false; + if (!existsSync3(oldPath)) + return false; + log4.info("migrating legacy database file", { from: oldPath, to: newPath }); + for (const suffix of ["", "-wal", "-shm"]) { + const src = oldPath + suffix; + if (!existsSync3(src)) + continue; + copyFileSync(src, newPath + suffix); + } + return true; +} var NotFoundError, log4, Database; var init_db2 = __esm(async () => { init_migrator2(); @@ -96745,18 +97036,19 @@ var init_db2 = __esm(async () => { log4 = Log.create({ service: "db" }); ((Database) => { function getChannelPath() { - if (["latest", "beta"].includes(CHANNEL) || Flag.UNIFIA_DISABLE_CHANNEL_DB) - return path6.join(Global.Path.data, "opencode.db"); - const safe = CHANNEL.replace(/[^a-zA-Z0-9._-]/g, "-"); - return path6.join(Global.Path.data, `opencode-${safe}.db`); + const files = channelFileNames(); + const newPath = path7.join(Global.Path.data, files.current); + const oldPath = path7.join(Global.Path.data, files.legacy); + migrateLegacyDatabaseFile(newPath, oldPath); + return newPath; } Database.getChannelPath = getChannelPath; Database.Path = iife2(() => { const override = Flag.UNIFIA_DB; if (override) { - if (override === ":memory:" || path6.isAbsolute(override)) + if (override === ":memory:" || path7.isAbsolute(override)) return override; - return path6.join(Global.Path.data, override); + return path7.join(Global.Path.data, override); } return getChannelPath(); }); @@ -96769,7 +97061,7 @@ var init_db2 = __esm(async () => { function migrations(dir2) { const dirs = readdirSync4(dir2, { withFileTypes: true }).filter((entry) => entry.isDirectory()).map((entry) => entry.name); const sql2 = dirs.map((name3) => { - const file2 = path6.join(dir2, name3, "migration.sql"); + const file2 = path7.join(dir2, name3, "migration.sql"); if (!existsSync3(file2)) return; return { @@ -96790,7 +97082,7 @@ var init_db2 = __esm(async () => { db2.run("PRAGMA foreign_keys = ON"); db2.run("PRAGMA wal_checkpoint(PASSIVE)"); const bundledMigrations = globalThis.UNIFIA_MIGRATIONS ?? globalThis.OPENCODE_MIGRATIONS; - const entries10 = typeof UNIFIA_MIGRATIONS !== "undefined" ? UNIFIA_MIGRATIONS : bundledMigrations ? bundledMigrations : migrations(path6.join(import.meta.dirname, "../../migration")); + const entries10 = typeof UNIFIA_MIGRATIONS !== "undefined" ? UNIFIA_MIGRATIONS : bundledMigrations ? bundledMigrations : migrations(path7.join(import.meta.dirname, "../../migration")); if (entries10.length > 0) { log4.info("applying migrations", { count: entries10.length, @@ -97791,7 +98083,7 @@ var init_audit = __esm(async () => { }); // packages/unifia/src/auth/index.ts -import path7 from "path"; +import path8 from "path"; class KeychainStorage { static SERVICE = "auth"; @@ -97918,7 +98210,7 @@ async function writeEncryptedAuth(data2) { const iv = crypto3.randomBytes(12); const cipher = crypto3.createCipheriv("aes-256-gcm", key, iv); const ciphertext = Buffer.concat([cipher.update(JSON.stringify(data2), "utf8"), cipher.final()]); - await fs6.mkdir(path7.dirname(encryptedFile), { recursive: true }); + await fs6.mkdir(path8.dirname(encryptedFile), { recursive: true }); await fs6.writeFile(encryptedFile, JSON.stringify({ v: 1, iv: iv.toString("base64"), tag: cipher.getAuthTag().toString("base64"), ciphertext: ciphertext.toString("base64") }), { mode: 384 }); } async function maybeMigrateToEncryptedFile() { @@ -98024,9 +98316,9 @@ var init_auth = __esm(async () => { init_global() ]); AUTH_STORAGE_BACKEND = (Flag.UNIFIA_AUTH_STORAGE ?? (Flag.UNIFIA_CLIENT === "mobile-embedded" ? "encrypted-file" : "file")).toLowerCase(); - file2 = path7.join(Global.Path.data, "auth.json"); - migratedMarker = path7.join(Global.Path.data, "auth.json.migrated"); - encryptedFile = path7.join(Global.Path.data, "auth.enc.json"); + file2 = path8.join(Global.Path.data, "auth.json"); + migratedMarker = path8.join(Global.Path.data, "auth.json.migrated"); + encryptedFile = path8.join(Global.Path.data, "auth.enc.json"); ((Auth) => { class Oauth extends exports_Schema.Class("OAuth")({ @@ -98178,25 +98470,25 @@ var Env; var init_env = __esm(async () => { await init_instance(); ((Env) => { - const state2 = Instance.state(() => { + const state = Instance.state(() => { return { ...process.env }; }); function get32(key) { - const env3 = state2(); + const env3 = state(); return env3[key]; } Env.get = get32; function all7() { - return state2(); + return state(); } Env.all = all7; function set22(key, value8) { - const env3 = state2(); + const env3 = state(); env3[key] = value8; } Env.set = set22; function remove18(key) { - const env3 = state2(); + const env3 = state(); delete env3[key]; } Env.remove = remove18; @@ -99005,12 +99297,12 @@ function parseTree(text4, errors4 = [], options2 = ParseOptions.DEFAULT) { } return result6; } -function findNodeAtLocation(root, path8) { +function findNodeAtLocation(root, path9) { if (!root) { return; } let node = root; - for (let segment of path8) { + for (let segment of path9) { if (typeof segment === "string") { if (node.type !== "object" || !Array.isArray(node.children)) { return; @@ -99320,14 +99612,14 @@ var init_parser = __esm(() => { // node_modules/jsonc-parser/lib/esm/impl/edit.js function setProperty(text4, originalPath, value8, options2) { - const path8 = originalPath.slice(); + const path9 = originalPath.slice(); const errors4 = []; const root = parseTree(text4, errors4); let parent = undefined; let lastSegment = undefined; - while (path8.length > 0) { - lastSegment = path8.pop(); - parent = findNodeAtLocation(root, path8); + while (path9.length > 0) { + lastSegment = path9.pop(); + parent = findNodeAtLocation(root, path9); if (parent === undefined && value8 !== undefined) { if (typeof lastSegment === "string") { value8 = { [lastSegment]: value8 }; @@ -99504,8 +99796,8 @@ function printParseErrorCode(code) { } return ""; } -function modify17(text4, path8, value8, options2) { - return setProperty(text4, path8, value8, options2); +function modify17(text4, path9, value8, options2) { + return setProperty(text4, path9, value8, options2); } function applyEdits(text4, edits) { let sortedEdits = edits.slice(0).sort((a4, b2) => { @@ -100152,7 +100444,7 @@ var TypeId76 = "~effect/http/HttpBody", HttpBodyErrorTypeId = "~effect/http/Http } } return formData(data2); -}, Stream3, stream2 = (body3, contentType, contentLength) => new Stream3(body3, contentType ?? "application/octet-stream", contentLength), file3 = (path8, options2) => flatMap7(FileSystem.asEffect(), (fs6) => map12(fs6.stat(path8), (info3) => stream2(fs6.stream(path8, options2), options2?.contentType, Number(info3.size)))); +}, Stream3, stream2 = (body3, contentType, contentLength) => new Stream3(body3, contentType ?? "application/octet-stream", contentLength), file3 = (path9, options2) => flatMap7(FileSystem.asEffect(), (fs6) => map12(fs6.stat(path9), (info3) => stream2(fs6.stream(path9, options2), options2?.contentType, Number(info3.size)))); var init_HttpBody = __esm(() => { init_Data(); init_Effect(); @@ -100517,15 +100809,15 @@ var init_HttpClientRequest = __esm(() => { clone3.hash = ""; return makeWith4(self2.method, clone3.toString(), urlParams2, hash4, self2.headers, self2.body); }); - prependUrl = /* @__PURE__ */ dual(2, (self2, path8) => { - if (path8 === "") + prependUrl = /* @__PURE__ */ dual(2, (self2, path9) => { + if (path9 === "") return self2; - return makeWith4(self2.method, joinSegments(path8, self2.url), self2.urlParams, self2.hash, self2.headers, self2.body); + return makeWith4(self2.method, joinSegments(path9, self2.url), self2.urlParams, self2.hash, self2.headers, self2.body); }); - appendUrl = /* @__PURE__ */ dual(2, (self2, path8) => { - if (path8 === "") + appendUrl = /* @__PURE__ */ dual(2, (self2, path9) => { + if (path9 === "") return self2; - return makeWith4(self2.method, joinSegments(self2.url, path8), self2.urlParams, self2.hash, self2.headers, self2.body); + return makeWith4(self2.method, joinSegments(self2.url, path9), self2.urlParams, self2.hash, self2.headers, self2.body); }); updateUrl = /* @__PURE__ */ dual(2, (self2, f4) => makeWith4(self2.method, f4(self2.url), self2.urlParams, self2.hash, self2.headers, self2.body)); setUrlParam = /* @__PURE__ */ dual(3, (self2, key, value8) => makeWith4(self2.method, self2.url, set23(self2.urlParams, key, value8), self2.hash, self2.headers, self2.body)); @@ -100555,7 +100847,7 @@ var init_HttpClientRequest = __esm(() => { bodyFormData = /* @__PURE__ */ dual(2, (self2, body3) => setBody(self2, formData(body3))); bodyFormDataRecord = /* @__PURE__ */ dual(2, (self2, entries10) => setBody(self2, formDataRecord(entries10))); bodyStream = /* @__PURE__ */ dual((args3) => isHttpClientRequest(args3[0]), (self2, body3, options3) => setBody(self2, stream2(body3, options3?.contentType, options3?.contentLength))); - bodyFile = /* @__PURE__ */ dual((args3) => isHttpClientRequest(args3[0]), (self2, path8, options3) => map12(file3(path8, options3), (body3) => setBody(self2, body3))); + bodyFile = /* @__PURE__ */ dual((args3) => isHttpClientRequest(args3[0]), (self2, path9, options3) => map12(file3(path9, options3), (body3) => setBody(self2, body3))); }); // node_modules/effect/dist/unstable/http/HttpIncomingMessage.js @@ -100935,18 +101227,18 @@ var TypeId80 = "~effect/http/HttpClient", isHttpClient = (u6) => hasProperty(u6, } }))); }); -})), succeed8), mapRequest, mapRequestEffect, mapRequestInput, mapRequestInputEffect, retry5, retryTransient, withRateLimiter, parseRateLimiterState = (state2, clock, headers, tokens) => { - const limit = parseRateLimitLimit(state2, headers, tokens) ?? state2.limit; - const window3 = parseRateLimitWindow(clock, headers) ?? state2.window; - if (limit === state2.limit && equals3(window3, state2.window)) { - return state2; +})), succeed8), mapRequest, mapRequestEffect, mapRequestInput, mapRequestInputEffect, retry5, retryTransient, withRateLimiter, parseRateLimiterState = (state, clock, headers, tokens) => { + const limit = parseRateLimitLimit(state, headers, tokens) ?? state.limit; + const window3 = parseRateLimitWindow(clock, headers) ?? state.window; + if (limit === state.limit && equals3(window3, state.window)) { + return state; } return { limit, window: window3, initial: false }; -}, parseRateLimitLimit = (state2, headers, tokens) => { +}, parseRateLimitLimit = (state, headers, tokens) => { const raw3 = getHeader(headers, "ratelimit-limit", "x-ratelimit-limit"); const value8 = parseNumberHeader(raw3); if (value8 !== undefined && value8 > 0) { @@ -100956,7 +101248,7 @@ var TypeId80 = "~effect/http/HttpClient", isHttpClient = (u6) => hasProperty(u6, if (remaining2 === undefined) { return; } - return state2.initial ? remaining2 + tokens : Math.max(remaining2 + tokens, state2.limit); + return state.initial ? remaining2 + tokens : Math.max(remaining2 + tokens, state.limit); }, parseRateLimitRemaining = (headers) => { const raw3 = getHeader(headers, "ratelimit-remaining", "x-ratelimit-remaining"); const value8 = parseNumberHeader(raw3); @@ -103210,8 +103502,8 @@ var require_semver2 = __commonJS((exports, module2) => { }); // packages/unifia/src/installation/index.ts -import path8 from "path"; -var import_semver, FORK_REPO = "Rwanbt/opencode", Installation; +import path9 from "path"; +var import_semver, FORK_REPO = "Rwanbt/unifia", NPM_PACKAGE = "unifia-ai", INSTALL_SCRIPT_URL, Installation; var init_installation = __esm(async () => { init_dist3(); init_http(); @@ -103227,6 +103519,7 @@ var init_installation = __esm(async () => { init_log() ]); import_semver = __toESM(require_semver2(), 1); + INSTALL_SCRIPT_URL = `https://github.com/${FORK_REPO}/releases/latest/download/install`; ((Installation) => { const log7 = Log.create({ service: "installation" }); Installation.Event = { @@ -103274,14 +103567,6 @@ var init_installation = __esm(async () => { Installation.UpgradeFailedError = UpgradeFailedError; const GitHubRelease = exports_Schema.Struct({ tag_name: exports_Schema.String }); const NpmPackage = exports_Schema.Struct({ version: exports_Schema.String }); - const BrewFormula = exports_Schema.Struct({ versions: exports_Schema.Struct({ stable: exports_Schema.String }) }); - const BrewInfoV2 = exports_Schema.Struct({ - formulae: exports_Schema.Array(exports_Schema.Struct({ versions: exports_Schema.Struct({ stable: exports_Schema.String }) })) - }); - const ChocoPackage = exports_Schema.Struct({ - d: exports_Schema.Struct({ results: exports_Schema.Array(exports_Schema.Struct({ Version: exports_Schema.String })) }) - }); - const ScoopManifest = NpmPackage; class Service3 extends exports_ServiceMap.Service()("@opencode/Installation") { } @@ -103312,17 +103597,8 @@ var init_installation = __esm(async () => { const code = yield* handle2.exitCode; return { code, stdout, stderr }; }, exports_Effect.scoped, exports_Effect.catch(() => exports_Effect.succeed({ code: exports_ChildProcessSpawner.ExitCode(1), stdout: "", stderr: "" }))); - const getBrewFormula = exports_Effect.fnUntraced(function* () { - const tapFormula = yield* text5(["brew", "list", "--formula", "anomalyco/tap/opencode"]); - if (tapFormula.includes("unifia")) - return "anomalyco/tap/opencode"; - const coreFormula = yield* text5(["brew", "list", "--formula", "unifia"]); - if (coreFormula.includes("unifia")) - return "unifia"; - return "unifia"; - }); const upgradeCurl = exports_Effect.fnUntraced(function* (target) { - const response = yield* httpOk.execute(exports_HttpClientRequest.get("https://opencode.ai/install")); + const response = yield* httpOk.execute(exports_HttpClientRequest.get(INSTALL_SCRIPT_URL)); const body3 = yield* response.text; const bodyBytes = new TextEncoder().encode(body3); const proc = exports_ChildProcess.make("bash", [], { @@ -103336,19 +103612,18 @@ var init_installation = __esm(async () => { return { code, stdout, stderr }; }, exports_Effect.scoped, exports_Effect.orDie); const methodImpl = exports_Effect.fn("Installation.method")(function* () { - if (process.execPath.includes(path8.join(".opencode", "bin"))) + if (process.execPath.includes(path9.join(".unifia", "bin"))) + return "curl"; + if (process.execPath.includes(path9.join(".opencode", "bin"))) return "curl"; - if (process.execPath.includes(path8.join(".local", "bin"))) + if (process.execPath.includes(path9.join(".local", "bin"))) return "curl"; const exec3 = process.execPath.toLowerCase(); const checks3 = [ { name: "npm", command: () => text5(["npm", "list", "-g", "--depth=0"]) }, { name: "yarn", command: () => text5(["yarn", "global", "list"]) }, { name: "pnpm", command: () => text5(["pnpm", "list", "-g", "--depth=0"]) }, - { name: "bun", command: () => text5(["bun", "pm", "ls", "-g"]) }, - { name: "brew", command: () => text5(["brew", "list", "--formula", "unifia"]) }, - { name: "scoop", command: () => text5(["scoop", "list", "unifia"]) }, - { name: "choco", command: () => text5(["choco", "list", "--limit-output", "unifia"]) } + { name: "bun", command: () => text5(["bun", "pm", "ls", "-g"]) } ]; checks3.sort((a4, b2) => { const aMatches = exec3.includes(a4.name); @@ -103361,8 +103636,7 @@ var init_installation = __esm(async () => { }); for (const check6 of checks3) { const output = yield* check6.command(); - const installedName = check6.name === "brew" || check6.name === "choco" || check6.name === "scoop" ? "unifia" : "unifia-ai"; - if (output.includes(installedName)) { + if (output.includes(NPM_PACKAGE)) { return check6.name; } } @@ -103370,36 +103644,15 @@ var init_installation = __esm(async () => { }); const latestImpl = exports_Effect.fn("Installation.latest")(function* (installMethod) { const detectedMethod = installMethod || (yield* methodImpl()); - if (detectedMethod === "brew") { - const formula = yield* getBrewFormula(); - if (formula.includes("/")) { - const infoJson = yield* text5(["brew", "info", "--json=v2", formula]); - const info3 = yield* exports_Schema.decodeUnknownEffect(exports_Schema.fromJsonString(BrewInfoV2))(infoJson); - return info3.formulae[0].versions.stable; - } - const response2 = yield* httpOk.execute(exports_HttpClientRequest.get("https://formulae.brew.sh/api/formula/opencode.json").pipe(exports_HttpClientRequest.acceptJson)); - const data3 = yield* exports_HttpClientResponse.schemaBodyJson(BrewFormula)(response2); - return data3.versions.stable; - } if (detectedMethod === "npm" || detectedMethod === "bun" || detectedMethod === "pnpm") { const r4 = (yield* text5(["npm", "config", "get", "registry"])).trim(); const reg = r4 || "https://registry.npmjs.org"; const registry2 = reg.endsWith("/") ? reg.slice(0, -1) : reg; const channel = Installation.CHANNEL; - const response2 = yield* httpOk.execute(exports_HttpClientRequest.get(`${registry2}/opencode-ai/${channel}`).pipe(exports_HttpClientRequest.acceptJson)); + const response2 = yield* httpOk.execute(exports_HttpClientRequest.get(`${registry2}/${NPM_PACKAGE}/${channel}`).pipe(exports_HttpClientRequest.acceptJson)); const data3 = yield* exports_HttpClientResponse.schemaBodyJson(NpmPackage)(response2); return data3.version; } - if (detectedMethod === "choco") { - const response2 = yield* httpOk.execute(exports_HttpClientRequest.get("https://community.chocolatey.org/api/v2/Packages?$filter=Id%20eq%20%27opencode%27%20and%20IsLatestVersion&$select=Version").pipe(exports_HttpClientRequest.setHeaders({ Accept: "application/json;odata=verbose" }))); - const data3 = yield* exports_HttpClientResponse.schemaBodyJson(ChocoPackage)(response2); - return data3.d.results[0].Version; - } - if (detectedMethod === "scoop") { - const response2 = yield* httpOk.execute(exports_HttpClientRequest.get("https://raw.githubusercontent.com/ScoopInstaller/Main/master/bucket/opencode.json").pipe(exports_HttpClientRequest.setHeaders({ Accept: "application/json" }))); - const data3 = yield* exports_HttpClientResponse.schemaBodyJson(ScoopManifest)(response2); - return data3.version; - } const response = yield* httpOk.execute(exports_HttpClientRequest.get(`https://api.github.com/repos/${FORK_REPO}/releases/latest`).pipe(exports_HttpClientRequest.acceptJson)); const data2 = yield* exports_HttpClientResponse.schemaBodyJson(GitHubRelease)(response); return data2.tag_name.replace(/^v/, "").replace(/-fork.*$/, ""); @@ -103411,48 +103664,19 @@ var init_installation = __esm(async () => { result6 = yield* upgradeCurl(target); break; case "npm": - result6 = yield* run7(["npm", "install", "-g", `unifia-ai@${target}`]); + result6 = yield* run7(["npm", "install", "-g", `${NPM_PACKAGE}@${target}`]); break; case "pnpm": - result6 = yield* run7(["pnpm", "install", "-g", `unifia-ai@${target}`]); + result6 = yield* run7(["pnpm", "install", "-g", `${NPM_PACKAGE}@${target}`]); break; case "bun": - result6 = yield* run7(["bun", "install", "-g", `unifia-ai@${target}`]); - break; - case "brew": { - const formula = yield* getBrewFormula(); - const env3 = { HOMEBREW_NO_AUTO_UPDATE: "1" }; - if (formula.includes("/")) { - const tap9 = yield* run7(["brew", "tap", "anomalyco/tap"], { env: env3 }); - if (tap9.code !== 0) { - result6 = tap9; - break; - } - const repo = yield* text5(["brew", "--repo", "anomalyco/tap"]); - const dir2 = repo.trim(); - if (dir2) { - const pull = yield* run7(["git", "pull", "--ff-only"], { cwd: dir2, env: env3 }); - if (pull.code !== 0) { - result6 = pull; - break; - } - } - } - result6 = yield* run7(["brew", "upgrade", formula], { env: env3 }); - break; - } - case "choco": - result6 = yield* run7(["choco", "upgrade", "unifia", `--version=${target}`, "-y"]); - break; - case "scoop": - result6 = yield* run7(["scoop", "install", `unifia@${target}`]); + result6 = yield* run7(["bun", "install", "-g", `${NPM_PACKAGE}@${target}`]); break; default: return yield* new UpgradeFailedError({ stderr: `Unknown method: ${m3}` }); } if (!result6 || result6.code !== 0) { - const stderr = m3 === "choco" ? "not running from an elevated command shell" : result6?.stderr || ""; - return yield* new UpgradeFailedError({ stderr }); + return yield* new UpgradeFailedError({ stderr: result6?.stderr || "" }); } log7.info("upgraded", { method: m3, @@ -104967,87 +105191,87 @@ var require_loader = __commonJS((exports, module2) => { this.totalMergeKeys = 0; this.documents = []; } - function generateError(state2, message) { - return new YAMLException(message, new Mark(state2.filename, state2.input, state2.position, state2.line, state2.position - state2.lineStart)); + function generateError(state, message) { + return new YAMLException(message, new Mark(state.filename, state.input, state.position, state.line, state.position - state.lineStart)); } - function throwError(state2, message) { - throw generateError(state2, message); + function throwError(state, message) { + throw generateError(state, message); } - function throwWarning(state2, message) { - if (state2.onWarning) { - state2.onWarning.call(null, generateError(state2, message)); + function throwWarning(state, message) { + if (state.onWarning) { + state.onWarning.call(null, generateError(state, message)); } } var directiveHandlers = { - YAML: function handleYamlDirective(state2, name3, args3) { + YAML: function handleYamlDirective(state, name3, args3) { var match17, major, minor; - if (state2.version !== null) { - throwError(state2, "duplication of %YAML directive"); + if (state.version !== null) { + throwError(state, "duplication of %YAML directive"); } if (args3.length !== 1) { - throwError(state2, "YAML directive accepts exactly one argument"); + throwError(state, "YAML directive accepts exactly one argument"); } match17 = /^([0-9]+)\.([0-9]+)$/.exec(args3[0]); if (match17 === null) { - throwError(state2, "ill-formed argument of the YAML directive"); + throwError(state, "ill-formed argument of the YAML directive"); } major = parseInt(match17[1], 10); minor = parseInt(match17[2], 10); if (major !== 1) { - throwError(state2, "unacceptable YAML version of the document"); + throwError(state, "unacceptable YAML version of the document"); } - state2.version = args3[0]; - state2.checkLineBreaks = minor < 2; + state.version = args3[0]; + state.checkLineBreaks = minor < 2; if (minor !== 1 && minor !== 2) { - throwWarning(state2, "unsupported YAML version of the document"); + throwWarning(state, "unsupported YAML version of the document"); } }, - TAG: function handleTagDirective(state2, name3, args3) { + TAG: function handleTagDirective(state, name3, args3) { var handle2, prefix3; if (args3.length !== 2) { - throwError(state2, "TAG directive accepts exactly two arguments"); + throwError(state, "TAG directive accepts exactly two arguments"); } handle2 = args3[0]; prefix3 = args3[1]; if (!PATTERN_TAG_HANDLE.test(handle2)) { - throwError(state2, "ill-formed tag handle (first argument) of the TAG directive"); + throwError(state, "ill-formed tag handle (first argument) of the TAG directive"); } - if (_hasOwnProperty.call(state2.tagMap, handle2)) { - throwError(state2, 'there is a previously declared suffix for "' + handle2 + '" tag handle'); + if (_hasOwnProperty.call(state.tagMap, handle2)) { + throwError(state, 'there is a previously declared suffix for "' + handle2 + '" tag handle'); } if (!PATTERN_TAG_URI.test(prefix3)) { - throwError(state2, "ill-formed tag prefix (second argument) of the TAG directive"); + throwError(state, "ill-formed tag prefix (second argument) of the TAG directive"); } - state2.tagMap[handle2] = prefix3; + state.tagMap[handle2] = prefix3; } }; - function captureSegment(state2, start2, end4, checkJson) { + function captureSegment(state, start2, end4, checkJson) { var _position, _length2, _character, _result; if (start2 < end4) { - _result = state2.input.slice(start2, end4); + _result = state.input.slice(start2, end4); if (checkJson) { for (_position = 0, _length2 = _result.length;_position < _length2; _position += 1) { _character = _result.charCodeAt(_position); if (!(_character === 9 || 32 <= _character && _character <= 1114111)) { - throwError(state2, "expected valid JSON character"); + throwError(state, "expected valid JSON character"); } } } else if (PATTERN_NON_PRINTABLE.test(_result)) { - throwError(state2, "the stream contains non-printable characters"); + throwError(state, "the stream contains non-printable characters"); } - state2.result += _result; + state.result += _result; } } - function mergeMappings(state2, destination, source, overridableKeys) { + function mergeMappings(state, destination, source, overridableKeys) { var sourceKeys, key, index3, quantity; if (!common.isObject(source)) { - throwError(state2, "cannot merge mappings; the provided source object is unacceptable"); + throwError(state, "cannot merge mappings; the provided source object is unacceptable"); } sourceKeys = Object.keys(source); for (index3 = 0, quantity = sourceKeys.length;index3 < quantity; index3 += 1) { key = sourceKeys[index3]; - if (state2.maxTotalMergeKeys !== -1 && ++state2.totalMergeKeys > state2.maxTotalMergeKeys) { - throwError(state2, "merge keys exceeded maxTotalMergeKeys (" + state2.maxTotalMergeKeys + ")"); + if (state.maxTotalMergeKeys !== -1 && ++state.totalMergeKeys > state.maxTotalMergeKeys) { + throwError(state, "merge keys exceeded maxTotalMergeKeys (" + state.maxTotalMergeKeys + ")"); } if (!_hasOwnProperty.call(destination, key)) { setProperty2(destination, key, source[key]); @@ -105055,13 +105279,13 @@ var require_loader = __commonJS((exports, module2) => { } } } - function storeMappingPair(state2, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, startPos) { + function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, startPos) { var index3, quantity; if (Array.isArray(keyNode)) { keyNode = Array.prototype.slice.call(keyNode); for (index3 = 0, quantity = keyNode.length;index3 < quantity; index3 += 1) { if (Array.isArray(keyNode[index3])) { - throwError(state2, "nested arrays are not supported inside keys"); + throwError(state, "nested arrays are not supported inside keys"); } if (typeof keyNode === "object" && _class(keyNode[index3]) === "[object Object]") { keyNode[index3] = "[object Object]"; @@ -105078,242 +105302,242 @@ var require_loader = __commonJS((exports, module2) => { if (keyTag === "tag:yaml.org,2002:merge") { if (Array.isArray(valueNode)) { for (index3 = 0, quantity = valueNode.length;index3 < quantity; index3 += 1) { - mergeMappings(state2, _result, valueNode[index3], overridableKeys); + mergeMappings(state, _result, valueNode[index3], overridableKeys); } } else { - mergeMappings(state2, _result, valueNode, overridableKeys); + mergeMappings(state, _result, valueNode, overridableKeys); } } else { - if (!state2.json && !_hasOwnProperty.call(overridableKeys, keyNode) && _hasOwnProperty.call(_result, keyNode)) { - state2.line = startLine || state2.line; - state2.position = startPos || state2.position; - throwError(state2, "duplicated mapping key"); + if (!state.json && !_hasOwnProperty.call(overridableKeys, keyNode) && _hasOwnProperty.call(_result, keyNode)) { + state.line = startLine || state.line; + state.position = startPos || state.position; + throwError(state, "duplicated mapping key"); } setProperty2(_result, keyNode, valueNode); delete overridableKeys[keyNode]; } return _result; } - function readLineBreak(state2) { + function readLineBreak(state) { var ch; - ch = state2.input.charCodeAt(state2.position); + ch = state.input.charCodeAt(state.position); if (ch === 10) { - state2.position++; + state.position++; } else if (ch === 13) { - state2.position++; - if (state2.input.charCodeAt(state2.position) === 10) { - state2.position++; + state.position++; + if (state.input.charCodeAt(state.position) === 10) { + state.position++; } } else { - throwError(state2, "a line break is expected"); + throwError(state, "a line break is expected"); } - state2.line += 1; - state2.lineStart = state2.position; + state.line += 1; + state.lineStart = state.position; } - function skipSeparationSpace(state2, allowComments, checkIndent) { - var lineBreaks = 0, ch = state2.input.charCodeAt(state2.position); + function skipSeparationSpace(state, allowComments, checkIndent) { + var lineBreaks = 0, ch = state.input.charCodeAt(state.position); while (ch !== 0) { while (is_WHITE_SPACE(ch)) { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } if (allowComments && ch === 35) { do { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } while (ch !== 10 && ch !== 13 && ch !== 0); } if (is_EOL(ch)) { - readLineBreak(state2); - ch = state2.input.charCodeAt(state2.position); + readLineBreak(state); + ch = state.input.charCodeAt(state.position); lineBreaks++; - state2.lineIndent = 0; + state.lineIndent = 0; while (ch === 32) { - state2.lineIndent++; - ch = state2.input.charCodeAt(++state2.position); + state.lineIndent++; + ch = state.input.charCodeAt(++state.position); } } else { break; } } - if (checkIndent !== -1 && lineBreaks !== 0 && state2.lineIndent < checkIndent) { - throwWarning(state2, "deficient indentation"); + if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) { + throwWarning(state, "deficient indentation"); } return lineBreaks; } - function testDocumentSeparator(state2) { - var _position = state2.position, ch; - ch = state2.input.charCodeAt(_position); - if ((ch === 45 || ch === 46) && ch === state2.input.charCodeAt(_position + 1) && ch === state2.input.charCodeAt(_position + 2)) { + function testDocumentSeparator(state) { + var _position = state.position, ch; + ch = state.input.charCodeAt(_position); + if ((ch === 45 || ch === 46) && ch === state.input.charCodeAt(_position + 1) && ch === state.input.charCodeAt(_position + 2)) { _position += 3; - ch = state2.input.charCodeAt(_position); + ch = state.input.charCodeAt(_position); if (ch === 0 || is_WS_OR_EOL(ch)) { return true; } } return false; } - function writeFoldedLines(state2, count5) { + function writeFoldedLines(state, count5) { if (count5 === 1) { - state2.result += " "; + state.result += " "; } else if (count5 > 1) { - state2.result += common.repeat(` + state.result += common.repeat(` `, count5 - 1); } } - function readPlainScalar(state2, nodeIndent, withinFlowCollection) { - var preceding, following, captureStart, captureEnd, hasPendingContent, _line, _lineStart, _lineIndent, _kind = state2.kind, _result = state2.result, ch; - ch = state2.input.charCodeAt(state2.position); + function readPlainScalar(state, nodeIndent, withinFlowCollection) { + var preceding, following, captureStart, captureEnd, hasPendingContent, _line, _lineStart, _lineIndent, _kind = state.kind, _result = state.result, ch; + ch = state.input.charCodeAt(state.position); if (is_WS_OR_EOL(ch) || is_FLOW_INDICATOR(ch) || ch === 35 || ch === 38 || ch === 42 || ch === 33 || ch === 124 || ch === 62 || ch === 39 || ch === 34 || ch === 37 || ch === 64 || ch === 96) { return false; } if (ch === 63 || ch === 45) { - following = state2.input.charCodeAt(state2.position + 1); + following = state.input.charCodeAt(state.position + 1); if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { return false; } } - state2.kind = "scalar"; - state2.result = ""; - captureStart = captureEnd = state2.position; + state.kind = "scalar"; + state.result = ""; + captureStart = captureEnd = state.position; hasPendingContent = false; while (ch !== 0) { if (ch === 58) { - following = state2.input.charCodeAt(state2.position + 1); + following = state.input.charCodeAt(state.position + 1); if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { break; } } else if (ch === 35) { - preceding = state2.input.charCodeAt(state2.position - 1); + preceding = state.input.charCodeAt(state.position - 1); if (is_WS_OR_EOL(preceding)) { break; } - } else if (state2.position === state2.lineStart && testDocumentSeparator(state2) || withinFlowCollection && is_FLOW_INDICATOR(ch)) { + } else if (state.position === state.lineStart && testDocumentSeparator(state) || withinFlowCollection && is_FLOW_INDICATOR(ch)) { break; } else if (is_EOL(ch)) { - _line = state2.line; - _lineStart = state2.lineStart; - _lineIndent = state2.lineIndent; - skipSeparationSpace(state2, false, -1); - if (state2.lineIndent >= nodeIndent) { + _line = state.line; + _lineStart = state.lineStart; + _lineIndent = state.lineIndent; + skipSeparationSpace(state, false, -1); + if (state.lineIndent >= nodeIndent) { hasPendingContent = true; - ch = state2.input.charCodeAt(state2.position); + ch = state.input.charCodeAt(state.position); continue; } else { - state2.position = captureEnd; - state2.line = _line; - state2.lineStart = _lineStart; - state2.lineIndent = _lineIndent; + state.position = captureEnd; + state.line = _line; + state.lineStart = _lineStart; + state.lineIndent = _lineIndent; break; } } if (hasPendingContent) { - captureSegment(state2, captureStart, captureEnd, false); - writeFoldedLines(state2, state2.line - _line); - captureStart = captureEnd = state2.position; + captureSegment(state, captureStart, captureEnd, false); + writeFoldedLines(state, state.line - _line); + captureStart = captureEnd = state.position; hasPendingContent = false; } if (!is_WHITE_SPACE(ch)) { - captureEnd = state2.position + 1; + captureEnd = state.position + 1; } - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } - captureSegment(state2, captureStart, captureEnd, false); - if (state2.result) { + captureSegment(state, captureStart, captureEnd, false); + if (state.result) { return true; } - state2.kind = _kind; - state2.result = _result; + state.kind = _kind; + state.result = _result; return false; } - function readSingleQuotedScalar(state2, nodeIndent) { + function readSingleQuotedScalar(state, nodeIndent) { var ch, captureStart, captureEnd; - ch = state2.input.charCodeAt(state2.position); + ch = state.input.charCodeAt(state.position); if (ch !== 39) { return false; } - state2.kind = "scalar"; - state2.result = ""; - state2.position++; - captureStart = captureEnd = state2.position; - while ((ch = state2.input.charCodeAt(state2.position)) !== 0) { + state.kind = "scalar"; + state.result = ""; + state.position++; + captureStart = captureEnd = state.position; + while ((ch = state.input.charCodeAt(state.position)) !== 0) { if (ch === 39) { - captureSegment(state2, captureStart, state2.position, true); - ch = state2.input.charCodeAt(++state2.position); + captureSegment(state, captureStart, state.position, true); + ch = state.input.charCodeAt(++state.position); if (ch === 39) { - captureStart = state2.position; - state2.position++; - captureEnd = state2.position; + captureStart = state.position; + state.position++; + captureEnd = state.position; } else { return true; } } else if (is_EOL(ch)) { - captureSegment(state2, captureStart, captureEnd, true); - writeFoldedLines(state2, skipSeparationSpace(state2, false, nodeIndent)); - captureStart = captureEnd = state2.position; - } else if (state2.position === state2.lineStart && testDocumentSeparator(state2)) { - throwError(state2, "unexpected end of the document within a single quoted scalar"); + captureSegment(state, captureStart, captureEnd, true); + writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); + captureStart = captureEnd = state.position; + } else if (state.position === state.lineStart && testDocumentSeparator(state)) { + throwError(state, "unexpected end of the document within a single quoted scalar"); } else { - state2.position++; - captureEnd = state2.position; + state.position++; + captureEnd = state.position; } } - throwError(state2, "unexpected end of the stream within a single quoted scalar"); + throwError(state, "unexpected end of the stream within a single quoted scalar"); } - function readDoubleQuotedScalar(state2, nodeIndent) { + function readDoubleQuotedScalar(state, nodeIndent) { var captureStart, captureEnd, hexLength, hexResult, tmp, ch; - ch = state2.input.charCodeAt(state2.position); + ch = state.input.charCodeAt(state.position); if (ch !== 34) { return false; } - state2.kind = "scalar"; - state2.result = ""; - state2.position++; - captureStart = captureEnd = state2.position; - while ((ch = state2.input.charCodeAt(state2.position)) !== 0) { + state.kind = "scalar"; + state.result = ""; + state.position++; + captureStart = captureEnd = state.position; + while ((ch = state.input.charCodeAt(state.position)) !== 0) { if (ch === 34) { - captureSegment(state2, captureStart, state2.position, true); - state2.position++; + captureSegment(state, captureStart, state.position, true); + state.position++; return true; } else if (ch === 92) { - captureSegment(state2, captureStart, state2.position, true); - ch = state2.input.charCodeAt(++state2.position); + captureSegment(state, captureStart, state.position, true); + ch = state.input.charCodeAt(++state.position); if (is_EOL(ch)) { - skipSeparationSpace(state2, false, nodeIndent); + skipSeparationSpace(state, false, nodeIndent); } else if (ch < 256 && simpleEscapeCheck[ch]) { - state2.result += simpleEscapeMap[ch]; - state2.position++; + state.result += simpleEscapeMap[ch]; + state.position++; } else if ((tmp = escapedHexLen(ch)) > 0) { hexLength = tmp; hexResult = 0; for (;hexLength > 0; hexLength--) { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); if ((tmp = fromHexCode(ch)) >= 0) { hexResult = (hexResult << 4) + tmp; } else { - throwError(state2, "expected hexadecimal character"); + throwError(state, "expected hexadecimal character"); } } - state2.result += charFromCodepoint(hexResult); - state2.position++; + state.result += charFromCodepoint(hexResult); + state.position++; } else { - throwError(state2, "unknown escape sequence"); + throwError(state, "unknown escape sequence"); } - captureStart = captureEnd = state2.position; + captureStart = captureEnd = state.position; } else if (is_EOL(ch)) { - captureSegment(state2, captureStart, captureEnd, true); - writeFoldedLines(state2, skipSeparationSpace(state2, false, nodeIndent)); - captureStart = captureEnd = state2.position; - } else if (state2.position === state2.lineStart && testDocumentSeparator(state2)) { - throwError(state2, "unexpected end of the document within a double quoted scalar"); + captureSegment(state, captureStart, captureEnd, true); + writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); + captureStart = captureEnd = state.position; + } else if (state.position === state.lineStart && testDocumentSeparator(state)) { + throwError(state, "unexpected end of the document within a double quoted scalar"); } else { - state2.position++; - captureEnd = state2.position; + state.position++; + captureEnd = state.position; } } - throwError(state2, "unexpected end of the stream within a double quoted scalar"); + throwError(state, "unexpected end of the stream within a double quoted scalar"); } - function readFlowCollection(state2, nodeIndent) { - var readNext = true, _line, _tag = state2.tag, _result, _anchor = state2.anchor, following, terminator, isPair, isExplicitPair, isMapping, overridableKeys = {}, keyNode, keyTag, valueNode, ch; - ch = state2.input.charCodeAt(state2.position); + function readFlowCollection(state, nodeIndent) { + var readNext = true, _line, _tag = state.tag, _result, _anchor = state.anchor, following, terminator, isPair, isExplicitPair, isMapping, overridableKeys = {}, keyNode, keyTag, valueNode, ch; + ch = state.input.charCodeAt(state.position); if (ch === 91) { terminator = 93; isMapping = false; @@ -105325,67 +105549,67 @@ var require_loader = __commonJS((exports, module2) => { } else { return false; } - if (state2.anchor !== null) { - state2.anchorMap[state2.anchor] = _result; + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; } - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); while (ch !== 0) { - skipSeparationSpace(state2, true, nodeIndent); - ch = state2.input.charCodeAt(state2.position); + skipSeparationSpace(state, true, nodeIndent); + ch = state.input.charCodeAt(state.position); if (ch === terminator) { - state2.position++; - state2.tag = _tag; - state2.anchor = _anchor; - state2.kind = isMapping ? "mapping" : "sequence"; - state2.result = _result; + state.position++; + state.tag = _tag; + state.anchor = _anchor; + state.kind = isMapping ? "mapping" : "sequence"; + state.result = _result; return true; } else if (!readNext) { - throwError(state2, "missed comma between flow collection entries"); + throwError(state, "missed comma between flow collection entries"); } keyTag = keyNode = valueNode = null; isPair = isExplicitPair = false; if (ch === 63) { - following = state2.input.charCodeAt(state2.position + 1); + following = state.input.charCodeAt(state.position + 1); if (is_WS_OR_EOL(following)) { isPair = isExplicitPair = true; - state2.position++; - skipSeparationSpace(state2, true, nodeIndent); + state.position++; + skipSeparationSpace(state, true, nodeIndent); } } - _line = state2.line; - composeNode(state2, nodeIndent, CONTEXT_FLOW_IN, false, true); - keyTag = state2.tag; - keyNode = state2.result; - skipSeparationSpace(state2, true, nodeIndent); - ch = state2.input.charCodeAt(state2.position); - if ((isExplicitPair || state2.line === _line) && ch === 58) { + _line = state.line; + composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); + keyTag = state.tag; + keyNode = state.result; + skipSeparationSpace(state, true, nodeIndent); + ch = state.input.charCodeAt(state.position); + if ((isExplicitPair || state.line === _line) && ch === 58) { isPair = true; - ch = state2.input.charCodeAt(++state2.position); - skipSeparationSpace(state2, true, nodeIndent); - composeNode(state2, nodeIndent, CONTEXT_FLOW_IN, false, true); - valueNode = state2.result; + ch = state.input.charCodeAt(++state.position); + skipSeparationSpace(state, true, nodeIndent); + composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); + valueNode = state.result; } if (isMapping) { - storeMappingPair(state2, _result, overridableKeys, keyTag, keyNode, valueNode); + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode); } else if (isPair) { - _result.push(storeMappingPair(state2, null, overridableKeys, keyTag, keyNode, valueNode)); + _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode)); } else { _result.push(keyNode); } - skipSeparationSpace(state2, true, nodeIndent); - ch = state2.input.charCodeAt(state2.position); + skipSeparationSpace(state, true, nodeIndent); + ch = state.input.charCodeAt(state.position); if (ch === 44) { readNext = true; - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } else { readNext = false; } } - throwError(state2, "unexpected end of the stream within a flow collection"); + throwError(state, "unexpected end of the stream within a flow collection"); } - function readBlockScalar(state2, nodeIndent) { + function readBlockScalar(state, nodeIndent) { var captureStart, folding, chomping = CHOMPING_CLIP, didReadContent = false, detectedIndent = false, textIndent = nodeIndent, emptyLines = 0, atMoreIndented = false, tmp, ch; - ch = state2.input.charCodeAt(state2.position); + ch = state.input.charCodeAt(state.position); if (ch === 124) { folding = false; } else if (ch === 62) { @@ -105393,24 +105617,24 @@ var require_loader = __commonJS((exports, module2) => { } else { return false; } - state2.kind = "scalar"; - state2.result = ""; + state.kind = "scalar"; + state.result = ""; while (ch !== 0) { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); if (ch === 43 || ch === 45) { if (CHOMPING_CLIP === chomping) { chomping = ch === 43 ? CHOMPING_KEEP : CHOMPING_STRIP; } else { - throwError(state2, "repeat of a chomping mode identifier"); + throwError(state, "repeat of a chomping mode identifier"); } } else if ((tmp = fromDecimalCode(ch)) >= 0) { if (tmp === 0) { - throwError(state2, "bad explicit indentation width of a block scalar; it cannot be less than one"); + throwError(state, "bad explicit indentation width of a block scalar; it cannot be less than one"); } else if (!detectedIndent) { textIndent = nodeIndent + tmp - 1; detectedIndent = true; } else { - throwError(state2, "repeat of an indentation width identifier"); + throwError(state, "repeat of an indentation width identifier"); } } else { break; @@ -105418,36 +105642,36 @@ var require_loader = __commonJS((exports, module2) => { } if (is_WHITE_SPACE(ch)) { do { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } while (is_WHITE_SPACE(ch)); if (ch === 35) { do { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } while (!is_EOL(ch) && ch !== 0); } } while (ch !== 0) { - readLineBreak(state2); - state2.lineIndent = 0; - ch = state2.input.charCodeAt(state2.position); - while ((!detectedIndent || state2.lineIndent < textIndent) && ch === 32) { - state2.lineIndent++; - ch = state2.input.charCodeAt(++state2.position); + readLineBreak(state); + state.lineIndent = 0; + ch = state.input.charCodeAt(state.position); + while ((!detectedIndent || state.lineIndent < textIndent) && ch === 32) { + state.lineIndent++; + ch = state.input.charCodeAt(++state.position); } - if (!detectedIndent && state2.lineIndent > textIndent) { - textIndent = state2.lineIndent; + if (!detectedIndent && state.lineIndent > textIndent) { + textIndent = state.lineIndent; } if (is_EOL(ch)) { emptyLines++; continue; } - if (state2.lineIndent < textIndent) { + if (state.lineIndent < textIndent) { if (chomping === CHOMPING_KEEP) { - state2.result += common.repeat(` + state.result += common.repeat(` `, didReadContent ? 1 + emptyLines : emptyLines); } else if (chomping === CHOMPING_CLIP) { if (didReadContent) { - state2.result += ` + state.result += ` `; } } @@ -105456,92 +105680,92 @@ var require_loader = __commonJS((exports, module2) => { if (folding) { if (is_WHITE_SPACE(ch)) { atMoreIndented = true; - state2.result += common.repeat(` + state.result += common.repeat(` `, didReadContent ? 1 + emptyLines : emptyLines); } else if (atMoreIndented) { atMoreIndented = false; - state2.result += common.repeat(` + state.result += common.repeat(` `, emptyLines + 1); } else if (emptyLines === 0) { if (didReadContent) { - state2.result += " "; + state.result += " "; } } else { - state2.result += common.repeat(` + state.result += common.repeat(` `, emptyLines); } } else { - state2.result += common.repeat(` + state.result += common.repeat(` `, didReadContent ? 1 + emptyLines : emptyLines); } didReadContent = true; detectedIndent = true; emptyLines = 0; - captureStart = state2.position; + captureStart = state.position; while (!is_EOL(ch) && ch !== 0) { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } - captureSegment(state2, captureStart, state2.position, false); + captureSegment(state, captureStart, state.position, false); } return true; } - function readBlockSequence(state2, nodeIndent) { - var _line, _tag = state2.tag, _anchor = state2.anchor, _result = [], following, detected = false, ch; - if (state2.anchor !== null) { - state2.anchorMap[state2.anchor] = _result; + function readBlockSequence(state, nodeIndent) { + var _line, _tag = state.tag, _anchor = state.anchor, _result = [], following, detected = false, ch; + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; } - ch = state2.input.charCodeAt(state2.position); + ch = state.input.charCodeAt(state.position); while (ch !== 0) { if (ch !== 45) { break; } - following = state2.input.charCodeAt(state2.position + 1); + following = state.input.charCodeAt(state.position + 1); if (!is_WS_OR_EOL(following)) { break; } detected = true; - state2.position++; - if (skipSeparationSpace(state2, true, -1)) { - if (state2.lineIndent <= nodeIndent) { + state.position++; + if (skipSeparationSpace(state, true, -1)) { + if (state.lineIndent <= nodeIndent) { _result.push(null); - ch = state2.input.charCodeAt(state2.position); + ch = state.input.charCodeAt(state.position); continue; } } - _line = state2.line; - composeNode(state2, nodeIndent, CONTEXT_BLOCK_IN, false, true); - _result.push(state2.result); - skipSeparationSpace(state2, true, -1); - ch = state2.input.charCodeAt(state2.position); - if ((state2.line === _line || state2.lineIndent > nodeIndent) && ch !== 0) { - throwError(state2, "bad indentation of a sequence entry"); - } else if (state2.lineIndent < nodeIndent) { + _line = state.line; + composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true); + _result.push(state.result); + skipSeparationSpace(state, true, -1); + ch = state.input.charCodeAt(state.position); + if ((state.line === _line || state.lineIndent > nodeIndent) && ch !== 0) { + throwError(state, "bad indentation of a sequence entry"); + } else if (state.lineIndent < nodeIndent) { break; } } if (detected) { - state2.tag = _tag; - state2.anchor = _anchor; - state2.kind = "sequence"; - state2.result = _result; + state.tag = _tag; + state.anchor = _anchor; + state.kind = "sequence"; + state.result = _result; return true; } return false; } - function readBlockMapping(state2, nodeIndent, flowIndent) { - var following, allowCompact, _line, _pos, _tag = state2.tag, _anchor = state2.anchor, _result = {}, overridableKeys = {}, keyTag = null, keyNode = null, valueNode = null, atExplicitKey = false, detected = false, ch; - if (state2.anchor !== null) { - state2.anchorMap[state2.anchor] = _result; + function readBlockMapping(state, nodeIndent, flowIndent) { + var following, allowCompact, _line, _pos, _tag = state.tag, _anchor = state.anchor, _result = {}, overridableKeys = {}, keyTag = null, keyNode = null, valueNode = null, atExplicitKey = false, detected = false, ch; + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; } - ch = state2.input.charCodeAt(state2.position); + ch = state.input.charCodeAt(state.position); while (ch !== 0) { - following = state2.input.charCodeAt(state2.position + 1); - _line = state2.line; - _pos = state2.position; + following = state.input.charCodeAt(state.position + 1); + _line = state.line; + _pos = state.position; if ((ch === 63 || ch === 58) && is_WS_OR_EOL(following)) { if (ch === 63) { if (atExplicitKey) { - storeMappingPair(state2, _result, overridableKeys, keyTag, keyNode, null); + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); keyTag = keyNode = valueNode = null; } detected = true; @@ -105551,218 +105775,218 @@ var require_loader = __commonJS((exports, module2) => { atExplicitKey = false; allowCompact = true; } else { - throwError(state2, "incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line"); + throwError(state, "incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line"); } - state2.position += 1; + state.position += 1; ch = following; - } else if (composeNode(state2, flowIndent, CONTEXT_FLOW_OUT, false, true)) { - if (state2.line === _line) { - ch = state2.input.charCodeAt(state2.position); + } else if (composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) { + if (state.line === _line) { + ch = state.input.charCodeAt(state.position); while (is_WHITE_SPACE(ch)) { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } if (ch === 58) { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); if (!is_WS_OR_EOL(ch)) { - throwError(state2, "a whitespace character is expected after the key-value separator within a block mapping"); + throwError(state, "a whitespace character is expected after the key-value separator within a block mapping"); } if (atExplicitKey) { - storeMappingPair(state2, _result, overridableKeys, keyTag, keyNode, null); + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); keyTag = keyNode = valueNode = null; } detected = true; atExplicitKey = false; allowCompact = false; - keyTag = state2.tag; - keyNode = state2.result; + keyTag = state.tag; + keyNode = state.result; } else if (detected) { - throwError(state2, "can not read an implicit mapping pair; a colon is missed"); + throwError(state, "can not read an implicit mapping pair; a colon is missed"); } else { - state2.tag = _tag; - state2.anchor = _anchor; + state.tag = _tag; + state.anchor = _anchor; return true; } } else if (detected) { - throwError(state2, "can not read a block mapping entry; a multiline key may not be an implicit key"); + throwError(state, "can not read a block mapping entry; a multiline key may not be an implicit key"); } else { - state2.tag = _tag; - state2.anchor = _anchor; + state.tag = _tag; + state.anchor = _anchor; return true; } } else { break; } - if (state2.line === _line || state2.lineIndent > nodeIndent) { - if (composeNode(state2, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) { + if (state.line === _line || state.lineIndent > nodeIndent) { + if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) { if (atExplicitKey) { - keyNode = state2.result; + keyNode = state.result; } else { - valueNode = state2.result; + valueNode = state.result; } } if (!atExplicitKey) { - storeMappingPair(state2, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _pos); + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _pos); keyTag = keyNode = valueNode = null; } - skipSeparationSpace(state2, true, -1); - ch = state2.input.charCodeAt(state2.position); + skipSeparationSpace(state, true, -1); + ch = state.input.charCodeAt(state.position); } - if (state2.lineIndent > nodeIndent && ch !== 0) { - throwError(state2, "bad indentation of a mapping entry"); - } else if (state2.lineIndent < nodeIndent) { + if (state.lineIndent > nodeIndent && ch !== 0) { + throwError(state, "bad indentation of a mapping entry"); + } else if (state.lineIndent < nodeIndent) { break; } } if (atExplicitKey) { - storeMappingPair(state2, _result, overridableKeys, keyTag, keyNode, null); + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); } if (detected) { - state2.tag = _tag; - state2.anchor = _anchor; - state2.kind = "mapping"; - state2.result = _result; + state.tag = _tag; + state.anchor = _anchor; + state.kind = "mapping"; + state.result = _result; } return detected; } - function readTagProperty(state2) { + function readTagProperty(state) { var _position, isVerbatim = false, isNamed = false, tagHandle, tagName, ch; - ch = state2.input.charCodeAt(state2.position); + ch = state.input.charCodeAt(state.position); if (ch !== 33) return false; - if (state2.tag !== null) { - throwError(state2, "duplication of a tag property"); + if (state.tag !== null) { + throwError(state, "duplication of a tag property"); } - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); if (ch === 60) { isVerbatim = true; - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } else if (ch === 33) { isNamed = true; tagHandle = "!!"; - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } else { tagHandle = "!"; } - _position = state2.position; + _position = state.position; if (isVerbatim) { do { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } while (ch !== 0 && ch !== 62); - if (state2.position < state2.length) { - tagName = state2.input.slice(_position, state2.position); - ch = state2.input.charCodeAt(++state2.position); + if (state.position < state.length) { + tagName = state.input.slice(_position, state.position); + ch = state.input.charCodeAt(++state.position); } else { - throwError(state2, "unexpected end of the stream within a verbatim tag"); + throwError(state, "unexpected end of the stream within a verbatim tag"); } } else { while (ch !== 0 && !is_WS_OR_EOL(ch)) { if (ch === 33) { if (!isNamed) { - tagHandle = state2.input.slice(_position - 1, state2.position + 1); + tagHandle = state.input.slice(_position - 1, state.position + 1); if (!PATTERN_TAG_HANDLE.test(tagHandle)) { - throwError(state2, "named tag handle cannot contain such characters"); + throwError(state, "named tag handle cannot contain such characters"); } isNamed = true; - _position = state2.position + 1; + _position = state.position + 1; } else { - throwError(state2, "tag suffix cannot contain exclamation marks"); + throwError(state, "tag suffix cannot contain exclamation marks"); } } - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } - tagName = state2.input.slice(_position, state2.position); + tagName = state.input.slice(_position, state.position); if (PATTERN_FLOW_INDICATORS.test(tagName)) { - throwError(state2, "tag suffix cannot contain flow indicator characters"); + throwError(state, "tag suffix cannot contain flow indicator characters"); } } if (tagName && !PATTERN_TAG_URI.test(tagName)) { - throwError(state2, "tag name cannot contain such characters: " + tagName); + throwError(state, "tag name cannot contain such characters: " + tagName); } if (isVerbatim) { - state2.tag = tagName; - } else if (_hasOwnProperty.call(state2.tagMap, tagHandle)) { - state2.tag = state2.tagMap[tagHandle] + tagName; + state.tag = tagName; + } else if (_hasOwnProperty.call(state.tagMap, tagHandle)) { + state.tag = state.tagMap[tagHandle] + tagName; } else if (tagHandle === "!") { - state2.tag = "!" + tagName; + state.tag = "!" + tagName; } else if (tagHandle === "!!") { - state2.tag = "tag:yaml.org,2002:" + tagName; + state.tag = "tag:yaml.org,2002:" + tagName; } else { - throwError(state2, 'undeclared tag handle "' + tagHandle + '"'); + throwError(state, 'undeclared tag handle "' + tagHandle + '"'); } return true; } - function readAnchorProperty(state2) { + function readAnchorProperty(state) { var _position, ch; - ch = state2.input.charCodeAt(state2.position); + ch = state.input.charCodeAt(state.position); if (ch !== 38) return false; - if (state2.anchor !== null) { - throwError(state2, "duplication of an anchor property"); + if (state.anchor !== null) { + throwError(state, "duplication of an anchor property"); } - ch = state2.input.charCodeAt(++state2.position); - _position = state2.position; + ch = state.input.charCodeAt(++state.position); + _position = state.position; while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } - if (state2.position === _position) { - throwError(state2, "name of an anchor node must contain at least one character"); + if (state.position === _position) { + throwError(state, "name of an anchor node must contain at least one character"); } - state2.anchor = state2.input.slice(_position, state2.position); + state.anchor = state.input.slice(_position, state.position); return true; } - function readAlias(state2) { + function readAlias(state) { var _position, alias2, ch; - ch = state2.input.charCodeAt(state2.position); + ch = state.input.charCodeAt(state.position); if (ch !== 42) return false; - ch = state2.input.charCodeAt(++state2.position); - _position = state2.position; + ch = state.input.charCodeAt(++state.position); + _position = state.position; while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } - if (state2.position === _position) { - throwError(state2, "name of an alias node must contain at least one character"); + if (state.position === _position) { + throwError(state, "name of an alias node must contain at least one character"); } - alias2 = state2.input.slice(_position, state2.position); - if (!_hasOwnProperty.call(state2.anchorMap, alias2)) { - throwError(state2, 'unidentified alias "' + alias2 + '"'); + alias2 = state.input.slice(_position, state.position); + if (!_hasOwnProperty.call(state.anchorMap, alias2)) { + throwError(state, 'unidentified alias "' + alias2 + '"'); } - state2.result = state2.anchorMap[alias2]; - skipSeparationSpace(state2, true, -1); + state.result = state.anchorMap[alias2]; + skipSeparationSpace(state, true, -1); return true; } - function composeNode(state2, parentIndent, nodeContext, allowToSeek, allowCompact) { + function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) { var allowBlockStyles, allowBlockScalars, allowBlockCollections, indentStatus = 1, atNewLine = false, hasContent = false, typeIndex, typeQuantity, type3, flowIndent, blockIndent; - if (state2.listener !== null) { - state2.listener("open", state2); + if (state.listener !== null) { + state.listener("open", state); } - state2.tag = null; - state2.anchor = null; - state2.kind = null; - state2.result = null; + state.tag = null; + state.anchor = null; + state.kind = null; + state.result = null; allowBlockStyles = allowBlockScalars = allowBlockCollections = CONTEXT_BLOCK_OUT === nodeContext || CONTEXT_BLOCK_IN === nodeContext; if (allowToSeek) { - if (skipSeparationSpace(state2, true, -1)) { + if (skipSeparationSpace(state, true, -1)) { atNewLine = true; - if (state2.lineIndent > parentIndent) { + if (state.lineIndent > parentIndent) { indentStatus = 1; - } else if (state2.lineIndent === parentIndent) { + } else if (state.lineIndent === parentIndent) { indentStatus = 0; - } else if (state2.lineIndent < parentIndent) { + } else if (state.lineIndent < parentIndent) { indentStatus = -1; } } } if (indentStatus === 1) { - while (readTagProperty(state2) || readAnchorProperty(state2)) { - if (skipSeparationSpace(state2, true, -1)) { + while (readTagProperty(state) || readAnchorProperty(state)) { + if (skipSeparationSpace(state, true, -1)) { atNewLine = true; allowBlockCollections = allowBlockStyles; - if (state2.lineIndent > parentIndent) { + if (state.lineIndent > parentIndent) { indentStatus = 1; - } else if (state2.lineIndent === parentIndent) { + } else if (state.lineIndent === parentIndent) { indentStatus = 0; - } else if (state2.lineIndent < parentIndent) { + } else if (state.lineIndent < parentIndent) { indentStatus = -1; } } else { @@ -105779,141 +106003,141 @@ var require_loader = __commonJS((exports, module2) => { } else { flowIndent = parentIndent + 1; } - blockIndent = state2.position - state2.lineStart; + blockIndent = state.position - state.lineStart; if (indentStatus === 1) { - if (allowBlockCollections && (readBlockSequence(state2, blockIndent) || readBlockMapping(state2, blockIndent, flowIndent)) || readFlowCollection(state2, flowIndent)) { + if (allowBlockCollections && (readBlockSequence(state, blockIndent) || readBlockMapping(state, blockIndent, flowIndent)) || readFlowCollection(state, flowIndent)) { hasContent = true; } else { - if (allowBlockScalars && readBlockScalar(state2, flowIndent) || readSingleQuotedScalar(state2, flowIndent) || readDoubleQuotedScalar(state2, flowIndent)) { + if (allowBlockScalars && readBlockScalar(state, flowIndent) || readSingleQuotedScalar(state, flowIndent) || readDoubleQuotedScalar(state, flowIndent)) { hasContent = true; - } else if (readAlias(state2)) { + } else if (readAlias(state)) { hasContent = true; - if (state2.tag !== null || state2.anchor !== null) { - throwError(state2, "alias node should not have any properties"); + if (state.tag !== null || state.anchor !== null) { + throwError(state, "alias node should not have any properties"); } - } else if (readPlainScalar(state2, flowIndent, CONTEXT_FLOW_IN === nodeContext)) { + } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) { hasContent = true; - if (state2.tag === null) { - state2.tag = "?"; + if (state.tag === null) { + state.tag = "?"; } } - if (state2.anchor !== null) { - state2.anchorMap[state2.anchor] = state2.result; + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; } } } else if (indentStatus === 0) { - hasContent = allowBlockCollections && readBlockSequence(state2, blockIndent); + hasContent = allowBlockCollections && readBlockSequence(state, blockIndent); } } - if (state2.tag !== null && state2.tag !== "!") { - if (state2.tag === "?") { - if (state2.result !== null && state2.kind !== "scalar") { - throwError(state2, 'unacceptable node kind for ! tag; it should be "scalar", not "' + state2.kind + '"'); + if (state.tag !== null && state.tag !== "!") { + if (state.tag === "?") { + if (state.result !== null && state.kind !== "scalar") { + throwError(state, 'unacceptable node kind for ! tag; it should be "scalar", not "' + state.kind + '"'); } - for (typeIndex = 0, typeQuantity = state2.implicitTypes.length;typeIndex < typeQuantity; typeIndex += 1) { - type3 = state2.implicitTypes[typeIndex]; - if (type3.resolve(state2.result)) { - state2.result = type3.construct(state2.result); - state2.tag = type3.tag; - if (state2.anchor !== null) { - state2.anchorMap[state2.anchor] = state2.result; + for (typeIndex = 0, typeQuantity = state.implicitTypes.length;typeIndex < typeQuantity; typeIndex += 1) { + type3 = state.implicitTypes[typeIndex]; + if (type3.resolve(state.result)) { + state.result = type3.construct(state.result); + state.tag = type3.tag; + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; } break; } } - } else if (_hasOwnProperty.call(state2.typeMap[state2.kind || "fallback"], state2.tag)) { - type3 = state2.typeMap[state2.kind || "fallback"][state2.tag]; - if (state2.result !== null && type3.kind !== state2.kind) { - throwError(state2, "unacceptable node kind for !<" + state2.tag + '> tag; it should be "' + type3.kind + '", not "' + state2.kind + '"'); + } else if (_hasOwnProperty.call(state.typeMap[state.kind || "fallback"], state.tag)) { + type3 = state.typeMap[state.kind || "fallback"][state.tag]; + if (state.result !== null && type3.kind !== state.kind) { + throwError(state, "unacceptable node kind for !<" + state.tag + '> tag; it should be "' + type3.kind + '", not "' + state.kind + '"'); } - if (!type3.resolve(state2.result)) { - throwError(state2, "cannot resolve a node with !<" + state2.tag + "> explicit tag"); + if (!type3.resolve(state.result)) { + throwError(state, "cannot resolve a node with !<" + state.tag + "> explicit tag"); } else { - state2.result = type3.construct(state2.result); - if (state2.anchor !== null) { - state2.anchorMap[state2.anchor] = state2.result; + state.result = type3.construct(state.result); + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; } } } else { - throwError(state2, "unknown tag !<" + state2.tag + ">"); + throwError(state, "unknown tag !<" + state.tag + ">"); } } - if (state2.listener !== null) { - state2.listener("close", state2); + if (state.listener !== null) { + state.listener("close", state); } - return state2.tag !== null || state2.anchor !== null || hasContent; + return state.tag !== null || state.anchor !== null || hasContent; } - function readDocument(state2) { - var documentStart = state2.position, _position, directiveName, directiveArgs, hasDirectives = false, ch; - state2.version = null; - state2.checkLineBreaks = state2.legacy; - state2.tagMap = {}; - state2.anchorMap = {}; - while ((ch = state2.input.charCodeAt(state2.position)) !== 0) { - skipSeparationSpace(state2, true, -1); - ch = state2.input.charCodeAt(state2.position); - if (state2.lineIndent > 0 || ch !== 37) { + function readDocument(state) { + var documentStart = state.position, _position, directiveName, directiveArgs, hasDirectives = false, ch; + state.version = null; + state.checkLineBreaks = state.legacy; + state.tagMap = {}; + state.anchorMap = {}; + while ((ch = state.input.charCodeAt(state.position)) !== 0) { + skipSeparationSpace(state, true, -1); + ch = state.input.charCodeAt(state.position); + if (state.lineIndent > 0 || ch !== 37) { break; } hasDirectives = true; - ch = state2.input.charCodeAt(++state2.position); - _position = state2.position; + ch = state.input.charCodeAt(++state.position); + _position = state.position; while (ch !== 0 && !is_WS_OR_EOL(ch)) { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } - directiveName = state2.input.slice(_position, state2.position); + directiveName = state.input.slice(_position, state.position); directiveArgs = []; if (directiveName.length < 1) { - throwError(state2, "directive name must not be less than one character in length"); + throwError(state, "directive name must not be less than one character in length"); } while (ch !== 0) { while (is_WHITE_SPACE(ch)) { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } if (ch === 35) { do { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } while (ch !== 0 && !is_EOL(ch)); break; } if (is_EOL(ch)) break; - _position = state2.position; + _position = state.position; while (ch !== 0 && !is_WS_OR_EOL(ch)) { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } - directiveArgs.push(state2.input.slice(_position, state2.position)); + directiveArgs.push(state.input.slice(_position, state.position)); } if (ch !== 0) - readLineBreak(state2); + readLineBreak(state); if (_hasOwnProperty.call(directiveHandlers, directiveName)) { - directiveHandlers[directiveName](state2, directiveName, directiveArgs); + directiveHandlers[directiveName](state, directiveName, directiveArgs); } else { - throwWarning(state2, 'unknown document directive "' + directiveName + '"'); + throwWarning(state, 'unknown document directive "' + directiveName + '"'); } } - skipSeparationSpace(state2, true, -1); - if (state2.lineIndent === 0 && state2.input.charCodeAt(state2.position) === 45 && state2.input.charCodeAt(state2.position + 1) === 45 && state2.input.charCodeAt(state2.position + 2) === 45) { - state2.position += 3; - skipSeparationSpace(state2, true, -1); + skipSeparationSpace(state, true, -1); + if (state.lineIndent === 0 && state.input.charCodeAt(state.position) === 45 && state.input.charCodeAt(state.position + 1) === 45 && state.input.charCodeAt(state.position + 2) === 45) { + state.position += 3; + skipSeparationSpace(state, true, -1); } else if (hasDirectives) { - throwError(state2, "directives end mark is expected"); + throwError(state, "directives end mark is expected"); } - composeNode(state2, state2.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true); - skipSeparationSpace(state2, true, -1); - if (state2.checkLineBreaks && PATTERN_NON_ASCII_LINE_BREAKS.test(state2.input.slice(documentStart, state2.position))) { - throwWarning(state2, "non-ASCII line breaks are interpreted as content"); + composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true); + skipSeparationSpace(state, true, -1); + if (state.checkLineBreaks && PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) { + throwWarning(state, "non-ASCII line breaks are interpreted as content"); } - state2.documents.push(state2.result); - if (state2.position === state2.lineStart && testDocumentSeparator(state2)) { - if (state2.input.charCodeAt(state2.position) === 46) { - state2.position += 3; - skipSeparationSpace(state2, true, -1); + state.documents.push(state.result); + if (state.position === state.lineStart && testDocumentSeparator(state)) { + if (state.input.charCodeAt(state.position) === 46) { + state.position += 3; + skipSeparationSpace(state, true, -1); } return; } - if (state2.position < state2.length - 1) { - throwError(state2, "end of the stream or a document separator is expected"); + if (state.position < state.length - 1) { + throwError(state, "end of the stream or a document separator is expected"); } else { return; } @@ -105930,21 +106154,21 @@ var require_loader = __commonJS((exports, module2) => { input = input.slice(1); } } - var state2 = new State2(input, options4); + var state = new State2(input, options4); var nullpos = input.indexOf("\x00"); if (nullpos !== -1) { - state2.position = nullpos; - throwError(state2, "null byte is not allowed in input"); + state.position = nullpos; + throwError(state, "null byte is not allowed in input"); } - state2.input += "\x00"; - while (state2.input.charCodeAt(state2.position) === 32) { - state2.lineIndent += 1; - state2.position += 1; + state.input += "\x00"; + while (state.input.charCodeAt(state.position) === 32) { + state.lineIndent += 1; + state.position += 1; } - while (state2.position < state2.length - 1) { - readDocument(state2); + while (state.position < state.length - 1) { + readDocument(state); } - return state2.documents; + return state.documents; } function loadAll(input, iterator, options4) { if (iterator !== null && typeof iterator === "object" && typeof options4 === "undefined") { @@ -106125,34 +106349,34 @@ var require_dumper = __commonJS((exports, module2) => { } return result6; } - function generateNextLine(state2, level) { + function generateNextLine(state, level) { return ` -` + common.repeat(" ", state2.indent * level); +` + common.repeat(" ", state.indent * level); } - function testImplicitResolving(state2, str2) { + function testImplicitResolving(state, str2) { var index3, length3, type3; - for (index3 = 0, length3 = state2.implicitTypes.length;index3 < length3; index3 += 1) { - type3 = state2.implicitTypes[index3]; + for (index3 = 0, length3 = state.implicitTypes.length;index3 < length3; index3 += 1) { + type3 = state.implicitTypes[index3]; if (type3.resolve(str2)) { return true; } } return false; } - function isWhitespace(c2) { + function isWhitespace2(c2) { return c2 === CHAR_SPACE || c2 === CHAR_TAB; } function isPrintable(c2) { return 32 <= c2 && c2 <= 126 || 161 <= c2 && c2 <= 55295 && c2 !== 8232 && c2 !== 8233 || 57344 <= c2 && c2 <= 65533 && c2 !== 65279 || 65536 <= c2 && c2 <= 1114111; } function isNsChar(c2) { - return isPrintable(c2) && !isWhitespace(c2) && c2 !== 65279 && c2 !== CHAR_CARRIAGE_RETURN && c2 !== CHAR_LINE_FEED; + return isPrintable(c2) && !isWhitespace2(c2) && c2 !== 65279 && c2 !== CHAR_CARRIAGE_RETURN && c2 !== CHAR_LINE_FEED; } function isPlainSafe(c2, prev2) { return isPrintable(c2) && c2 !== 65279 && c2 !== CHAR_COMMA && c2 !== CHAR_LEFT_SQUARE_BRACKET && c2 !== CHAR_RIGHT_SQUARE_BRACKET && c2 !== CHAR_LEFT_CURLY_BRACKET && c2 !== CHAR_RIGHT_CURLY_BRACKET && c2 !== CHAR_COLON && (c2 !== CHAR_SHARP || prev2 && isNsChar(prev2)); } function isPlainSafeFirst(c2) { - return isPrintable(c2) && c2 !== 65279 && !isWhitespace(c2) && c2 !== CHAR_MINUS && c2 !== CHAR_QUESTION && c2 !== CHAR_COLON && c2 !== CHAR_COMMA && c2 !== CHAR_LEFT_SQUARE_BRACKET && c2 !== CHAR_RIGHT_SQUARE_BRACKET && c2 !== CHAR_LEFT_CURLY_BRACKET && c2 !== CHAR_RIGHT_CURLY_BRACKET && c2 !== CHAR_SHARP && c2 !== CHAR_AMPERSAND && c2 !== CHAR_ASTERISK && c2 !== CHAR_EXCLAMATION && c2 !== CHAR_VERTICAL_LINE && c2 !== CHAR_EQUALS && c2 !== CHAR_GREATER_THAN && c2 !== CHAR_SINGLE_QUOTE && c2 !== CHAR_DOUBLE_QUOTE && c2 !== CHAR_PERCENT && c2 !== CHAR_COMMERCIAL_AT && c2 !== CHAR_GRAVE_ACCENT; + return isPrintable(c2) && c2 !== 65279 && !isWhitespace2(c2) && c2 !== CHAR_MINUS && c2 !== CHAR_QUESTION && c2 !== CHAR_COLON && c2 !== CHAR_COMMA && c2 !== CHAR_LEFT_SQUARE_BRACKET && c2 !== CHAR_RIGHT_SQUARE_BRACKET && c2 !== CHAR_LEFT_CURLY_BRACKET && c2 !== CHAR_RIGHT_CURLY_BRACKET && c2 !== CHAR_SHARP && c2 !== CHAR_AMPERSAND && c2 !== CHAR_ASTERISK && c2 !== CHAR_EXCLAMATION && c2 !== CHAR_VERTICAL_LINE && c2 !== CHAR_EQUALS && c2 !== CHAR_GREATER_THAN && c2 !== CHAR_SINGLE_QUOTE && c2 !== CHAR_DOUBLE_QUOTE && c2 !== CHAR_PERCENT && c2 !== CHAR_COMMERCIAL_AT && c2 !== CHAR_GRAVE_ACCENT; } function needIndentIndicator(string12) { var leadingSpaceRe = /^\n* /; @@ -106170,7 +106394,7 @@ var require_dumper = __commonJS((exports, module2) => { var hasFoldableLine = false; var shouldTrackWidth = lineWidth !== -1; var previousLineBreak = -1; - var plain = isPlainSafeFirst(string12.charCodeAt(0)) && !isWhitespace(string12.charCodeAt(string12.length - 1)); + var plain = isPlainSafeFirst(string12.charCodeAt(0)) && !isWhitespace2(string12.charCodeAt(string12.length - 1)); if (singleLineOnly) { for (i6 = 0;i6 < string12.length; i6++) { char2 = string12.charCodeAt(i6); @@ -106205,29 +106429,29 @@ var require_dumper = __commonJS((exports, module2) => { } return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL; } - function writeScalar(state2, string12, level, iskey) { - state2.dump = function() { + function writeScalar(state, string12, level, iskey) { + state.dump = function() { if (string12.length === 0) { return "''"; } - if (!state2.noCompatMode && DEPRECATED_BOOLEANS_SYNTAX.indexOf(string12) !== -1) { + if (!state.noCompatMode && DEPRECATED_BOOLEANS_SYNTAX.indexOf(string12) !== -1) { return "'" + string12 + "'"; } - var indent = state2.indent * Math.max(1, level); - var lineWidth = state2.lineWidth === -1 ? -1 : Math.max(Math.min(state2.lineWidth, 40), state2.lineWidth - indent); - var singleLineOnly = iskey || state2.flowLevel > -1 && level >= state2.flowLevel; + var indent = state.indent * Math.max(1, level); + var lineWidth = state.lineWidth === -1 ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent); + var singleLineOnly = iskey || state.flowLevel > -1 && level >= state.flowLevel; function testAmbiguity(string13) { - return testImplicitResolving(state2, string13); + return testImplicitResolving(state, string13); } - switch (chooseScalarStyle(string12, singleLineOnly, state2.indent, lineWidth, testAmbiguity)) { + switch (chooseScalarStyle(string12, singleLineOnly, state.indent, lineWidth, testAmbiguity)) { case STYLE_PLAIN: return string12; case STYLE_SINGLE: return "'" + string12.replace(/'/g, "''") + "'"; case STYLE_LITERAL: - return "|" + blockHeader(string12, state2.indent) + dropEndingNewline(indentString(string12, indent)); + return "|" + blockHeader(string12, state.indent) + dropEndingNewline(indentString(string12, indent)); case STYLE_FOLDED: - return ">" + blockHeader(string12, state2.indent) + dropEndingNewline(indentString(foldString(string12, lineWidth), indent)); + return ">" + blockHeader(string12, state.indent) + dropEndingNewline(indentString(foldString(string12, lineWidth), indent)); case STYLE_DOUBLE: return '"' + escapeString(string12, lineWidth) + '"'; default: @@ -106318,115 +106542,115 @@ var require_dumper = __commonJS((exports, module2) => { } return result6; } - function writeFlowSequence(state2, level, object5) { - var _result = "", _tag = state2.tag, index3, length3; + function writeFlowSequence(state, level, object5) { + var _result = "", _tag = state.tag, index3, length3; for (index3 = 0, length3 = object5.length;index3 < length3; index3 += 1) { - if (writeNode(state2, level, object5[index3], false, false)) { + if (writeNode(state, level, object5[index3], false, false)) { if (index3 !== 0) - _result += "," + (!state2.condenseFlow ? " " : ""); - _result += state2.dump; + _result += "," + (!state.condenseFlow ? " " : ""); + _result += state.dump; } } - state2.tag = _tag; - state2.dump = "[" + _result + "]"; + state.tag = _tag; + state.dump = "[" + _result + "]"; } - function writeBlockSequence(state2, level, object5, compact7) { - var _result = "", _tag = state2.tag, index3, length3; + function writeBlockSequence(state, level, object5, compact7) { + var _result = "", _tag = state.tag, index3, length3; for (index3 = 0, length3 = object5.length;index3 < length3; index3 += 1) { - if (writeNode(state2, level + 1, object5[index3], true, true)) { + if (writeNode(state, level + 1, object5[index3], true, true)) { if (!compact7 || index3 !== 0) { - _result += generateNextLine(state2, level); + _result += generateNextLine(state, level); } - if (state2.dump && CHAR_LINE_FEED === state2.dump.charCodeAt(0)) { + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { _result += "-"; } else { _result += "- "; } - _result += state2.dump; + _result += state.dump; } } - state2.tag = _tag; - state2.dump = _result || "[]"; + state.tag = _tag; + state.dump = _result || "[]"; } - function writeFlowMapping(state2, level, object5) { - var _result = "", _tag = state2.tag, objectKeyList = Object.keys(object5), index3, length3, objectKey, objectValue, pairBuffer; + function writeFlowMapping(state, level, object5) { + var _result = "", _tag = state.tag, objectKeyList = Object.keys(object5), index3, length3, objectKey, objectValue, pairBuffer; for (index3 = 0, length3 = objectKeyList.length;index3 < length3; index3 += 1) { pairBuffer = ""; if (index3 !== 0) pairBuffer += ", "; - if (state2.condenseFlow) + if (state.condenseFlow) pairBuffer += '"'; objectKey = objectKeyList[index3]; objectValue = object5[objectKey]; - if (!writeNode(state2, level, objectKey, false, false)) { + if (!writeNode(state, level, objectKey, false, false)) { continue; } - if (state2.dump.length > 1024) + if (state.dump.length > 1024) pairBuffer += "? "; - pairBuffer += state2.dump + (state2.condenseFlow ? '"' : "") + ":" + (state2.condenseFlow ? "" : " "); - if (!writeNode(state2, level, objectValue, false, false)) { + pairBuffer += state.dump + (state.condenseFlow ? '"' : "") + ":" + (state.condenseFlow ? "" : " "); + if (!writeNode(state, level, objectValue, false, false)) { continue; } - pairBuffer += state2.dump; + pairBuffer += state.dump; _result += pairBuffer; } - state2.tag = _tag; - state2.dump = "{" + _result + "}"; + state.tag = _tag; + state.dump = "{" + _result + "}"; } - function writeBlockMapping(state2, level, object5, compact7) { - var _result = "", _tag = state2.tag, objectKeyList = Object.keys(object5), index3, length3, objectKey, objectValue, explicitPair, pairBuffer; - if (state2.sortKeys === true) { + function writeBlockMapping(state, level, object5, compact7) { + var _result = "", _tag = state.tag, objectKeyList = Object.keys(object5), index3, length3, objectKey, objectValue, explicitPair, pairBuffer; + if (state.sortKeys === true) { objectKeyList.sort(); - } else if (typeof state2.sortKeys === "function") { - objectKeyList.sort(state2.sortKeys); - } else if (state2.sortKeys) { + } else if (typeof state.sortKeys === "function") { + objectKeyList.sort(state.sortKeys); + } else if (state.sortKeys) { throw new YAMLException("sortKeys must be a boolean or a function"); } for (index3 = 0, length3 = objectKeyList.length;index3 < length3; index3 += 1) { pairBuffer = ""; if (!compact7 || index3 !== 0) { - pairBuffer += generateNextLine(state2, level); + pairBuffer += generateNextLine(state, level); } objectKey = objectKeyList[index3]; objectValue = object5[objectKey]; - if (!writeNode(state2, level + 1, objectKey, true, true, true)) { + if (!writeNode(state, level + 1, objectKey, true, true, true)) { continue; } - explicitPair = state2.tag !== null && state2.tag !== "?" || state2.dump && state2.dump.length > 1024; + explicitPair = state.tag !== null && state.tag !== "?" || state.dump && state.dump.length > 1024; if (explicitPair) { - if (state2.dump && CHAR_LINE_FEED === state2.dump.charCodeAt(0)) { + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { pairBuffer += "?"; } else { pairBuffer += "? "; } } - pairBuffer += state2.dump; + pairBuffer += state.dump; if (explicitPair) { - pairBuffer += generateNextLine(state2, level); + pairBuffer += generateNextLine(state, level); } - if (!writeNode(state2, level + 1, objectValue, true, explicitPair)) { + if (!writeNode(state, level + 1, objectValue, true, explicitPair)) { continue; } - if (state2.dump && CHAR_LINE_FEED === state2.dump.charCodeAt(0)) { + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { pairBuffer += ":"; } else { pairBuffer += ": "; } - pairBuffer += state2.dump; + pairBuffer += state.dump; _result += pairBuffer; } - state2.tag = _tag; - state2.dump = _result || "{}"; + state.tag = _tag; + state.dump = _result || "{}"; } - function detectType(state2, object5, explicit) { + function detectType(state, object5, explicit) { var _result, typeList, index3, length3, type3, style; - typeList = explicit ? state2.explicitTypes : state2.implicitTypes; + typeList = explicit ? state.explicitTypes : state.implicitTypes; for (index3 = 0, length3 = typeList.length;index3 < length3; index3 += 1) { type3 = typeList[index3]; if ((type3.instanceOf || type3.predicate) && (!type3.instanceOf || typeof object5 === "object" && object5 instanceof type3.instanceOf) && (!type3.predicate || type3.predicate(object5))) { - state2.tag = explicit ? type3.tag : "?"; + state.tag = explicit ? type3.tag : "?"; if (type3.represent) { - style = state2.styleMap[type3.tag] || type3.defaultStyle; + style = state.styleMap[type3.tag] || type3.defaultStyle; if (_toString.call(type3.represent) === "[object Function]") { _result = type3.represent(object5, style); } else if (_hasOwnProperty.call(type3.represent, style)) { @@ -106434,84 +106658,84 @@ var require_dumper = __commonJS((exports, module2) => { } else { throw new YAMLException("!<" + type3.tag + '> tag resolver accepts not "' + style + '" style'); } - state2.dump = _result; + state.dump = _result; } return true; } } return false; } - function writeNode(state2, level, object5, block, compact7, iskey) { - state2.tag = null; - state2.dump = object5; - if (!detectType(state2, object5, false)) { - detectType(state2, object5, true); + function writeNode(state, level, object5, block, compact7, iskey) { + state.tag = null; + state.dump = object5; + if (!detectType(state, object5, false)) { + detectType(state, object5, true); } - var type3 = _toString.call(state2.dump); + var type3 = _toString.call(state.dump); if (block) { - block = state2.flowLevel < 0 || state2.flowLevel > level; + block = state.flowLevel < 0 || state.flowLevel > level; } var objectOrArray = type3 === "[object Object]" || type3 === "[object Array]", duplicateIndex, duplicate; if (objectOrArray) { - duplicateIndex = state2.duplicates.indexOf(object5); + duplicateIndex = state.duplicates.indexOf(object5); duplicate = duplicateIndex !== -1; } - if (state2.tag !== null && state2.tag !== "?" || duplicate || state2.indent !== 2 && level > 0) { + if (state.tag !== null && state.tag !== "?" || duplicate || state.indent !== 2 && level > 0) { compact7 = false; } - if (duplicate && state2.usedDuplicates[duplicateIndex]) { - state2.dump = "*ref_" + duplicateIndex; + if (duplicate && state.usedDuplicates[duplicateIndex]) { + state.dump = "*ref_" + duplicateIndex; } else { - if (objectOrArray && duplicate && !state2.usedDuplicates[duplicateIndex]) { - state2.usedDuplicates[duplicateIndex] = true; + if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) { + state.usedDuplicates[duplicateIndex] = true; } if (type3 === "[object Object]") { - if (block && Object.keys(state2.dump).length !== 0) { - writeBlockMapping(state2, level, state2.dump, compact7); + if (block && Object.keys(state.dump).length !== 0) { + writeBlockMapping(state, level, state.dump, compact7); if (duplicate) { - state2.dump = "&ref_" + duplicateIndex + state2.dump; + state.dump = "&ref_" + duplicateIndex + state.dump; } } else { - writeFlowMapping(state2, level, state2.dump); + writeFlowMapping(state, level, state.dump); if (duplicate) { - state2.dump = "&ref_" + duplicateIndex + " " + state2.dump; + state.dump = "&ref_" + duplicateIndex + " " + state.dump; } } } else if (type3 === "[object Array]") { - var arrayLevel = state2.noArrayIndent && level > 0 ? level - 1 : level; - if (block && state2.dump.length !== 0) { - writeBlockSequence(state2, arrayLevel, state2.dump, compact7); + var arrayLevel = state.noArrayIndent && level > 0 ? level - 1 : level; + if (block && state.dump.length !== 0) { + writeBlockSequence(state, arrayLevel, state.dump, compact7); if (duplicate) { - state2.dump = "&ref_" + duplicateIndex + state2.dump; + state.dump = "&ref_" + duplicateIndex + state.dump; } } else { - writeFlowSequence(state2, arrayLevel, state2.dump); + writeFlowSequence(state, arrayLevel, state.dump); if (duplicate) { - state2.dump = "&ref_" + duplicateIndex + " " + state2.dump; + state.dump = "&ref_" + duplicateIndex + " " + state.dump; } } } else if (type3 === "[object String]") { - if (state2.tag !== "?") { - writeScalar(state2, state2.dump, level, iskey); + if (state.tag !== "?") { + writeScalar(state, state.dump, level, iskey); } } else { - if (state2.skipInvalid) + if (state.skipInvalid) return false; throw new YAMLException("unacceptable kind of an object to dump " + type3); } - if (state2.tag !== null && state2.tag !== "?") { - state2.dump = "!<" + state2.tag + "> " + state2.dump; + if (state.tag !== null && state.tag !== "?") { + state.dump = "!<" + state.tag + "> " + state.dump; } } return true; } - function getDuplicateReferences(object5, state2) { + function getDuplicateReferences(object5, state) { var objects = [], duplicatesIndexes = [], index3, length3; inspectNode(object5, objects, duplicatesIndexes); for (index3 = 0, length3 = duplicatesIndexes.length;index3 < length3; index3 += 1) { - state2.duplicates.push(objects[duplicatesIndexes[index3]]); + state.duplicates.push(objects[duplicatesIndexes[index3]]); } - state2.usedDuplicates = new Array(length3); + state.usedDuplicates = new Array(length3); } function inspectNode(object5, objects, duplicatesIndexes) { var objectKeyList, index3, length3; @@ -106538,11 +106762,11 @@ var require_dumper = __commonJS((exports, module2) => { } function dump3(input, options4) { options4 = options4 || {}; - var state2 = new State2(options4); - if (!state2.noRefs) - getDuplicateReferences(input, state2); - if (writeNode(state2, 0, input, true, true)) - return state2.dump + ` + var state = new State2(options4); + if (!state.noRefs) + getDuplicateReferences(input, state); + if (writeNode(state, 0, input, true, true)) + return state.dump + ` `; return ""; } @@ -107071,7 +107295,7 @@ var init_bus = __esm(async () => { } Bus.Service = Service3; Bus.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { - const state2 = yield* InstanceState.make(exports_Effect.fn("Bus.state")(function* (ctx) { + const state = yield* InstanceState.make(exports_Effect.fn("Bus.state")(function* (ctx) { const wildcard = yield* exports_PubSub.unbounded(); const typed = new Map; yield* exports_Effect.addFinalizer(() => exports_Effect.gen(function* () { @@ -107086,19 +107310,19 @@ var init_bus = __esm(async () => { })); return { wildcard, typed }; })); - function getOrCreate(state3, def) { + function getOrCreate(state2, def) { return exports_Effect.gen(function* () { - let ps2 = state3.typed.get(def.type); + let ps2 = state2.typed.get(def.type); if (!ps2) { ps2 = yield* exports_PubSub.unbounded(); - state3.typed.set(def.type, ps2); + state2.typed.set(def.type, ps2); } return ps2; }); } function publish4(def, properties) { return exports_Effect.gen(function* () { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); const payload = { type: def.type, properties }; log7.info("publishing", { type: def.type }); const ps2 = s5.typed.get(def.type); @@ -107115,7 +107339,7 @@ var init_bus = __esm(async () => { function subscribe4(def) { log7.info("subscribing", { type: def.type }); return exports_Stream.unwrap(exports_Effect.gen(function* () { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); const ps2 = yield* getOrCreate(s5, def); return exports_Stream.fromPubSub(ps2); })).pipe(exports_Stream.ensuring(exports_Effect.sync(() => log7.info("unsubscribing", { type: def.type })))); @@ -107123,7 +107347,7 @@ var init_bus = __esm(async () => { function subscribeAll2() { log7.info("subscribing", { type: "*" }); return exports_Stream.unwrap(exports_Effect.gen(function* () { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); return exports_Stream.fromPubSub(s5.wildcard); })).pipe(exports_Stream.ensuring(exports_Effect.sync(() => log7.info("unsubscribing", { type: "*" })))); } @@ -107145,12 +107369,12 @@ var init_bus = __esm(async () => { }); } const subscribeCallback = exports_Effect.fn("Bus.subscribeCallback")(function* (def, callback5) { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); const ps2 = yield* getOrCreate(s5, def); return yield* on(ps2, def.type, callback5); }); const subscribeAllCallback = exports_Effect.fn("Bus.subscribeAllCallback")(function* (callback5) { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); return yield* on(s5.wildcard, "*", callback5); }); return Service3.of({ publish: publish4, subscribe: subscribe4, subscribeAll: subscribeAll2, subscribeCallback, subscribeAllCallback }); @@ -107292,15 +107516,15 @@ var init_repo = __esm(async () => { catch: (cause) => new AccountRepoError({ message: "Database operation failed", cause }) }); const current = (db2) => { - const state3 = db2.select().from(AccountStateTable).where(eq(AccountStateTable.id, ACCOUNT_STATE_ID)).get(); - if (!state3?.active_account_id) + const state2 = db2.select().from(AccountStateTable).where(eq(AccountStateTable.id, ACCOUNT_STATE_ID)).get(); + if (!state2?.active_account_id) return; - const account = db2.select().from(AccountTable).where(eq(AccountTable.id, state3.active_account_id)).get(); + const account = db2.select().from(AccountTable).where(eq(AccountTable.id, state2.active_account_id)).get(); if (!account) return; - return { ...account, active_org_id: state3.active_org_id ?? null }; + return { ...account, active_org_id: state2.active_org_id ?? null }; }; - const state2 = (db2, accountID, orgID) => { + const state = (db2, accountID, orgID) => { const id2 = exports_Option.getOrNull(orgID); return db2.insert(AccountStateTable).values({ id: ACCOUNT_STATE_ID, active_account_id: accountID, active_org_id: id2 }).onConflictDoUpdate({ target: AccountStateTable.id, @@ -107313,7 +107537,7 @@ var init_repo = __esm(async () => { db2.update(AccountStateTable).set({ active_account_id: null, active_org_id: null }).where(eq(AccountStateTable.active_account_id, accountID)).run(); db2.delete(AccountTable).where(eq(AccountTable.id, accountID)).run(); }).pipe(exports_Effect.asVoid)); - const use2 = exports_Effect.fn("AccountRepo.use")((accountID, orgID) => query((db2) => state2(db2, accountID, orgID)).pipe(exports_Effect.asVoid)); + const use2 = exports_Effect.fn("AccountRepo.use")((accountID, orgID) => query((db2) => state(db2, accountID, orgID)).pipe(exports_Effect.asVoid)); const getRow = exports_Effect.fn("AccountRepo.getRow")((accountID) => query((db2) => db2.select().from(AccountTable).where(eq(AccountTable.id, accountID)).get()).pipe(exports_Effect.map(exports_Option.fromNullishOr))); const persistToken = exports_Effect.fn("AccountRepo.persistToken")((input) => query((db2) => db2.update(AccountTable).set({ access_token: input.accessToken, @@ -107338,7 +107562,7 @@ var init_repo = __esm(async () => { token_expiry: input.expiry } }).run(); - state2(db2, input.id, input.orgID); + state(db2, input.id, input.orgID); }).pipe(exports_Effect.asVoid)); return AccountRepo.of({ active, @@ -107528,7 +107752,7 @@ var init_account = __esm(async () => { const { account, accessToken } = resolved.value; return yield* fetchOrgs(account.url, accessToken); }); - const config3 = exports_Effect.fn("Account.config")(function* (accountID, orgID) { + const config2 = exports_Effect.fn("Account.config")(function* (accountID, orgID) { const resolved = yield* resolveAccess(accountID); if (exports_Option.isNone(resolved)) return exports_Option.none(); @@ -107588,7 +107812,7 @@ var init_account = __esm(async () => { remove: repo.remove, use: repo.use, orgs: orgs2, - config: config3, + config: config2, token: token2, login, poll: poll5 @@ -107629,7 +107853,7 @@ var init_account = __esm(async () => { }); // packages/unifia/src/config/paths.ts -import path9 from "path"; +import path10 from "path"; import os4 from "os"; var ConfigPaths; var init_paths = __esm(async () => { @@ -107640,24 +107864,36 @@ var init_paths = __esm(async () => { init_flag(); await init_global(); ((ConfigPaths) => { + ConfigPaths.PROJECT_DIRECTORY = ".unifia"; + ConfigPaths.LEGACY_PROJECT_DIRECTORY = ".opencode"; + const PROJECT_DIRECTORIES = [ConfigPaths.LEGACY_PROJECT_DIRECTORY, ConfigPaths.PROJECT_DIRECTORY]; + function isConfigDirectory(dir3) { + return PROJECT_DIRECTORIES.some((name3) => dir3.endsWith(name3)) || dir3 === Flag.UNIFIA_CONFIG_DIR; + } + ConfigPaths.isConfigDirectory = isConfigDirectory; + function isLegacyDirectory(dir3) { + return dir3.endsWith(ConfigPaths.LEGACY_PROJECT_DIRECTORY); + } + ConfigPaths.isLegacyDirectory = isLegacyDirectory; function searchStop(input) { return input.vcs === "git" ? input.worktree : undefined; } ConfigPaths.searchStop = searchStop; - async function projectFiles(name3, directory, stop2) { - return Filesystem.findUp([`${name3}.json`, `${name3}.jsonc`], directory, stop2, { rootFirst: true }); + async function projectFiles(name3, directory, stop2, legacy) { + const targets = legacy ? [`${legacy}.json`, `${legacy}.jsonc`, `${name3}.json`, `${name3}.jsonc`] : [`${name3}.json`, `${name3}.jsonc`]; + return Filesystem.findUp(targets, directory, stop2, { rootFirst: true }); } ConfigPaths.projectFiles = projectFiles; async function directories(directory, stop2) { return [ Global.Path.config, ...!Flag.UNIFIA_DISABLE_PROJECT_CONFIG ? await Array.fromAsync(Filesystem.up({ - targets: [".opencode"], + targets: PROJECT_DIRECTORIES, start: directory, stop: stop2 })) : [], ...await Array.fromAsync(Filesystem.up({ - targets: [".opencode"], + targets: PROJECT_DIRECTORIES, start: Global.Path.home, stop: Global.Path.home })), @@ -107666,7 +107902,7 @@ var init_paths = __esm(async () => { } ConfigPaths.directories = directories; function fileInDirectory(dir3, name3) { - return [path9.join(dir3, `${name3}.json`), path9.join(dir3, `${name3}.jsonc`)]; + return [path10.join(dir3, `${name3}.json`), path10.join(dir3, `${name3}.jsonc`)]; } ConfigPaths.fileInDirectory = fileInDirectory; ConfigPaths.JsonError = NamedError.create("ConfigJsonError", zod_default.object({ @@ -107690,7 +107926,7 @@ var init_paths = __esm(async () => { return typeof input === "string" ? input : input.source; } function dir2(input) { - return typeof input === "string" ? path9.dirname(input) : input.dir; + return typeof input === "string" ? path10.dirname(input) : input.dir; } async function substitute(text5, input, missing = "error") { text5 = text5.replace(/\{env:([^}]+)\}/g, (_3, varName) => { @@ -107717,9 +107953,9 @@ var init_paths = __esm(async () => { } let filePath = token.replace(/^\{file:/, "").replace(/\}$/, ""); if (filePath.startsWith("~/")) { - filePath = path9.join(os4.homedir(), filePath.slice(2)); + filePath = path10.join(os4.homedir(), filePath.slice(2)); } - const resolvedPath = path9.isAbsolute(filePath) ? filePath : path9.resolve(configDir, filePath); + const resolvedPath = path10.isAbsolute(filePath) ? filePath : path10.resolve(configDir, filePath); const fileContent = (await Filesystem.readText(resolvedPath).catch((error46) => { if (missing === "empty") return ""; @@ -107789,7 +108025,7 @@ var init_hash = __esm(() => { }); // packages/unifia/src/util/flock.ts -import path10 from "path"; +import path11 from "path"; import os5 from "os"; import { randomBytes as randomBytes5, randomUUID } from "crypto"; import { mkdir as mkdir3, readFile as readFile4, rm as rm2, stat as stat3, utimes as utimes3, writeFile as writeFile5 } from "fs/promises"; @@ -107798,7 +108034,7 @@ var init_flock = __esm(async () => { init_hash(); await init_global(); ((Flock) => { - const root = path10.join(Global.Path.state, "locks"); + const root = path11.join(Global.Path.state, "locks"); const defaultOpts = { staleMs: 60000, timeoutMs: 5 * 60000, @@ -107874,8 +108110,8 @@ var init_flock = __esm(async () => { } async function tryAcquireLockDir(lockDir, opts) { const token = randomUUID?.() ?? randomBytes5(16).toString("hex"); - const metaPath = path10.join(lockDir, "meta.json"); - const heartbeatPath = path10.join(lockDir, "heartbeat"); + const metaPath = path11.join(lockDir, "meta.json"); + const heartbeatPath = path11.join(lockDir, "heartbeat"); try { await mkdir3(lockDir, { mode: 448 }); } catch (err2) { @@ -108020,7 +108256,7 @@ var init_flock = __esm(async () => { }; const dir2 = input.dir ?? root; await mkdir3(dir2, { recursive: true }); - const lockfile = path10.join(dir2, Hash.fast(key) + ".lock"); + const lockfile = path11.join(dir2, Hash.fast(key) + ".lock"); const lock = await acquireLockDir(lockfile, { key, onWait: input.onWait, @@ -109289,11 +109525,11 @@ var require_commonjs3 = __commonJS((exports) => { return (f4) => f4.length === len && f4 !== "." && f4 !== ".."; }; var defaultPlatform2 = typeof process === "object" && process ? typeof process.env === "object" && process.env && process.env.__MINIMATCH_TESTING_PLATFORM__ || process.platform : "posix"; - var path11 = { + var path12 = { win32: { sep: "\\" }, posix: { sep: "/" } }; - exports.sep = defaultPlatform2 === "win32" ? path11.win32.sep : path11.posix.sep; + exports.sep = defaultPlatform2 === "win32" ? path12.win32.sep : path12.posix.sep; exports.minimatch.sep = exports.sep; exports.GLOBSTAR = Symbol("globstar **"); exports.minimatch.GLOBSTAR = exports.GLOBSTAR; @@ -111035,13 +111271,13 @@ var require_hosts = __commonJS((exports, module2) => { var defaults2 = { sshtemplate: ({ domain: domain3, user, project, committish }) => `git@${domain3}:${user}/${project}.git${maybeJoin("#", committish)}`, sshurltemplate: ({ domain: domain3, user, project, committish }) => `git+ssh://git@${domain3}/${user}/${project}.git${maybeJoin("#", committish)}`, - edittemplate: ({ domain: domain3, user, project, committish, editpath, path: path11 }) => `https://${domain3}/${user}/${project}${maybeJoin("/", editpath, "/", maybeEncode(committish || "HEAD"), "/", path11)}`, + edittemplate: ({ domain: domain3, user, project, committish, editpath, path: path12 }) => `https://${domain3}/${user}/${project}${maybeJoin("/", editpath, "/", maybeEncode(committish || "HEAD"), "/", path12)}`, browsetemplate: ({ domain: domain3, user, project, committish, treepath }) => `https://${domain3}/${user}/${project}${maybeJoin("/", treepath, "/", maybeEncode(committish))}`, - browsetreetemplate: ({ domain: domain3, user, project, committish, treepath, path: path11, fragment, hashformat }) => `https://${domain3}/${user}/${project}/${treepath}/${maybeEncode(committish || "HEAD")}/${path11}${maybeJoin("#", hashformat(fragment || ""))}`, - browseblobtemplate: ({ domain: domain3, user, project, committish, blobpath, path: path11, fragment, hashformat }) => `https://${domain3}/${user}/${project}/${blobpath}/${maybeEncode(committish || "HEAD")}/${path11}${maybeJoin("#", hashformat(fragment || ""))}`, + browsetreetemplate: ({ domain: domain3, user, project, committish, treepath, path: path12, fragment, hashformat }) => `https://${domain3}/${user}/${project}/${treepath}/${maybeEncode(committish || "HEAD")}/${path12}${maybeJoin("#", hashformat(fragment || ""))}`, + browseblobtemplate: ({ domain: domain3, user, project, committish, blobpath, path: path12, fragment, hashformat }) => `https://${domain3}/${user}/${project}/${blobpath}/${maybeEncode(committish || "HEAD")}/${path12}${maybeJoin("#", hashformat(fragment || ""))}`, docstemplate: ({ domain: domain3, user, project, treepath, committish }) => `https://${domain3}/${user}/${project}${maybeJoin("/", treepath, "/", maybeEncode(committish))}#readme`, httpstemplate: ({ auth, domain: domain3, user, project, committish }) => `git+https://${maybeJoin(auth, "@")}${domain3}/${user}/${project}.git${maybeJoin("#", committish)}`, - filetemplate: ({ domain: domain3, user, project, committish, path: path11 }) => `https://${domain3}/${user}/${project}/raw/${maybeEncode(committish || "HEAD")}/${path11}`, + filetemplate: ({ domain: domain3, user, project, committish, path: path12 }) => `https://${domain3}/${user}/${project}/raw/${maybeEncode(committish || "HEAD")}/${path12}`, shortcuttemplate: ({ type: type3, user, project, committish }) => `${type3}:${user}/${project}${maybeJoin("#", committish)}`, pathtemplate: ({ user, project, committish }) => `${user}/${project}${maybeJoin("#", committish)}`, bugstemplate: ({ domain: domain3, user, project }) => `https://${domain3}/${user}/${project}/issues`, @@ -111054,7 +111290,7 @@ var require_hosts = __commonJS((exports, module2) => { treepath: "tree", blobpath: "blob", editpath: "edit", - filetemplate: ({ auth, user, project, committish, path: path11 }) => `https://${maybeJoin(auth, "@")}raw.githubusercontent.com/${user}/${project}/${maybeEncode(committish || "HEAD")}/${path11}`, + filetemplate: ({ auth, user, project, committish, path: path12 }) => `https://${maybeJoin(auth, "@")}raw.githubusercontent.com/${user}/${project}/${maybeEncode(committish || "HEAD")}/${path12}`, gittemplate: ({ auth, domain: domain3, user, project, committish }) => `git://${maybeJoin(auth, "@")}${domain3}/${user}/${project}.git${maybeJoin("#", committish)}`, tarballtemplate: ({ domain: domain3, user, project, committish }) => `https://codeload.${domain3}/${user}/${project}/tar.gz/${maybeEncode(committish || "HEAD")}`, extract: (url3) => { @@ -111080,7 +111316,7 @@ var require_hosts = __commonJS((exports, module2) => { treepath: "src", blobpath: "src", editpath: "?mode=edit", - edittemplate: ({ domain: domain3, user, project, committish, treepath, path: path11, editpath }) => `https://${domain3}/${user}/${project}${maybeJoin("/", treepath, "/", maybeEncode(committish || "HEAD"), "/", path11, editpath)}`, + edittemplate: ({ domain: domain3, user, project, committish, treepath, path: path12, editpath }) => `https://${domain3}/${user}/${project}${maybeJoin("/", treepath, "/", maybeEncode(committish || "HEAD"), "/", path12, editpath)}`, tarballtemplate: ({ domain: domain3, user, project, committish }) => `https://${domain3}/${user}/${project}/get/${maybeEncode(committish || "HEAD")}.tar.gz`, extract: (url3) => { let [, user, project, aux] = url3.pathname.split("/", 4); @@ -111104,11 +111340,11 @@ var require_hosts = __commonJS((exports, module2) => { editpath: "-/edit", tarballtemplate: ({ domain: domain3, user, project, committish }) => `https://${domain3}/api/v4/projects/${maybeEncode(user + "/" + project)}/repository/archive.tar.gz?sha=${maybeEncode(committish || "HEAD")}`, extract: (url3) => { - const path11 = url3.pathname.slice(1); - if (path11.includes("/-/") || path11.includes("/archive.tar.gz")) { + const path12 = url3.pathname.slice(1); + if (path12.includes("/-/") || path12.includes("/archive.tar.gz")) { return; } - const segments = path11.split("/"); + const segments = path12.split("/"); let project = segments.pop(); if (project.endsWith(".git")) { project = project.slice(0, -4); @@ -111128,11 +111364,11 @@ var require_hosts = __commonJS((exports, module2) => { sshurltemplate: ({ domain: domain3, project, committish }) => `git+ssh://git@${domain3}/${project}.git${maybeJoin("#", committish)}`, edittemplate: ({ domain: domain3, user, project, committish, editpath }) => `https://${domain3}/${user}/${project}${maybeJoin("/", maybeEncode(committish))}/${editpath}`, browsetemplate: ({ domain: domain3, project, committish }) => `https://${domain3}/${project}${maybeJoin("/", maybeEncode(committish))}`, - browsetreetemplate: ({ domain: domain3, project, committish, path: path11, hashformat }) => `https://${domain3}/${project}${maybeJoin("/", maybeEncode(committish))}${maybeJoin("#", hashformat(path11))}`, - browseblobtemplate: ({ domain: domain3, project, committish, path: path11, hashformat }) => `https://${domain3}/${project}${maybeJoin("/", maybeEncode(committish))}${maybeJoin("#", hashformat(path11))}`, + browsetreetemplate: ({ domain: domain3, project, committish, path: path12, hashformat }) => `https://${domain3}/${project}${maybeJoin("/", maybeEncode(committish))}${maybeJoin("#", hashformat(path12))}`, + browseblobtemplate: ({ domain: domain3, project, committish, path: path12, hashformat }) => `https://${domain3}/${project}${maybeJoin("/", maybeEncode(committish))}${maybeJoin("#", hashformat(path12))}`, docstemplate: ({ domain: domain3, project, committish }) => `https://${domain3}/${project}${maybeJoin("/", maybeEncode(committish))}`, httpstemplate: ({ domain: domain3, project, committish }) => `git+https://${domain3}/${project}.git${maybeJoin("#", committish)}`, - filetemplate: ({ user, project, committish, path: path11 }) => `https://gist.githubusercontent.com/${user}/${project}/raw${maybeJoin("/", maybeEncode(committish))}/${path11}`, + filetemplate: ({ user, project, committish, path: path12 }) => `https://gist.githubusercontent.com/${user}/${project}/raw${maybeJoin("/", maybeEncode(committish))}/${path12}`, shortcuttemplate: ({ type: type3, project, committish }) => `${type3}:${project}${maybeJoin("#", committish)}`, pathtemplate: ({ project, committish }) => `${project}${maybeJoin("#", committish)}`, bugstemplate: ({ domain: domain3, project }) => `https://${domain3}/${project}`, @@ -111164,7 +111400,7 @@ var require_hosts = __commonJS((exports, module2) => { domain: "git.sr.ht", treepath: "tree", blobpath: "tree", - filetemplate: ({ domain: domain3, user, project, committish, path: path11 }) => `https://${domain3}/${user}/${project}/blob/${maybeEncode(committish) || "HEAD"}/${path11}`, + filetemplate: ({ domain: domain3, user, project, committish, path: path12 }) => `https://${domain3}/${user}/${project}/blob/${maybeEncode(committish) || "HEAD"}/${path12}`, httpstemplate: ({ domain: domain3, user, project, committish }) => `https://${domain3}/${user}/${project}${maybeJoin("#", committish)}`, tarballtemplate: ({ domain: domain3, user, project, committish }) => `https://${domain3}/${user}/${project}/archive/${maybeEncode(committish) || "HEAD"}.tar.gz`, bugstemplate: () => null, @@ -111345,8 +111581,8 @@ var require_lib6 = __commonJS((exports, module2) => { return null; } const proto = /(?:git\+)http:$/.test(protocol) ? "http:" : "https:"; - const path11 = pathname.replace(/\.git$/, ""); - return `${proto}//${hostname3}${path11}`; + const path12 = pathname.replace(/\.git$/, ""); + return `${proto}//${hostname3}${path12}`; } catch { return null; } @@ -111439,20 +111675,20 @@ var require_lib6 = __commonJS((exports, module2) => { sshurl(opts) { return this.#fill(this.sshurltemplate, opts); } - browse(path11, ...args3) { - if (typeof path11 !== "string") { - return this.#fill(this.browsetemplate, path11); + browse(path12, ...args3) { + if (typeof path12 !== "string") { + return this.#fill(this.browsetemplate, path12); } if (typeof args3[0] !== "string") { - return this.#fill(this.browsetreetemplate, { ...args3[0], path: path11 }); + return this.#fill(this.browsetreetemplate, { ...args3[0], path: path12 }); } - return this.#fill(this.browsetreetemplate, { ...args3[1], fragment: args3[0], path: path11 }); + return this.#fill(this.browsetreetemplate, { ...args3[1], fragment: args3[0], path: path12 }); } - browseFile(path11, ...args3) { + browseFile(path12, ...args3) { if (typeof args3[0] !== "string") { - return this.#fill(this.browseblobtemplate, { ...args3[0], path: path11 }); + return this.#fill(this.browseblobtemplate, { ...args3[0], path: path12 }); } - return this.#fill(this.browseblobtemplate, { ...args3[1], fragment: args3[0], path: path11 }); + return this.#fill(this.browseblobtemplate, { ...args3[1], fragment: args3[0], path: path12 }); } docs(opts) { return this.#fill(this.docstemplate, opts); @@ -111475,11 +111711,11 @@ var require_lib6 = __commonJS((exports, module2) => { tarball(opts) { return this.#fill(this.tarballtemplate, { ...opts, noCommittish: false }); } - file(path11, opts) { - return this.#fill(this.filetemplate, { ...opts, path: path11 }); + file(path12, opts) { + return this.#fill(this.filetemplate, { ...opts, path: path12 }); } - edit(path11, opts) { - return this.#fill(this.edittemplate, { ...opts, path: path11 }); + edit(path12, opts) { + return this.#fill(this.edittemplate, { ...opts, path: path12 }); } getDefaultRepresentation() { return this.default; @@ -111960,7 +112196,7 @@ var require_index_min3 = __commonJS((exports) => { var H3 = R3((g2) => { Object.defineProperty(g2, "__esModule", { value: true }); g2.unescape = g2.escape = g2.AST = g2.Minimatch = g2.match = g2.makeRe = g2.braceExpand = g2.defaults = g2.filter = g2.GLOBSTAR = g2.sep = g2.minimatch = undefined; - var Si2 = Ke2(), jt2 = Xe2(), is8 = pe2(), vi2 = me2(), Ei2 = kt2(), _i2 = (n10, t2, e2 = {}) => ((0, jt2.assertValidPattern)(t2), !e2.nocomment && t2.charAt(0) === "#" ? false : new J2(t2, e2).match(n10)); + var Si2 = Ke2(), jt2 = Xe2(), is7 = pe2(), vi2 = me2(), Ei2 = kt2(), _i2 = (n10, t2, e2 = {}) => ((0, jt2.assertValidPattern)(t2), !e2.nocomment && t2.charAt(0) === "#" ? false : new J2(t2, e2).match(n10)); g2.minimatch = _i2; var Oi2 = /^\*+([^+@!?\*\[\(]*)$/, xi2 = (n10) => (t2) => !t2.startsWith(".") && t2.endsWith(n10), Ti2 = (n10) => (t2) => t2.endsWith(n10), Ci2 = (n10) => (n10 = n10.toLowerCase(), (t2) => !t2.startsWith(".") && t2.toLowerCase().endsWith(n10)), Ri2 = (n10) => (n10 = n10.toLowerCase(), (t2) => t2.toLowerCase().endsWith(n10)), Ai2 = /^\*+\.\*+$/, ki2 = (n10) => !n10.startsWith(".") && n10.includes("."), Mi2 = (n10) => n10 !== "." && n10 !== ".." && n10.includes("."), Pi2 = /^\.\*+$/, Di2 = (n10) => n10 !== "." && n10 !== ".." && n10.startsWith("."), Fi2 = /^\*+$/, ji2 = (n10) => n10.length !== 0 && !n10.startsWith("."), Ni2 = (n10) => n10.length !== 0 && n10 !== "." && n10 !== "..", Li2 = /^\?+([^+@!?\*\[\(]*)?$/, Wi2 = ([n10, t2 = ""]) => { let e2 = rs2([n10]); @@ -112271,7 +112507,7 @@ globstar while`, t2, d4, e2, u6, m3), this.matchOne(t2.slice(d4), e2.slice(u6), return ""; let s5, i6 = null; (s5 = t2.match(Fi2)) ? i6 = e2.dot ? Ni2 : ji2 : (s5 = t2.match(Oi2)) ? i6 = (e2.nocase ? e2.dot ? Ri2 : Ci2 : e2.dot ? Ti2 : xi2)(s5[1]) : (s5 = t2.match(Li2)) ? i6 = (e2.nocase ? e2.dot ? Bi2 : Wi2 : e2.dot ? Ii2 : Gi)(s5) : (s5 = t2.match(Ai2)) ? i6 = e2.dot ? Mi2 : ki2 : (s5 = t2.match(Pi2)) && (i6 = Di2); - let r4 = is8.AST.fromGlob(t2, this.options).toMMPattern(); + let r4 = is7.AST.fromGlob(t2, this.options).toMMPattern(); return i6 && typeof r4 == "object" && Reflect.defineProperty(r4, "test", { value: i6 }), r4; } makeRe() { @@ -112352,7 +112588,7 @@ globstar while`, t2, d4, e2, u6, m3), this.matchOne(t2.slice(d4), e2.slice(u6), Object.defineProperty(g2, "unescape", { enumerable: true, get: function() { return tr2.unescape; } }); - g2.minimatch.AST = is8.AST; + g2.minimatch.AST = is7.AST; g2.minimatch.Minimatch = J2; g2.minimatch.escape = vi2.escape; g2.minimatch.unescape = Ei2.unescape; @@ -116742,9 +116978,9 @@ var require_ini = __commonJS((exports, module2) => { var require_opts = __commonJS((exports, module2) => { var fs6 = __require("fs"); var os6 = __require("os"); - var path11 = __require("path"); + var path12 = __require("path"); var ini = require_ini(); - var gitConfigPath = path11.join(os6.homedir(), ".gitconfig"); + var gitConfigPath = path12.join(os6.homedir(), ".gitconfig"); var cachedConfig = null; var loadGitConfig = () => { if (cachedConfig === null) { @@ -116761,10 +116997,10 @@ var require_opts = __commonJS((exports, module2) => { return cachedConfig; }; var checkGitConfigs = () => { - const config3 = loadGitConfig(); + const config2 = loadGitConfig(); return { - sshCommandSetInConfig: config3?.core?.sshCommand !== undefined, - askPassSetInConfig: config3?.core?.askpass !== undefined + sshCommandSetInConfig: config2?.core?.sshCommand !== undefined, + askPassSetInConfig: config2?.core?.askpass !== undefined }; }; var sshCommandSetInEnv = process.env.GIT_SSH_COMMAND !== undefined; @@ -117077,7 +117313,7 @@ var require_lib9 = __commonJS((exports, module2) => { var require_npa = __commonJS((exports, module2) => { var isWindows = process.platform === "win32"; var { URL: URL3 } = __require("url"); - var path11 = isWindows ? __require("path/win32") : __require("path"); + var path12 = isWindows ? __require("path/win32") : __require("path"); var { homedir } = __require("os"); var HostedGit = require_lib6(); var semver2 = require_semver2(); @@ -117333,7 +117569,7 @@ var require_npa = __commonJS((exports, module2) => { let resolvedUrl; let specUrl; try { - resolvedUrl = new URL3(rawSpec, `${pathToFileURL2(path11.resolve(where))}/`); + resolvedUrl = new URL3(rawSpec, `${pathToFileURL2(path12.resolve(where))}/`); specUrl = new URL3(rawSpec); } catch (originalError) { const er2 = new Error("Invalid file: URL, must comply with RFC 8089"); @@ -117352,13 +117588,13 @@ var require_npa = __commonJS((exports, module2) => { } if (/^\/~(\/|$)/.test(specPath)) { res.saveSpec = `file:${specPath.substr(1)}`; - resolvedPath = path11.resolve(homedir(), specPath.substr(3)); - } else if (!path11.isAbsolute(rawSpec.slice(5))) { - res.saveSpec = `file:${path11.relative(where, resolvedPath)}`; + resolvedPath = path12.resolve(homedir(), specPath.substr(3)); + } else if (!path12.isAbsolute(rawSpec.slice(5))) { + res.saveSpec = `file:${path12.relative(where, resolvedPath)}`; } else { - res.saveSpec = `file:${path11.resolve(resolvedPath)}`; + res.saveSpec = `file:${path12.resolve(resolvedPath)}`; } - res.fetchSpec = path11.resolve(where, resolvedPath); + res.fetchSpec = path12.resolve(where, resolvedPath); res.saveSpec = res.saveSpec.split("\\").join("/"); if (res.saveSpec.startsWith("file://")) { res.saveSpec = `file:/${res.saveSpec.slice(7)}`; @@ -117964,7 +118200,7 @@ var require_clone = __commonJS((exports, module2) => { "bitbucket.org" ]); var { parse: parse11 } = __require("url"); - var path11 = __require("path"); + var path12 = __require("path"); var getRevs = require_revs(); var spawn = require_spawn(); var { isWindows } = require_utils2(); @@ -117977,7 +118213,7 @@ var require_clone = __commonJS((exports, module2) => { } return shallowHosts.has(parse11(repo).host); }; - var defaultTarget = (repo, cwd = process.cwd()) => path11.resolve(cwd, path11.basename(repo.replace(/[/\\]?\.git$/, ""))); + var defaultTarget = (repo, cwd = process.cwd()) => path12.resolve(cwd, path12.basename(repo.replace(/[/\\]?\.git$/, ""))); var clone3 = (repo, revs, ref, revDoc, target, opts) => { if (!revDoc) { return unresolved(repo, ref, target, opts); @@ -118077,11 +118313,11 @@ var require_is = __commonJS((exports, module2) => { // node_modules/@npmcli/git/lib/find.js var require_find = __commonJS((exports, module2) => { - var is8 = require_is(); + var is7 = require_is(); var { dirname: dirname6 } = __require("path"); module2.exports = async ({ cwd = process.cwd(), root } = {}) => { while (true) { - if (await is8({ cwd })) { + if (await is7({ cwd })) { return cwd; } const next3 = dirname6(cwd); @@ -118117,7 +118353,7 @@ var require_normalize = __commonJS((exports, module2) => { var valid = require_valid(); var clean = require_clean(); var fs6 = __require("fs/promises"); - var path11 = __require("path"); + var path12 = __require("path"); var { log: log7 } = require_lib5(); var moduleBuiltin = __require("module"); var _hostedGitInfo; @@ -118142,7 +118378,7 @@ var require_normalize = __commonJS((exports, module2) => { } else if (Array.isArray(pkg.bin)) { changes4?.push('"bin" was converted to an object'); pkg.bin = pkg.bin.reduce((acc, k3) => { - acc[path11.basename(k3)] = k3; + acc[path12.basename(k3)] = k3; return acc; }, {}); } @@ -118153,7 +118389,7 @@ var require_normalize = __commonJS((exports, module2) => { changes4?.push(`removed invalid "bin[${binKey}]"`); continue; } - const base2 = path11.basename(secureAndUnixifyPath(binKey)); + const base2 = path12.basename(secureAndUnixifyPath(binKey)); if (!base2) { delete pkg.bin[binKey]; changes4?.push(`removed invalid "bin[${binKey}]"`); @@ -118219,7 +118455,7 @@ var require_normalize = __commonJS((exports, module2) => { return ref.replace(/\\|:/g, "/"); } function secureAndUnixifyPath(ref) { - const secured = unixifyPath(path11.join(".", path11.join("/", unixifyPath(ref)))); + const secured = unixifyPath(path12.join(".", path12.join("/", unixifyPath(ref)))); return secured.startsWith("./") ? "" : secured; } function syncSteps(pkg, { strict, steps, changes: changes4, allowLegacyCase }) { @@ -118440,7 +118676,7 @@ var require_normalize = __commonJS((exports, module2) => { } if (steps.includes("serverjs") && !scripts.start) { try { - await fs6.access(path11.join(pkg.path, "server.js")); + await fs6.access(path12.join(pkg.path, "server.js")); scripts.start = "node server.js"; data2.scripts = scripts; changes4?.push('"scripts.start" was set to "node server.js"'); @@ -118448,7 +118684,7 @@ var require_normalize = __commonJS((exports, module2) => { } if (steps.includes("authors") && !data2.contributors) { try { - const authorData = await fs6.readFile(path11.join(pkg.path, "AUTHORS"), "utf8"); + const authorData = await fs6.readFile(path12.join(pkg.path, "AUTHORS"), "utf8"); const authors = authorData.split(/\r?\n/g).map((line2) => line2.replace(/^\s*#.*$/, "").trim()).filter((line2) => line2); data2.contributors = authors; changes4?.push('"contributors" was auto-populated with the contents of the "AUTHORS" file'); @@ -118463,7 +118699,7 @@ var require_normalize = __commonJS((exports, module2) => { }); let readmeFile; for (const file4 of files) { - if (!file4.endsWith(path11.sep)) { + if (!file4.endsWith(path12.sep)) { if (file4.match(mdre)) { readmeFile = file4; break; @@ -118474,7 +118710,7 @@ var require_normalize = __commonJS((exports, module2) => { } } if (readmeFile) { - const readmeData = await fs6.readFile(path11.join(pkg.path, readmeFile), "utf8"); + const readmeData = await fs6.readFile(path12.join(pkg.path, readmeFile), "utf8"); data2.readme = readmeData; data2.readmeFilename = readmeFile; changes4?.push(`"readme" was set to the contents of ${readmeFile}`); @@ -118487,18 +118723,18 @@ var require_normalize = __commonJS((exports, module2) => { if (steps.includes("mans")) { if (data2.directories?.man && !data2.man) { const manDir = secureAndUnixifyPath(data2.directories.man); - const cwd = path11.resolve(pkg.path, manDir); + const cwd = path12.resolve(pkg.path, manDir); const files = await lazyLoadGlob()("**/*.[0-9]", { cwd }); - data2.man = files.map((man) => path11.relative(pkg.path, path11.join(cwd, man)).split(path11.sep).join("/")); + data2.man = files.map((man) => path12.relative(pkg.path, path12.join(cwd, man)).split(path12.sep).join("/")); } normalizePackageMan(data2, changes4); } if (steps.includes("binDir") && data2.directories?.bin && !data2.bin && pkg.path) { const binPath = secureAndUnixifyPath(data2.directories.bin); - const bins = await lazyLoadGlob()("**", { cwd: path11.resolve(pkg.path, binPath) }); + const bins = await lazyLoadGlob()("**", { cwd: path12.resolve(pkg.path, binPath) }); data2.bin = bins.reduce((acc, binFile) => { if (binFile && !binFile.startsWith(".")) { - const binName = path11.basename(binFile); + const binName = path12.basename(binFile); acc[binName] = `${binPath}/${secureAndUnixifyPath(binFile)}`; } return acc; @@ -118512,20 +118748,20 @@ var require_normalize = __commonJS((exports, module2) => { let head7; if (gitRoot) { try { - head7 = await fs6.readFile(path11.resolve(gitRoot, ".git/HEAD"), "utf8"); + head7 = await fs6.readFile(path12.resolve(gitRoot, ".git/HEAD"), "utf8"); } catch (err2) {} } let headData; if (head7) { if (head7.startsWith("ref: ")) { const headRef = head7.replace(/^ref: /, "").trim(); - const headFile = path11.resolve(gitRoot, ".git", headRef); + const headFile = path12.resolve(gitRoot, ".git", headRef); try { headData = await fs6.readFile(headFile, "utf8"); headData = headData.replace(/^ref: /, "").trim(); } catch (err2) {} if (!headData) { - const packFile = path11.resolve(gitRoot, ".git/packed-refs"); + const packFile = path12.resolve(gitRoot, ".git/packed-refs"); try { let refs = await fs6.readFile(packFile, "utf8"); if (refs) { @@ -118554,20 +118790,20 @@ var require_normalize = __commonJS((exports, module2) => { if (typeof index3 !== "string") { throw new TypeError('The "main" attribute must be of type string.'); } - const extless = path11.join(path11.dirname(index3), path11.basename(index3, path11.extname(index3))); + const extless = path12.join(path12.dirname(index3), path12.basename(index3, path12.extname(index3))); const dts = `./${extless}.d.ts`; const hasDTSFields = "types" in data2 || "typings" in data2; if (!hasDTSFields) { try { - await fs6.access(path11.join(pkg.path, dts)); - data2.types = dts.split(path11.sep).join("/"); + await fs6.access(path12.join(pkg.path, dts)); + data2.types = dts.split(path12.sep).join("/"); } catch {} } } if (steps.includes("binRefs") && data2.bin instanceof Object) { for (const key in data2.bin) { try { - await fs6.access(path11.resolve(pkg.path, data2.bin[key])); + await fs6.access(path12.resolve(pkg.path, data2.bin[key])); } catch { log7.warn("package-json", pkgId, `No bin file found at ${data2.bin[key]}`); } @@ -118650,7 +118886,7 @@ var require_sort2 = __commonJS((exports, module2) => { files, workspaces, scripts, - config: config3, + config: config2, dependencies, devDependencies, peerDependencies, @@ -118693,7 +118929,7 @@ var require_sort2 = __commonJS((exports, module2) => { ...typeof files !== "undefined" ? { files } : {}, ...typeof workspaces !== "undefined" ? { workspaces } : {}, ...typeof scripts !== "undefined" ? { scripts } : {}, - ...typeof config3 !== "undefined" ? { config: config3 } : {}, + ...typeof config2 !== "undefined" ? { config: config2 } : {}, ...typeof dependencies !== "undefined" ? { dependencies } : {}, ...typeof devDependencies !== "undefined" ? { devDependencies } : {}, ...typeof peerDependencies !== "undefined" ? { peerDependencies } : {}, @@ -118778,49 +119014,49 @@ var require_lib14 = __commonJS((exports, module2) => { "normalizeData", "binRefs" ]); - static async create(path11, opts = {}) { + static async create(path12, opts = {}) { const p2 = new PackageJson; - await p2.create(path11); + await p2.create(path12); if (opts.data) { return p2.update(opts.data); } return p2; } - static async load(path11, opts = {}) { + static async load(path12, opts = {}) { const p2 = new PackageJson; if (!opts.create) { - return p2.load(path11); + return p2.load(path12); } try { - return await p2.load(path11); + return await p2.load(path12); } catch (err2) { if (!err2.message.startsWith("Could not read package.json")) { throw err2; } - return await p2.create(path11); + return await p2.create(path12); } } - static async fix(path11, opts) { + static async fix(path12, opts) { const p2 = new PackageJson; - await p2.load(path11, true); + await p2.load(path12, true); return p2.fix(opts); } - static async prepare(path11, opts) { + static async prepare(path12, opts) { const p2 = new PackageJson; - await p2.load(path11, true); + await p2.load(path12, true); return p2.prepare(opts); } - static async normalize(path11, opts) { + static async normalize(path12, opts) { const p2 = new PackageJson; - await p2.load(path11); + await p2.load(path12); return p2.normalize(opts); } #path; #manifest; #readFileContent = ""; #canSave = true; - async load(path11, parseIndex) { - this.#path = path11; + async load(path12, parseIndex) { + this.#path = path12; let parseErr; try { this.#readFileContent = await read3(this.filename); @@ -118887,8 +119123,8 @@ var require_lib14 = __commonJS((exports, module2) => { } return; } - create(path11) { - this.#path = path11; + create(path12) { + this.#path = path12; this.#manifest = {}; return this; } @@ -118957,7 +119193,7 @@ var require_lib14 = __commonJS((exports, module2) => { // node_modules/@npmcli/map-workspaces/lib/index.js var require_lib15 = __commonJS((exports, module2) => { - var path11 = __require("path"); + var path12 = __require("path"); var getName = require_lib3(); var { minimatch: minimatch2 } = require_commonjs3(); var pkgJson = require_lib14(); @@ -119050,7 +119286,7 @@ var require_lib15 = __commonJS((exports, module2) => { for (const match17 of orderedMatches) { let pkg; try { - pkg = await pkgJson.normalize(path11.join(opts.cwd, match17)); + pkg = await pkgJson.normalize(path12.join(opts.cwd, match17)); } catch (err2) { if (err2.code === "ENOENT" || err2.code === "ENOTDIR") { continue; @@ -119116,7 +119352,7 @@ var require_lib15 = __commonJS((exports, module2) => { } for (const pattern of patterns) { for (const packageKey of minimatch2.match(packageKeys, pattern)) { - const packagePathname = path11.join(opts.cwd, packageKey); + const packagePathname = path12.join(opts.cwd, packageKey); const name3 = getPackageName(packages[packageKey], packagePathname); results.set(packagePathname, name3); } @@ -121441,8 +121677,8 @@ var require_polyfill = __commonJS((exports, module2) => { return cpFn(toNamespacedPath(getValidatedPath(src)), toNamespacedPath(getValidatedPath(dest)), { ...defaultOptions2, ...opts }); } function getValidatedPath(fileURLOrPath) { - const path11 = fileURLOrPath != null && fileURLOrPath.href && fileURLOrPath.origin ? fileURLToPath3(fileURLOrPath) : fileURLOrPath; - return path11; + const path12 = fileURLOrPath != null && fileURLOrPath.href && fileURLOrPath.origin ? fileURLToPath3(fileURLOrPath) : fileURLOrPath; + return path12; } async function cpFn(src, dest, opts) { if (opts.preserveTimestamps && process.arch === "ia32") { @@ -121547,7 +121783,7 @@ var require_polyfill = __commonJS((exports, module2) => { } return checkParentPaths(src, srcStat, destParent); } - var normalizePathToArray = (path11) => resolve9(path11).split(sep2).filter(Boolean); + var normalizePathToArray = (path12) => resolve9(path12).split(sep2).filter(Boolean); function isSrcSubdir(src, dest) { const srcArr = normalizePathToArray(src); const destArr = normalizePathToArray(dest); @@ -121789,9 +122025,9 @@ var require_readdir_scoped = __commonJS((exports, module2) => { var require_move_file = __commonJS((exports, module2) => { var { dirname: dirname6, join: join12, resolve: resolve9, relative: relative4, isAbsolute } = __require("path"); var fs6 = __require("fs/promises"); - var pathExists = async (path11) => { + var pathExists = async (path12) => { try { - await fs6.access(path11); + await fs6.access(path12); return true; } catch (er2) { return er2.code !== "ENOENT"; @@ -121866,17 +122102,17 @@ var require_tmp = __commonJS((exports, module2) => { var crypto3 = __require("crypto"); var { withTempDir } = require_lib17(); var fs6 = __require("fs/promises"); - var path11 = __require("path"); + var path12 = __require("path"); exports.mkdir = mktmpdir; exports.tmpName = function tmpName(cache4, tmpPrefix) { const id2 = crypto3.randomUUID(); - return path11.join(cache4, "tmp", tmpPrefix ? `${tmpPrefix}-${id2}` : id2); + return path12.join(cache4, "tmp", tmpPrefix ? `${tmpPrefix}-${id2}` : id2); }; async function mktmpdir(cache4, opts = {}) { const { tmpPrefix } = opts; - const tmpDir = path11.join(cache4, "tmp"); + const tmpDir = path12.join(cache4, "tmp"); await fs6.mkdir(tmpDir, { recursive: true, owner: "inherit" }); - const target = `${tmpDir}${path11.sep}${tmpPrefix || ""}`; + const target = `${tmpDir}${path12.sep}${tmpPrefix || ""}`; return fs6.mkdtemp(target, { owner: "inherit" }); } exports.withTmp = withTmp; @@ -121885,7 +122121,7 @@ var require_tmp = __commonJS((exports, module2) => { cb = opts; opts = {}; } - return withTempDir(path11.join(cache4, "tmp"), cb, opts); + return withTempDir(path12.join(cache4, "tmp"), cb, opts); } }); @@ -121986,16 +122222,16 @@ var require_hash_to_segments = __commonJS((exports, module2) => { var require_path = __commonJS((exports, module2) => { var contentVer = require_package()["cache-version"].content; var hashToSegments = require_hash_to_segments(); - var path11 = __require("path"); + var path12 = __require("path"); var ssri = require_lib16(); module2.exports = contentPath; function contentPath(cache4, integrity) { const sri = ssri.parse(integrity, { single: true }); - return path11.join(contentDir(cache4), sri.algorithm, ...hashToSegments(sri.hexDigest())); + return path12.join(contentDir(cache4), sri.algorithm, ...hashToSegments(sri.hexDigest())); } module2.exports.contentDir = contentDir; function contentDir(cache4) { - return path11.join(cache4, `content-v${contentVer}`); + return path12.join(cache4, `content-v${contentVer}`); } }); @@ -122218,7 +122454,7 @@ var require_entry_index = __commonJS((exports, module2) => { writeFile: writeFile6 } = __require("fs/promises"); var { Minipass } = require_commonjs4(); - var path11 = __require("path"); + var path12 = __require("path"); var ssri = require_lib16(); var { tmpName } = require_tmp(); var contentPath = require_path(); @@ -122257,7 +122493,7 @@ var require_entry_index = __commonJS((exports, module2) => { `); const setup = async () => { const target = tmpName(cache4, opts.tmpPrefix); - await mkdir4(path11.dirname(target), { recursive: true }); + await mkdir4(path12.dirname(target), { recursive: true }); return { target, moved: false @@ -122270,7 +122506,7 @@ var require_entry_index = __commonJS((exports, module2) => { }; const write2 = async (tmp2) => { await writeFile6(tmp2.target, newIndex, { flag: "wx" }); - await mkdir4(path11.dirname(bucket), { recursive: true }); + await mkdir4(path12.dirname(bucket), { recursive: true }); await moveFile(tmp2.target, bucket); tmp2.moved = true; }; @@ -122294,7 +122530,7 @@ var require_entry_index = __commonJS((exports, module2) => { metadata: metadata2 }; try { - await mkdir4(path11.dirname(bucket), { recursive: true }); + await mkdir4(path12.dirname(bucket), { recursive: true }); const stringified = JSON.stringify(entry); await appendFile(bucket, ` ${hashEntry(stringified)} ${stringified}`); @@ -122342,13 +122578,13 @@ ${hashEntry(stringified)} ${stringified}`); const { default: pMap2 } = await Promise.resolve().then(() => (init_p_map(), exports_p_map)); const buckets = await readdirOrEmpty(indexDir); await pMap2(buckets, async (bucket) => { - const bucketPath2 = path11.join(indexDir, bucket); + const bucketPath2 = path12.join(indexDir, bucket); const subbuckets = await readdirOrEmpty(bucketPath2); await pMap2(subbuckets, async (subbucket) => { - const subbucketPath = path11.join(bucketPath2, subbucket); + const subbucketPath = path12.join(bucketPath2, subbucket); const subbucketEntries = await readdirOrEmpty(subbucketPath); await pMap2(subbucketEntries, async (entry) => { - const entryPath = path11.join(subbucketPath, entry); + const entryPath = path12.join(subbucketPath, entry); try { const entries10 = await bucketEntries(entryPath); const reduced = entries10.reduce((acc, entry2) => { @@ -122411,12 +122647,12 @@ ${hashEntry(stringified)} ${stringified}`); } exports.bucketDir = bucketDir; function bucketDir(cache4) { - return path11.join(cache4, `index-v${indexV}`); + return path12.join(cache4, `index-v${indexV}`); } exports.bucketPath = bucketPath; function bucketPath(cache4, key) { const hashed = hashKey(key); - return path11.join.apply(path11, [bucketDir(cache4)].concat(hashToSegments(hashed))); + return path12.join.apply(path12, [bucketDir(cache4)].concat(hashToSegments(hashed))); } exports.hashKey = hashKey; function hashKey(key) { @@ -122548,17 +122784,17 @@ var require_lib18 = __commonJS((exports) => { var _errored = Symbol("_errored"); class ReadStream extends Minipass { - constructor(path11, opt2) { + constructor(path12, opt2) { opt2 = opt2 || {}; super(opt2); this.readable = true; this.writable = false; - if (typeof path11 !== "string") { + if (typeof path12 !== "string") { throw new TypeError("path must be a string"); } this[_errored] = false; this[_fd] = typeof opt2.fd === "number" ? opt2.fd : null; - this[_path] = path11; + this[_path] = path12; this[_readSize] = opt2.readSize || 16 * 1024 * 1024; this[_reading] = false; this[_size2] = typeof opt2.size === "number" ? opt2.size : Infinity; @@ -122706,7 +122942,7 @@ var require_lib18 = __commonJS((exports) => { } class WriteStream extends EE { - constructor(path11, opt2) { + constructor(path12, opt2) { opt2 = opt2 || {}; super(opt2); this.readable = false; @@ -122716,7 +122952,7 @@ var require_lib18 = __commonJS((exports) => { this[_ended] = false; this[_needDrain] = false; this[_queue] = []; - this[_path] = path11; + this[_path] = path12; this[_fd] = typeof opt2.fd === "number" ? opt2.fd : null; this[_mode] = opt2.mode === undefined ? 438 : opt2.mode; this[_pos] = typeof opt2.start === "number" ? opt2.start : null; @@ -123002,11 +123238,11 @@ var require_read = __commonJS((exports, module2) => { err2.code = "EBADSIZE"; return err2; } - function integrityError(sri, path11) { - const err2 = new Error(`Integrity verification failed for ${sri} (${path11})`); + function integrityError(sri, path12) { + const err2 = new Error(`Integrity verification failed for ${sri} (${path12})`); err2.code = "EINTEGRITY"; err2.sri = sri; - err2.path = path11; + err2.path = path12; return err2; } }); @@ -123702,7 +123938,7 @@ var require_write = __commonJS((exports, module2) => { var { Minipass } = require_commonjs4(); var Pipeline = require_minipass_pipeline(); var Flush = require_minipass_flush(); - var path11 = __require("path"); + var path12 = __require("path"); var ssri = require_lib16(); var { tmpName } = require_tmp(); var fsm = require_lib18(); @@ -123811,7 +124047,7 @@ var require_write = __commonJS((exports, module2) => { } async function makeTmp(cache4, opts) { const tmpTarget = tmpName(cache4, opts.tmpPrefix); - await fs6.mkdir(path11.dirname(tmpTarget), { recursive: true }); + await fs6.mkdir(path12.dirname(tmpTarget), { recursive: true }); return { target: tmpTarget, moved: false @@ -123819,7 +124055,7 @@ var require_write = __commonJS((exports, module2) => { } async function moveToDestination(tmp, cache4, sri) { const destination = contentPath(cache4, sri); - const destDir = path11.dirname(destination); + const destDir = path12.dirname(destination); if (moveOperations.has(destination)) { return moveOperations.get(destination); } @@ -123919,9 +124155,9 @@ var require_put = __commonJS((exports, module2) => { // node_modules/cacache/lib/util/glob.js var require_glob = __commonJS((exports, module2) => { var { glob } = require_index_min3(); - var path11 = __require("path"); - var globify = (pattern) => pattern.split(path11.win32.sep).join(path11.posix.sep); - module2.exports = (path12, options4) => glob(globify(path12), options4); + var path12 = __require("path"); + var globify = (pattern) => pattern.split(path12.win32.sep).join(path12.posix.sep); + module2.exports = (path13, options4) => glob(globify(path13), options4); }); // node_modules/cacache/lib/content/rm.js @@ -123947,7 +124183,7 @@ var require_rm2 = __commonJS((exports, module2) => { var glob = require_glob(); var index3 = require_entry_index(); var memo2 = require_memoization(); - var path11 = __require("path"); + var path12 = __require("path"); var rmContent = require_rm(); module2.exports = entry; module2.exports.entry = entry; @@ -123963,7 +124199,7 @@ var require_rm2 = __commonJS((exports, module2) => { module2.exports.all = all7; async function all7(cache4) { memo2.clearMemoized(); - const paths = await glob(path11.join(cache4, "*(content-*|index-*)"), { silent: true, nosort: true }); + const paths = await glob(path12.join(cache4, "*(content-*|index-*)"), { silent: true, nosort: true }); return Promise.all(paths.map((p2) => rm3(p2, { recursive: true, force: true }))); } }); @@ -123982,7 +124218,7 @@ var require_verify = __commonJS((exports, module2) => { var fsm = require_lib18(); var glob = require_glob(); var index3 = require_entry_index(); - var path11 = __require("path"); + var path12 = __require("path"); var ssri = require_lib16(); var hasOwnProperty = (obj, key) => Object.prototype.hasOwnProperty.call(obj, key); var verifyOpts = (opts) => ({ @@ -124052,7 +124288,7 @@ var require_verify = __commonJS((exports, module2) => { indexStream.on("end", resolve9).on("error", reject); }); const contentDir = contentPath.contentDir(cache4); - const files = await glob(path11.join(contentDir, "**"), { + const files = await glob(path12.join(contentDir, "**"), { follow: false, nodir: true, nosort: true @@ -124164,16 +124400,16 @@ var require_verify = __commonJS((exports, module2) => { } function cleanTmp(cache4, opts) { opts.log.silly("verify", "cleaning tmp directory"); - return rm3(path11.join(cache4, "tmp"), { recursive: true, force: true }); + return rm3(path12.join(cache4, "tmp"), { recursive: true, force: true }); } async function writeVerifile(cache4, opts) { - const verifile = path11.join(cache4, "_lastverified"); + const verifile = path12.join(cache4, "_lastverified"); opts.log.silly("verify", "writing verifile to " + verifile); return writeFile6(verifile, `${Date.now()}`); } module2.exports.lastRun = lastRun; async function lastRun(cache4) { - const data2 = await readFile5(path11.join(cache4, "_lastverified"), { encoding: "utf8" }); + const data2 = await readFile5(path12.join(cache4, "_lastverified"), { encoding: "utf8" }); return new Date(+data2); } }); @@ -124217,7 +124453,7 @@ var require_lib19 = __commonJS((exports, module2) => { // node_modules/npm-bundled/lib/index.js var require_lib20 = __commonJS((exports, module2) => { var fs6 = __require("fs"); - var path11 = __require("path"); + var path12 = __require("path"); var EE = __require("events").EventEmitter; var normalizePackageBin = require_lib11(); @@ -124225,13 +124461,13 @@ var require_lib20 = __commonJS((exports, module2) => { constructor(opt2) { opt2 = opt2 || {}; super(opt2); - this.path = path11.resolve(opt2.path || process.cwd()); + this.path = path12.resolve(opt2.path || process.cwd()); this.parent = opt2.parent || null; if (this.parent) { this.result = this.parent.result; if (!this.parent.parent) { - const base2 = path11.basename(this.path); - const scope3 = path11.basename(path11.dirname(this.path)); + const base2 = path12.basename(this.path); + const scope3 = path12.basename(path12.dirname(this.path)); this.result.add(/^@/.test(scope3) ? scope3 + "/" + base2 : base2); } this.root = this.parent.root; @@ -124271,7 +124507,7 @@ var require_lib20 = __commonJS((exports, module2) => { } } start() { - const pj = path11.resolve(this.path, "package.json"); + const pj = path12.resolve(this.path, "package.json"); if (this.packageJsonCache.has(pj)) { this.onPackage(this.packageJsonCache.get(pj)); } else { @@ -124426,13 +124662,13 @@ var require_lib21 = __commonJS((exports, module2) => { var { readFile: readFile5, readdir: readdir2, stat: stat4 } = __require("fs/promises"); var { resolve: resolve9, basename: basename2, dirname: dirname6 } = __require("path"); var normalizePackageBin = require_lib11(); - var readPackage = ({ path: path11, packageJsonCache }) => packageJsonCache.has(path11) ? Promise.resolve(packageJsonCache.get(path11)) : readFile5(path11).then((json5) => { + var readPackage = ({ path: path12, packageJsonCache }) => packageJsonCache.has(path12) ? Promise.resolve(packageJsonCache.get(path12)) : readFile5(path12).then((json5) => { const pkg = normalizePackageBin(JSON.parse(json5)); - packageJsonCache.set(path11, pkg); + packageJsonCache.set(path12, pkg); return pkg; }).catch(() => null); var normalized = Symbol("package data has been normalized"); - var rpj = ({ path: path11, packageJsonCache }) => readPackage({ path: path11, packageJsonCache }).then((pkg) => { + var rpj = ({ path: path12, packageJsonCache }) => readPackage({ path: path12, packageJsonCache }).then((pkg) => { if (!pkg || pkg[normalized]) { return pkg; } @@ -124454,7 +124690,7 @@ var require_lib21 = __commonJS((exports, module2) => { return pkg; }); var pkgContents = async ({ - path: path11, + path: path12, depth = 1, currentDepth = 0, pkg = null, @@ -124468,8 +124704,8 @@ var require_lib21 = __commonJS((exports, module2) => { packageJsonCache = new Map; } if (pkg === true) { - return rpj({ path: path11 + "/package.json", packageJsonCache }).then((p2) => pkgContents({ - path: path11, + return rpj({ path: path12 + "/package.json", packageJsonCache }).then((p2) => pkgContents({ + path: path12, depth, currentDepth, pkg: p2, @@ -124479,7 +124715,7 @@ var require_lib21 = __commonJS((exports, module2) => { } if (pkg) { if (pkg.bin) { - const dir2 = dirname6(path11); + const dir2 = dirname6(path12); const scope3 = basename2(dir2); const nm = /^@.+/.test(scope3) ? dirname6(dir2) : dir2; const binFiles = []; @@ -124492,23 +124728,23 @@ var require_lib21 = __commonJS((exports, module2) => { } } if (currentDepth >= depth) { - result6.add(path11); + result6.add(path12); return result6; } const [dirEntries, bundleDeps] = await Promise.all([ - readdir2(path11, { withFileTypes: true }), - currentDepth === 0 && pkg && pkg.bundleDependencies ? bundled({ path: path11, packageJsonCache }) : null + readdir2(path12, { withFileTypes: true }), + currentDepth === 0 && pkg && pkg.bundleDependencies ? bundled({ path: path12, packageJsonCache }) : null ]).catch(() => []); if (!dirEntries) { return result6; } if (!dirEntries.length && !bundleDeps && currentDepth !== 0) { - result6.add(path11); + result6.add(path12); return result6; } const recursePromises = []; for (const entry of dirEntries) { - const p2 = resolve9(path11, entry.name); + const p2 = resolve9(path12, entry.name); if (entry.isDirectory() === false) { result6.add(p2); continue; @@ -124530,7 +124766,7 @@ var require_lib21 = __commonJS((exports, module2) => { } if (bundleDeps) { recursePromises.push(...bundleDeps.map((dep) => { - const p2 = resolve9(path11, "node_modules", dep); + const p2 = resolve9(path12, "node_modules", dep); return pkgContents({ path: p2, packageJsonCache, @@ -124546,8 +124782,8 @@ var require_lib21 = __commonJS((exports, module2) => { } return result6; }; - module2.exports = ({ path: path11, ...opts }) => pkgContents({ - path: resolve9(path11), + module2.exports = ({ path: path12, ...opts }) => pkgContents({ + path: resolve9(path12), ...opts, pkg: true }).then((results) => [...results]); @@ -124583,7 +124819,7 @@ var require_index_min4 = __commonJS((exports) => { end() { this.unpipe(), this.opts.end && this.dest.end(); } - }, is8 = class extends Gt2 { + }, is7 = class extends Gt2 { unpipe() { this.src.removeListener("error", this.proxyErrors), super.unpipe(); } @@ -124729,7 +124965,7 @@ var require_index_min4 = __commonJS((exports) => { return e2; this[x3] = false; let i6 = this[we2]; - return t2 = t2 || {}, e2 === kr2.stdout || e2 === kr2.stderr ? t2.end = false : t2.end = t2.end !== false, t2.proxyErrors = !!t2.proxyErrors, i6 ? t2.end && e2.end() : (this[I3].push(t2.proxyErrors ? new is8(this, e2, t2) : new Gt2(this, e2, t2)), this[J2] ? _t2(() => this[qe2]()) : this[qe2]()), e2; + return t2 = t2 || {}, e2 === kr2.stdout || e2 === kr2.stderr ? t2.end = false : t2.end = t2.end !== false, t2.proxyErrors = !!t2.proxyErrors, i6 ? t2.end && e2.end() : (this[I3].push(t2.proxyErrors ? new is7(this, e2, t2) : new Gt2(this, e2, t2)), this[J2] ? _t2(() => this[qe2]()) : this[qe2]()), e2; } unpipe(e2) { let t2 = this[I3].find((i6) => i6.dest === e2); @@ -128075,9 +128311,9 @@ var require_cache_dir = __commonJS((exports, module2) => { // node_modules/pacote/lib/util/is-package-bin.js var require_is_package_bin = __commonJS((exports, module2) => { var binObj = (name3, bin) => typeof bin === "string" ? { [name3]: bin } : bin; - var hasBin = (pkg, path11) => { + var hasBin = (pkg, path12) => { const bin = binObj(pkg.name, pkg.bin); - const p2 = path11.replace(/^[^\\/]*\//, ""); + const p2 = path12.replace(/^[^\\/]*\//, ""); for (const kv of Object.entries(bin)) { if (kv[1] === p2) { return true; @@ -128085,7 +128321,7 @@ var require_is_package_bin = __commonJS((exports, module2) => { } return false; }; - module2.exports = (pkg, path11) => pkg && pkg.bin ? hasBin(pkg, path11) : false; + module2.exports = (pkg, path12) => pkg && pkg.bin ? hasBin(pkg, path12) : false; }); // node_modules/pacote/lib/util/trailing-slashes.js @@ -128103,7 +128339,7 @@ var require_trailing_slashes = __commonJS((exports, module2) => { // node_modules/ignore-walk/lib/index.js var require_lib22 = __commonJS((exports, module2) => { var fs6 = __require("fs"); - var path11 = __require("path"); + var path12 = __require("path"); var EE = __require("events").EventEmitter; var Minimatch2 = require_commonjs3().Minimatch; @@ -128113,7 +128349,7 @@ var require_lib22 = __commonJS((exports, module2) => { super(opts); this.isSymbolicLink = opts.isSymbolicLink; this.path = opts.path || process.cwd(); - this.basename = path11.basename(this.path); + this.basename = path12.basename(this.path); this.ignoreFiles = opts.ignoreFiles || [".ignore"]; this.ignoreRules = {}; this.parent = opts.parent || null; @@ -128179,7 +128415,7 @@ var require_lib22 = __commonJS((exports, module2) => { newIg.forEach((e2) => this.addIgnoreFile(e2, then)); } addIgnoreFile(file4, then) { - const ig = path11.resolve(this.path, file4); + const ig = path12.resolve(this.path, file4); fs6.readFile(ig, "utf8", (er2, data2) => er2 ? this.emit("error", er2) : this.onReadIgnoreFile(file4, data2, then)); } onReadIgnoreFile(file4, data2, then) { @@ -128300,7 +128536,7 @@ var require_lib22 = __commonJS((exports, module2) => { return this; } addIgnoreFile(file4, then) { - const ig = path11.resolve(this.path, file4); + const ig = path12.resolve(this.path, file4); this.onReadIgnoreFile(file4, fs6.readFileSync(ig, "utf8"), then); } stat({ entry, file: file4, dir: dir2 }, then) { @@ -128366,7 +128602,7 @@ var require_lib23 = __commonJS((exports, module2) => { var strictDefaults = [ "/.git" ]; - var normalizePath = (path11) => path11.split("\\").join("/"); + var normalizePath = (path12) => path12.split("\\").join("/"); var readOutOfTreeIgnoreFiles = (root, rel, result6 = []) => { for (const file4 of [".npmignore", ".gitignore"]) { try { @@ -128410,13 +128646,13 @@ var require_lib23 = __commonJS((exports, module2) => { this.requiredFiles = options4.requiredFiles || []; const additionalDefaults = []; if (options4.prefix && options4.workspaces) { - const path11 = normalizePath(options4.path); + const path12 = normalizePath(options4.path); const prefix3 = normalizePath(options4.prefix); const workspaces = options4.workspaces.map((ws2) => normalizePath(ws2)); - if (path11 !== prefix3 && workspaces.includes(path11)) { + if (path12 !== prefix3 && workspaces.includes(path12)) { const relpath = relative4(options4.prefix, dirname6(options4.path)); additionalDefaults.push(...readOutOfTreeIgnoreFiles(options4.prefix, relpath)); - } else if (path11 === prefix3) { + } else if (path12 === prefix3) { additionalDefaults.push(...workspaces.map((w2) => normalizePath(relative4(options4.path, w2)))); } } @@ -128596,10 +128832,10 @@ var require_lib23 = __commonJS((exports, module2) => { if (!node) { continue; } - const path11 = node.path; + const path12 = node.path; const tree = node.target; const walkerOpts = { - path: path11, + path: path12, isPackage: true, ignoreFiles: [], seen: this.seen @@ -128642,7 +128878,7 @@ var require_lib23 = __commonJS((exports, module2) => { // node_modules/@npmcli/run-script/lib/set-path.js var require_set_path = __commonJS((exports, module2) => { - var __dirname = "D:\\App\\OpenCode\\opencode-unifia-rebrand\\node_modules\\@npmcli\\run-script\\lib"; + var __dirname = "D:\\App\\OpenCode\\opencode-work-design\\node_modules\\@npmcli\\run-script\\lib"; var { log: log7 } = require_lib5(); var { resolve: resolve9, dirname: dirname6, delimiter } = __require("path"); var nodeGypPath = resolve9(__dirname, "../lib/node-gyp-bin"); @@ -128680,40 +128916,40 @@ var require_set_path = __commonJS((exports, module2) => { // node_modules/env-paths/index.js var require_env_paths = __commonJS((exports, module2) => { - var path11 = __require("path"); + var path12 = __require("path"); var os6 = __require("os"); var homedir = os6.homedir(); var tmpdir2 = os6.tmpdir(); var { env: env3 } = process; var macos = (name3) => { - const library = path11.join(homedir, "Library"); + const library = path12.join(homedir, "Library"); return { - data: path11.join(library, "Application Support", name3), - config: path11.join(library, "Preferences", name3), - cache: path11.join(library, "Caches", name3), - log: path11.join(library, "Logs", name3), - temp: path11.join(tmpdir2, name3) + data: path12.join(library, "Application Support", name3), + config: path12.join(library, "Preferences", name3), + cache: path12.join(library, "Caches", name3), + log: path12.join(library, "Logs", name3), + temp: path12.join(tmpdir2, name3) }; }; var windows = (name3) => { - const appData = env3.APPDATA || path11.join(homedir, "AppData", "Roaming"); - const localAppData = env3.LOCALAPPDATA || path11.join(homedir, "AppData", "Local"); + const appData = env3.APPDATA || path12.join(homedir, "AppData", "Roaming"); + const localAppData = env3.LOCALAPPDATA || path12.join(homedir, "AppData", "Local"); return { - data: path11.join(localAppData, name3, "Data"), - config: path11.join(appData, name3, "Config"), - cache: path11.join(localAppData, name3, "Cache"), - log: path11.join(localAppData, name3, "Log"), - temp: path11.join(tmpdir2, name3) + data: path12.join(localAppData, name3, "Data"), + config: path12.join(appData, name3, "Config"), + cache: path12.join(localAppData, name3, "Cache"), + log: path12.join(localAppData, name3, "Log"), + temp: path12.join(tmpdir2, name3) }; }; var linux = (name3) => { - const username = path11.basename(homedir); + const username = path12.basename(homedir); return { - data: path11.join(env3.XDG_DATA_HOME || path11.join(homedir, ".local", "share"), name3), - config: path11.join(env3.XDG_CONFIG_HOME || path11.join(homedir, ".config"), name3), - cache: path11.join(env3.XDG_CACHE_HOME || path11.join(homedir, ".cache"), name3), - log: path11.join(env3.XDG_STATE_HOME || path11.join(homedir, ".local", "state"), name3), - temp: path11.join(tmpdir2, username, name3) + data: path12.join(env3.XDG_DATA_HOME || path12.join(homedir, ".local", "share"), name3), + config: path12.join(env3.XDG_CONFIG_HOME || path12.join(homedir, ".config"), name3), + cache: path12.join(env3.XDG_CACHE_HOME || path12.join(homedir, ".cache"), name3), + log: path12.join(env3.XDG_STATE_HOME || path12.join(homedir, ".local", "state"), name3), + temp: path12.join(tmpdir2, username, name3) }; }; var envPaths = (name3, options4) => { @@ -128794,7 +129030,7 @@ var require_debug2 = __commonJS((exports, module2) => { // node_modules/nopt/lib/type-defs.js var require_type_defs = __commonJS((exports, module2) => { var url3 = __require("url"); - var path11 = __require("path"); + var path12 = __require("path"); var Stream4 = __require("stream").Stream; var os6 = __require("os"); var debug2 = require_debug2(); @@ -128813,9 +129049,9 @@ var require_type_defs = __commonJS((exports, module2) => { const homePattern = isWin ? /^~(\/|\\)/ : /^~\//; const home = os6.homedir(); if (home && val.match(homePattern)) { - data2[k3] = path11.resolve(home, val.slice(2)); + data2[k3] = path12.resolve(home, val.slice(2)); } else { - data2[k3] = path11.resolve(val); + data2[k3] = path12.resolve(val); } return true; } @@ -128866,7 +129102,7 @@ var require_type_defs = __commonJS((exports, module2) => { Boolean: { type: Boolean, validate: validateBoolean }, url: { type: url3, validate: validateUrl }, Number: { type: Number, validate: validateNumber }, - path: { type: path11, validate: validatePath }, + path: { type: path12, validate: validatePath }, Stream: { type: Stream4, validate: validateStream }, Date: { type: Date, validate: validateDate }, Array: { type: Array } @@ -129506,8 +129742,8 @@ var require_package2 = __commonJS((exports, module2) => { // node_modules/node-gyp/lib/node-gyp.js var require_node_gyp = __commonJS((exports, module2) => { - var __dirname = "D:\\App\\OpenCode\\opencode-unifia-rebrand\\node_modules\\node-gyp\\lib"; - var path11 = __require("path"); + var __dirname = "D:\\App\\OpenCode\\opencode-work-design\\node_modules\\node-gyp\\lib"; + var path12 = __require("path"); var nopt = require_nopt(); var log7 = require_log(); var childProcess = __require("child_process"); @@ -129632,7 +129868,7 @@ var require_node_gyp = __commonJS((exports, module2) => { commands2.map((c2) => " - " + c2 + " - " + __require("./" + c2).usage).join(` `), "", - "node-gyp@" + this.version + " " + path11.resolve(__dirname, ".."), + "node-gyp@" + this.version + " " + path12.resolve(__dirname, ".."), "node@" + process.versions.node ].join(` `); @@ -129770,7 +130006,7 @@ var require_make_spawn_args = __commonJS((exports, module2) => { env: env3, event, nodeGyp, - path: path11, + path: path12, scriptShell = true, stdio, stdioString @@ -129780,12 +130016,12 @@ var require_make_spawn_args = __commonJS((exports, module2) => { } else if (env3.npm_config_node_gyp) { npm_config_node_gyp = env3.npm_config_node_gyp; } else { - npm_config_node_gyp = __require.resolve("D:\\App\\OpenCode\\opencode-unifia-rebrand\\node_modules\\node-gyp\\bin\\node-gyp.js"); + npm_config_node_gyp = __require.resolve("D:\\App\\OpenCode\\opencode-work-design\\node_modules\\node-gyp\\bin\\node-gyp.js"); } - const spawnEnv = setPATH(path11, binPaths, { + const spawnEnv = setPATH(path12, binPaths, { ...process.env, ...env3, - npm_package_json: resolve9(path11, "package.json"), + npm_package_json: resolve9(path12, "package.json"), npm_lifecycle_event: event, npm_lifecycle_script: cmd, npm_config_node_gyp @@ -129794,7 +130030,7 @@ var require_make_spawn_args = __commonJS((exports, module2) => { env: spawnEnv, stdioString, stdio, - cwd: path11, + cwd: path12, shell: scriptShell }; return [cmd, args3, spawnOpts]; @@ -129838,8 +130074,8 @@ var require_lib25 = __commonJS((exports, module2) => { var util3 = __require("util"); var fs6 = __require("fs"); var { stat: stat4 } = fs6.promises || { stat: util3.promisify(fs6.stat) }; - async function isNodeGypPackage(path11) { - return await stat4(`${path11}/binding.gyp`).then((st2) => st2.isFile()).catch(() => false); + async function isNodeGypPackage(path12) { + return await stat4(`${path12}/binding.gyp`).then((st2) => st2.isFile()).catch(() => false); } module2.exports = { isNodeGypPackage, @@ -129895,9 +130131,9 @@ var require_signal_manager = __commonJS((exports, module2) => { var require_is_server_package = __commonJS((exports, module2) => { var { stat: stat4 } = __require("fs/promises"); var { resolve: resolve9 } = __require("path"); - module2.exports = async (path11) => { + module2.exports = async (path12) => { try { - const st2 = await stat4(resolve9(path11, "server.js")); + const st2 = await stat4(resolve9(path12, "server.js")); return st2.isFile(); } catch (er2) { return false; @@ -129920,7 +130156,7 @@ var require_run_script_pkg = __commonJS((exports, module2) => { env: env3 = {}, event, nodeGyp, - path: path11, + path: path12, pkg, scriptShell, signalTimeout = 500, @@ -129933,9 +130169,9 @@ var require_run_script_pkg = __commonJS((exports, module2) => { cmd = options4.cmd; } else if (pkg.scripts && pkg.scripts[event]) { cmd = pkg.scripts[event]; - } else if (event === "install" && !scripts.install && !scripts.preinstall && gypfile !== false && await isNodeGypPackage(path11)) { + } else if (event === "install" && !scripts.install && !scripts.preinstall && gypfile !== false && await isNodeGypPackage(path12)) { cmd = defaultGypInstallScript; - } else if (event === "start" && await isServerPackage(path11)) { + } else if (event === "start" && await isServerPackage(path12)) { cmd = "node server.js"; } if (!cmd) { @@ -129971,7 +130207,7 @@ var require_run_script_pkg = __commonJS((exports, module2) => { env: { ...env3, ...packageEnvs(pkg) }, event, nodeGyp, - path: path11, + path: path12, scriptShell, stdio, stdioString @@ -129980,7 +130216,7 @@ var require_run_script_pkg = __commonJS((exports, module2) => { event, script: cmd, pkgid: pkg._id, - path: path11 + path: path12 }); if (stdio === "inherit") { signalManager.add(p2.process); @@ -130009,7 +130245,7 @@ var require_validate_options = __commonJS((exports, module2) => { } const { event, - path: path11, + path: path12, scriptShell, env: env3 = {}, stdio = "pipe", @@ -130019,7 +130255,7 @@ var require_validate_options = __commonJS((exports, module2) => { if (!event || typeof event !== "string") { throw new TypeError("valid event not provided to runScript"); } - if (!path11 || typeof path11 !== "string") { + if (!path12 || typeof path12 !== "string") { throw new TypeError("valid path not provided to runScript"); } if (scriptShell !== undefined && typeof scriptShell !== "string") { @@ -130139,8 +130375,8 @@ var require_tar_create_options = __commonJS((exports, module2) => { gzip: { level: 9 }, - filter: (path11, stat4) => { - if (isPackageBin(manifest, path11)) { + filter: (path12, stat4) => { + if (isPackageBin(manifest, path12)) { stat4.mode |= 73; } return true; @@ -135777,22 +136013,22 @@ var require_matchers = __commonJS((exports, module2) => { }; var DEEP_HEADER_AUTHORIZATION = { type: TYPE_PATH, - predicate: ({ path: path11 }) => path11.endsWith(".headers.authorization"), + predicate: ({ path: path12 }) => path12.endsWith(".headers.authorization"), replacement: "[REDACTED_HEADER_AUTHORIZATION]" }; var DEEP_HEADER_SET_COOKIE = { type: TYPE_PATH, - predicate: ({ path: path11 }) => path11.endsWith(".headers.set-cookie"), + predicate: ({ path: path12 }) => path12.endsWith(".headers.set-cookie"), replacement: "[REDACTED_HEADER_SET_COOKIE]" }; var DEEP_HEADER_COOKIE = { type: TYPE_PATH, - predicate: ({ path: path11 }) => path11.endsWith(".headers.cookie"), + predicate: ({ path: path12 }) => path12.endsWith(".headers.cookie"), replacement: "[REDACTED_HEADER_COOKIE]" }; var REWRITE_REQUEST = { type: TYPE_PATH, - predicate: ({ path: path11 }) => path11.endsWith(".request"), + predicate: ({ path: path12 }) => path12.endsWith(".request"), replacement: (input) => ({ method: input?.method, path: input?.path, @@ -135802,7 +136038,7 @@ var require_matchers = __commonJS((exports, module2) => { }; var REWRITE_RESPONSE = { type: TYPE_PATH, - predicate: ({ path: path11 }) => path11.endsWith(".response"), + predicate: ({ path: path12 }) => path12.endsWith(".response"), replacement: (input) => ({ data: input?.data, status: input?.status, @@ -135916,12 +136152,12 @@ var require_utils3 = __commonJS((exports, module2) => { }, [TYPE_PATH]: (matcher) => (value8, ctx) => { const rawPath = ctx?.path; - const path11 = rawPath.join(".").toLowerCase(); + const path12 = rawPath.join(".").toLowerCase(); const { predicate, replacement } = matcher; const replace5 = typeof replacement === "function" ? replacement : () => replacement; - const shouldRun = predicate({ rawPath, path: path11 }); + const shouldRun = predicate({ rawPath, path: path12 }); if (shouldRun) { - value8 = replace5(value8, { rawPath, path: path11 }); + value8 = replace5(value8, { rawPath, path: path12 }); } return value8; } @@ -137023,7 +137259,7 @@ var require_mediaType = __commonJS((exports, module2) => { module2.exports = preferredMediaTypes; module2.exports.preferredMediaTypes = preferredMediaTypes; var simpleMediaTypeRegExp = /^\s*([^\s\/;]+)\/([^;\s]+)\s*(?:;(.*))?$/; - function parseAccept(accept2) { + function parseAccept2(accept2) { var accepts = splitMediaTypes(accept2); for (var i6 = 0, j2 = 0;i6 < accepts.length; i6++) { var mediaType = parseMediaType(accepts[i6].trim(), i6); @@ -137108,7 +137344,7 @@ var require_mediaType = __commonJS((exports, module2) => { }; } function preferredMediaTypes(accept2, provided) { - var accepts = parseAccept(accept2 === undefined ? "*/*" : accept2 || ""); + var accepts = parseAccept2(accept2 === undefined ? "*/*" : accept2 || ""); if (!provided) { return accepts.filter(isQuality).sort(compareSpecs).map(getFullType); } @@ -139567,8 +139803,10 @@ var require_address_error = __commonJS((exports) => { var require_common3 = __commonJS((exports) => { Object.defineProperty(exports, "__esModule", { value: true }); exports.isInSubnet = isInSubnet; + exports.isHostInSubnet = isHostInSubnet; exports.isCorrect = isCorrect; exports.prefixLengthFromMask = prefixLengthFromMask; + exports.assertByteArray = assertByteArray; exports.numberToPaddedHex = numberToPaddedHex; exports.stringToPaddedHex = stringToPaddedHex; exports.testBit = testBit; @@ -139577,13 +139815,13 @@ var require_common3 = __commonJS((exports) => { if (this.subnetMask < address.subnetMask) { return false; } - if (this.mask(address.subnetMask) === address.mask()) { - return true; - } - return false; + return isHostInSubnet.call(this, address); + } + function isHostInSubnet(address) { + return this.mask(address.subnetMask) === address.mask(); } function isCorrect(defaultBits) { - return function() { + return function isCorrectForm() { if (this.addressMinusSuffix !== this.correctForm()) { return false; } @@ -139607,6 +139845,16 @@ var require_common3 = __commonJS((exports) => { } return firstZero; } + function assertByteArray(bytes, byteCount, family, minimum) { + if (bytes.length !== byteCount) { + throw new address_error_1.AddressError(`${family} addresses require exactly ${byteCount} bytes`); + } + for (let i6 = 0;i6 < bytes.length; i6++) { + if (!Number.isInteger(bytes[i6]) || bytes[i6] < minimum || bytes[i6] > 255) { + throw new address_error_1.AddressError(`All bytes must be integers between ${minimum} and 255`); + } + } + } function numberToPaddedHex(number10) { return number10.toString(16).padStart(2, "0"); } @@ -139629,7 +139877,7 @@ var require_constants4 = __commonJS((exports) => { exports.RE_SUBNET_STRING = exports.RE_ADDRESS = exports.GROUPS = exports.BITS = undefined; exports.BITS = 32; exports.GROUPS = 4; - exports.RE_ADDRESS = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/g; + exports.RE_ADDRESS = /^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])$/g; exports.RE_SUBNET_STRING = /\/\d{1,2}$/; }); @@ -139676,6 +139924,7 @@ var require_ipv4 = __commonJS((exports) => { class Address4 { constructor(address) { + this.addressMinusSuffix = ""; this.groups = constants2.GROUPS; this.parsedAddress = []; this.parsedSubnet = ""; @@ -139684,6 +139933,7 @@ var require_ipv4 = __commonJS((exports) => { this.v4 = true; this.isCorrect = isCorrect4; this.isInSubnet = common.isInSubnet; + this.isHostInSubnet = common.isHostInSubnet; this.address = address; const subnet = constants2.RE_SUBNET_STRING.exec(address); if (subnet) { @@ -139702,12 +139952,15 @@ var require_ipv4 = __commonJS((exports) => { try { new Address4(address); return true; - } catch (e2) { + } catch { return false; } } parse(address) { const groups = address.split("."); + if (groups.some((group4) => /^0\d/.test(group4))) { + throw new address_error_1.AddressError("IPv4 addresses can't have leading zeroes."); + } if (!address.match(constants2.RE_ADDRESS)) { throw new address_error_1.AddressError("Invalid IPv4 address."); } @@ -139816,20 +140069,13 @@ var require_ipv4 = __commonJS((exports) => { return `${this.startAddress().correctForm()}/${this.subnetMask}`; } static fromBigInt(bigInt3) { - if (bigInt3 < 0n || bigInt3 > 0xffffffffn) { + if (bigInt3 < BigInt(0) || bigInt3 > BigInt(4294967295)) { throw new address_error_1.AddressError("IPv4 BigInt must be in the range 0 to 2**32 - 1"); } return Address4.fromHex(bigInt3.toString(16).padStart(8, "0")); } static fromByteArray(bytes) { - if (bytes.length !== 4) { - throw new address_error_1.AddressError("IPv4 addresses require exactly 4 bytes"); - } - for (let i6 = 0;i6 < bytes.length; i6++) { - if (!Number.isInteger(bytes[i6]) || bytes[i6] < 0 || bytes[i6] > 255) { - throw new address_error_1.AddressError("All bytes must be integers between 0 and 255"); - } - } + common.assertByteArray(bytes, 4, "IPv4", 0); return this.fromUnsignedByteArray(bytes); } static fromUnsignedByteArray(bytes) { @@ -139859,25 +140105,25 @@ var require_ipv4 = __commonJS((exports) => { return `${reversed}.in-addr.arpa.`; } isMulticast() { - return this.isInSubnet(MULTICAST_V4); + return this.isHostInSubnet(MULTICAST_V4); } isPrivate() { - return PRIVATE_V4.some((subnet) => this.isInSubnet(subnet)); + return PRIVATE_V4.some((subnet) => this.isHostInSubnet(subnet)); } isLoopback() { - return this.isInSubnet(LOOPBACK_V4); + return this.isHostInSubnet(LOOPBACK_V4); } isLinkLocal() { - return this.isInSubnet(LINK_LOCAL_V4); + return this.isHostInSubnet(LINK_LOCAL_V4); } isUnspecified() { - return this.isInSubnet(UNSPECIFIED_V4); + return this.isHostInSubnet(UNSPECIFIED_V4); } isBroadcast() { - return this.isInSubnet(BROADCAST_V4); + return this.isHostInSubnet(BROADCAST_V4); } isCGNAT() { - return this.isInSubnet(CGNAT_V4); + return this.isHostInSubnet(CGNAT_V4); } binaryZeroPad() { if (this._binaryZeroPad === undefined) { @@ -139887,7 +140133,7 @@ var require_ipv4 = __commonJS((exports) => { } groupForV6() { const segments = this.parsedAddress; - return this.address.replace(constants2.RE_ADDRESS, `${segments.slice(0, 2).join(".")}.${segments.slice(2, 4).join(".")}`); + return this.correctForm().replace(constants2.RE_ADDRESS, `${segments.slice(0, 2).join(".")}.${segments.slice(2, 4).join(".")}`); } } exports.Address4 = Address4; @@ -139941,6 +140187,7 @@ var require_constants5 = __commonJS((exports) => { "ff05::1:3/128": "Multicast (All DHCP servers in this site)", "::/128": "Unspecified", "::1/128": "Loopback", + "::ffff:0:0/96": "IPv4-mapped", "ff00::/8": "Multicast", "fe80::/10": "Link-local unicast", "fc00::/7": "Unique local", @@ -139953,8 +140200,8 @@ var require_constants5 = __commonJS((exports) => { exports.RE_BAD_ADDRESS = /([0-9a-f]{5,}|:{3,}|[^:]:$|^:[^:]|\/$)/gi; exports.RE_SUBNET_STRING = /\/\d{1,3}(?=%|$)/; exports.RE_ZONE_STRING = /%.*$/; - exports.RE_URL = /^\[{0,1}([0-9a-f:]+)\]{0,1}/; - exports.RE_URL_WITH_PORT = /\[([0-9a-f:]+)\]:([0-9]{1,5})/; + exports.RE_URL = /^(?:\[([0-9a-f:.]+)\]|([0-9a-f:.]+))(?:[/?#].*)?$/i; + exports.RE_URL_WITH_PORT = /^\[([0-9a-f:.]+)\]:([0-9]{1,5})(?:[/?#].*)?$/i; }); // node_modules/ip-address/dist/v6/helpers.js @@ -140178,6 +140425,7 @@ var require_ipv6 = __commonJS((exports) => { this.v4 = false; this.zone = ""; this.isInSubnet = common.isInSubnet; + this.isHostInSubnet = common.isHostInSubnet; this.isCorrect = isCorrect6; if (optionalGroups === undefined) { this.groups = constants6.GROUPS; @@ -140194,7 +140442,8 @@ var require_ipv6 = __commonJS((exports) => { throw new address_error_1.AddressError("Invalid subnet mask."); } address = address.replace(constants6.RE_SUBNET_STRING, ""); - } else if (/\//.test(address)) { + } + if (/\//.test(address)) { throw new address_error_1.AddressError("Invalid subnet mask."); } const zone = constants6.RE_ZONE_STRING.exec(address); @@ -140209,12 +140458,12 @@ var require_ipv6 = __commonJS((exports) => { try { new Address6(address); return true; - } catch (e2) { + } catch { return false; } } static fromBigInt(bigInt3) { - if (bigInt3 < 0n || bigInt3 > (1n << BigInt(constants6.BITS)) - 1n) { + if (bigInt3 < BigInt(0) || bigInt3 > (BigInt(1) << BigInt(constants6.BITS)) - BigInt(1)) { throw new address_error_1.AddressError("IPv6 BigInt must be in the range 0 to 2**128 - 1"); } const hex3 = bigInt3.toString(16).padStart(32, "0"); @@ -140225,46 +140474,43 @@ var require_ipv6 = __commonJS((exports) => { return new Address6(groups.join(":")); } static fromURL(url3) { + var _a3; let host; let port2 = null; let result6; - if (url3.indexOf("[") !== -1 && url3.indexOf("]:") !== -1) { - result6 = constants6.RE_URL_WITH_PORT.exec(url3); + let error46; + const stripped = url3.replace(/^[a-z][a-z0-9+.-]*:\/\//i, ""); + if (stripped.indexOf("[") !== -1 && stripped.indexOf("]:") !== -1) { + error46 = "failed to parse address with port"; + result6 = constants6.RE_URL_WITH_PORT.exec(stripped); if (result6 === null) { - return { - error: "failed to parse address with port", - address: null, - port: null - }; + return { error: error46, address: null, port: null }; } host = result6[1]; port2 = result6[2]; - } else if (url3.indexOf("/") !== -1) { - url3 = url3.replace(/^[a-z0-9]+:\/\//, ""); - result6 = constants6.RE_URL.exec(url3); + } else { + error46 = "failed to parse address from URL"; + result6 = constants6.RE_URL.exec(stripped); if (result6 === null) { - return { - error: "failed to parse address from URL", - address: null, - port: null - }; + return { error: error46, address: null, port: null }; } - host = result6[1]; - } else { - host = url3; + host = (_a3 = result6[1]) !== null && _a3 !== undefined ? _a3 : result6[2]; } if (port2) { port2 = parseInt(port2, 10); - if (port2 < 0 || port2 > 65536) { + if (port2 < 0 || port2 > 65535) { port2 = null; } } else { port2 = null; } - return { - address: new Address6(host), - port: port2 - }; + let address; + try { + address = new Address6(host); + } catch { + return { error: error46, address: null, port: null }; + } + return { address, port: port2 }; } static fromAddressAndMask(address, mask2) { const bits = common.prefixLengthFromMask(new Address6(mask2).bigInt(), constants6.BITS); @@ -140395,7 +140641,7 @@ var require_ipv6 = __commonJS((exports) => { getType() { for (let i6 = 0;i6 < TYPE_SUBNETS.length; i6++) { const entry = TYPE_SUBNETS[i6]; - if (this.isInSubnet(entry[0])) { + if (this.isHostInSubnet(entry[0])) { return entry[1]; } } @@ -140484,18 +140730,20 @@ var require_ipv6 = __commonJS((exports) => { } const groups = address.split(":"); const lastGroup = groups.slice(-1)[0]; + const v4Octets = lastGroup.split("."); + if (v4Octets.length === constants4.GROUPS && v4Octets.every((octet) => /^\d{1,3}$/.test(octet))) { + if (v4Octets.some((octet) => /^0\d/.test(octet))) { + const highlighted = v4Octets.map(spanLeadingZeroes4).join("."); + const prefix3 = groups.slice(0, -1).map(helpers.escapeHtml).join(":"); + const separator = groups.length > 1 ? ":" : ""; + throw new address_error_1.AddressError("IPv4 addresses can't have leading zeroes.", `${prefix3}${separator}${highlighted}`); + } + } const address4 = lastGroup.match(constants4.RE_ADDRESS); if (address4) { this.parsedAddress4 = address4[0]; - this.address4 = new ipv4_1.Address4(this.parsedAddress4); - for (let i6 = 0;i6 < this.address4.groups; i6++) { - if (/^0[0-9]+/.test(this.address4.parsedAddress[i6])) { - const highlighted = this.address4.parsedAddress.map(spanLeadingZeroes4).join("."); - const prefix3 = groups.slice(0, -1).map(helpers.escapeHtml).join(":"); - const separator = groups.length > 1 ? ":" : ""; - throw new address_error_1.AddressError("IPv4 addresses can't have leading zeroes.", `${prefix3}${separator}${highlighted}`); - } - } + const v4Suffix = this.subnetMask >= 96 ? `/${this.subnetMask - 96}` : ""; + this.address4 = new ipv4_1.Address4(`${this.parsedAddress4}${v4Suffix}`); this.v4 = true; groups[groups.length - 1] = this.address4.toGroup6(); address = groups.join(":"); @@ -140558,7 +140806,16 @@ var require_ipv6 = __commonJS((exports) => { } to4() { const binary2 = this.binaryZeroPad().split(""); - return ipv4_1.Address4.fromHex(BigInt(`0b${binary2.slice(96, 128).join("")}`).toString(16).padStart(8, "0")); + const hex3 = BigInt(`0b${binary2.slice(96, 128).join("")}`).toString(16).padStart(8, "0"); + if (this.subnetMask >= 96) { + const v4Mask = this.subnetMask - 96; + const groups = []; + for (let i6 = 0;i6 < 8; i6 += 2) { + groups.push(parseInt(hex3.slice(i6, i6 + 2), 16)); + } + return new ipv4_1.Address4(`${groups.join(".")}/${v4Mask}`); + } + return ipv4_1.Address4.fromHex(hex3); } to4in6() { const address4 = this.to4(); @@ -140568,7 +140825,7 @@ var require_ipv6 = __commonJS((exports) => { if (!/:$/.test(correct)) { infix = ":"; } - return correct + infix + address4.address; + return correct + infix + address4.correctForm(); } inspectTeredo() { const prefix3 = this.getBitsBase16(0, 32); @@ -140633,7 +140890,13 @@ var require_ipv6 = __commonJS((exports) => { bits = prefixBits.slice(0, 96) + v4Bits; } else { const beforeU = 64 - pl; - bits = prefixBits.slice(0, pl) + v4Bits.slice(0, beforeU) + "00000000" + v4Bits.slice(beforeU) + "0".repeat(128 - 72 - (32 - beforeU)); + bits = [ + prefixBits.slice(0, pl), + v4Bits.slice(0, beforeU), + "00000000", + v4Bits.slice(beforeU), + "0".repeat(128 - 72 - (32 - beforeU)) + ].join(""); } const hex3 = BigInt(`0b${bits}`).toString(16).padStart(32, "0"); const groups = []; @@ -140648,7 +140911,7 @@ var require_ipv6 = __commonJS((exports) => { if (pl !== 32 && pl !== 40 && pl !== 48 && pl !== 56 && pl !== 64 && pl !== 96) { throw new address_error_1.AddressError("NAT64 prefix length must be 32, 40, 48, 56, 64, or 96"); } - if (!this.isInSubnet(prefix6)) { + if (!this.isHostInSubnet(prefix6)) { return null; } const bits = this.binaryZeroPad(); @@ -140666,9 +140929,7 @@ var require_ipv6 = __commonJS((exports) => { return new ipv4_1.Address4(octets.join(".")); } toByteArray() { - const valueWithoutPadding = this.bigInt().toString(16); - const leadingPad = "0".repeat(valueWithoutPadding.length % 2); - const value8 = `${leadingPad}${valueWithoutPadding}`; + const value8 = this.bigInt().toString(16).padStart(constants6.BITS / 4, "0"); const bytes = []; for (let i6 = 0, length3 = value8.length;i6 < length3; i6 += 2) { bytes.push(parseInt(value8.substring(i6, i6 + 2), 16)); @@ -140679,9 +140940,11 @@ var require_ipv6 = __commonJS((exports) => { return this.toByteArray().map(unsignByte); } static fromByteArray(bytes) { + common.assertByteArray(bytes, 16, "IPv6", -128); return this.fromUnsignedByteArray(bytes.map(unsignByte)); } static fromUnsignedByteArray(bytes) { + common.assertByteArray(bytes, 16, "IPv6", 0); const BYTE_MAX = BigInt("256"); let result6 = BigInt("0"); let multiplier = BigInt("1"); @@ -140695,12 +140958,20 @@ var require_ipv6 = __commonJS((exports) => { return this.addressMinusSuffix === this.canonicalForm(); } isLinkLocal() { + const embedded = this.embeddedIPv4(); + if (embedded) { + return embedded.isLinkLocal(); + } if (this.getBitsBase2(0, 64) === "1111111010000000000000000000000000000000000000000000000000000000") { return true; } return false; } isMulticast() { + const embedded = this.embeddedIPv4(); + if (embedded) { + return embedded.isMulticast(); + } const type3 = this.getType(); return type3 === "Multicast" || type3.startsWith("Multicast "); } @@ -140708,25 +140979,60 @@ var require_ipv6 = __commonJS((exports) => { return this.v4; } isMapped4() { - return this.isInSubnet(IPV4_MAPPED_SUBNET); + return this.isHostInSubnet(IPV4_MAPPED_SUBNET); + } + embeddedIPv4() { + if (this.isMapped4() || this.isHostInSubnet(NAT64_WELL_KNOWN_SUBNET)) { + return this.to4(); + } + return null; } isTeredo() { - return this.isInSubnet(TEREDO_SUBNET); + return this.isHostInSubnet(TEREDO_SUBNET); } is6to4() { - return this.isInSubnet(SIX_TO_FOUR_SUBNET); + return this.isHostInSubnet(SIX_TO_FOUR_SUBNET); } isLoopback() { + const embedded = this.embeddedIPv4(); + if (embedded) { + return embedded.isLoopback(); + } return this.getType() === "Loopback"; } isULA() { - return this.isInSubnet(ULA_SUBNET); + return this.isHostInSubnet(ULA_SUBNET); + } + isPrivate() { + const embedded = this.embeddedIPv4(); + if (embedded) { + return embedded.isPrivate(); + } + return this.isULA(); + } + isCGNAT() { + const embedded = this.embeddedIPv4(); + if (embedded) { + return embedded.isCGNAT(); + } + return false; + } + isBroadcast() { + const embedded = this.embeddedIPv4(); + if (embedded) { + return embedded.isBroadcast(); + } + return false; } isUnspecified() { + const embedded = this.embeddedIPv4(); + if (embedded) { + return embedded.isUnspecified(); + } return this.getType() === "Unspecified"; } isDocumentation() { - return this.isInSubnet(DOCUMENTATION_SUBNET); + return this.isHostInSubnet(DOCUMENTATION_SUBNET); } href(optionalPort) { if (optionalPort === undefined) { @@ -140838,6 +141144,7 @@ var require_ipv6 = __commonJS((exports) => { var ULA_SUBNET = new Address6("fc00::/7"); var DOCUMENTATION_SUBNET = new Address6("2001:db8::/32"); var IPV4_MAPPED_SUBNET = new Address6("::ffff:0:0/96"); + var NAT64_WELL_KNOWN_SUBNET = new Address6("64:ff9b::/96"); }); // node_modules/ip-address/dist/ip-address.js @@ -143469,8 +143776,8 @@ var require_json_stream = __commonJS((exports, module2) => { static get JSONStreamError() { return JSONStreamError; } - static parse(path11, map32) { - return new JSONStream({ path: path11, map: map32 }); + static parse(path12, map32) { + return new JSONStream({ path: path12, map: map32 }); } } module2.exports = JSONStream; @@ -149226,7 +149533,7 @@ var require_file2 = __commonJS((exports) => { ...this.unrecognizedFields }; } - static fromJSON(path11, data2) { + static fromJSON(path12, data2) { const { length: length3, hashes, ...rest } = data2; if (typeof length3 !== "number") { throw new TypeError("length must be a number"); @@ -149236,7 +149543,7 @@ var require_file2 = __commonJS((exports) => { } return new TargetFile({ length: length3, - path: path11, + path: path12, hashes, unrecognizedFields: rest }); @@ -149936,9 +150243,9 @@ var require_snapshot = __commonJS((exports) => { } exports.Snapshot = Snapshot; function metaToJSON(meta) { - return Object.entries(meta).reduce((acc, [path11, metadata2]) => ({ + return Object.entries(meta).reduce((acc, [path12, metadata2]) => ({ ...acc, - [path11]: metadata2.toJSON() + [path12]: metadata2.toJSON() }), {}); } function metaFromJSON(data2) { @@ -149947,9 +150254,9 @@ var require_snapshot = __commonJS((exports) => { if (!utils_1.guard.isObjectRecord(data2)) { throw new TypeError("meta field is malformed"); } else { - meta = Object.entries(data2).reduce((acc, [path11, metadata2]) => ({ + meta = Object.entries(data2).reduce((acc, [path12, metadata2]) => ({ ...acc, - [path11]: file_1.MetaFile.fromJSON(metadata2) + [path12]: file_1.MetaFile.fromJSON(metadata2) }), {}); } } @@ -150127,9 +150434,9 @@ var require_targets = __commonJS((exports) => { } exports.Targets = Targets; function targetsToJSON(targets) { - return Object.entries(targets).reduce((acc, [path11, target]) => ({ + return Object.entries(targets).reduce((acc, [path12, target]) => ({ ...acc, - [path11]: target.toJSON() + [path12]: target.toJSON() }), {}); } function targetsFromJSON(data2) { @@ -150138,9 +150445,9 @@ var require_targets = __commonJS((exports) => { if (!utils_1.guard.isObjectRecord(data2)) { throw new TypeError("targets must be an object"); } else { - targets = Object.entries(data2).reduce((acc, [path11, target]) => ({ + targets = Object.entries(data2).reduce((acc, [path12, target]) => ({ ...acc, - [path11]: file_1.TargetFile.fromJSON(path11, target) + [path12]: file_1.TargetFile.fromJSON(path12, target) }), {}); } } @@ -150805,14 +151112,14 @@ var require_url = __commonJS((exports) => { Object.defineProperty(exports, "__esModule", { value: true }); exports.join = join12; var url_1 = __require("url"); - function join12(base2, path11) { - return new url_1.URL(ensureTrailingSlash(base2) + removeLeadingSlash(path11)).toString(); + function join12(base2, path12) { + return new url_1.URL(ensureTrailingSlash(base2) + removeLeadingSlash(path12)).toString(); } - function ensureTrailingSlash(path11) { - return path11.endsWith("/") ? path11 : path11 + "/"; + function ensureTrailingSlash(path12) { + return path12.endsWith("/") ? path12 : path12 + "/"; } - function removeLeadingSlash(path11) { - return path11.startsWith("/") ? path11.slice(1) : path11; + function removeLeadingSlash(path12) { + return path12.startsWith("/") ? path12.slice(1) : path12; } }); @@ -150870,7 +151177,7 @@ var require_updater = __commonJS((exports) => { var models_1 = require_dist9(); var debug_1 = __importDefault(require_src()); var fs6 = __importStar(__require("fs")); - var path11 = __importStar(__require("path")); + var path12 = __importStar(__require("path")); var package_json_1 = require_package8(); var config_1 = require_config2(); var error_1 = require_error7(); @@ -150889,7 +151196,7 @@ var require_updater = __commonJS((exports) => { config; fetcher; constructor(options4) { - const { metadataDir, metadataBaseUrl, targetDir, targetBaseUrl, fetcher, config: config3 } = options4; + const { metadataDir, metadataBaseUrl, targetDir, targetBaseUrl, fetcher, config: config2 } = options4; this.dir = metadataDir; this.metadataBaseUrl = metadataBaseUrl; this.targetDir = targetDir; @@ -150897,8 +151204,8 @@ var require_updater = __commonJS((exports) => { this.forceCache = options4.forceCache ?? false; const data2 = this.loadLocalMetadata(models_1.MetadataKind.Root); this.trustedSet = new store_1.TrustedMetadataStore(data2); - this.config = { ...config_1.defaultConfig, ...config3 }; - const userAgent = config3?.userAgent ? `${config3.userAgent} tuf-js/${package_json_1.version}` : `tuf-js/${package_json_1.version}`; + this.config = { ...config_1.defaultConfig, ...config2 }; + const userAgent = config2?.userAgent ? `${config2.userAgent} tuf-js/${package_json_1.version}` : `tuf-js/${package_json_1.version}`; this.fetcher = fetcher || new fetcher_1.DefaultFetcher({ userAgent, timeout: this.config.fetchTimeout, @@ -150938,7 +151245,7 @@ var require_updater = __commonJS((exports) => { const consistentSnapshot = this.trustedSet.root.signed.consistentSnapshot; if (consistentSnapshot && this.config.prefixTargetsWithHash) { const hashes = Object.values(targetInfo.hashes); - const { dir: dir2, base: base2 } = path11.parse(targetFilePath); + const { dir: dir2, base: base2 } = path12.parse(targetFilePath); const filename = `${hashes[0]}.${base2}`; targetFilePath = dir2 ? `${dir2}/${filename}` : filename; } @@ -150965,7 +151272,7 @@ var require_updater = __commonJS((exports) => { return; } loadLocalMetadata(fileName) { - const filePath = path11.join(this.dir, `${fileName}.json`); + const filePath = path12.join(this.dir, `${fileName}.json`); log7("READ %s", filePath); return fs6.readFileSync(filePath); } @@ -151102,12 +151409,12 @@ var require_updater = __commonJS((exports) => { throw new error_1.ValueError("Target directory not set"); } const filePath = encodeURIComponent(targetInfo.path); - return path11.join(this.targetDir, filePath); + return path12.join(this.targetDir, filePath); } persistMetadata(metaDataName, bytesData) { const encodedName = encodeURIComponent(metaDataName); try { - const filePath = path11.join(this.dir, `${encodedName}.json`); + const filePath = path12.join(this.dir, `${encodedName}.json`); log7("WRITE %s", filePath); fs6.writeFileSync(filePath, bytesData.toString("utf8")); } catch (error46) { @@ -151209,13 +151516,13 @@ var require_target = __commonJS((exports) => { var fs_1 = __importDefault(__require("fs")); var error_1 = require_error8(); async function readTarget(tuf, targetPath) { - const path11 = await getTargetPath(tuf, targetPath); + const path12 = await getTargetPath(tuf, targetPath); return new Promise((resolve9, reject) => { - fs_1.default.readFile(path11, "utf-8", (err2, data2) => { + fs_1.default.readFile(path12, "utf-8", (err2, data2) => { if (err2) { reject(new error_1.TUFError({ code: "TUF_READ_TARGET_ERROR", - message: `error reading target ${path11}`, + message: `error reading target ${path12}`, cause: err2 })); } else { @@ -151241,19 +151548,19 @@ var require_target = __commonJS((exports) => { message: `target ${target} not found` }); } - let path11 = await tuf.findCachedTarget(targetInfo); - if (!path11) { + let path12 = await tuf.findCachedTarget(targetInfo); + if (!path12) { try { - path11 = await tuf.downloadTarget(targetInfo); + path12 = await tuf.downloadTarget(targetInfo); } catch (err2) { throw new error_1.TUFError({ code: "TUF_DOWNLOAD_TARGET_ERROR", - message: `error downloading target ${path11}`, + message: `error downloading target ${path12}`, cause: err2 }); } } - return path11; + return path12; } }); @@ -151337,7 +151644,7 @@ var require_client3 = __commonJS((exports) => { } } function initClient(options4) { - const config3 = { + const config2 = { fetchTimeout: options4.timeout, fetchRetry: options4.retry, userAgent: `${encodeURIComponent(package_json_1.name)}/${package_json_1.version}` @@ -151348,7 +151655,7 @@ var require_client3 = __commonJS((exports) => { metadataDir: options4.cachePath, targetDir: path_1.default.join(options4.cachePath, TARGETS_DIR_NAME), forceCache: options4.forceCache, - config: config3 + config: config2 }); } }); @@ -151696,15 +152003,15 @@ var require_certificate = __commonJS((exports) => { sort() { const leafCert = this.untrustedCert; let paths = this.buildPaths(leafCert); - paths = paths.filter((path12) => path12.some((cert) => this.trustedCerts.includes(cert))); + paths = paths.filter((path13) => path13.some((cert) => this.trustedCerts.includes(cert))); if (paths.length === 0) { throw new error_1.VerificationError({ code: "CERTIFICATE_ERROR", message: "no trusted certificate path found" }); } - const path11 = paths.reduce((prev2, curr) => prev2.length < curr.length ? prev2 : curr); - return [leafCert, ...path11].slice(0, -1); + const path12 = paths.reduce((prev2, curr) => prev2.length < curr.length ? prev2 : curr); + return [leafCert, ...path12].slice(0, -1); } buildPaths(certificate) { const paths = []; @@ -151761,30 +152068,30 @@ var require_certificate = __commonJS((exports) => { }); return issuers; } - checkPath(path11) { - if (path11.length < 1) { + checkPath(path12) { + if (path12.length < 1) { throw new error_1.VerificationError({ code: "CERTIFICATE_ERROR", message: "certificate chain must contain at least one certificate" }); } - const validCAs = path11.slice(1).every((cert) => cert.isCA); + const validCAs = path12.slice(1).every((cert) => cert.isCA); if (!validCAs) { throw new error_1.VerificationError({ code: "CERTIFICATE_ERROR", message: "intermediate certificate is not a CA" }); } - for (let i6 = path11.length - 2;i6 >= 0; i6--) { - if (!path11[i6].issuer.equals(path11[i6 + 1].subject)) { + for (let i6 = path12.length - 2;i6 >= 0; i6--) { + if (!path12[i6].issuer.equals(path12[i6 + 1].subject)) { throw new error_1.VerificationError({ code: "CERTIFICATE_ERROR", message: "incorrect certificate name chaining" }); } } - for (let i6 = 0;i6 < path11.length; i6++) { - const cert = path11[i6]; + for (let i6 = 0;i6 < path12.length; i6++) { + const cert = path12[i6]; if (cert.extBasicConstraints?.isCA) { const pathLength = cert.extBasicConstraints.pathLenConstraint; if (pathLength !== undefined && pathLength < i6 - 1) { @@ -151882,13 +152189,13 @@ var require_key4 = __commonJS((exports) => { return { key: key.publicKey }; } function verifyCertificate(leaf, timestamps, trustMaterial) { - let path11 = []; + let path12 = []; timestamps.forEach((timestamp2) => { - path11 = (0, certificate_1.verifyCertificateChain)(timestamp2, leaf, trustMaterial.certificateAuthorities); + path12 = (0, certificate_1.verifyCertificateChain)(timestamp2, leaf, trustMaterial.certificateAuthorities); }); return { - scts: (0, sct_1.verifySCTs)(path11[0], path11[1], trustMaterial.ctlogs), - signer: getSigner(path11[0]) + scts: (0, sct_1.verifySCTs)(path12[0], path12[1], trustMaterial.ctlogs), + signer: getSigner(path12[0]) }; } function getSigner(cert) { @@ -152842,14 +153149,14 @@ var require_sigstore = __commonJS((exports) => { var bundle_1 = require_dist6(); var tuf = __importStar(require_dist11()); var verify_1 = require_dist12(); - var config3 = __importStar(require_config3()); + var config2 = __importStar(require_config3()); async function sign4(payload, options4 = {}) { - const bundler = config3.createBundleBuilder("messageSignature", options4); + const bundler = config2.createBundleBuilder("messageSignature", options4); const bundle = await bundler.create({ data: payload }); return (0, bundle_1.bundleToJSON)(bundle); } async function attest(payload, payloadType, options4 = {}) { - const bundler = config3.createBundleBuilder("dsseEnvelope", options4); + const bundler = config2.createBundleBuilder("dsseEnvelope", options4); const bundle = await bundler.create({ data: payload, type: payloadType }); return (0, bundle_1.bundleToJSON)(bundle); } @@ -152869,17 +153176,17 @@ var require_sigstore = __commonJS((exports) => { rootPath: options4.tufRootPath, cachePath: options4.tufCachePath, forceCache: options4.tufForceCache, - retry: options4.retry ?? config3.DEFAULT_RETRY, - timeout: options4.timeout ?? config3.DEFAULT_TIMEOUT + retry: options4.retry ?? config2.DEFAULT_RETRY, + timeout: options4.timeout ?? config2.DEFAULT_TIMEOUT }); - const keyFinder = options4.keySelector ? config3.createKeyFinder(options4.keySelector) : undefined; + const keyFinder = options4.keySelector ? config2.createKeyFinder(options4.keySelector) : undefined; const trustMaterial = (0, verify_1.toTrustMaterial)(trustedRoot, keyFinder); const verifierOptions = { ctlogThreshold: options4.ctLogThreshold, tlogThreshold: options4.tlogThreshold }; const verifier = new verify_1.Verifier(trustMaterial, verifierOptions); - const policy = config3.createVerificationPolicy(options4); + const policy = config2.createVerificationPolicy(options4); return { verify: (bundle, payload) => { const deserializedBundle = (0, bundle_1.bundleFromJSON)(bundle); @@ -153362,8 +153669,8 @@ var require_fetcher2 = __commonJS((exports, module2) => { cleanupCached() { return cacache.rm.content(this.cache, this.integrity, this.opts); } - #empty(path11) { - return getContents({ path: path11, depth: 1 }).then((contents) => Promise.all(contents.map((entry) => rm3(entry, { recursive: true, force: true })))); + #empty(path12) { + return getContents({ path: path12, depth: 1 }).then((contents) => Promise.all(contents.map((entry) => rm3(entry, { recursive: true, force: true })))); } async#mkdir(dest) { await this.#empty(dest); @@ -153411,9 +153718,9 @@ var require_fetcher2 = __commonJS((exports, module2) => { tarball.pipe(extractor); return p2; } - #entryMode(path11, mode, type3) { + #entryMode(path12, mode, type3) { const m3 = /Directory|GNUDumpDir/.test(type3) ? this.dmode : /File$/.test(type3) ? this.fmode : 0; - const exe = isPackageBin(this.package, path11) ? 73 : 0; + const exe = isPackageBin(this.package, path12) ? 73 : 0; return (mode | m3) & ~this.umask | exe | 384; } #tarxOptions({ cwd }) { @@ -154591,16 +154898,16 @@ var require_commonjs7 = __commonJS((exports) => { var require_realpath = __commonJS((exports, module2) => { var { lstat, readlink: readlink2 } = __require("fs/promises"); var { resolve: resolve9, basename: basename2, dirname: dirname6 } = __require("path"); - var realpathCached = (path11, rpcache, stcache, depth) => { + var realpathCached = (path12, rpcache, stcache, depth) => { if (depth > 2000) { - throw eloop(path11); + throw eloop(path12); } - path11 = resolve9(path11); - if (rpcache.has(path11)) { - return Promise.resolve(rpcache.get(path11)); + path12 = resolve9(path12); + if (rpcache.has(path12)) { + return Promise.resolve(rpcache.get(path12)); } - const dir2 = dirname6(path11); - const base2 = basename2(path11); + const dir2 = dirname6(path12); + const base2 = basename2(path12); if (base2 && rpcache.has(dir2)) { return realpathChild(dir2, base2, rpcache, stcache, depth); } @@ -154608,24 +154915,24 @@ var require_realpath = __commonJS((exports, module2) => { rpcache.set(dir2, dir2); return Promise.resolve(dir2); } - return realpathCached(dir2, rpcache, stcache, depth + 1).then(() => realpathCached(path11, rpcache, stcache, depth + 1)); + return realpathCached(dir2, rpcache, stcache, depth + 1).then(() => realpathCached(path12, rpcache, stcache, depth + 1)); }; - var lstatCached = (path11, stcache) => { - if (stcache.has(path11)) { - return Promise.resolve(stcache.get(path11)); + var lstatCached = (path12, stcache) => { + if (stcache.has(path12)) { + return Promise.resolve(stcache.get(path12)); } - const p2 = lstat(path11).then((st2) => { - stcache.set(path11, st2); + const p2 = lstat(path12).then((st2) => { + stcache.set(path12, st2); return st2; }); - stcache.set(path11, p2); + stcache.set(path12, p2); return p2; }; - var eloop = (path11) => Object.assign(new Error(`ELOOP: too many symbolic links encountered, stat '${path11}'`), { + var eloop = (path12) => Object.assign(new Error(`ELOOP: too many symbolic links encountered, stat '${path12}'`), { errno: -62, syscall: "stat", code: "ELOOP", - path: path11 + path: path12 }); var realpathChild = (dir2, base2, rpcache, stcache, depth) => { const realdir = rpcache.get(dir2); @@ -154655,7 +154962,7 @@ var require_realpath = __commonJS((exports, module2) => { // node_modules/@npmcli/arborist/lib/debug.js var require_debug3 = __commonJS((exports, module2) => { - var __dirname = "D:\\App\\OpenCode\\opencode-unifia-rebrand\\node_modules\\@npmcli\\arborist\\lib"; + var __dirname = "D:\\App\\OpenCode\\opencode-work-design\\node_modules\\@npmcli\\arborist\\lib"; var debug2 = process.env.ARBORIST_DEBUG !== "0" && (process.env.ARBORIST_DEBUG === "1" || /\barborist\b/.test(process.env.NODE_DEBUG || "") || process.env.npm_package_name === "@npmcli/arborist" && ["test", "snap"].includes(process.env.npm_lifecycle_event) || process.cwd() === __require("path").resolve(__dirname, "..")); module2.exports = debug2 ? (fn3) => fn3() : () => {}; var red = process.stderr.isTTY ? (msg) => `\x1B[31m${msg}\x1B[39m` : (m3) => m3; @@ -155076,8 +155383,8 @@ var require_can_place_dep = __commonJS((exports, module2) => { get top() { return this.parent ? this.parent.top : this; } - canPlacePeers(state2) { - this.canPlaceSelf = state2; + canPlacePeers(state) { + this.canPlaceSelf = state; if (this._canPlacePeers) { return this._canPlacePeers; } @@ -155107,7 +155414,7 @@ var require_can_place_dep = __commonJS((exports, module2) => { sawConflict = true; } } - this._canPlacePeers = sawConflict ? CONFLICT : state2; + this._canPlacePeers = sawConflict ? CONFLICT : state; return this._canPlacePeers; } get peerSetSource() { @@ -155146,13 +155453,13 @@ var require_is_windows = __commonJS((exports, module2) => { var require_get_node_modules = __commonJS((exports, module2) => { var { dirname: dirname6, basename: basename2 } = __require("path"); var memo2 = new Map; - module2.exports = (path11) => { - if (memo2.has(path11)) { - return memo2.get(path11); + module2.exports = (path12) => { + if (memo2.has(path12)) { + return memo2.get(path12); } - const scopeOrNm = dirname6(path11); + const scopeOrNm = dirname6(path12); const nm = basename2(scopeOrNm) === "node_modules" ? scopeOrNm : dirname6(scopeOrNm); - memo2.set(path11, nm); + memo2.set(path12, nm); return nm; }; }); @@ -155161,7 +155468,7 @@ var require_get_node_modules = __commonJS((exports, module2) => { var require_get_prefix = __commonJS((exports, module2) => { var { dirname: dirname6 } = __require("path"); var getNodeModules = require_get_node_modules(); - module2.exports = (path11) => dirname6(getNodeModules(path11)); + module2.exports = (path12) => dirname6(getNodeModules(path12)); }); // node_modules/bin-links/lib/bin-target.js @@ -155170,7 +155477,7 @@ var require_bin_target = __commonJS((exports, module2) => { var getPrefix = require_get_prefix(); var getNodeModules = require_get_node_modules(); var { dirname: dirname6 } = __require("path"); - module2.exports = ({ top: top2, path: path11 }) => !top2 ? getNodeModules(path11) + "/.bin" : isWindows ? getPrefix(path11) : dirname6(getPrefix(path11)) + "/bin"; + module2.exports = ({ top: top2, path: path12 }) => !top2 ? getNodeModules(path12) + "/.bin" : isWindows ? getPrefix(path12) : dirname6(getPrefix(path12)) + "/bin"; }); // node_modules/cmd-shim/lib/to-batch-syntax.js @@ -155237,7 +155544,7 @@ var require_lib36 = __commonJS((exports, module2) => { var toBatchSyntax = require_to_batch_syntax(); var shebangExpr = /^#!\s*(?:\/usr\/bin\/env\s+(?:-S\s+)?((?:[^ \t=]+=[^ \t=]+\s+)*))?([^ \t]+)(.*)$/; var cmdShimIfExists = (from, to2) => stat4(from).then(() => cmdShim(from, to2), () => {}); - var rm3 = (path11) => unlink(path11).catch(() => {}); + var rm3 = (path12) => unlink(path12).catch(() => {}); var cmdShim = (from, to2) => stat4(from).then(() => cmdShim_(from, to2)); var cmdShim_ = (from, to2) => Promise.all([ rm3(to2), @@ -155392,10 +155699,10 @@ var require_lib37 = __commonJS((exports, module2) => { var { promisify } = __require("util"); var { readFileSync: readFileSync5 } = fs6; var readFile5 = promisify(fs6.readFile); - var extractPath = (path11, cmdshimContents) => { - if (/[.]cmd$/.test(path11)) { + var extractPath = (path12, cmdshimContents) => { + if (/[.]cmd$/.test(path12)) { return extractPathFromCmd(cmdshimContents); - } else if (/[.]ps1$/.test(path11)) { + } else if (/[.]ps1$/.test(path12)) { return extractPathFromPowershell(cmdshimContents); } else { return extractPathFromCygwin(cmdshimContents); @@ -155419,33 +155726,33 @@ var require_lib37 = __commonJS((exports, module2) => { newError.path = thrown.path; return newError; }; - var notaShim = (path11, er2) => { + var notaShim = (path12, er2) => { if (!er2) { er2 = new Error; Error.captureStackTrace(er2, notaShim); } er2.code = "ENOTASHIM"; - er2.message = `Can't read shim path from '${path11}', ` + `it doesn't appear to be a cmd-shim`; + er2.message = `Can't read shim path from '${path12}', ` + `it doesn't appear to be a cmd-shim`; return er2; }; - var readCmdShim = (path11) => { + var readCmdShim = (path12) => { const er2 = new Error; Error.captureStackTrace(er2, readCmdShim); - return readFile5(path11).then((contents) => { - const destination = extractPath(path11, contents.toString()); + return readFile5(path12).then((contents) => { + const destination = extractPath(path12, contents.toString()); if (destination) { return destination; } - throw notaShim(path11, er2); + throw notaShim(path12, er2); }, (readFileEr) => { throw wrapError(readFileEr, er2); }); }; - var readCmdShimSync = (path11) => { - const contents = readFileSync5(path11); - const destination = extractPath(path11, contents.toString()); + var readCmdShimSync = (path12) => { + const contents = readFileSync5(path12); + const destination = extractPath(path12, contents.toString()); if (!destination) { - throw notaShim(path11); + throw notaShim(path12); } return destination; }; @@ -155672,7 +155979,7 @@ var require_cjs = __commonJS((exports) => { // node_modules/write-file-atomic/lib/index.js var require_lib38 = __commonJS((exports, module2) => { - var __filename = "D:\\App\\OpenCode\\opencode-unifia-rebrand\\node_modules\\write-file-atomic\\lib\\index.js"; + var __filename = "D:\\App\\OpenCode\\opencode-work-design\\node_modules\\write-file-atomic\\lib\\index.js"; module2.exports = writeFile6; module2.exports.sync = writeFileSync; module2.exports._getTmpname = getTmpname; @@ -155680,7 +155987,7 @@ var require_lib38 = __commonJS((exports, module2) => { var fs6 = __require("fs"); var crypto3 = __require("crypto"); var { onExit: onExit6 } = require_cjs(); - var path11 = __require("path"); + var path12 = __require("path"); var { promisify } = __require("util"); var activeFiles = {}; var threadId = function getId() { @@ -155732,7 +156039,7 @@ var require_lib38 = __commonJS((exports, module2) => { let fd; let tmpfile; const removeOnExitHandler = onExit6(cleanupOnExit(() => tmpfile)); - const absoluteName = path11.resolve(filename); + const absoluteName = path12.resolve(filename); try { await serializeActiveFile(absoluteName); const truename = await promisify(fs6.realpath)(filename).catch(() => filename); @@ -155928,7 +156235,7 @@ var require_shim_bin = __commonJS((exports, module2) => { })); var handleReadCmdShimError = ({ er: er2, from, to: to2 }) => er2.code === "ENOENT" ? null : er2.code === "ENOTASHIM" ? failEEXIST({ from, to: to2 }) : Promise.reject(er2); var SKIP = Symbol("skip - missing or already installed"); - var shimBin = ({ path: path11, to: to2, from, absFrom, force }) => { + var shimBin = ({ path: path12, to: to2, from, absFrom, force }) => { const shims = [ to2, to2 + ".cmd", @@ -155957,9 +156264,9 @@ var require_shim_bin = __commonJS((exports, module2) => { } return readCmdShim(s5).then((target) => { target = resolve9(dirname6(to2), target); - const base2 = resolve9(path11); + const base2 = resolve9(path12); if (target !== base2 && !target.startsWith(base2 + sep2)) { - return failEEXIST({ from, to: to2, path: path11 }); + return failEEXIST({ from, to: to2, path: path12 }); } return false; }, (er2) => handleReadCmdShimError({ er: er2, from, to: to2 })); @@ -155997,7 +156304,7 @@ var require_link_gently = __commonJS((exports, module2) => { var seen = new Set; var SKIP = Symbol("skip - missing or already installed"); var CLOBBER = Symbol("clobber - ours or in forceful mode"); - var linkGently = async ({ path: path11, to: to2, from, absFrom, force }) => { + var linkGently = async ({ path: path12, to: to2, from, absFrom, force }) => { if (seen.has(to2)) { return false; } @@ -156018,7 +156325,7 @@ var require_link_gently = __commonJS((exports, module2) => { return SKIP; } target = resolve9(dirname6(to2), target); - if (target === path11 || target.startsWith(path11 + sep2) || force) { + if (target === path12 || target.startsWith(path12 + sep2) || force) { return rm3(to2, rmOpts).then(() => CLOBBER); } return false; @@ -156050,7 +156357,7 @@ var require_link_gently = __commonJS((exports, module2) => { var require_link_bin = __commonJS((exports, module2) => { var linkGently = require_link_gently(); var fixBin = require_fix_bin(); - var linkBin = ({ path: path11, to: to2, from, absFrom, force }) => linkGently({ path: path11, to: to2, from, absFrom, force }).then((linked) => linked && fixBin(absFrom)); + var linkBin = ({ path: path12, to: to2, from, absFrom, force }) => linkGently({ path: path12, to: to2, from, absFrom, force }).then((linked) => linked && fixBin(absFrom)); module2.exports = linkBin; }); @@ -156061,18 +156368,18 @@ var require_link_bins = __commonJS((exports, module2) => { var { dirname: dirname6, resolve: resolve9, relative: relative4 } = __require("path"); var linkBin = isWindows ? require_shim_bin() : require_link_bin(); var normalize4 = require_lib11(); - var linkBins = ({ path: path11, pkg, top: top2, force }) => { + var linkBins = ({ path: path12, pkg, top: top2, force }) => { pkg = normalize4(pkg); if (!pkg.bin) { return Promise.resolve([]); } const promises2 = []; - const target = binTarget({ path: path11, top: top2 }); + const target = binTarget({ path: path12, top: top2 }); for (const [key, val] of Object.entries(pkg.bin)) { const to2 = resolve9(target, key); - const absFrom = resolve9(path11, val); + const absFrom = resolve9(path12, val); const from = relative4(dirname6(to2), absFrom); - promises2.push(linkBin({ path: path11, from, to: to2, absFrom, force })); + promises2.push(linkBin({ path: path12, from, to: to2, absFrom, force })); } return Promise.all(promises2); }; @@ -156084,7 +156391,7 @@ var require_man_target = __commonJS((exports, module2) => { var isWindows = require_is_windows(); var getPrefix = require_get_prefix(); var { dirname: dirname6 } = __require("path"); - module2.exports = ({ top: top2, path: path11 }) => !top2 || isWindows ? null : dirname6(getPrefix(path11)) + "/share/man"; + module2.exports = ({ top: top2, path: path12 }) => !top2 || isWindows ? null : dirname6(getPrefix(path12)) + "/share/man"; }); // node_modules/bin-links/lib/link-mans.js @@ -156092,8 +156399,8 @@ var require_link_mans = __commonJS((exports, module2) => { var { dirname: dirname6, relative: relative4, join: join12, resolve: resolve9, basename: basename2 } = __require("path"); var linkGently = require_link_gently(); var manTarget = require_man_target(); - var linkMans = async ({ path: path11, pkg, top: top2, force }) => { - const target = manTarget({ path: path11, top: top2 }); + var linkMans = async ({ path: path12, pkg, top: top2, force }) => { + const target = manTarget({ path: path12, top: top2 }); if (!target || !Array.isArray(pkg?.man) || !pkg.man.length) { return []; } @@ -156108,25 +156415,25 @@ var require_link_mans = __commonJS((exports, module2) => { throw Object.assign(new Error(`invalid man entry name ` + "Man files must end with a number, " + "and optionally a .gz suffix if they are compressed."), { code: "EBADMAN", - path: path11, + path: path12, pkgid: pkg._id, man }); } const section = parseMan[1]; const base2 = basename2(man); - const absFrom = resolve9(path11, man); - if (absFrom.indexOf(path11) !== 0) { + const absFrom = resolve9(path12, man); + if (absFrom.indexOf(path12) !== 0) { throw Object.assign(new Error("invalid man entry"), { code: "EBADMAN", - path: path11, + path: path12, pkgid: pkg._id, man }); } const to2 = resolve9(target, "man" + section, base2); const from = relative4(dirname6(to2), absFrom); - links.push(linkGently({ from, to: to2, path: path11, absFrom, force })); + links.push(linkGently({ from, to: to2, path: path12, absFrom, force })); } return Promise.all(links); }; @@ -156140,23 +156447,23 @@ var require_check_bin = __commonJS((exports, module2) => { var { resolve: resolve9, dirname: dirname6, sep: sep2 } = __require("path"); var readCmdShim = require_lib37(); var { readlink: readlink2 } = __require("fs/promises"); - var checkBin = async ({ bin, path: path11, top: top2, global: global2, force }) => { + var checkBin = async ({ bin, path: path12, top: top2, global: global2, force }) => { if (force || !global2 || !top2) { return; } - const target = resolve9(binTarget({ path: path11, top: top2 }), bin); - path11 = resolve9(path11); - return isWindows ? checkShim({ target, path: path11 }) : checkLink({ target, path: path11 }); + const target = resolve9(binTarget({ path: path12, top: top2 }), bin); + path12 = resolve9(path12); + return isWindows ? checkShim({ target, path: path12 }) : checkLink({ target, path: path12 }); }; var handleReadLinkError = async ({ er: er2, target }) => er2.code === "ENOENT" ? null : failEEXIST({ target }); - var checkLink = async ({ target, path: path11 }) => { + var checkLink = async ({ target, path: path12 }) => { const current = await readlink2(target).catch((er2) => handleReadLinkError({ er: er2, target })); if (!current) { return; } const resolved = resolve9(dirname6(target), current); const resolvedLower = resolved.toLowerCase(); - const pathLower = path11.toLowerCase(); + const pathLower = path12.toLowerCase(); if (resolvedLower !== pathLower && !resolvedLower.startsWith(pathLower + sep2)) { return failEEXIST({ target }); } @@ -156166,7 +156473,7 @@ var require_check_bin = __commonJS((exports, module2) => { path: target, code: "EEXIST" })); - var checkShim = async ({ target, path: path11 }) => { + var checkShim = async ({ target, path: path12 }) => { const shims = [ target, target + ".cmd", @@ -156179,7 +156486,7 @@ var require_check_bin = __commonJS((exports, module2) => { } const resolved = resolve9(dirname6(shim3), current.replace(/\\/g, "/")); const resolvedLower = resolved.toLowerCase(); - const pathLower = path11.toLowerCase(); + const pathLower = path12.toLowerCase(); if (resolvedLower !== pathLower && !resolvedLower.startsWith(pathLower + sep2)) { return failEEXIST({ target: shim3 }); } @@ -156192,7 +156499,7 @@ var require_check_bin = __commonJS((exports, module2) => { var require_check_bins = __commonJS((exports, module2) => { var checkBin = require_check_bin(); var normalize4 = require_lib11(); - var checkBins = async ({ pkg, path: path11, top: top2, global: global2, force }) => { + var checkBins = async ({ pkg, path: path12, top: top2, global: global2, force }) => { if (force || !global2 || !top2) { return; } @@ -156200,7 +156507,7 @@ var require_check_bins = __commonJS((exports, module2) => { if (!pkg.bin) { return; } - await Promise.all(Object.keys(pkg.bin).map((bin) => checkBin({ bin, path: path11, top: top2, global: global2, force }))); + await Promise.all(Object.keys(pkg.bin).map((bin) => checkBin({ bin, path: path12, top: top2, global: global2, force }))); }; module2.exports = checkBins; }); @@ -156211,12 +156518,12 @@ var require_get_paths = __commonJS((exports, module2) => { var manTarget = require_man_target(); var { resolve: resolve9, basename: basename2, extname: extname3 } = __require("path"); var isWindows = require_is_windows(); - module2.exports = ({ path: path11, pkg, global: global2, top: top2 }) => { + module2.exports = ({ path: path12, pkg, global: global2, top: top2 }) => { if (top2 && !global2) { return []; } const binSet = []; - const binTarg = binTarget({ path: path11, top: top2 }); + const binTarg = binTarget({ path: path12, top: top2 }); if (pkg.bin) { for (const bin of Object.keys(pkg.bin)) { const b2 = resolve9(binTarg, bin); @@ -156227,7 +156534,7 @@ var require_get_paths = __commonJS((exports, module2) => { } } } - const manTarg = manTarget({ path: path11, top: top2 }); + const manTarg = manTarget({ path: path12, top: top2 }); const manSet = []; if (manTarg && pkg.man && Array.isArray(pkg.man) && pkg.man.length) { for (const man of pkg.man) { @@ -156248,13 +156555,13 @@ var require_lib39 = __commonJS((exports, module2) => { var linkBins = require_link_bins(); var linkMans = require_link_mans(); var binLinks = (opts) => { - const { path: path11, pkg, force, global: global2, top: top2 } = opts; + const { path: path12, pkg, force, global: global2, top: top2 } = opts; if (top2 && !global2) { return Promise.resolve(); } return Promise.all([ - linkBins({ path: path11, pkg, top: top2, force: force || !top2 }), - linkMans({ path: path11, pkg, top: top2, force }) + linkBins({ path: path12, pkg, top: top2, force: force || !top2 }), + linkMans({ path: path12, pkg, top: top2, force }) ]); }; var shimBin = require_shim_bin(); @@ -156277,14 +156584,14 @@ var require_commonjs8 = __commonJS((exports) => { Object.defineProperty(exports, "__esModule", { value: true }); exports.walkUp = undefined; var path_1 = __require("path"); - var walkUp = function* (path11) { - for (path11 = (0, path_1.resolve)(path11);path11; ) { - yield path11; - const pp = (0, path_1.dirname)(path11); - if (pp === path11) { + var walkUp = function* (path12) { + for (path12 = (0, path_1.resolve)(path12);path12; ) { + yield path12; + const pp = (0, path_1.dirname)(path12); + if (pp === path12) { break; } else { - path11 = pp; + path12 = pp; } } }; @@ -157144,7 +157451,7 @@ var require_printable = __commonJS((exports, module2) => { var relpath = require_relpath(); class ArboristNode { - constructor(tree, path11) { + constructor(tree, path12) { this.name = tree.name; if (tree.packageName && tree.packageName !== this.name) { this.packageName = tree.packageName; @@ -157212,33 +157519,33 @@ var require_printable = __commonJS((exports, module2) => { this.edgesIn = new Set([...tree.edgesIn].sort((a4, b2) => localeCompare2(a4.from.location, b2.from.location)).map((edge) => new EdgeIn(edge))); } if (tree.workspaces && tree.workspaces.size) { - this.workspaces = new Map([...tree.workspaces.entries()].map(([name3, path12]) => [name3, relpath(tree.root.realpath, path12)])); + this.workspaces = new Map([...tree.workspaces.entries()].map(([name3, path13]) => [name3, relpath(tree.root.realpath, path13)])); } if (tree.fsChildren.size) { - this.fsChildren = new Set([...tree.fsChildren].sort(({ path: a4 }, { path: b2 }) => localeCompare2(a4, b2)).map((tree2) => printableTree(tree2, path11))); + this.fsChildren = new Set([...tree.fsChildren].sort(({ path: a4 }, { path: b2 }) => localeCompare2(a4, b2)).map((tree2) => printableTree(tree2, path12))); } if (tree.children.size) { - this.children = new Map([...tree.children.entries()].sort(([a4], [b2]) => localeCompare2(a4, b2)).map(([name3, tree2]) => [name3, printableTree(tree2, path11)])); + this.children = new Map([...tree.children.entries()].sort(([a4], [b2]) => localeCompare2(a4, b2)).map(([name3, tree2]) => [name3, printableTree(tree2, path12)])); } } } class ArboristVirtualNode extends ArboristNode { - constructor(tree, path11) { - super(tree, path11); - this.sourceReference = printableTree(tree.sourceReference, path11); + constructor(tree, path12) { + super(tree, path12); + this.sourceReference = printableTree(tree.sourceReference, path12); } } class ArboristLink extends ArboristNode { - constructor(tree, path11) { - super(tree, path11); - this.target = printableTree(tree.target, path11); + constructor(tree, path12) { + super(tree, path12); + this.target = printableTree(tree.target, path12); } } - var treeError = ({ code, path: path11 }) => ({ + var treeError = ({ code, path: path12 }) => ({ code, - ...path11 ? { path: path11 } : {} + ...path12 ? { path: path12 } : {} }); class Edge2 { @@ -157277,17 +157584,17 @@ var require_printable = __commonJS((exports, module2) => { return `{ ${this.from || '""'} ${this.type} ${this.name}@${this.spec}${this.error ? " " + this.error : ""}${this.peerConflicted ? " peerConflicted" : ""} }`; } } - var printableTree = (tree, path11 = []) => { + var printableTree = (tree, path12 = []) => { if (!tree) { return tree; } const Cls = tree.isLink ? ArboristLink : tree.sourceReference ? ArboristVirtualNode : ArboristNode; - if (path11.includes(tree)) { + if (path12.includes(tree)) { const obj = Object.create(Cls.prototype); return Object.assign(obj, { location: tree.location }); } - path11.push(tree); - return new Cls(tree, path11); + path12.push(tree); + return new Cls(tree, path12); }; module2.exports = printableTree; }); @@ -161696,7 +162003,7 @@ var require_node5 = __commonJS((exports, module2) => { constructor(options4) { const { root, - path: path11, + path: path12, realpath: realpath2, parent, error: error46, @@ -161742,8 +162049,8 @@ var require_node5 = __commonJS((exports, module2) => { pkg.syncNormalize(); this[_package] = pkg.content; } - this.name = name3 || nameFromFolder(path11 || this.package.name || realpath2) || this.package.name || null; - this.path = path11 ? resolve9(path11) : null; + this.name = name3 || nameFromFolder(path12 || this.package.name || realpath2) || this.package.name || null; + this.path = path12 ? resolve9(path12) : null; if (!this.name && (!this.path || this.path !== dirname6(this.path))) { throw new TypeError("could not detect node name from path or package"); } @@ -161989,16 +162296,16 @@ var require_node5 = __commonJS((exports, module2) => { } return this.peer && omitSet.has("peer") || this.dev && omitSet.has("dev") || this.optional && omitSet.has("optional") || this.devOptional && omitSet.has("optional") && omitSet.has("dev"); } - getBundler(path11 = []) { - if (path11.includes(this)) { + getBundler(path12 = []) { + if (path12.includes(this)) { return null; } - path11.push(this); + path12.push(this); const parent = this[_parent]; if (!parent) { return null; } - const pBundler = parent.getBundler(path11); + const pBundler = parent.getBundler(path12); if (pBundler) { return pBundler; } @@ -162008,7 +162315,7 @@ var require_node5 = __commonJS((exports, module2) => { return parent; } for (const edge of this.edgesIn) { - const eBundler = edge.from.getBundler(path11); + const eBundler = edge.from.getBundler(path12); if (!eBundler) { continue; } @@ -162256,8 +162563,8 @@ var require_node5 = __commonJS((exports, module2) => { if (!this.#workspaces) { return; } - for (const [name3, path11] of this.#workspaces.entries()) { - new Edge2({ from: this, name: name3, spec: `file:${path11}`, type: "workspace" }); + for (const [name3, path12] of this.#workspaces.entries()) { + new Edge2({ from: this, name: name3, spec: `file:${path12}`, type: "workspace" }); } } [_loadDeps]() { @@ -162279,13 +162586,13 @@ var require_node5 = __commonJS((exports, module2) => { } this.#loadDepType(this.package.dependencies, "prod", ad); this.#loadDepType(this.package.optionalDependencies, "optional", ad); - const { globalTop, isTop, path: path11, sourceReference } = this; + const { globalTop, isTop, path: path12, sourceReference } = this; const { globalTop: srcGlobalTop, isTop: srcTop, path: srcPath } = sourceReference || {}; - const thisDev = isTop && !globalTop && path11; + const thisDev = isTop && !globalTop && path12; const srcDev = !sourceReference || srcTop && !srcGlobalTop && srcPath; if (thisDev && srcDev) { this.#loadDepType(this.package.devDependencies, "dev", ad); @@ -163602,16 +163909,16 @@ var require_just_diff = __commonJS((exports, module2) => { var obj1KeysLength = obj1Keys.length; var obj2Keys = Object.keys(obj22); var obj2KeysLength = obj2Keys.length; - var path11; + var path12; var lengthDelta = obj12.length - obj22.length; if (trimFromRight(obj12, obj22)) { for (var i6 = 0;i6 < obj1KeysLength; i6++) { var key = Array.isArray(obj12) ? Number(obj1Keys[i6]) : obj1Keys[i6]; if (!(key in obj22)) { - path11 = basePathForRemoves.concat(key); + path12 = basePathForRemoves.concat(key); diffs2.remove.push({ op: "remove", - path: pathConverter(path11) + path: pathConverter(path12) }); } } @@ -163628,10 +163935,10 @@ var require_just_diff = __commonJS((exports, module2) => { } } else { for (var i6 = 0;i6 < lengthDelta; i6++) { - path11 = basePathForRemoves.concat(i6); + path12 = basePathForRemoves.concat(i6); diffs2.remove.push({ op: "remove", - path: pathConverter(path11) + path: pathConverter(path12) }); } var obj1Trimmed = obj12.slice(lengthDelta); @@ -163656,27 +163963,27 @@ var require_just_diff = __commonJS((exports, module2) => { diffs }); return diffs.remove.reverse().concat(diffs.replace).concat(diffs.add); - function pushReplaces({ key, obj1: obj12, obj2: obj22, path: path11, pathForRemoves, diffs: diffs2 }) { + function pushReplaces({ key, obj1: obj12, obj2: obj22, path: path12, pathForRemoves, diffs: diffs2 }) { var obj1AtKey = obj12[key]; var obj2AtKey = obj22[key]; if (!(key in obj12) && key in obj22) { var obj2Value = obj2AtKey; diffs2.add.push({ op: "add", - path: pathConverter(path11), + path: pathConverter(path12), value: obj2Value }); } else if (obj1AtKey !== obj2AtKey) { if (Object(obj1AtKey) !== obj1AtKey || Object(obj2AtKey) !== obj2AtKey || differentTypes(obj1AtKey, obj2AtKey)) { - pushReplace(path11, diffs2, obj2AtKey); + pushReplace(path12, diffs2, obj2AtKey); } else { if (!Object.keys(obj1AtKey).length && !Object.keys(obj2AtKey).length && String(obj1AtKey) != String(obj2AtKey)) { - pushReplace(path11, diffs2, obj2AtKey); + pushReplace(path12, diffs2, obj2AtKey); } else { getDiff({ obj1: obj12[key], obj2: obj22[key], - basePath: path11, + basePath: path12, basePathForRemoves: pathForRemoves, diffs: diffs2 }); @@ -163684,10 +163991,10 @@ var require_just_diff = __commonJS((exports, module2) => { } } } - function pushReplace(path11, diffs2, newValue) { + function pushReplace(path12, diffs2, newValue) { diffs2.replace.push({ op: "replace", - path: pathConverter(path11), + path: pathConverter(path12), value: newValue }); } @@ -163781,9 +164088,9 @@ var require_just_diff_apply = __commonJS((exports, module2) => { subObject = subObject[thisProp]; } if (thisOp === REMOVE || thisOp === REPLACE || thisOp === MOVE) { - var path11 = thisOp === MOVE ? thisDiff.from : thisDiff.path; + var path12 = thisOp === MOVE ? thisDiff.from : thisDiff.path; if (!subObject.hasOwnProperty(lastProp)) { - throw new Error(["expected to find property", path11, "in object", obj].join(" ")); + throw new Error(["expected to find property", path12, "in object", obj].join(" ")); } } if (thisOp === REMOVE || thisOp === MOVE) { @@ -163891,10 +164198,10 @@ var require_lib41 = __commonJS((exports, module2) => { return prefer === "ours" ? resolve9(parent, ours, theirs) : resolve9(parent, theirs, ours); }; var isObj = (obj) => obj && typeof obj === "object"; - var copyPath = (to2, from, path11, i6) => { - const p2 = path11[i6]; + var copyPath = (to2, from, path12, i6) => { + const p2 = path12[i6]; if (isObj(to2[p2]) && isObj(from[p2]) && Array.isArray(to2[p2]) === Array.isArray(from[p2])) { - return copyPath(to2[p2], from[p2], path11, i6 + 1); + return copyPath(to2[p2], from[p2], path12, i6 + 1); } to2[p2] = from[p2]; }; @@ -164034,16 +164341,16 @@ var require_shrinkwrap = __commonJS((exports, module2) => { } return null; }; - var assertNoNewer = async (path11, data2, lockTime, dir2, seen) => { + var assertNoNewer = async (path12, data2, lockTime, dir2, seen) => { const base2 = basename2(dir2); - const isNM = dir2 !== path11 && base2 === "node_modules"; - const isScope = dir2 !== path11 && base2.startsWith("@"); - const isParent = dir2 === path11 || isNM || isScope; + const isNM = dir2 !== path12 && base2 === "node_modules"; + const isScope = dir2 !== path12 && base2.startsWith("@"); + const isParent = dir2 === path12 || isNM || isScope; const parent = isParent ? dir2 : resolve9(dir2, "node_modules"); - const rel = relpath(path11, dir2); + const rel = relpath(path12, dir2); seen.add(rel); let entries10; - if (dir2 === path11) { + if (dir2 === path12) { entries10 = [{ name: "node_modules", isDirectory: () => true }]; } else { const { mtime: dirTime } = await stat4(dir2); @@ -164058,17 +164365,17 @@ var require_shrinkwrap = __commonJS((exports, module2) => { await Promise.all(entries10.map(async (dirent) => { const child = resolve9(parent, dirent.name); if (dirent.isDirectory() && !dirent.name.startsWith(".")) { - await assertNoNewer(path11, data2, lockTime, child, seen); + await assertNoNewer(path12, data2, lockTime, child, seen); } else if (dirent.isSymbolicLink()) { const target = resolve9(parent, await readlink2(child)); const tstat = await stat4(target).catch(() => null); - seen.add(relpath(path11, child)); - if (tstat?.isDirectory() && !seen.has(relpath(path11, target))) { - await assertNoNewer(path11, data2, lockTime, target, seen); + seen.add(relpath(path12, child)); + if (tstat?.isDirectory() && !seen.has(relpath(path12, target))) { + await assertNoNewer(path12, data2, lockTime, target, seen); } } })); - if (dir2 !== path11) { + if (dir2 !== path12) { return; } for (const loc in data2.packages) { @@ -164103,10 +164410,10 @@ var require_shrinkwrap = __commonJS((exports, module2) => { s5.type = basename2(s5.filename); return s5; } - static metaFromNode(node, path11, options4 = {}) { + static metaFromNode(node, path12, options4 = {}) { if (node.isLink) { return { - resolved: relpath(path11, node.realpath), + resolved: relpath(path12, node.realpath), link: true }; } @@ -164129,7 +164436,7 @@ var require_shrinkwrap = __commonJS((exports, module2) => { meta[key] = node[key]; } } - const resolved = consistentResolve(node.resolved, node.path, path11, true); + const resolved = consistentResolve(node.resolved, node.path, path12, true); if (!resolved) {} else if (node.isRegistryDependency) { meta.resolved = overrideResolves(resolved, options4); } else { @@ -164156,7 +164463,7 @@ var require_shrinkwrap = __commonJS((exports, module2) => { #awaitingUpdate = new Map; constructor(options4 = {}) { const { - path: path11, + path: path12, indent = 2, newline = ` `, @@ -164173,7 +164480,7 @@ var require_shrinkwrap = __commonJS((exports, module2) => { this.lockfileVersion = null; } this.tree = null; - this.path = resolve9(path11 || "."); + this.path = resolve9(path12 || "."); this.filename = null; this.data = null; this.indent = indent; @@ -164377,34 +164684,34 @@ var require_shrinkwrap = __commonJS((exports, module2) => { } } #resolveMetaNode(loc, name3) { - for (let path11 = loc;; path11 = path11.replace(/(^|\/)[^/]*$/, "")) { - const check6 = `${path11}${path11 ? "/" : ""}node_modules/${name3}`; + for (let path12 = loc;; path12 = path12.replace(/(^|\/)[^/]*$/, "")) { + const check6 = `${path12}${path12 ? "/" : ""}node_modules/${name3}`; if (this.data.packages[check6]) { return this.data.packages[check6]; } - if (!path11) { + if (!path12) { break; } } return null; } - #lockFromLoc(lock, path11, i6 = 0) { + #lockFromLoc(lock, path12, i6 = 0) { if (!lock) { return null; } - if (path11[i6] === "") { + if (path12[i6] === "") { i6++; } - if (i6 >= path11.length) { + if (i6 >= path12.length) { return lock; } if (!lock.dependencies) { return null; } - return this.#lockFromLoc(lock.dependencies[path11[i6]], path11, i6 + 1); + return this.#lockFromLoc(lock.dependencies[path12[i6]], path12, i6 + 1); } - #pathToLoc(path11) { - return relpath(this.path, resolve9(this.path, path11)); + #pathToLoc(path12) { + return relpath(this.path, resolve9(this.path, path12)); } delete(nodePath2) { if (!this.data) { @@ -164413,9 +164720,9 @@ var require_shrinkwrap = __commonJS((exports, module2) => { const location2 = this.#pathToLoc(nodePath2); this.#awaitingUpdate.delete(location2); delete this.data.packages[location2]; - const path11 = location2.split(/(?:^|\/)node_modules\//); - const name3 = path11.pop(); - const pLock = this.#lockFromLoc(this.data, path11); + const path12 = location2.split(/(?:^|\/)node_modules\//); + const name3 = path12.pop(); + const pLock = this.#lockFromLoc(this.data, path12); if (pLock && pLock.dependencies) { delete pLock.dependencies[name3]; } @@ -164431,9 +164738,9 @@ var require_shrinkwrap = __commonJS((exports, module2) => { if (this.data.packages[location2]) { return this.data.packages[location2]; } - const path11 = location2.split(/(?:^|\/)node_modules\//); - const name3 = path11[path11.length - 1]; - const lock = this.#lockFromLoc(this.data, path11); + const path12 = location2.split(/(?:^|\/)node_modules\//); + const name3 = path12[path12.length - 1]; + const lock = this.#lockFromLoc(this.data, path12); return this.#metaFromLock(location2, name3, lock); } #metaFromLock(location2, name3, lock) { @@ -164628,7 +164935,7 @@ var require_shrinkwrap = __commonJS((exports, module2) => { return { ...this.data }; } } - #buildLegacyLockfile(node, lock, path11 = []) { + #buildLegacyLockfile(node, lock, path12 = []) { if (node === this.tree) { lock.name = node.packageName || node.name; if (node.version) { @@ -164716,11 +165023,11 @@ var require_shrinkwrap = __commonJS((exports, module2) => { if (!children.size) { delete lock.dependencies; } else { - const kidPath = [...path11, node.realpath]; + const kidPath = [...path12, node.realpath]; const dependencies = {}; let found = false; for (const [name3, kid] of children.entries()) { - if (path11.includes(kid.realpath)) { + if (path12.includes(kid.realpath)) { continue; } dependencies[name3] = this.#buildLegacyLockfile(kid, {}, kidPath); @@ -165168,7 +165475,7 @@ var require_build_ideal_tree = __commonJS((exports, module2) => { this.#depsQueue.push(tree); } async#add(tree, { add: add10, saveType = null, saveBundle = false }) { - const path11 = tree.target.path; + const path12 = tree.target.path; await Promise.all(add10.map(async (rawSpec) => { let spec = npa(rawSpec); const isTag = spec.rawSpec && spec.type === "tag"; @@ -165182,12 +165489,12 @@ var require_build_ideal_tree = __commonJS((exports, module2) => { } const { name: name3 } = spec; if (spec.type === "file") { - spec = npa(`file:${relpath(path11, spec.fetchSpec)}`, path11); + spec = npa(`file:${relpath(path12, spec.fetchSpec)}`, path12); spec.name = name3; } else if (spec.type === "directory") { try { const real4 = await realpath2(spec.fetchSpec, this[_rpcache], this[_stcache]); - spec = npa(`file:${relpath(path11, real4)}`, path11); + spec = npa(`file:${relpath(path12, real4)}`, path12); spec.name = name3; } catch {} } @@ -165299,10 +165606,10 @@ This is a one-time fix-up, please be patient... } queue.push(async () => { log7.silly("inflate", node.location); - const { resolved, version: version4, path: path11, name: name3, location: location2, integrity } = node; + const { resolved, version: version4, path: path12, name: name3, location: location2, integrity } = node; const useResolved = resolved && (!version4 || resolved.startsWith("file:")); const id2 = useResolved ? resolved : version4; - const spec = npa.resolve(name3, id2, dirname6(path11)); + const spec = npa.resolve(name3, id2, dirname6(path12)); const t2 = `idealTree:inflate:${location2}`; this.addTracker(t2); try { @@ -165362,18 +165669,18 @@ This is a one-time fix-up, please be patient... if (crackOpen) { const Arborist = this.constructor; const opt2 = { ...this.options }; - await cacache.tmp.withTmp(this.cache, opt2, async (path11) => { - await pacote.extract(node.resolved, path11, { + await cacache.tmp.withTmp(this.cache, opt2, async (path12) => { + await pacote.extract(node.resolved, path12, { ...opt2, Arborist, resolved: node.resolved, integrity: node.integrity }); if (hasShrinkwrap) { - await new Arborist({ ...this.options, path: path11 }).loadVirtual({ root: node }); + await new Arborist({ ...this.options, path: path12 }).loadVirtual({ root: node }); } if (hasBundle) { - await new Arborist({ ...this.options, path: path11 }).loadActual({ root: node, ignoreMissing: true }); + await new Arborist({ ...this.options, path: path12 }).loadActual({ root: node, ignoreMissing: true }); } }); } @@ -165904,9 +166211,9 @@ var require_load_actual = __commonJS((exports, module2) => { await this[_setWorkspaces](this.#actualTree); if (this.#actualTree.workspaces && this.#actualTree.workspaces.size) { const promises2 = []; - for (const path11 of this.#actualTree.workspaces.values()) { - if (!this.#cache.has(path11)) { - const p2 = this.#loadFSNode({ path: path11, root: this.#actualTree, useRootOverrides: true }).then((node) => this.#loadFSTree(node)); + for (const path12 of this.#actualTree.workspaces.values()) { + if (!this.#cache.has(path12)) { + const p2 = this.#loadFSNode({ path: path12, root: this.#actualTree, useRootOverrides: true }).then((node) => this.#loadFSTree(node)); promises2.push(p2); } } @@ -165915,10 +166222,10 @@ var require_load_actual = __commonJS((exports, module2) => { if (!ignoreMissing) { await this.#findMissingEdges(); } - for (const path11 of this.#topNodes) { - const node = this.#cache.get(path11); + for (const path12 of this.#topNodes) { + const node = this.#cache.get(path12); if (node && !node.parent && !node.fsParent) { - for (const p2 of walkUp(dirname6(path11))) { + for (const p2 of walkUp(dirname6(path12))) { if (this.#cache.has(p2)) { node.fsParent = this.#cache.get(p2); break; @@ -165955,22 +166262,22 @@ var require_load_actual = __commonJS((exports, module2) => { } this.#actualTree = root; } - async#loadFSNode({ path: path11, parent, real: real4, root, loadOverrides, useRootOverrides }) { + async#loadFSNode({ path: path12, parent, real: real4, root, loadOverrides, useRootOverrides }) { if (!real4) { try { - real4 = await realpath2(path11, this[_rpcache], this[_stcache]); + real4 = await realpath2(path12, this[_rpcache], this[_stcache]); } catch (error46) { return new Node4({ error: error46, - path: path11, - realpath: path11, + path: path12, + realpath: path12, parent, root, loadOverrides }); } } - const cached4 = this.#cache.get(path11); + const cached4 = this.#cache.get(path12); let node; if (cached4 && !cached4.dummy) { cached4.parent = parent; @@ -165979,7 +166286,7 @@ var require_load_actual = __commonJS((exports, module2) => { const params = { installLinks: this.installLinks, legacyPeerDeps: this.legacyPeerDeps, - path: path11, + path: path12, realpath: real4, parent, root, @@ -165997,13 +166304,13 @@ var require_load_actual = __commonJS((exports, module2) => { } params.error = err2; } - if (normalize4(path11) === real4) { + if (normalize4(path12) === real4) { node = this.#newNode(params); } else { node = await this.#newLink(params); } } - this.#cache.set(path11, node); + this.#cache.set(path12, node); return node; } #newNode(options4) { @@ -166200,8 +166507,8 @@ var require_load_virtual = __commonJS((exports, module2) => { cwd: this.path, lockfile: s5.data }); - for (const [name3, path11] of workspaces.entries()) { - lockWS[name3] = `file:${path11}`; + for (const [name3, path12] of workspaces.entries()) { + lockWS[name3] = `file:${path12}`; } const rootNames = new Set(root.edgesOut.keys()); const lockByType = { dev, optional: optional4, peer, peerOptional, prod, workspace: lockWS }; @@ -166262,18 +166569,18 @@ To fix: } #loadNode(location2, sw, loadOverrides) { const p2 = this.virtualTree ? this.virtualTree.realpath : this.path; - const path11 = resolve9(p2, location2); + const path12 = resolve9(p2, location2); if (!sw.name) { - sw.name = nameFromFolder(path11); + sw.name = nameFromFolder(path12); } const node = new Node4({ installLinks: this.installLinks, legacyPeerDeps: this.legacyPeerDeps, root: this.virtualTree, - path: path11, - realpath: path11, + path: path12, + realpath: path12, integrity: sw.integrity, - resolved: consistentResolve(sw.resolved, this.path, path11), + resolved: consistentResolve(sw.resolved, this.path, path12), pkg: sw, hasShrinkwrap: sw.hasShrinkwrap, loadOverrides, @@ -166286,11 +166593,11 @@ To fix: return node; } #loadLink(location2, targetLoc, target) { - const path11 = resolve9(this.path, location2); + const path12 = resolve9(this.path, location2); const link4 = new Link2({ installLinks: this.installLinks, legacyPeerDeps: this.legacyPeerDeps, - path: path11, + path: path12, realpath: resolve9(this.path, targetLoc), target, pkg: target && target.package @@ -166483,8 +166790,8 @@ var require_rebuild = __commonJS((exports, module2) => { if (!node.globalTop || this.options.force) { return; } - const { path: path11, package: pkg } = node; - await binLinks.checkBins({ pkg, path: path11, top: true, global: true }); + const { path: path12, package: pkg } = node; + await binLinks.checkBins({ pkg, path: path12, top: true, global: true }); } async#addToBuildSet(node, set24, refreshed = false) { if (set24.has(node)) { @@ -166530,7 +166837,7 @@ var require_rebuild = __commonJS((exports, module2) => { const limit = this.options.foregroundScripts ? 1 : undefined; await promiseCallLimit(queue.map((node) => async () => { const { - path: path11, + path: path12, integrity, resolved, optional: optional4, @@ -166540,7 +166847,7 @@ var require_rebuild = __commonJS((exports, module2) => { package: pkg, location: location2 } = node.target; - if (this[_trashList].has(path11) || node.isLink && node.target?.isInStore) { + if (this[_trashList].has(path12) || node.isLink && node.target?.isInStore) { return; } const timeEndLocation = time5.start(`build:run:${event}:${location2}`); @@ -166548,7 +166855,7 @@ var require_rebuild = __commonJS((exports, module2) => { const env3 = { npm_package_resolved: resolved, npm_package_integrity: integrity, - npm_package_json: resolve9(path11, "package.json"), + npm_package_json: resolve9(path12, "package.json"), npm_package_optional: boolEnv(optional4), npm_package_dev: boolEnv(dev), npm_package_peer: boolEnv(peer), @@ -166556,7 +166863,7 @@ var require_rebuild = __commonJS((exports, module2) => { }; const runOpts = { event, - path: path11, + path: path12, pkg, stdio, env: env3, @@ -166569,7 +166876,7 @@ var require_rebuild = __commonJS((exports, module2) => { }).then(({ args: args3, code, signal, stdout, stderr }) => { this.scriptsRun.add({ pkg, - path: path11, + path: path12, event, cmd: args3 && args3[args3.length - 1], env: env3, @@ -166711,7 +167018,7 @@ var require_diff2 = __commonJS((exports, module2) => { if (ideal.version !== actual.version) { return "CHANGE"; } - const binsExist = ideal.binPaths.every((path11) => existsSync4(path11)); + const binsExist = ideal.binPaths.every((path12) => existsSync4(path12)); const noIntegrity = !ideal.integrity && !actual.integrity; const noResolved = !ideal.resolved && !actual.resolved; const resolvedMatch = ideal.resolved && ideal.resolved === actual.resolved; @@ -166757,9 +167064,9 @@ var require_diff2 = __commonJS((exports, module2) => { return children; } const paths = new Set([...actualKids.keys(), ...idealKids.keys()]); - for (const path11 of paths) { - const actual2 = actualKids.get(path11); - const ideal2 = idealKids.get(path11); + for (const path12 of paths) { + const actual2 = actualKids.get(path12); + const ideal2 = idealKids.get(path12); diffNode({ actual: actual2, ideal: ideal2, @@ -167022,8 +167329,8 @@ var require_reify = __commonJS((exports, module2) => { node.parent = null; } } - for (const path11 of this[_trashList]) { - const loc = relpath(this.idealTree.realpath, path11); + for (const path12 of this[_trashList]) { + const loc = relpath(this.idealTree.realpath, path12); const node = this.idealTree.inventory.get(loc); if (node && node.root === this.idealTree) { node.parent = null; @@ -167083,7 +167390,7 @@ var require_reify = __commonJS((exports, module2) => { await this.actualTree.meta.save(); const ignoreScripts = !!this.options.ignoreScripts; if (!this.options.dryRun && !ignoreScripts && this.diff && this.diff.children.length) { - const { path: path11, package: pkg } = this.actualTree.target; + const { path: path12, package: pkg } = this.actualTree.target; const stdio = this.options.foregroundScripts ? "inherit" : "pipe"; const { scripts = {} } = pkg; for (const event of ["predependencies", "dependencies", "postdependencies"]) { @@ -167091,7 +167398,7 @@ var require_reify = __commonJS((exports, module2) => { log7.info("run", pkg._id, event, scripts[event]); await time5.start(`reify:run:${event}`, () => runScript({ event, - path: path11, + path: path12, pkg, stdio, scriptShell: this.options.scriptShell @@ -167246,13 +167553,13 @@ var require_reify = __commonJS((exports, module2) => { const paths = [node.path, ...node.binPaths]; const moves = this.#retiredPaths; log7.silly("reify", "mark", retire ? "retired" : "deleted", paths); - for (const path11 of paths) { + for (const path12 of paths) { if (retire) { - const retired = retirePath(path11); - moves[path11] = retired; + const retired = retirePath(path12); + moves[path12] = retired; this[_trashList].add(retired); } else { - this[_trashList].add(path11); + this[_trashList].add(path12); } } } @@ -167322,7 +167629,7 @@ var require_reify = __commonJS((exports, module2) => { const roots = this.#sparseTreeRoots; const failures = []; const targets = [...roots, ...Object.keys(this.#retiredPaths)]; - const unlinks = targets.map((path11) => rm3(path11, { recursive: true, force: true }).catch((er3) => failures.push([path11, er3]))); + const unlinks = targets.map((path12) => rm3(path12, { recursive: true, force: true }).catch((er3) => failures.push([path12, er3]))); return promiseAllRejectLate(unlinks).then(() => { if (failures.length) { log7.warn("cleanup", "Failed to remove some directories", failures); @@ -167682,10 +167989,10 @@ var require_reify = __commonJS((exports, module2) => { path: fromPath, depth: 1, packageJsonCache: new Map([[fromPath + "/package.json", node.package]]) - }).then((res) => promiseAllRejectLate(res.map((path11) => { - const rel = relative4(fromPath, path11); + }).then((res) => promiseAllRejectLate(res.map((path12) => { + const rel = relative4(fromPath, path12); const to2 = resolve9(node.path, rel); - return this[_renamePath](path11, to2); + return this[_renamePath](path12, to2); }))); } [_rollbackMoveBackRetiredUnchanged](er2) { @@ -167725,9 +168032,9 @@ var require_reify = __commonJS((exports, module2) => { const timeEnd = time5.start("reify:trash"); const promises2 = []; const failures = []; - const _rm = (path11) => rm3(path11, { recursive: true, force: true }).catch((er2) => failures.push([path11, er2])); - for (const path11 of this[_trashList]) { - promises2.push(_rm(path11)); + const _rm = (path12) => rm3(path12, { recursive: true, force: true }).catch((er2) => failures.push([path12, er2])); + for (const path12 of this[_trashList]) { + promises2.push(_rm(path12)); } await promiseAllRejectLate(promises2); if (failures.length) { @@ -168382,12 +168689,12 @@ var require_arborist = __commonJS((exports, module2) => { } const nodes2 = []; for (const name3 of workspaces) { - const path11 = wsMap.get(name3); - if (!path11) { + const path12 = wsMap.get(name3); + if (!path12) { log7.warn("workspaces", `${name3} in filter set, but not in workspaces`); continue; } - const loc = relpath(tree.realpath, path11); + const loc = relpath(tree.realpath, path12); const node = tree.inventory.get(loc); if (!node) { log7.warn("workspaces", `${name3} in filter set, but no workspace folder present`); @@ -168518,7 +168825,7 @@ var require_lib42 = __commonJS((exports, module2) => { }); // packages/unifia/src/npm/index.ts -import path11 from "path"; +import path12 from "path"; import { readdir as readdir2, rm as rm3 } from "fs/promises"; var import_semver2, import_arborist, Npm; var init_npm = __esm(async () => { @@ -168538,7 +168845,7 @@ var init_npm = __esm(async () => { pkg: zod_default.string() })); function directory(pkg) { - return path11.join(Global.Path.cache, "packages", pkg); + return path12.join(Global.Path.cache, "packages", pkg); } function resolveEntryPoint(name3, dir2) { let entrypoint; @@ -168615,15 +168922,15 @@ var init_npm = __esm(async () => { savePrefix: "", ignoreScripts: true }); - await arb.reify().catch(() => {}); + await arb.reify(); }; - if (!await Filesystem.exists(path11.join(dir2, "node_modules"))) { + if (!await Filesystem.exists(path12.join(dir2, "node_modules"))) { log7.info("node_modules missing, reifying"); await reify(); return; } - const pkg = await Filesystem.readJson(path11.join(dir2, "package.json")).catch(() => ({})); - const lock = await Filesystem.readJson(path11.join(dir2, "package-lock.json")).catch(() => ({})); + const pkg = await Filesystem.readJson(path12.join(dir2, "package.json")).catch(() => ({})); + const lock = await Filesystem.readJson(path12.join(dir2, "package-lock.json")).catch(() => ({})); const declared = new Set([ ...Object.keys(pkg.dependencies || {}), ...Object.keys(pkg.devDependencies || {}), @@ -168649,14 +168956,14 @@ var init_npm = __esm(async () => { Npm.install = install; async function which2(pkg) { const dir2 = directory(pkg); - const binDir = path11.join(dir2, "node_modules", ".bin"); + const binDir = path12.join(dir2, "node_modules", ".bin"); const pick5 = async () => { const files = await readdir2(binDir).catch(() => []); if (files.length === 0) return; if (files.length === 1) return files[0]; - const pkgJson = await Filesystem.readJson(path11.join(dir2, "node_modules", pkg, "package.json")).catch(() => { + const pkgJson = await Filesystem.readJson(path12.join(dir2, "node_modules", pkg, "package.json")).catch(() => { return; }); if (pkgJson?.bin) { @@ -168673,20 +168980,20 @@ var init_npm = __esm(async () => { }; const bin = await pick5(); if (bin) - return path11.join(binDir, bin); - await rm3(path11.join(dir2, "package-lock.json"), { force: true }); + return path12.join(binDir, bin); + await rm3(path12.join(dir2, "package-lock.json"), { force: true }); await add10(pkg); const resolved = await pick5(); if (!resolved) return; - return path11.join(binDir, resolved); + return path12.join(binDir, resolved); } Npm.which = which2; })(Npm ||= {}); }); // packages/unifia/src/plugin/shared.ts -import path12 from "path"; +import path13 from "path"; import { fileURLToPath as fileURLToPath3, pathToFileURL as pathToFileURL2 } from "url"; function isDeprecatedPlugin(spec) { return DEPRECATED_PLUGIN_PACKAGES.some((pkg) => spec.includes(pkg)); @@ -168705,12 +169012,12 @@ function pluginSource(spec) { function resolveExportPath(raw3, dir2) { if (raw3.startsWith("file://")) return fileURLToPath3(raw3); - if (path12.isAbsolute(raw3)) + if (path13.isAbsolute(raw3)) return raw3; - return path12.resolve(dir2, raw3); + return path13.resolve(dir2, raw3); } function isAbsolutePath(raw3) { - return path12.isAbsolute(raw3) || /^[A-Za-z]:[\\/]/.test(raw3); + return path13.isAbsolute(raw3) || /^[A-Za-z]:[\\/]/.test(raw3); } function extractExportValue(value8) { if (typeof value8 === "string") @@ -168762,12 +169069,12 @@ function resolvePackageEntrypoint(spec, kind, pkg) { function targetPath(target) { if (target.startsWith("file://")) return fileURLToPath3(target); - if (path12.isAbsolute(target)) + if (path13.isAbsolute(target)) return target; } async function resolveDirectoryIndex(dir2) { for (const name3 of INDEX_FILES) { - const file4 = path12.join(dir2, name3); + const file4 = path13.join(dir2, name3); if (await Filesystem.exists(file4)) return file4; } @@ -168819,14 +169126,14 @@ function isPathPluginSpec(spec) { } async function resolvePathPluginTarget(spec) { const raw3 = spec.startsWith("file://") ? fileURLToPath3(spec) : spec; - const file4 = path12.isAbsolute(raw3) || /^[A-Za-z]:[\\/]/.test(raw3) ? raw3 : path12.resolve(raw3); + const file4 = path13.isAbsolute(raw3) || /^[A-Za-z]:[\\/]/.test(raw3) ? raw3 : path13.resolve(raw3); const stat4 = await Filesystem.statAsync(file4); if (!stat4?.isDirectory()) { if (spec.startsWith("file://")) return spec; return pathToFileURL2(file4).href; } - if (await Filesystem.exists(path12.join(file4, "package.json"))) { + if (await Filesystem.exists(path13.join(file4, "package.json"))) { return pathToFileURL2(file4).href; } const index3 = await resolveDirectoryIndex(file4); @@ -168861,8 +169168,8 @@ async function resolvePluginTarget(spec, parsed = parsePluginSpecifier(spec)) { async function readPluginPackage(target) { const file4 = target.startsWith("file://") ? fileURLToPath3(target) : target; const stat4 = await Filesystem.statAsync(file4); - const dir2 = stat4?.isDirectory() ? file4 : path12.dirname(file4); - const pkg = path12.join(dir2, "package.json"); + const dir2 = stat4?.isDirectory() ? file4 : path13.dirname(file4); + const pkg = path13.join(dir2, "package.json"); const json5 = await Filesystem.readJson(pkg); return { dir: dir2, pkg, json: json5 }; } @@ -168941,18 +169248,8 @@ var init_shared = __esm(async () => { INDEX_FILES = ["index.ts", "index.tsx", "index.js", "index.mjs", "index.cjs"]; }); -// packages/unifia/src/provider/models-snapshot.js -var exports_models_snapshot = {}; -__export(exports_models_snapshot, { - snapshot: () => snapshot3 -}); -var snapshot3; -var init_models_snapshot = __esm(() => { - snapshot3 = { zhipuai: { id: "zhipuai", env: ["ZHIPU_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://open.bigmodel.cn/api/paas/v4", name: "Zhipu AI", doc: "https://docs.z.ai/guides/overview/pricing", models: { "glm-5": { id: "glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.2, cache_write: 0 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-27", last_updated: "2026-03-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26, cache_write: 0 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26, cache_write: 0 } }, "glm-5v-turbo": { id: "glm-5v-turbo", name: "GLM-5V-Turbo", description: "Fast GLM vision model for screenshots, documents, and multimodal agent tasks", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 5, output: 22, cache_read: 1.2, cache_write: 0 } }, "glm-4.5-flash": { id: "glm-4.5-flash", name: "GLM-4.5-Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-4.7": { id: "glm-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "glm-4.5v": { id: "glm-4.5v", name: "GLM-4.5V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 64000, output: 16384 }, cost: { input: 0.6, output: 1.8 } }, "glm-4.5": { id: "glm-4.5", name: "GLM-4.5", description: "Hybrid-reasoning GLM release that made the 4.5 line broadly useful", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "glm-4.6": { id: "glm-4.6", name: "GLM-4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "glm-4.7-flashx": { id: "glm-4.7-flashx", name: "GLM-4.7-FlashX", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0.07, output: 0.4, cache_read: 0.01, cache_write: 0 } }, "glm-4.7-flash": { id: "glm-4.7-flash", name: "GLM-4.7-Flash", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-4.5-air": { id: "glm-4.5-air", name: "GLM-4.5-Air", description: "Lighter GLM-4.5 variant for fast coding assistance and cheaper agents", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.2, output: 1.1, cache_read: 0.03, cache_write: 0 } }, "glm-4.6v": { id: "glm-4.6v", name: "GLM-4.6V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.3, output: 0.9 } } } }, lucidquery: { id: "lucidquery", env: ["LUCIDQUERY_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.lucidquery.com/v1", name: "LucidQuery", doc: "https://lucidquery.com/docs", models: { "lucidquery-agi-01-frontier": { id: "lucidquery-agi-01-frontier", name: "AGI-01 Frontier", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "agi", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2026-06-05", release_date: "2026-06-16", last_updated: "2026-06-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 120000 }, cost: { input: 4.5, output: 22 } }, "lucidnova-rf1-100b": { id: "lucidnova-rf1-100b", name: "LucidNova RF1 100B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "nova", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2025-09-16", release_date: "2024-12-28", last_updated: "2025-09-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 120000, output: 8000 }, cost: { input: 2, output: 5 } }, "lucidquery-agi-01-swift": { id: "lucidquery-agi-01-swift", name: "AGI-01 Swift", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "agi", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2026-06-05", release_date: "2026-06-16", last_updated: "2026-06-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 120000 }, cost: { input: 2.5, output: 15 } }, "lucidquery-nexus-coder": { id: "lucidquery-nexus-coder", name: "LucidQuery Nexus Coder", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "lucid", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2025-08-01", release_date: "2025-09-01", last_updated: "2025-09-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 250000, output: 60000 }, cost: { input: 2, output: 5 } } } }, anyapi: { id: "anyapi", env: ["ANYAPI_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.anyapi.ai/v1", name: "AnyAPI", doc: "https://docs.anyapi.ai", models: { "cohere/command-r-plus-08-2024": { id: "cohere/command-r-plus-08-2024", name: "Command R+", description: "Cohere's RAG workhorse for long-context enterprise search and tool use", family: "command-r", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-08-30", last_updated: "2024-08-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 } }, "google/gemini-3-flash-preview": { id: "google/gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 } }, "google/gemini-3-pro-preview": { id: "google/gemini-3-pro-preview", name: "Gemini 3 Pro Preview", description: "Preview Gemini flagship for complex reasoning, coding, and rich multimodal prompts", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 } }, "google/gemini-2.5-flash-lite": { id: "google/gemini-2.5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 } }, "mistralai/devstral-2512": { id: "mistralai/devstral-2512", name: "Devstral 2", description: "Mistral's coding-agent model for repository work, terminal tasks, and software fixes", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-12", release_date: "2025-12-09", last_updated: "2025-12-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated" }, "mistralai/mistral-large-2512": { id: "mistralai/mistral-large-2512", name: "Mistral Large 3", description: "Mistral's largest general model for enterprise agents, coding, and multilingual reasoning", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 } }, "xai/grok-4.3": { id: "xai/grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 } }, "deepseek/deepseek-r1": { id: "deepseek/deepseek-r1", name: "DeepSeek Reasoner", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-09", release_date: "2025-12-01", last_updated: "2026-02-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 } }, "deepseek/deepseek-chat": { id: "deepseek/deepseek-chat", name: "DeepSeek Chat", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-12-01", last_updated: "2026-02-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 } }, "anthropic/claude-sonnet-4-6": { id: "anthropic/claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 } }, "anthropic/claude-haiku-4-5": { id: "anthropic/claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 } }, "anthropic/claude-opus-4-6": { id: "anthropic/claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024, max: 127999 }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } } }, "anthropic/claude-sonnet-4-5": { id: "anthropic/claude-sonnet-4-5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 } }, "anthropic/claude-opus-4-7": { id: "anthropic/claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } } }, "perplexity/sonar-pro": { id: "perplexity/sonar-pro", name: "Sonar Pro", description: "Deeper Sonar search model with broader retrieval and stronger synthesis", family: "sonar-pro", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 } }, "perplexity/sonar-reasoning-pro": { id: "perplexity/sonar-reasoning-pro", name: "Sonar Reasoning Pro", description: "Web-grounded Sonar for multi-step research questions that need cited reasoning", family: "sonar-reasoning", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 } }, "openai/gpt-4.1-mini": { id: "openai/gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 } }, "openai/o3-mini": { id: "openai/o3-mini", name: "o3-mini", description: "Smaller o-series reasoner for economical coding, math, and planning tasks", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 5, output: 30, cache_read: 0.5 }, provider: { body: { service_tier: "priority" } } } } } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 } }, "openai/o3": { id: "openai/o3", name: "o3", description: "Deliberate o-series reasoner for hard math, coding, and multi-step analysis", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 } }, "openai/gpt-4.1": { id: "openai/gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 } }, "openai/o4-mini": { id: "openai/o4-mini", name: "o4-mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 } } } }, impossibl: { id: "impossibl", env: ["IMPOSSIBL_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.impossibl.com/v1", name: "Impossibl", doc: "https://impossibl.com/docs/models", models: { "google/gemini-3.5-flash": { id: "google/gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15 } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "google/gemini-3.5-flash-lite": { id: "google/gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "google/gemini-3.6-flash": { id: "google/gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15 } }, "google/gemini-3.1-flash-lite": { id: "google/gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025 } }, "google/gemini-3.1-pro-preview": { id: "google/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "google/gemini-2.5-flash-lite": { id: "google/gemini-2.5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 512, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01 } }, "thinkingmachines/inkling": { id: "thinkingmachines/inkling", name: "Inkling", description: "Multimodal MoE reasoning model (975B total, 41B active) for text, image, and audio", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 1.87, output: 4.68, cache_read: 0.374 } }, "qwen/qwen3.7-plus": { id: "qwen/qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.4, output: 1.6, cache_read: 0.08, tiers: [{ input: 1.2, output: 4.8, cache_read: 0.24, tier: { type: "context", size: 262144 } }], context_over_200k: { input: 1.2, output: 4.8, cache_read: 0.24 } } }, "qwen/qwen3.8-max-preview": { id: "qwen/qwen3.8-max-preview", name: "Qwen3.8 Max Preview", description: "Preview Qwen flagship for million-token multimodal reasoning and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "xhigh"] }], tool_call: true, temperature: true, release_date: "2026-07-19", last_updated: "2026-07-19", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 2.5, output: 7.5 } }, "qwen/qwen3.7-max": { id: "qwen/qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5 } }, "qwen/qwen3.6-flash": { id: "qwen/qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.05, tiers: [{ input: 1, output: 4, cache_read: 0.2, tier: { type: "context", size: 262144 } }], context_over_200k: { input: 1, output: 4, cache_read: 0.2 } } }, "xai/grok-4.3": { id: "xai/grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "xai/grok-4.20-0309-non-reasoning": { id: "xai/grok-4.20-0309-non-reasoning", name: "Grok 4.20 (Non-Reasoning)", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "xai/grok-4.5": { id: "xai/grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.3 } }, "xai/grok-build-0.1": { id: "xai/grok-build-0.1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1, output: 2, cache_read: 0.2 } }, "xai/grok-4.20-0309-reasoning": { id: "xai/grok-4.20-0309-reasoning", name: "Grok 4.20 (Reasoning)", description: "Reasoning Grok for document-heavy analysis and long-horizon tool use", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "fireworks/gpt-oss-20b": { id: "fireworks/gpt-oss-20b", name: "GPT OSS 20B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.07, output: 0.3, cache_read: 0.035 } }, "fireworks/glm-5.2": { id: "fireworks/glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.14 } }, "fireworks/gpt-oss-120b": { id: "fireworks/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015 } }, "groq/gpt-oss-20b": { id: "groq/gpt-oss-20b", name: "GPT OSS 20B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.075, output: 0.3, cache_read: 0.0375 } }, "groq/gpt-oss-120b": { id: "groq/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.19, output: 0.51, cache_read: 0.028 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 1.74, output: 3.48, cache_read: 0.145 } }, "xiaomi/mimo-v2.5": { id: "xiaomi/mimo-v2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.003 } }, "anthropic/claude-sonnet-4-6": { id: "anthropic/claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024 }, { type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-haiku-4-5": { id: "anthropic/claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "anthropic/claude-opus-4-6": { id: "anthropic/claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024 }, { type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-fable-5": { id: "anthropic/claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4-8": { id: "anthropic/claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-4-5": { id: "anthropic/claude-sonnet-4-5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-opus-4-7": { id: "anthropic/claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4-5": { id: "anthropic/claude-opus-4-5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024 }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-5": { id: "anthropic/claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "cerebras/gpt-oss-120b": { id: "cerebras/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.35, output: 0.75 } }, "moonshotai/kimi-k3": { id: "moonshotai/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "openai/gpt-5.1-codex-mini": { id: "openai/gpt-5.1-codex-mini", name: "GPT-5.1 Codex mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/gpt-5.5-pro": { id: "openai/gpt-5.5-pro", name: "GPT-5.5 Pro", description: "Highest-accuracy GPT-5.5 tier for slower, precision-heavy reasoning and coding", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, cache_read: 3, tiers: [{ input: 60, output: 270, cache_read: 3, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270, cache_read: 3 } } }, "openai/gpt-4.1-mini": { id: "openai/gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "openai/gpt-4o": { id: "openai/gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.4-pro": { id: "openai/gpt-5.4-pro", name: "GPT-5.4 Pro", description: "More exact GPT-5.4 tier for demanding professional reasoning and agent tasks", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, cache_read: 3, tiers: [{ input: 60, output: 270, cache_read: 3, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270, cache_read: 3 } } }, "openai/gpt-5.6-sol": { id: "openai/gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 45, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1, cache_write: 12.5 } } }, "openai/gpt-4.1-nano": { id: "openai/gpt-4.1-nano", name: "GPT-4.1 nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "openai/o3-mini": { id: "openai/o3-mini", name: "o3-mini", description: "Smaller o-series reasoner for economical coding, math, and planning tasks", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "openai/gpt-4o-mini": { id: "openai/gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-5-codex": { id: "openai/gpt-5-codex", name: "GPT-5-Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-3.5-turbo": { id: "openai/gpt-3.5-turbo", name: "GPT-3.5-turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2021-09-01", release_date: "2023-03-01", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16385, output: 4096 }, cost: { input: 0.5, output: 1.5 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "openai/gpt-5.2-codex": { id: "openai/gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Code-specialist GPT for repository edits, reviews, and long-running software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "openai/gpt-5-pro": { id: "openai/gpt-5-pro", name: "GPT-5 Pro", description: "Higher-accuracy GPT-5 tier for tough analysis, coding reviews, and planning", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 272000 }, cost: { input: 15, output: 120 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "openai/o1": { id: "openai/o1", name: "o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2023-09", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 15, output: 60, cache_read: 7.5 } }, "openai/gpt-5.6-luna": { id: "openai/gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, cache_write: 0.25, tiers: [{ input: 0.4, output: 1.8, cache_read: 0.04, cache_write: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 0.4, output: 1.8, cache_read: 0.04, cache_write: 0.5 } } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.3-codex": { id: "openai/gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4-turbo": { id: "openai/gpt-4-turbo", name: "GPT-4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-12", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 10, output: 30 } }, "openai/gpt-5.1-codex": { id: "openai/gpt-5.1-codex", name: "GPT-5.1 Codex", description: "Codex GPT for repository edits, code review, and practical software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-5-nano": { id: "openai/gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "openai/o3": { id: "openai/o3", name: "o3", description: "Deliberate o-series reasoner for hard math, coding, and multi-step analysis", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/gpt-5.6-terra": { id: "openai/gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 2.5, tiers: [{ input: 4, output: 18, cache_read: 0.4, cache_write: 5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4, cache_write: 5 } } }, "openai/gpt-4.1": { id: "openai/gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/o4-mini": { id: "openai/o4-mini", name: "o4-mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.275 } }, "zai/glm-5": { id: "zai/glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.2 } }, "zai/glm-4.5-air": { id: "zai/glm-4.5-air", name: "GLM-4.5-Air", description: "Lighter GLM-4.5 variant for fast coding assistance and cheaper agents", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.2, output: 1.1, cache_read: 0.03 } }, "zai/glm-5.1": { id: "zai/glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "zai/glm-5.2": { id: "zai/glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "zai/glm-4.6": { id: "zai/glm-4.6", name: "GLM-4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "zai/glm-4.5": { id: "zai/glm-4.5", name: "GLM-4.5", description: "Hybrid-reasoning GLM release that made the 4.5 line broadly useful", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "zai/glm-4.7": { id: "zai/glm-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "zai/glm-5-turbo": { id: "zai/glm-5-turbo", name: "GLM-5-Turbo", description: "Faster GLM-5 lane for coding agents that need lower latency", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24 } } } }, blueclaw: { id: "blueclaw", env: ["BLUECLAW_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://openai.blueclaw.network/v1", name: "Blue Claw", doc: "https://blueclaw.network", models: { "Qwen3.6-27B": { id: "Qwen3.6-27B", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 65536 }, status: "beta" }, "Qwen/Qwen3.6-35B-A3B-FP8": { id: "Qwen/Qwen3.6-35B-A3B-FP8", name: "Qwen3.6 35B A3B FP8", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, status: "beta" } } }, "tencent-tokenhub": { id: "tencent-tokenhub", env: ["TENCENT_TOKENHUB_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://tokenhub.tencentmaas.com/v1", name: "Tencent TokenHub", doc: "https://cloud.tencent.com/document/product/1823/130050", models: { hy3: { id: "hy3", name: "Hy3", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "hy3-preview": { id: "hy3-preview", name: "Hy3 preview", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, "fireworks-ai": { id: "fireworks-ai", env: ["FIREWORKS_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.fireworks.ai/inference/v1/", name: "Fireworks AI", doc: "https://fireworks.ai/docs/", models: { "accounts/fireworks/routers/glm-5p2-fast": { id: "accounts/fireworks/routers/glm-5p2-fast", name: "GLM 5.2 Fast", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-06-26", last_updated: "2026-06-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048575, output: 131072 }, cost: { input: 2.1, output: 6.6, cache_read: 0.21 } }, "accounts/fireworks/routers/kimi-k2p6-fast": { id: "accounts/fireworks/routers/kimi-k2p6-fast", name: "Kimi K2.6 Fast", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-17", last_updated: "2026-06-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 2, output: 8, cache_read: 0.3 } }, "accounts/fireworks/routers/kimi-k2p6-turbo": { id: "accounts/fireworks/routers/kimi-k2p6-turbo", name: "Kimi K2.6 Turbo", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 2, output: 8, cache_read: 0.3 } }, "accounts/fireworks/routers/kimi-k2p7-code-fast": { id: "accounts/fireworks/routers/kimi-k2p7-code-fast", name: "Kimi K2.7 Code Fast", description: "Kimi coding model for software agents, refactors, and repository reasoning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-06-12", last_updated: "2026-06-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 1.9, output: 8, cache_read: 0.38 } }, "accounts/fireworks/routers/kimi-k3-fast": { id: "accounts/fireworks/routers/kimi-k3-fast", name: "Kimi K3 Fast", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-27", last_updated: "2026-07-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 4.5, output: 22.5, cache_read: 0.45 } }, "accounts/fireworks/models/qwen3p7-plus": { id: "accounts/fireworks/models/qwen3p7-plus", name: "Qwen 3.7 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1 }], tool_call: true, temperature: true, release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.4, output: 1.6, cache_read: 0.08 } }, "accounts/fireworks/models/deepseek-v4-flash": { id: "accounts/fireworks/models/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-06-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "accounts/fireworks/models/gpt-oss-20b": { id: "accounts/fireworks/models/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.07, output: 0.3, cache_read: 0.035 } }, "accounts/fireworks/models/minimax-m2p7": { id: "accounts/fireworks/models/minimax-m2p7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-12", last_updated: "2026-04-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 196608 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "accounts/fireworks/models/kimi-k2p6": { id: "accounts/fireworks/models/kimi-k2p6", name: "Kimi K2.6", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "accounts/fireworks/models/minimax-m3": { id: "accounts/fireworks/models/minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal coding model for long-context reasoning and agent tasks", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 512000, output: 512000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "accounts/fireworks/models/deepseek-v4-pro": { id: "accounts/fireworks/models/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 1.74, output: 3.48, cache_read: 0.145 } }, "accounts/fireworks/models/deepseek-v4-flash-0731": { id: "accounts/fireworks/models/deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "accounts/fireworks/models/kimi-k2p7-code": { id: "accounts/fireworks/models/kimi-k2p7-code", name: "Kimi K2.7 Code", description: "Kimi coding model for software agents, refactors, and repository reasoning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-06-12", last_updated: "2026-06-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "accounts/fireworks/models/gpt-oss-120b": { id: "accounts/fireworks/models/gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-08-05", last_updated: "2026-06-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015 } }, "accounts/fireworks/models/glm-5p2": { id: "accounts/fireworks/models/glm-5p2", name: "GLM 5.2", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-06-16", last_updated: "2026-06-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048575, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.14 } }, "accounts/fireworks/models/kimi-k3": { id: "accounts/fireworks/models/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-27", last_updated: "2026-07-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } } } }, greenpt: { id: "greenpt", env: ["GREENPT_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.greenpt.ai/v1", name: "GreenPT", doc: "https://docs.greenpt.ai", models: { "mistral-medium-3.5-128b": { id: "mistral-medium-3.5-128b", name: "Mistral Medium 3.5", description: "Balanced Mistral model for enterprise assistants, multilingual work, and tools", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 2.052, output: 10.26 } }, "glm-5.2-ponytail": { id: "glm-5.2-ponytail", name: "GLM-5.2 Ponytail", description: "glm-5.2 carrying a built-in ruleset that compresses generated code, preferring platform features over custom code. The middle tier, and the ruleset as its authors wrote it. Same upstream model and price per token as glm-5.2, with fewer output tokens.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.254, output: 5.016, cache_read: 0.3135 } }, "qwen3.6-35b-a3b": { id: "qwen3.6-35b-a3b", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.342, output: 2.052 } }, "holo2-30b-a3b": { id: "holo2-30b-a3b", name: "Holo2 30B A3B", description: "H Company Holo2 vision model for GUI navigation and computer-use agents", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-11", last_updated: "2025-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 22016, output: 16384 }, cost: { input: 0.399, output: 0.969 } }, "glm-5.2-caveman": { id: "glm-5.2-caveman", name: "GLM-5.2 Caveman", description: "glm-5.2 carrying a built-in ruleset that compresses prose, keeping code and technical detail verbatim. The middle tier, and the ruleset as its authors wrote it. Same upstream model and price per token as glm-5.2, with fewer output tokens.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.254, output: 5.016, cache_read: 0.3135 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, status: "deprecated", cost: { input: 1.756, output: 5.518 } }, "glm-5.2-ponytail-ultra": { id: "glm-5.2-ponytail-ultra", name: "GLM-5.2 Ponytail Ultra", description: "glm-5.2 carrying a built-in ruleset that compresses generated code, preferring platform features over custom code. The most aggressive tier, close to answer-only. Same upstream model and price per token as glm-5.2, with fewer output tokens.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.254, output: 5.016, cache_read: 0.3135 } }, "qwen3-coder-30b-a3b-instruct": { id: "qwen3-coder-30b-a3b-instruct", name: "Qwen3-Coder 30B-A3B Instruct", description: "Smaller Qwen coder for efficient local agents and repo-level fixes", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.285, output: 1.083 } }, "green-l": { id: "green-l", name: "Green L", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-06-20", last_updated: "2025-06-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.285, output: 0.912 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.254, output: 5.016, cache_read: 0.3135 } }, "devstral-2-123b-instruct-2512": { id: "devstral-2-123b-instruct-2512", name: "Devstral 2", description: "Mistral's coding-agent model for repository work, terminal tasks, and software fixes", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-12", release_date: "2025-12-09", last_updated: "2025-12-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 16384 }, cost: { input: 0.57, output: 2.736 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.7524, output: 4.275, cache_read: 0.2508 } }, "pixtral-12b-2409": { id: "pixtral-12b-2409", name: "Pixtral 12B", description: "Mistral vision-language model for image understanding and multimodal chat", family: "pixtral", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2024-09-01", last_updated: "2024-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.285, output: 0.285 } }, "green-s": { id: "green-s", name: "Green S", description: "GreenPT speech-to-text model for pre-recorded and live transcription", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-01", last_updated: "2025-01", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 8192 }, cost: { input: 0.00437, output: 0 } }, "glm-5.2-caveman-ultra": { id: "glm-5.2-caveman-ultra", name: "GLM-5.2 Caveman Ultra", description: "glm-5.2 carrying a built-in ruleset that compresses prose, keeping code and technical detail verbatim. The most aggressive tier, close to answer-only. Same upstream model and price per token as glm-5.2, with fewer output tokens.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.254, output: 5.016, cache_read: 0.3135 } }, "glm-5.2-ponytail-lite": { id: "glm-5.2-ponytail-lite", name: "GLM-5.2 Ponytail Lite", description: "glm-5.2 carrying a built-in ruleset that compresses generated code, preferring platform features over custom code. The gentlest tier: it cuts filler only and keeps the explanation intact. Same upstream model and price per token as glm-5.2, with fewer output tokens.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.254, output: 5.016, cache_read: 0.3135 } }, "green-s-pro": { id: "green-s-pro", name: "Green S Pro", description: "GreenPT advanced speech-to-text model with multilingual transcription support", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-02", last_updated: "2025-02", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 8192 }, cost: { input: 0.00437, output: 0 } }, "llama-3.3-70b-instruct": { id: "llama-3.3-70b-instruct", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e5, output: 16384 }, cost: { input: 1.254, output: 1.254 } }, "green-r-raw": { id: "green-r-raw", name: "Green R Raw", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.399, output: 1.083 } }, "gemma-3-27b-it": { id: "gemma-3-27b-it", name: "Gemma 3 27B", description: "Google Gemma 3 multimodal model for chat, reasoning, and image understanding", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-08", release_date: "2025-03-12", last_updated: "2025-03-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 40000, output: 8192 }, cost: { input: 0.342, output: 0.684 } }, "deepseek-v4-flash-0731": { id: "deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.1596, output: 0.399, cache_read: 0.0456 } }, "glm-5.2-honey-ultra": { id: "glm-5.2-honey-ultra", name: "GLM-5.2 Honey Ultra", description: "glm-5.2 carrying a built-in ruleset that compresses both generated code and prose. The most aggressive tier, close to answer-only. Same upstream model and price per token as glm-5.2, with fewer output tokens.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.254, output: 5.016, cache_read: 0.3135 } }, "qwen3-235b-a22b-instruct-2507": { id: "qwen3-235b-a22b-instruct-2507", name: "Qwen3 235B A22B Instruct 2507", description: "Qwen3 235B MoE instruct model for long-context multilingual chat and reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-21", last_updated: "2025-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 1.026, output: 3.078 } }, "glm-5.2-honey": { id: "glm-5.2-honey", name: "GLM-5.2 Honey", description: "glm-5.2 carrying a built-in ruleset that compresses both generated code and prose. The middle tier, and the ruleset as its authors wrote it. Same upstream model and price per token as glm-5.2, with fewer output tokens.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.254, output: 5.016, cache_read: 0.3135 } }, "voxtral-small-24b-2507": { id: "voxtral-small-24b-2507", name: "Voxtral Small 24B", description: "Mistral Voxtral audio-understanding model for speech and transcription tasks", family: "mistral", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2025-07", release_date: "2025-07-15", last_updated: "2025-07-15", modalities: { input: ["text", "audio"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 16384 }, cost: { input: 0.228, output: 0.513 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.228, output: 0.798 } }, "minimax-m2.5": { id: "minimax-m2.5", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.1938, output: 1.129, cache_read: 0.0627 } }, gemma4: { id: "gemma4", name: "gemma4", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.57, output: 1.71 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.9006, output: 4.389, cache_read: 0.1881 } }, "mistral-small-3.2-24b-instruct-2506": { id: "mistral-small-3.2-24b-instruct-2506", name: "Mistral Small 3.2", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-06-20", last_updated: "2025-06-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.228, output: 0.456 } }, "green-l-raw": { id: "green-l-raw", name: "Green L Raw", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-06-20", last_updated: "2025-06-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.285, output: 0.912 } }, "kimi-k2.6-fast": { id: "kimi-k2.6-fast", name: "Kimi K2.6 Fast", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 1.655, output: 8.778 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3.762, output: 18.81, cache_read: 0.9405 } }, "qwen3.5-397b-a17b": { id: "qwen3.5-397b-a17b", name: "Qwen3.5 397B-A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.798, output: 4.959 } }, "glm-5.2-honey-lite": { id: "glm-5.2-honey-lite", name: "GLM-5.2 Honey Lite", description: "glm-5.2 carrying a built-in ruleset that compresses both generated code and prose. The gentlest tier: it cuts filler only and keeps the explanation intact. Same upstream model and price per token as glm-5.2, with fewer output tokens.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.254, output: 5.016, cache_read: 0.3135 } }, "glm-5.2-caveman-lite": { id: "glm-5.2-caveman-lite", name: "GLM-5.2 Caveman Lite", description: "glm-5.2 carrying a built-in ruleset that compresses prose, keeping code and technical detail verbatim. The gentlest tier: it cuts filler only and keeps the explanation intact. Same upstream model and price per token as glm-5.2, with fewer output tokens.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.254, output: 5.016, cache_read: 0.3135 } }, "green-r": { id: "green-r", name: "Green R", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.399, output: 1.083 } } } }, wandb: { id: "wandb", env: ["WANDB_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.inference.wandb.ai/v1", name: "Weights & Biases", doc: "https://docs.wandb.ai/guides/integrations/inference/", models: { "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-FP8": { id: "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-FP8", name: "Nemotron 3 Super", description: "Nemotron 3 is a LatentMoE model designed to deliver strong agentic, reasoning, and conversational capabilities.", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.2, output: 0.8, cache_read: 0.2 } }, "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B": { id: "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B", name: "Nemotron 3 Ultra", description: "Nemotron 3 Ultra is a powerful MoE model designed for long-running agents across coding, deep research, and enterprise automation.", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.75, output: 2.75, cache_read: 0.15 } }, "google/gemma-4-31B-it": { id: "google/gemma-4-31B-it", name: "Gemma 4 31B", description: "Gemma 4 31B Dense is designed for advanced reasoning, agentic workflows, and longer context and is natively trained on 140+ languages.", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.1, output: 0.34, cache_read: 0.1 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM 5.2", description: "GLM-5.2 is a Mixture-of-Experts language model featuring 40 billion activated parameters and a total of 744 billion parameters.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-16", last_updated: "2026-06-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.76, output: 2.42, cache_read: 0.14 } }, "zai-org/GLM-5.1": { id: "zai-org/GLM-5.1", name: "GLM 5.1", description: "Powerful MoE model for long-horizon agentic engineering and advanced reasoning.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "JetBrains/Mellum2-12B-A2.5B-Instruct": { id: "JetBrains/Mellum2-12B-A2.5B-Instruct", name: "Mellum2 12B A2.5B", description: "Mellum2-12B-A2.5B-Instruct is a fast MoE model with 131K context built for coding, tool use, and low-latency AI workflows.", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.05, output: 0.1, cache_read: 0.05 } }, "Qwen/Qwen3.5-35B-A3B": { id: "Qwen/Qwen3.5-35B-A3B", name: "Qwen3.5-35B-A3B", description: "Qwen3.5-35B-A3B is an open-weights multimodal MoE model built for efficient, high-throughput inference across chat, reasoning, and agentic tasks.", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-24", last_updated: "2026-02-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.25, output: 1.25, cache_read: 0.25 } }, "Qwen/Qwen3.6-27B": { id: "Qwen/Qwen3.6-27B", name: "Qwen3.6 27B", description: "Qwen3.6-27B is a 27B dense multimodal model with 262K context built for flagship-level agentic coding.", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3.6, cache_read: 0.12 } }, "Qwen/Qwen3.6-35B-A3B": { id: "Qwen/Qwen3.6-35B-A3B", name: "Qwen3.6 35B A3B", description: "Qwen3.6-35B-A3B is an MoE multimodal model with 262K context optimized for agentic coding workflows.", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-15", last_updated: "2026-04-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.25, output: 1.25, cache_read: 0.25 } }, "Qwen/Qwen3-30B-A3B-Instruct-2507": { id: "Qwen/Qwen3-30B-A3B-Instruct-2507", name: "Qwen3 30B A3B Instruct 2507", description: "Qwen3-30B-A3B-Instruct-2507 is a 30.5B MoE instruction-tuned model with enhanced reasoning, coding, and long-context understanding.", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-29", last_updated: "2025-07-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.1, output: 0.3, cache_read: 0.1 } }, "Qwen/Qwen3-Coder-480B-A35B-Instruct": { id: "Qwen/Qwen3-Coder-480B-A35B-Instruct", name: "Qwen3 Coder 480B A35B", description: "Mixture-of-Experts model optimized for agentic coding tasks such as function calling, tool use, and long-context reasoning.", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-22", last_updated: "2025-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1, output: 1.5, cache_read: 1 } }, "MiniMaxAI/MiniMax-M2.5": { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax M2.5", description: "MoE model with a highly sparse architecture designed for high-throughput and low latency with strong coding capabilities.", family: "minimax-m2.5", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 196608 }, cost: { input: 0.3, output: 1.2, cache_read: 0.3 } }, "MiniMaxAI/MiniMax-M3": { id: "MiniMaxAI/MiniMax-M3", name: "MiniMax M3", description: "MiniMax M3 is a multimodal MoE model with 23B active parameters optimized for coding and agentic workflows.", family: "minimax-m3", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.23, output: 0.96, cache_read: 0.05 } }, "ibm-granite/granite-4.1-8b": { id: "ibm-granite/granite-4.1-8b", name: "Granite 4.1 8B", description: "Granite 4.1 8B is a long-context instruct model capable of enhanced tool calling, instruction following, and chat capabilities.", family: "granite", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.05, output: 0.1, cache_read: 0.05 } }, "deepseek-ai/DeepSeek-V4-Flash-0731": { id: "deepseek-ai/DeepSeek-V4-Flash-0731", name: "DeepSeek V4 Flash 0731", description: "DeepSeek V4-Flash-0731 is an MoE model great for coding, reasoning, and agentic workloads.", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.13, output: 0.28, cache_read: 0.07 } }, "deepseek-ai/DeepSeek-V3.1": { id: "deepseek-ai/DeepSeek-V3.1", name: "DeepSeek V3.1", description: "A large hybrid model that supports both thinking and non-thinking modes via prompt templates.", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 161000, output: 161000 }, cost: { input: 0.55, output: 1.65, cache_read: 0.55 } }, "deepseek-ai/DeepSeek-V4-Flash": { id: "deepseek-ai/DeepSeek-V4-Flash", name: "DeepSeek V4 Flash", description: "DeepSeek V4-Flash is an MoE model with 1M context length great for coding, reasoning, and agentic workloads.", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 0.14, output: 0.28, cache_read: 0.07 } }, "deepseek-ai/DeepSeek-V4-Pro": { id: "deepseek-ai/DeepSeek-V4-Pro", name: "DeepSeek V4 Pro", description: "DeepSeek V4-Pro is a 1.6T-parameter MoE model with 49B active parameters excelling at advanced reasoning, coding, and complex agentic workloads.", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 1.15, output: 2.55, cache_read: 0.2 } }, "OpenPipe/Qwen3-14B-Instruct": { id: "OpenPipe/Qwen3-14B-Instruct", name: "Qwen3 14B Instruct", description: "An efficient multilingual, dense, instruction-tuned model, optimized by OpenPipe for building agents with finetuning.", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-29", last_updated: "2025-04-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.05, output: 0.22, cache_read: 0.05 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Kimi K2.6 is a multimodal Mixture-of-Experts language model featuring 32 billion activated parameters and a total of 1 trillion parameters.", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.65, output: 3.41, cache_read: 0.15 } }, "moonshotai/Kimi-K2.7-Code": { id: "moonshotai/Kimi-K2.7-Code", name: "Kimi K2.7 Code", description: "Kimi K2.7 Code is a 1T-parameter MoE model with 32B active parameters purpose-built for long-horizon agentic coding and software engineering.", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.71, output: 3.5, cache_read: 0.15 } }, "moonshotai/Kimi-K3": { id: "moonshotai/Kimi-K3", name: "Kimi K3", description: "Kimi K3 is a 2.8T-parameter multimodal MoE model with 104B active parameters built for long-horizon coding and agentic workflows.", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "gpt-oss-20b", description: "Lower latency Mixture-of-Experts model trained on OpenAI's Harmony response format with reasoning capabilities.", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.03, output: 0.13, cache_read: 0.03 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "gpt-oss-120b", description: "Efficient Mixture-of-Experts model designed for high-reasoning, agentic and general-purpose use cases.", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.03, output: 0.17, cache_read: 0.03 } }, "meta-llama/Llama-3.3-70B-Instruct": { id: "meta-llama/Llama-3.3-70B-Instruct", name: "Llama 3.3 70B", description: "Multilingual model excelling in conversational tasks, detailed instruction-following, and coding.", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.71, output: 0.71, cache_read: 0.71 } }, "meta-llama/Llama-3.1-8B-Instruct": { id: "meta-llama/Llama-3.1-8B-Instruct", name: "Llama 3.1 8B", description: "Efficient conversational model optimized for responsive multilingual chatbot interactions.", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.22, output: 0.22, cache_read: 0.22 } }, "meta-llama/Llama-3.1-70B-Instruct": { id: "meta-llama/Llama-3.1-70B-Instruct", name: "Llama 3.1 70B", description: "Efficient conversational model optimized for responsive multilingual chatbot interactions.", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.8, output: 0.8, cache_read: 0.8 } } } }, crossmodel: { id: "crossmodel", env: ["CROSSMODEL_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.crossmodel.ai/v1", name: "CrossModel", doc: "https://www.crossmodel.ai/docs", models: { "gemini/gemini-3.5-flash": { id: "gemini/gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, cache_write: 1.5 } }, "gemini/gemini-2.5-flash": { id: "gemini/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, cache_write: 0.3 } }, "gemini/gemini-3.5-flash-lite": { id: "gemini/gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, cache_write: 0.3 } }, "gemini/gemini-3-flash-preview": { id: "gemini/gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 0.5 } }, "gemini/gemini-3.6-flash": { id: "gemini/gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15, cache_write: 1.5 } }, "gemini/gemini-3.1-pro-preview": { id: "gemini/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 2, tiers: [{ input: 4, output: 18, cache_read: 0.4, cache_write: 4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4, cache_write: 4 } } }, "gemini/gemini-2.5-pro": { id: "gemini/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, cache_write: 1.25, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, cache_write: 2.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 2.5 } } }, "gemini/gemini-2.5-flash-lite": { id: "gemini/gemini-2.5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01, cache_write: 0.1 } }, "qwen/qwen3.7-flash": { id: "qwen/qwen3.7-flash", name: "Qwen3.7 Flash", description: "Lightweight multimodal Qwen model for high-throughput text, image, and video tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 991000, output: 65536 }, cost: { input: 0.04, output: 0.13, cache_read: 0.01, cache_write: 0.04, tiers: [{ input: 0.1, output: 0.37, cache_read: 0.02, cache_write: 0.12, tier: { type: "context", size: 32000 } }, { input: 0.19, output: 0.74, cache_read: 0.04, cache_write: 0.24, tier: { type: "context", size: 256000 } }] } }, "qwen/qwen3.7-plus": { id: "qwen/qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.288, output: 1.125, cache_read: 0.0288, cache_write: 0.36, tiers: [{ input: 0.864, output: 3.375, cache_read: 0.0864, cache_write: 1.08, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.864, output: 3.375, cache_read: 0.0864, cache_write: 1.08 } } }, "qwen/qwen3.7-max": { id: "qwen/qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 1.504, output: 4.504, cache_read: 0.3, cache_write: 1.88 } }, "qwen/qwen3.8-max": { id: "qwen/qwen3.8-max", name: "Qwen3.8 Max", description: "2.4-trillion-parameter MoE flagship for coding, professional work, multimodal understanding, and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 1.88, output: 5.63, cache_read: 0.23, cache_write: 2.35 } }, "qwen/qwen3.6-flash": { id: "qwen/qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.19, output: 1.13, cache_read: 0.019, cache_write: 0.24, tiers: [{ input: 0.75, output: 4.5, cache_read: 0.075, cache_write: 0.94, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.75, output: 4.5, cache_read: 0.075, cache_write: 0.94 } } }, "qwen/qwen3.6-plus": { id: "qwen/qwen3.6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.32, output: 1.88, cache_read: 0.032, cache_write: 0.4, tiers: [{ input: 1.25, output: 7.5, cache_read: 0.124, cache_write: 1.57, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 1.25, output: 7.5, cache_read: 0.124, cache_write: 1.57 } } }, "tencent/hy3": { id: "tencent/hy3", name: "Hy3", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.16, output: 0.64, cache_read: 0.04, cache_write: 0.16 } }, "tencent/hy3-preview": { id: "tencent/hy3-preview", name: "Hy3 preview", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.19, output: 0.63, cache_read: 0.063, cache_write: 0.19, tiers: [{ input: 0.25, output: 1, cache_read: 0.094, cache_write: 0.25, tier: { type: "context", size: 16000 } }, { input: 0.32, output: 1.25, cache_read: 0.125, cache_write: 0.32, tier: { type: "context", size: 32000 } }] } }, "moonshot/kimi-k2.5": { id: "moonshot/kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.62, output: 3.3, cache_read: 0.11, cache_write: 0.62 } }, "moonshot/kimi-k2.6": { id: "moonshot/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 1, output: 4.16, cache_read: 0.18, cache_write: 1 } }, "moonshot/kimi-k2.7-code": { id: "moonshot/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 1, output: 4.16, cache_read: 0.18, cache_write: 1 } }, "moonshot/kimi-k3": { id: "moonshot/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3 } }, "minimax/minimax-m2.7": { id: "minimax/minimax-m2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.33, output: 1.32, cache_read: 0.066, cache_write: 0.42 } }, "minimax/minimax-m3": { id: "minimax/minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1024000, output: 512000 }, cost: { input: 0.33, output: 1.32, cache_read: 0.066, cache_write: 0.33, tiers: [{ input: 0.66, output: 2.63, cache_read: 0.132, cache_write: 0.66, tier: { type: "context", size: 512000 } }], context_over_200k: { input: 0.66, output: 2.63, cache_read: 0.132, cache_write: 0.66 } } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 65000 }, cost: { input: 0.16, output: 0.32, cache_read: 0.004, cache_write: 0.16 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 65000 }, cost: { input: 0.47, output: 0.94, cache_read: 0.005, cache_write: 0.47 } }, "x-ai/grok-4.3": { id: "x-ai/grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, cache_write: 1.25, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, cache_write: 2.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4, cache_write: 2.5 } } }, "x-ai/grok-4.5": { id: "x-ai/grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.5, cache_write: 2, tiers: [{ input: 4, output: 12, cache_read: 1, cache_write: 4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 12, cache_read: 1, cache_write: 4 } } }, "x-ai/grok-build-0.1": { id: "x-ai/grok-build-0.1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1, output: 2, cache_read: 0.2, cache_write: 1, tiers: [{ input: 2, output: 4, cache_read: 0.4, cache_write: 2, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2, output: 4, cache_read: 0.4, cache_write: 2 } } }, "xiaomi/mimo-v2.5": { id: "xiaomi/mimo-v2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 0.16, output: 0.32, cache_read: 0.004, cache_write: 0.16 } }, "xiaomi/mimo-v2.5-pro": { id: "xiaomi/mimo-v2.5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 0.47, output: 0.94, cache_read: 0.005, cache_write: 0.47 } }, "anthropic/claude-sonnet-4-6": { id: "anthropic/claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-haiku-4-5": { id: "anthropic/claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "anthropic/claude-fable-5": { id: "anthropic/claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4-8": { id: "anthropic/claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4-7": { id: "anthropic/claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-5": { id: "anthropic/claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "anthropic/claude-opus-5": { id: "anthropic/claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "z-ai/glm-5": { id: "z-ai/glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.6, output: 3, cache_read: 0.16, cache_write: 0.6, tiers: [{ input: 0.8, output: 3.4, cache_read: 0.2, cache_write: 0.8, tier: { type: "context", size: 32000 } }] } }, "z-ai/glm-5.1": { id: "z-ai/glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 1, output: 3.8, cache_read: 0.2, cache_write: 1, tiers: [{ input: 1.2, output: 4.4, cache_read: 0.3, cache_write: 1.2, tier: { type: "context", size: 32000 } }] } }, "z-ai/glm-5.2": { id: "z-ai/glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 1.2, output: 4.4, cache_read: 0.3, cache_write: 1.2 } }, "z-ai/glm-4.7": { id: "z-ai/glm-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.47, output: 2.16, cache_read: 0.1, cache_write: 0.47, tiers: [{ input: 0.62, output: 2.47, cache_read: 0.13, cache_write: 0.62, tier: { type: "context", size: 32000 } }] } }, "z-ai/glm-5-turbo": { id: "z-ai/glm-5-turbo", name: "GLM-5-Turbo", description: "Faster GLM-5 lane for coding agents that need lower latency", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 0.9, output: 3.7, cache_read: 0.18, cache_write: 0.9, tiers: [{ input: 1.1, output: 4.3, cache_read: 0.27, cache_write: 1.1, tier: { type: "context", size: 32000 } }] } }, "openai/gpt-5.5-pro": { id: "openai/gpt-5.5-pro", name: "GPT-5.5 Pro", description: "Highest-accuracy GPT-5.5 tier for slower, precision-heavy reasoning and coding", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "openai/gpt-5.6-sol": { id: "openai/gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 45, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1, cache_write: 12.5 } } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 5, tiers: [{ input: 10, output: 45, cache_read: 1, cache_write: 10, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1, cache_write: 10 } } }, "openai/gpt-4o-mini": { id: "openai/gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075, cache_write: 0.15 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 2.5, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, cache_write: 5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5, cache_write: 5 } } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02, cache_write: 0.2 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075, cache_write: 0.75 } }, "openai/gpt-5.6-luna": { id: "openai/gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, cache_write: 0.25, tiers: [{ input: 0.4, output: 1.8, cache_read: 0.04, cache_write: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 0.4, output: 1.8, cache_read: 0.04, cache_write: 0.5 } } }, "openai/gpt-5.6-terra": { id: "openai/gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 2.5, tiers: [{ input: 4, output: 18, cache_read: 0.4, cache_write: 5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4, cache_write: 5 } } } } }, llmtr: { id: "llmtr", env: ["LLMTR_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://llmtr.com/v1", name: "LLMTR", doc: "https://llmtr.com/docs", models: { sincap: { id: "sincap", name: "Sincap", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-05-05", last_updated: "2026-05-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "medgemma-4b": { id: "medgemma-4b", name: "MedGemma 4B", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-26", last_updated: "2026-04-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 4096 }, cost: { input: 3, output: 5 } }, "magibu-11b-v8": { id: "magibu-11b-v8", name: "Magibu 11B v8", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-06-05", last_updated: "2026-06-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 4096 }, cost: { input: 0, output: 0 } }, "qwen3-6-35b": { id: "qwen3-6-35b", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 16384, output: 65536 }, cost: { input: 5, output: 10 } }, "trendyol-7b": { id: "trendyol-7b", name: "Trendyol 7B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-06-06", last_updated: "2026-06-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 0, output: 0 } }, "gemma-4": { id: "gemma-4", name: "Gemma 4", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 5, output: 10 } } } }, claudinio: { id: "claudinio", env: ["CLAUDINIO_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.claudin.io/v1", name: "Claudinio", doc: "https://claudin.io", models: { claudinio: { id: "claudinio", name: "Claudinio", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, knowledge: "2026-05", release_date: "2026-05-12", last_updated: "2026-06-02", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 0.5, output: 2, cache_read: 0.15 } }, claudius: { id: "claudius", name: "Claudius", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, knowledge: "2026-05", release_date: "2026-05-12", last_updated: "2026-05-12", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 3, output: 8, cache_read: 0.9 } } } }, "snowflake-cortex": { id: "snowflake-cortex", env: ["SNOWFLAKE_ACCOUNT", "SNOWFLAKE_CORTEX_PAT"], npm: "@ai-sdk/openai-compatible", api: "https://${SNOWFLAKE_ACCOUNT}.snowflakecomputing.com/api/v2/cortex/v1", name: "Snowflake Cortex", doc: "https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-rest-api", models: { "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 16384 } }, "openai-gpt-5.6-terra": { id: "openai-gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, status: "beta" }, "openai-gpt-4.1": { id: "openai-gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 16384 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 } }, "gemini-3.1-pro": { id: "gemini-3.1-pro", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 } }, "openai-gpt-5.1": { id: "openai-gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 } }, "openai-gpt-5.4": { id: "openai-gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, status: "beta", experimental: { modes: { fast: { cost: { input: 5, output: 30, cache_read: 0.5 }, provider: { body: { service_tier: "priority" } } } } } }, "claude-sonnet-4-5": { id: "claude-sonnet-4-5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 16384 } }, "openai-gpt-5-mini": { id: "openai-gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 272000, input: 272000, output: 8192 }, status: "beta" }, "openai-gpt-5.5": { id: "openai-gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, status: "beta" }, "openai-gpt-5-nano": { id: "openai-gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, status: "beta" }, "deepseek-r1": { id: "deepseek-r1", name: "DeepSeek-R1", description: "Classic open reasoning model for transparent math, coding, and deliberate problem solving", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 } }, "openai-gpt-5.6-sol": { id: "openai-gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, status: "beta" }, "mistral-large2": { id: "mistral-large2", name: "Mistral Large (latest)", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, status: "beta", experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } } }, "snowflake-llama3.3-70b": { id: "snowflake-llama3.3-70b", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 } }, "openai-gpt-5.6-luna": { id: "openai-gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, status: "beta" }, "openai-gpt-5": { id: "openai-gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, status: "beta" }, "openai-gpt-5.2": { id: "openai-gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 } } } }, cohere: { id: "cohere", env: ["COHERE_API_KEY"], npm: "@ai-sdk/cohere", name: "Cohere", doc: "https://docs.cohere.com/docs/models", models: { "command-r7b-arabic-02-2025": { id: "command-r7b-arabic-02-2025", name: "Command R7B Arabic", description: "Open Command R model optimized for Arabic enterprise chat, RAG, and cultural knowledge", family: "command-r", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06-01", release_date: "2025-02-27", last_updated: "2025-02-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 0.0375, output: 0.15 } }, "command-r-08-2024": { id: "command-r-08-2024", name: "Command R", description: "Cohere retrieval model for long-context chat and enterprise RAG workflows", family: "command-r", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-08-30", last_updated: "2024-08-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 0.15, output: 0.6 } }, "command-a-plus-05-2026": { id: "command-a-plus-05-2026", name: "Command A Plus", description: "Cohere's stronger command model for multilingual agents and enterprise workflows", family: "command-a", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04-01", release_date: "2026-05-20", last_updated: "2026-06-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 64000 }, cost: { input: 2.5, output: 10 } }, "command-a-translate-08-2025": { id: "command-a-translate-08-2025", name: "Command A Translate", description: "Translation model for multilingual conversion, localization, and cross-language workflows", family: "command-a", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06-01", release_date: "2025-08-28", last_updated: "2025-08-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8000, output: 8000 }, cost: { input: 2.5, output: 10 } }, "c4ai-aya-expanse-8b": { id: "c4ai-aya-expanse-8b", name: "Aya Expanse 8B", description: "Compact open multilingual model optimized for generation across 23 languages", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-10-24", last_updated: "2024-10-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8000, output: 4000 } }, "c4ai-aya-vision-32b": { id: "c4ai-aya-vision-32b", name: "Aya Vision 32B", description: "Open multilingual vision model for OCR, visual reasoning, and image question answering", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-03-04", last_updated: "2025-05-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 16000, output: 4000 } }, "command-a-03-2025": { id: "command-a-03-2025", name: "Command A", description: "Cohere command model for multilingual enterprise agents, tools, and chat", family: "command-a", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06-01", release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8000 }, cost: { input: 2.5, output: 10 } }, "command-r-plus-08-2024": { id: "command-r-plus-08-2024", name: "Command R+", description: "Cohere's RAG workhorse for long-context enterprise search and tool use", family: "command-r", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-08-30", last_updated: "2024-08-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 2.5, output: 10 } }, "command-a-reasoning-08-2025": { id: "command-a-reasoning-08-2025", name: "Command A Reasoning", description: "Cohere reasoning model for multilingual enterprise agents, tools, and complex workflows", family: "command-a", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1 }], tool_call: true, temperature: true, knowledge: "2024-06-01", release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 32000 }, cost: { input: 2.5, output: 10 } }, "command-a-vision-07-2025": { id: "command-a-vision-07-2025", name: "Command A Vision", description: "Cohere vision model for multilingual document analysis, OCR, and image understanding", family: "command-a", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-06-01", release_date: "2025-07-31", last_updated: "2025-07-31", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8000 }, cost: { input: 2.5, output: 10 } }, "command-r7b-12-2024": { id: "command-r7b-12-2024", name: "Command R7B", description: "Cohere retrieval model for long-context chat and enterprise RAG workflows", family: "command-r", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-12-02", last_updated: "2024-12-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 0.0375, output: 0.15 } }, "c4ai-aya-vision-8b": { id: "c4ai-aya-vision-8b", name: "Aya Vision 8B", description: "Compact open multilingual vision model for OCR and visual question answering", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-03-04", last_updated: "2025-05-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 16000, output: 4000 } }, "north-mini-code-1-0": { id: "north-mini-code-1-0", name: "North Mini Code", description: "Cohere coding model for practical software engineering and agentic edits", family: "north", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-09-23", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://api.cohere.ai/compatibility/v1" }, cost: { input: 0, output: 0 } }, "c4ai-aya-expanse-32b": { id: "c4ai-aya-expanse-32b", name: "Aya Expanse 32B", description: "Open multilingual model optimized for generation across 23 languages", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-10-24", last_updated: "2024-10-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 } } } }, "opencode-go": { id: "opencode-go", env: ["OPENCODE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://opencode.ai/zen/go/v1", name: "OpenCode Go", doc: "https://opencode.ai/docs/zen", models: { "qwen3.7-plus": { id: "qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "qwen3.7-plus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 262144 }], tool_call: true, temperature: true, release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0.4, output: 1.6, cache_read: 0.04, cache_write: 0.5, tiers: [{ input: 1.2, output: 4.8, cache_read: 0.12, cache_write: 1.5, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 1.2, output: 4.8, cache_read: 0.12, cache_write: 1.5 } } }, "glm-5": { id: "glm-5", name: "GLM-5", description: "Legacy model retained for compatibility with older integrations", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 32768 }, status: "deprecated", cost: { input: 1, output: 3.2, cache_read: 0.2 } }, "qwen3.5-plus": { id: "qwen3.5-plus", name: "Qwen3.5 Plus", description: "Legacy model retained for compatibility with older integrations", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, status: "deprecated", provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, cache_write: 0.25 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 32768 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "mimo-v2-omni": { id: "mimo-v2-omni", name: "MiMo V2 Omni", description: "Legacy model retained for compatibility with older integrations", family: "mimo-v2-omni", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 128000 }, status: "deprecated", cost: { input: 0.4, output: 2, cache_read: 0.08 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash (2x usage)", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.07, output: 0.14, cache_read: 0.0014 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Legacy model retained for compatibility with older integrations", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-10", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, status: "deprecated", cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "minimax-m2.7": { id: "minimax-m2.7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax-m2.7", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "qwen3.7-max": { id: "qwen3.7-max", name: "Qwen3.7 Max", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "qwen3.7-max", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 262144 }], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 2.5, output: 7.5, cache_read: 0.5, cache_write: 3.125 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-10", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "mimo-v2-pro": { id: "mimo-v2-pro", name: "MiMo V2 Pro", description: "Legacy model retained for compatibility with older integrations", family: "mimo-v2-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 128000 }, status: "deprecated", cost: { input: 1, output: 3, cache_read: 0.2, tiers: [{ input: 2, output: 6, cache_read: 0.4, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.4 } } }, "minimax-m3": { id: "minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal coding model for long-context reasoning and agent tasks", family: "minimax-m3", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-31", last_updated: "2026-05-31", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0.3, output: 1.2, cache_read: 0.06, tiers: [{ input: 0.6, output: 2.4, cache_read: 0.12, tier: { type: "context", size: 512000 } }], context_over_200k: { input: 0.6, output: 2.4, cache_read: 0.12 } } }, hy3: { id: "hy3", name: "Hy3", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, temperature: true, release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0.14, output: 0.58, cache_read: 0.035 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "qwen3.8-max": { id: "qwen3.8-max", name: "Qwen3.8 Max", description: "2.4-trillion-parameter multimodal flagship for coding, professional work, and long-horizon agentic workflows", family: "qwen3.8-max", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 262144 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 2, output: 6, cache_read: 0.25, cache_write: 2.5 } }, "mimo-v2.5": { id: "mimo-v2.5", name: "MiMo V2.5", description: "MiMo omni model for text, image, video, audio, and agents", family: "mimo-v2.5", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "minimax-m2.5": { id: "minimax-m2.5", name: "MiniMax-M2.5", description: "Legacy model retained for compatibility with older integrations", family: "minimax-m2.5", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 65536 }, status: "deprecated", provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna (2x usage)", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 0.1, output: 0.6, cache_read: 0.01, cache_write: 0.125, tiers: [{ input: 0.2, output: 0.9, cache_read: 0.02, cache_write: 0.25, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 0.2, output: 0.9, cache_read: 0.02, cache_write: 0.25 } } }, "grok-4.5": { id: "grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 2, output: 6, cache_read: 0.5, tiers: [{ input: 4, output: 12, cache_read: 1, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 12, cache_read: 1 } } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "mimo-v2.5-pro": { id: "mimo-v2.5-pro", name: "MiMo V2.5 Pro", description: "MiMo pro model for strong multimodal reasoning and agent execution", family: "mimo-v2.5-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 128000 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "qwen3.6-plus": { id: "qwen3.6-plus", name: "Qwen3.6 Plus", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 0.625, tiers: [{ input: 2, output: 6, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.2, cache_write: 2.5 } } } } }, poe: { id: "poe", env: ["POE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.poe.com/v1", name: "Poe", doc: "https://creator.poe.com/docs/external-applications/openai-compatible-api", models: { "stabilityai/stablediffusionxl": { id: "stabilityai/stablediffusionxl", name: "StableDiffusionXL", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "stable-diffusion", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2023-07-09", last_updated: "2023-07-09", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 200, output: 0 } }, "fireworks-ai/kimi-k2.5-fw": { id: "fireworks-ai/kimi-k2.5-fw", name: "Kimi-K2.5-FW", description: "Kimi multimodal agent model for visual understanding, coding, and planning", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, input: 245760, output: 16384 }, cost: { input: 0, output: 0 } }, "topazlabs-co/topazlabs": { id: "topazlabs-co/topazlabs", name: "TopazLabs", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "topazlabs", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-12-03", last_updated: "2024-12-03", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 204, output: 0 } }, "google/imagen-4-fast": { id: "google/imagen-4-fast", name: "Imagen-4-Fast", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "imagen", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-06-25", last_updated: "2025-06-25", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/gemini-3.5-flash": { id: "google/gemini-3.5-flash", name: "Gemini-3.5-Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5152, output: 9.0909, cache_read: 0.1515 } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini-2.5-Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, temperature: false, release_date: "2025-04-26", last_updated: "2025-04-26", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1065535, output: 65535 }, cost: { input: 0.21, output: 1.8, cache_read: 0.021 } }, "google/imagen-3": { id: "google/imagen-3", name: "Imagen-3", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "imagen", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-10-15", last_updated: "2024-10-15", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/gemini-3.1-pro": { id: "google/gemini-3.1-pro", name: "Gemini-3.1-Pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, temperature: false, release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2 } }, "google/veo-3": { id: "google/veo-3", name: "Veo-3", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-05-21", last_updated: "2025-05-21", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/imagen-4-ultra": { id: "google/imagen-4-ultra", name: "Imagen-4-Ultra", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "imagen", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-05-24", last_updated: "2025-05-24", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/gemini-3-flash": { id: "google/gemini-3-flash", name: "Gemini-3-Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "high"] }], tool_call: true, temperature: false, release_date: "2025-10-07", last_updated: "2025-10-07", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.4, output: 2.4, cache_read: 0.04 } }, "google/veo-3.1-fast": { id: "google/veo-3.1-fast", name: "Veo-3.1-Fast", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/veo-3-fast": { id: "google/veo-3-fast", name: "Veo-3-Fast", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-10-13", last_updated: "2025-10-13", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/gemini-deep-research": { id: "google/gemini-deep-research", name: "gemini-deep-research", description: "Legacy model retained for compatibility with older integrations", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 0 }, status: "deprecated", cost: { input: 1.6, output: 9.6 } }, "google/gemma-4-31b": { id: "google/gemma-4-31b", name: "Gemma-4-31B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 8192 }, cost: { input: 0, output: 0 } }, "google/gemini-3-pro": { id: "google/gemini-3-pro", name: "Gemini-3-Pro", description: "Legacy model retained for compatibility with older integrations", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-10-22", last_updated: "2025-10-22", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, status: "deprecated", cost: { input: 1.6, output: 9.6, cache_read: 0.16 } }, "google/imagen-3-fast": { id: "google/imagen-3-fast", name: "Imagen-3-Fast", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "imagen", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-10-17", last_updated: "2024-10-17", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/veo-2": { id: "google/veo-2", name: "Veo-2", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-12-02", last_updated: "2024-12-02", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/nano-banana-pro": { id: "google/nano-banana-pro", name: "Nano-Banana-Pro", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "nano-banana", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-11-19", last_updated: "2025-11-19", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 65536, output: 0 }, cost: { input: 2, output: 12, cache_read: 0.2 } }, "google/gemini-2.0-flash": { id: "google/gemini-2.0-flash", name: "Gemini-2.0-Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 990000, output: 8192 }, cost: { input: 0.1, output: 0.42 } }, "google/nano-banana": { id: "google/nano-banana", name: "Nano-Banana", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "nano-banana", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 0 }, cost: { input: 0.21, output: 1.8, cache_read: 0.021 } }, "google/gemini-3.1-flash-lite": { id: "google/gemini-3.1-flash-lite", name: "Gemini-3.1-Flash-Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "high"] }], tool_call: true, temperature: false, release_date: "2026-02-18", last_updated: "2026-02-18", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5 } }, "google/imagen-4": { id: "google/imagen-4", name: "Imagen-4", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "imagen", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini-2.5-Pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 0, max: 32768 }], tool_call: true, temperature: false, release_date: "2025-02-05", last_updated: "2025-02-05", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1065535, output: 65535 }, cost: { input: 0.87, output: 7, cache_read: 0.087 } }, "google/veo-3.1": { id: "google/veo-3.1", name: "Veo-3.1", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/gemini-2.5-flash-lite": { id: "google/gemini-2.5-flash-lite", name: "Gemini-2.5-Flash-Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, temperature: false, release_date: "2025-06-19", last_updated: "2025-06-19", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1024000, output: 64000 }, cost: { input: 0.07, output: 0.28 } }, "google/gemini-2.0-flash-lite": { id: "google/gemini-2.0-flash-lite", name: "Gemini-2.0-Flash-Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-02-05", last_updated: "2025-02-05", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 990000, output: 8192 }, cost: { input: 0.052, output: 0.21 } }, "google/lyria": { id: "google/lyria", name: "Lyria", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "lyria", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-06-04", last_updated: "2025-06-04", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "poetools/claude-code": { id: "poetools/claude-code", name: "claude-code", description: "Claude model for careful reasoning, writing, coding, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-11-27", last_updated: "2025-11-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 } }, "ideogramai/ideogram-v2": { id: "ideogramai/ideogram-v2", name: "Ideogram-v2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "ideogram", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-08-21", last_updated: "2024-08-21", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 150, output: 0 } }, "ideogramai/ideogram-v2a": { id: "ideogramai/ideogram-v2a", name: "Ideogram-v2a", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "ideogram", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-02-27", last_updated: "2025-02-27", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 150, output: 0 } }, "ideogramai/ideogram": { id: "ideogramai/ideogram", name: "Ideogram", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "ideogram", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-04-03", last_updated: "2024-04-03", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 150, output: 0 } }, "ideogramai/ideogram-v2a-turbo": { id: "ideogramai/ideogram-v2a-turbo", name: "Ideogram-v2a-Turbo", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "ideogram", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-02-27", last_updated: "2025-02-27", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 150, output: 0 } }, "empiriolabs/deepseek-v4-flash-el": { id: "empiriolabs/deepseek-v4-flash-el", name: "DeepSeek-V4-Flash-EL", description: "Fast DeepSeek model for efficient chat, coding help, and agent loops", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, release_date: "2026-04-24", last_updated: "2026-05-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, input: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28 } }, "empiriolabs/deepseek-v4-pro-el": { id: "empiriolabs/deepseek-v4-pro-el", name: "DeepSeek-V4-Pro-EL", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, release_date: "2026-04-24", last_updated: "2026-05-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, input: 1e6, output: 384000 }, cost: { input: 1.67, output: 3.33 } }, "xai/grok-4": { id: "xai/grok-4", name: "Grok-4", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-07-10", last_updated: "2025-07-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 3, output: 15, cache_read: 0.75 } }, "xai/grok-4.1-fast-reasoning": { id: "xai/grok-4.1-fast-reasoning", name: "Grok-4.1-Fast-Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-11-19", last_updated: "2025-11-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 } }, "xai/grok-4.20-multi-agent": { id: "xai/grok-4.20-multi-agent", name: "Grok-4.20-Multi-Agent", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2026-03-13", last_updated: "2026-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 0 }, cost: { input: 2, output: 6, cache_read: 0.2 } }, "xai/grok-4-fast-reasoning": { id: "xai/grok-4-fast-reasoning", name: "Grok-4-Fast-Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-09-16", last_updated: "2025-09-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 128000 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "xai/grok-code-fast-1": { id: "xai/grok-code-fast-1", name: "Grok Code Fast 1", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-08-22", last_updated: "2025-08-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 0.2, output: 1.5, cache_read: 0.02 } }, "xai/grok-4-fast-non-reasoning": { id: "xai/grok-4-fast-non-reasoning", name: "Grok-4-Fast-Non-Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-09-16", last_updated: "2025-09-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 128000 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "xai/grok-4.1-fast-non-reasoning": { id: "xai/grok-4.1-fast-non-reasoning", name: "Grok-4.1-Fast-Non-Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-11-19", last_updated: "2025-11-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 } }, "xai/grok-3-mini": { id: "xai/grok-3-mini", name: "Grok 3 Mini", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-04-11", last_updated: "2025-04-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.3, output: 0.5, cache_read: 0.075 } }, "xai/grok-3": { id: "xai/grok-3", name: "Grok 3", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-04-11", last_updated: "2025-04-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 3, output: 15, cache_read: 0.75 } }, "lumalabs/ray2": { id: "lumalabs/ray2", name: "Ray2", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "ray", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-02-20", last_updated: "2025-02-20", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 5000, output: 0 } }, "trytako/tako": { id: "trytako/tako", name: "Tako", description: "Tool-capable chat model for instruction following and agentic application workflows", family: "tako", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-08-15", last_updated: "2024-08-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 2048, output: 0 } }, "runwayml/runway-gen-4-turbo": { id: "runwayml/runway-gen-4-turbo", name: "Runway-Gen-4-Turbo", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "runway", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-05-09", last_updated: "2025-05-09", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 256, output: 0 } }, "runwayml/runway": { id: "runwayml/runway", name: "Runway", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "runway", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-10-11", last_updated: "2024-10-11", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 256, output: 0 } }, "anthropic/claude-sonnet-4.6": { id: "anthropic/claude-sonnet-4.6", name: "Claude-Sonnet-4.6", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, temperature: false, release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 983040, output: 128000 }, cost: { input: 2.6, output: 13, cache_read: 0.26, cache_write: 3.2 } }, "anthropic/claude-opus-4.1": { id: "anthropic/claude-opus-4.1", name: "Claude-Opus-4.1", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 0, max: 31999 }], tool_call: true, temperature: false, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 196608, output: 32000 }, cost: { input: 13, output: 64, cache_read: 1.3, cache_write: 16 } }, "anthropic/claude-opus-4.5": { id: "anthropic/claude-opus-4.5", name: "Claude-Opus-4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 0, max: 63999 }], tool_call: true, temperature: false, release_date: "2025-11-21", last_updated: "2025-11-21", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 196608, output: 64000 }, cost: { input: 4.3, output: 21, cache_read: 0.43, cache_write: 5.3 } }, "anthropic/claude-opus-4.7": { id: "anthropic/claude-opus-4.7", name: "Claude-Opus-4.7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, release_date: "2026-04-15", last_updated: "2026-04-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 128000 }, cost: { input: 4.3, output: 21, cache_read: 0.43, cache_write: 5.4 } }, "anthropic/claude-sonnet-4.5": { id: "anthropic/claude-sonnet-4.5", name: "Claude-Sonnet-4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 0, max: 31999 }], tool_call: true, temperature: false, release_date: "2025-09-26", last_updated: "2025-09-26", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 983040, output: 32768 }, cost: { input: 2.6, output: 13, cache_read: 0.26, cache_write: 3.2 } }, "anthropic/claude-sonnet-3.5": { id: "anthropic/claude-sonnet-3.5", name: "Claude-Sonnet-3.5", description: "Legacy model retained for compatibility with older integrations", family: "claude-sonnet", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-06-05", last_updated: "2024-06-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 189096, output: 8192 }, status: "deprecated", cost: { input: 2.6, output: 13, cache_read: 0.26, cache_write: 3.2 } }, "anthropic/claude-haiku-3.5": { id: "anthropic/claude-haiku-3.5", name: "Claude-Haiku-3.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-10-01", last_updated: "2024-10-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 189096, output: 8192 }, cost: { input: 0.68, output: 3.4, cache_read: 0.068, cache_write: 0.85 } }, "anthropic/claude-sonnet-4": { id: "anthropic/claude-sonnet-4", name: "Claude-Sonnet-4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-05-21", last_updated: "2025-05-21", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 983040, output: 64000 }, cost: { input: 2.6, output: 13, cache_read: 0.26, cache_write: 3.2 } }, "anthropic/claude-haiku-4.5": { id: "anthropic/claude-haiku-4.5", name: "Claude-Haiku-4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 0, max: 63999 }], tool_call: true, temperature: false, release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 192000, output: 64000 }, cost: { input: 0.85, output: 4.3, cache_read: 0.085, cache_write: 1.1 } }, "anthropic/claude-sonnet-3.7": { id: "anthropic/claude-sonnet-3.7", name: "Claude-Sonnet-3.7", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-02-19", last_updated: "2025-02-19", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 196608, output: 128000 }, cost: { input: 2.6, output: 13, cache_read: 0.26, cache_write: 3.2 } }, "anthropic/claude-sonnet-3.5-june": { id: "anthropic/claude-sonnet-3.5-june", name: "Claude-Sonnet-3.5-June", description: "Legacy model retained for compatibility with older integrations", family: "claude-sonnet", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-11-18", last_updated: "2024-11-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 189096, output: 8192 }, status: "deprecated", cost: { input: 2.6, output: 13, cache_read: 0.26, cache_write: 3.2 } }, "anthropic/claude-opus-4": { id: "anthropic/claude-opus-4", name: "Claude-Opus-4", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-05-21", last_updated: "2025-05-21", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 192512, output: 28672 }, cost: { input: 13, output: 64, cache_read: 1.3, cache_write: 16 } }, "anthropic/claude-opus-4.8": { id: "anthropic/claude-opus-4.8", name: "Claude-Opus-4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 128000 }, cost: { input: 4.2929, output: 21.4646 } }, "anthropic/claude-haiku-3": { id: "anthropic/claude-haiku-3", name: "Claude-Haiku-3", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-03-09", last_updated: "2024-03-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 189096, output: 8192 }, cost: { input: 0.21, output: 1.1, cache_read: 0.021, cache_write: 0.26 } }, "anthropic/claude-opus-4.6": { id: "anthropic/claude-opus-4.6", name: "Claude-Opus-4.6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, temperature: false, release_date: "2026-02-04", last_updated: "2026-02-04", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 983040, output: 128000 }, cost: { input: 4.3, output: 21, cache_read: 0.43, cache_write: 5.3 } }, "cerebras/qwen3-235b-2507-cs": { id: "cerebras/qwen3-235b-2507-cs", name: "qwen3-235b-2507-cs", description: "Legacy model retained for compatibility with older integrations", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-08-06", last_updated: "2025-08-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 }, status: "deprecated" }, "cerebras/llama-3.1-8b-cs": { id: "cerebras/llama-3.1-8b-cs", name: "Llama-3.1-8B-CS", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-05-13", last_updated: "2025-05-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 0 }, cost: { input: 0.1, output: 0.1 } }, "cerebras/qwen3-32b-cs": { id: "cerebras/qwen3-32b-cs", name: "qwen3-32b-cs", description: "Legacy model retained for compatibility with older integrations", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-05-15", last_updated: "2025-05-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 }, status: "deprecated" }, "cerebras/gpt-oss-120b-cs": { id: "cerebras/gpt-oss-120b-cs", name: "GPT-OSS-120B-CS", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-08-06", last_updated: "2025-08-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 0 }, cost: { input: 0.35, output: 0.75 } }, "cerebras/llama-3.3-70b-cs": { id: "cerebras/llama-3.3-70b-cs", name: "llama-3.3-70b-cs", description: "Legacy model retained for compatibility with older integrations", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-05-13", last_updated: "2025-05-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 }, status: "deprecated" }, "openai/gpt-5.1-codex-mini": { id: "openai/gpt-5.1-codex-mini", name: "GPT-5.1-Codex-Mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-11-12", last_updated: "2025-11-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.22, output: 1.8, cache_read: 0.022 } }, "openai/gpt-image-2": { id: "openai/gpt-image-2", name: "GPT-Image-2", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 5.0505, output: 32.3232, cache_read: 1.2626 } }, "openai/gpt-5.2-pro": { id: "openai/gpt-5.2-pro", name: "GPT-5.2-Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, temperature: false, release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 19, output: 150 } }, "openai/gpt-5.5-pro": { id: "openai/gpt-5.5-pro", name: "GPT-5.5-Pro", description: "Highest-accuracy GPT-5.5 tier for slower, precision-heavy reasoning and coding", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-08", last_updated: "2026-04-08", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 27.2727, output: 163.6364 } }, "openai/gpt-4.1-mini": { id: "openai/gpt-4.1-mini", name: "GPT-4.1-mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.36, output: 1.4, cache_read: 0.09 } }, "openai/gpt-4o": { id: "openai/gpt-4o", name: "GPT-4o", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-05-13", last_updated: "2024-05-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 } }, "openai/sora-2-pro": { id: "openai/sora-2-pro", name: "Sora-2-Pro", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "sora", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "openai/gpt-5-chat": { id: "openai/gpt-5-chat", name: "GPT-5-Chat", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-codex", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.1, output: 9, cache_read: 0.11 } }, "openai/gpt-5.3-codex-spark": { id: "openai/gpt-5.3-codex-spark", name: "GPT-5.3-Codex-Spark", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2026-03-04", last_updated: "2026-03-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "openai/gpt-4o-aug": { id: "openai/gpt-4o-aug", name: "GPT-4o-Aug", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-11-21", last_updated: "2024-11-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 2.2, output: 9, cache_read: 1.1 } }, "openai/gpt-5.4-pro": { id: "openai/gpt-5.4-pro", name: "GPT-5.4-Pro", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, temperature: false, release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 27, output: 160 } }, "openai/o3-mini-high": { id: "openai/o3-mini-high", name: "o3-mini-high", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-01-31", last_updated: "2025-01-31", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 0.99, output: 4 } }, "openai/gpt-4.1-nano": { id: "openai/gpt-4.1-nano", name: "GPT-4.1-nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.09, output: 0.36, cache_read: 0.022 } }, "openai/gpt-4o-search": { id: "openai/gpt-4o-search", name: "GPT-4o-Search", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-03-11", last_updated: "2025-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 2.2, output: 9 } }, "openai/chatgpt-4o-latest": { id: "openai/chatgpt-4o-latest", name: "ChatGPT-4o-Latest", description: "Legacy model retained for compatibility with older integrations", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-08-14", last_updated: "2024-08-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, status: "deprecated", cost: { input: 4.5, output: 14 } }, "openai/gpt-5.1-instant": { id: "openai/gpt-5.1-instant", name: "GPT-5.1-Instant", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-11-12", last_updated: "2025-11-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.1, output: 9, cache_read: 0.11 } }, "openai/o3-mini": { id: "openai/o3-mini", name: "o3-mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-01-31", last_updated: "2025-01-31", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 0.99, output: 4 } }, "openai/gpt-4-classic": { id: "openai/gpt-4-classic", name: "GPT-4-Classic", description: "Legacy model retained for compatibility with older integrations", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-03-25", last_updated: "2024-03-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 4096 }, status: "deprecated", cost: { input: 27, output: 54 } }, "openai/gpt-image-1-mini": { id: "openai/gpt-image-1-mini", name: "GPT-Image-1-Mini", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-08", last_updated: "2026-04-08", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 4.5455, output: 27.2727, cache_read: 0.4545 } }, "openai/gpt-5.3-instant": { id: "openai/gpt-5.3-instant", name: "GPT-5.3-Instant", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 111616, output: 16384 }, cost: { input: 1.6, output: 13, cache_read: 0.16 } }, "openai/o3-pro": { id: "openai/o3-pro", name: "o3-pro", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-06-10", last_updated: "2025-06-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 18, output: 72 } }, "openai/gpt-4o-mini": { id: "openai/gpt-4o-mini", name: "GPT-4o-mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 124096, output: 4096 }, cost: { input: 0.14, output: 0.54, cache_read: 0.068 } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT-5", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.1, output: 9, cache_read: 0.11 } }, "openai/dall-e-3": { id: "openai/dall-e-3", name: "DALL-E-3", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "dall-e", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2023-11-06", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 800, output: 0 } }, "openai/o4-mini-deep-research": { id: "openai/o4-mini-deep-research", name: "o4-mini-deep-research", description: "Research model for long-horizon investigation, synthesis, and analytical reports", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-06-27", last_updated: "2025-06-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.8, output: 7.2, cache_read: 0.45 } }, "openai/o3-deep-research": { id: "openai/o3-deep-research", name: "o3-deep-research", description: "Research model for long-horizon investigation, synthesis, and analytical reports", family: "o", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-06-27", last_updated: "2025-06-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 9, output: 36, cache_read: 2.2 } }, "openai/gpt-5-codex": { id: "openai/gpt-5-codex", name: "GPT-5-Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.1, output: 9 } }, "openai/gpt-3.5-turbo": { id: "openai/gpt-3.5-turbo", name: "GPT-3.5-Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2023-09-13", last_updated: "2023-09-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 2048 }, cost: { input: 0.45, output: 1.4 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT-5.4", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, temperature: false, release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image", "pdf"], output: ["image"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.2, output: 14, cache_read: 0.22 } }, "openai/gpt-4-classic-0314": { id: "openai/gpt-4-classic-0314", name: "GPT-4-Classic-0314", description: "Legacy model retained for compatibility with older integrations", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-08-26", last_updated: "2024-08-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 4096 }, status: "deprecated", cost: { input: 27, output: 54 } }, "openai/gpt-image-1.5": { id: "openai/gpt-image-1.5", name: "gpt-image-1.5", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 128000, output: 0 } }, "openai/gpt-5.2-codex": { id: "openai/gpt-5.2-codex", name: "GPT-5.2-Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, temperature: false, release_date: "2026-01-14", last_updated: "2026-01-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.6, output: 13, cache_read: 0.16 } }, "openai/gpt-3.5-turbo-raw": { id: "openai/gpt-3.5-turbo-raw", name: "GPT-3.5-Turbo-Raw", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2023-09-27", last_updated: "2023-09-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 4524, output: 2048 }, cost: { input: 0.45, output: 1.4 } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT-5.4-Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, temperature: false, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.18, output: 1.1, cache_read: 0.018 } }, "openai/gpt-5-pro": { id: "openai/gpt-5-pro", name: "GPT-5-Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 14, output: 110 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT-5.4-Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, temperature: false, release_date: "2026-03-12", last_updated: "2026-03-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.68, output: 4, cache_read: 0.068 } }, "openai/o1": { id: "openai/o1", name: "o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2024-12-18", last_updated: "2024-12-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 14, output: 54 } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, temperature: false, release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.6, output: 13, cache_read: 0.16 } }, "openai/gpt-5.3-codex": { id: "openai/gpt-5.3-codex", name: "GPT-5.3-Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, temperature: false, release_date: "2026-02-10", last_updated: "2026-02-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.6, output: 13, cache_read: 0.16 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT-5-mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-06-25", last_updated: "2025-06-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.22, output: 1.8, cache_read: 0.022 } }, "openai/o1-pro": { id: "openai/o1-pro", name: "o1-pro", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-03-19", last_updated: "2025-03-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 140, output: 540 } }, "openai/sora-2": { id: "openai/sora-2", name: "Sora-2", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "sora", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT-5.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-11-12", last_updated: "2025-11-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.1, output: 9, cache_read: 0.11 } }, "openai/gpt-4-turbo": { id: "openai/gpt-4-turbo", name: "GPT-4-Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2023-09-13", last_updated: "2023-09-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 9, output: 27 } }, "openai/gpt-5.1-codex": { id: "openai/gpt-5.1-codex", name: "GPT-5.1-Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-11-12", last_updated: "2025-11-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.1, output: 9, cache_read: 0.11 } }, "openai/gpt-5-nano": { id: "openai/gpt-5-nano", name: "GPT-5-nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.045, output: 0.36, cache_read: 0.0045 } }, "openai/o3": { id: "openai/o3", name: "o3", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.8, output: 7.2, cache_read: 0.45 } }, "openai/gpt-3.5-turbo-instruct": { id: "openai/gpt-3.5-turbo-instruct", name: "GPT-3.5-Turbo-Instruct", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2023-09-20", last_updated: "2023-09-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 3500, output: 1024 }, cost: { input: 1.4, output: 1.8 } }, "openai/gpt-image-1": { id: "openai/gpt-image-1", name: "GPT-Image-1", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-03-31", last_updated: "2025-03-31", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 128000, output: 0 } }, "openai/gpt-4o-mini-search": { id: "openai/gpt-4o-mini-search", name: "GPT-4o-mini-Search", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-03-11", last_updated: "2025-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.14, output: 0.54 } }, "openai/gpt-5.2-instant": { id: "openai/gpt-5.2-instant", name: "GPT-5.2-Instant", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.6, output: 13, cache_read: 0.16 } }, "openai/gpt-4.1": { id: "openai/gpt-4.1", name: "GPT-4.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 1.8, output: 7.2, cache_read: 0.45 } }, "openai/o4-mini": { id: "openai/o4-mini", name: "o4-mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 0.99, output: 4, cache_read: 0.25 } }, "openai/gpt-5.1-codex-max": { id: "openai/gpt-5.1-codex-max", name: "GPT-5.1-Codex-Max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, temperature: false, release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.1, output: 9, cache_read: 0.11 } }, "novita/glm-4.6v": { id: "novita/glm-4.6v", name: "glm-4.6v", description: "GLM vision model for visual reasoning, documents, and multimodal agents", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: false, release_date: "2025-12-09", last_updated: "2025-12-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 32768 } }, "novita/glm-5": { id: "novita/glm-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 205000, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.2 } }, "novita/kimi-k2.5": { id: "novita/kimi-k2.5", name: "Kimi-K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 262144 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "novita/glm-4.7-flash": { id: "novita/glm-4.7-flash", name: "glm-4.7-flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: false, release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 65500 } }, "novita/kimi-k2.6": { id: "novita/kimi-k2.6", name: "Kimi-K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-20", last_updated: "2026-05-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 262144 }, cost: { input: 0.96, output: 4.04, cache_read: 0.16 } }, "novita/glm-4.6": { id: "novita/glm-4.6", name: "GLM-4.6", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 } }, "novita/deepseek-v3.2": { id: "novita/deepseek-v3.2", name: "DeepSeek-V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 0 }, cost: { input: 0.27, output: 0.4, cache_read: 0.13 } }, "novita/glm-4.7": { id: "novita/glm-4.7", name: "glm-4.7", description: "Legacy model retained for compatibility with older integrations", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 205000, output: 131072 }, status: "deprecated" }, "novita/kimi-k2-thinking": { id: "novita/kimi-k2-thinking", name: "kimi-k2-thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: false, release_date: "2025-11-07", last_updated: "2025-11-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 0 } }, "novita/minimax-m2.1": { id: "novita/minimax-m2.1", name: "minimax-m2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: false, release_date: "2025-12-26", last_updated: "2025-12-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 205000, output: 131072 } }, "novita/glm-4.7-n": { id: "novita/glm-4.7-n", name: "glm-4.7-n", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: false, release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 205000, output: 131072 } }, "elevenlabs/elevenlabs-v2.5-turbo": { id: "elevenlabs/elevenlabs-v2.5-turbo", name: "ElevenLabs-v2.5-Turbo", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "elevenlabs", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-10-28", last_updated: "2024-10-28", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 128000, output: 0 } }, "elevenlabs/elevenlabs-v3": { id: "elevenlabs/elevenlabs-v3", name: "ElevenLabs-v3", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "elevenlabs", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-06-05", last_updated: "2025-06-05", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 128000, output: 0 } }, "elevenlabs/elevenlabs-music": { id: "elevenlabs/elevenlabs-music", name: "ElevenLabs-Music", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "elevenlabs", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-08-29", last_updated: "2025-08-29", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 2000, output: 0 } } } }, baseten: { id: "baseten", env: ["BASETEN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://inference.baseten.co/v1", name: "Baseten", doc: "https://docs.baseten.co/inference/model-apis/overview", models: { "nvidia/Nemotron-120B-A12B": { id: "nvidia/Nemotron-120B-A12B", name: "Nemotron Super", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2026-02", release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202800, output: 202800 }, cost: { input: 0.3, output: 0.75, cache_read: 0.06 } }, "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B": { id: "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B", name: "Nemotron Ultra", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202800, output: 202800 }, cost: { input: 0.6, output: 2.4, cache_read: 0.12 } }, "thinkingmachines/inkling-small": { id: "thinkingmachines/inkling-small", name: "Inkling Small", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-07-30", last_updated: "2026-07-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 32768 }, cost: { input: 0.5, output: 1.2, cache_read: 0.1 } }, "thinkingmachines/inkling": { id: "thinkingmachines/inkling", name: "Inkling", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 32768 }, cost: { input: 1, output: 4.05 } }, "zai-org/GLM-5": { id: "zai-org/GLM-5", name: "GLM 5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2026-01", release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202800, output: 202800 }, cost: { input: 0.95, output: 3.15, cache_read: 0.2 } }, "zai-org/GLM-5.2-Fast": { id: "zai-org/GLM-5.2-Fast", name: "GLM 5.2 Fast", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 262144 }, cost: { input: 2.1, output: 6.6, cache_read: 0.21 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 262144 }, cost: { input: 1.4, output: 4.4, cache_read: 0.3 } }, "zai-org/GLM-5.1": { id: "zai-org/GLM-5.1", name: "GLM 5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202800, output: 202800 }, cost: { input: 1.3, output: 4.3, cache_read: 0.26 } }, "zai-org/GLM-4.7": { id: "zai-org/GLM-4.7", name: "GLM 4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 200000 }, cost: { input: 0.6, output: 2.2, cache_read: 0.12 } }, "MiniMaxAI/MiniMax-M2.5": { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax-M2.5", description: "Legacy model retained for compatibility with older integrations", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2026-01", release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204000, output: 204000 }, status: "deprecated", cost: { input: 0.3, output: 1.2 } }, "deepseek-ai/DeepSeek-V4-Flash-0731": { id: "deepseek-ai/DeepSeek-V4-Flash-0731", name: "Deepseek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 0.13, output: 0.26, cache_read: 0.028 } }, "deepseek-ai/DeepSeek-V3.1": { id: "deepseek-ai/DeepSeek-V3.1", name: "DeepSeek V3.1", description: "Legacy model retained for compatibility with older integrations", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-08-25", last_updated: "2025-08-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 164000, output: 131000 }, status: "deprecated", cost: { input: 0.5, output: 1.5 } }, "deepseek-ai/DeepSeek-V4-Pro": { id: "deepseek-ai/DeepSeek-V4-Pro", name: "Deepseek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.74, output: 3.48, cache_read: 0.145 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "moonshotai/Kimi-K2.5": { id: "moonshotai/Kimi-K2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-12", release_date: "2026-01-30", last_updated: "2026-02-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.6, output: 3, cache_read: 0.12 } }, "moonshotai/Kimi-K2.7-Code": { id: "moonshotai/Kimi-K2.7-Code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "moonshotai/Kimi-K3": { id: "moonshotai/Kimi-K3", name: "Kimi K3", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 262144 }, cost: { input: 3, output: 15 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "OpenAI GPT 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128072, output: 128072 }, cost: { input: 0.1, output: 0.5 } } } }, nvidia: { id: "nvidia", env: ["NVIDIA_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://integrate.api.nvidia.com/v1", name: "Nvidia", doc: "https://docs.api.nvidia.com/nim/", models: { "microsoft/phi-4-mini-instruct": { id: "microsoft/phi-4-mini-instruct", name: "Phi-4-Mini", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "phi", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2024-12-01", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0, output: 0 } }, "microsoft/phi-4-multimodal-instruct": { id: "microsoft/phi-4-multimodal-instruct", name: "Phi 4 Multimodal", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-26", last_updated: "2025-07-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "nvidia/magpie-tts-zeroshot": { id: "nvidia/magpie-tts-zeroshot", name: "magpie-tts-zeroshot", description: "Speech generation model for controllable voice, narration, and audio delivery", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-05-22", last_updated: "2025-06-12", modalities: { input: ["text", "audio"], output: ["audio"] }, open_weights: true, limit: { context: 0, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/nv-embedcode-7b-v1": { id: "nvidia/nv-embedcode-7b-v1", name: "nv-embedcode-7b-v1", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-03-17", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 2048 }, cost: { input: 0, output: 0 } }, "nvidia/studiovoice": { id: "nvidia/studiovoice", name: "studiovoice", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-10-03", last_updated: "2025-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "nvidia/sparsedrive": { id: "nvidia/sparsedrive", name: "sparsedrive", description: "Nemotron multimodal model for visual reasoning and agentic AI workflows", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-03-18", last_updated: "2025-07-20", modalities: { input: ["video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "nvidia/cosmos-reason2-8b": { id: "nvidia/cosmos-reason2-8b", name: "Cosmos Reason2 8B", description: "Vision language model for physical-world understanding with structured reasoning on video and images", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-nano-12b-v2-vl": { id: "nvidia/nemotron-nano-12b-v2-vl", name: "Nemotron Nano 12B v2 VL", description: "Nemotron multimodal model for visual reasoning and agentic AI workflows", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-10-28", last_updated: "2025-10-28", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0, output: 0 } }, "nvidia/bevformer": { id: "nvidia/bevformer", name: "bevformer", description: "Nemotron multimodal model for visual reasoning and agentic AI workflows", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-03-18", last_updated: "2025-07-20", modalities: { input: ["video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-nano-30b-a3b": { id: "nvidia/nemotron-3-nano-30b-a3b", name: "nemotron-3-nano-30b-a3b", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2024-12", last_updated: "2024-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0, output: 0 } }, "nvidia/llama-3.3-nemotron-super-49b-v1.5": { id: "nvidia/llama-3.3-nemotron-super-49b-v1.5", name: "Llama 3.3 Nemotron Super 49B v1.5", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0, output: 0 } }, "nvidia/cosmos-transfer2_5-2b": { id: "nvidia/cosmos-transfer2_5-2b", name: "cosmos-transfer2.5-2b", description: "Video model for prompt-guided generation, editing, and motion workflows", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image", "video"], output: ["video"] }, open_weights: true, limit: { context: 0, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/llama-3.1-nemotron-nano-8b-v1": { id: "nvidia/llama-3.1-nemotron-nano-8b-v1", name: "Llama 3.1 Nemotron Nano 8B v1", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2025-03-18", last_updated: "2025-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0, output: 0 } }, "nvidia/active-speaker-detection": { id: "nvidia/active-speaker-detection", name: "Active Speaker Detection", description: "Nemotron multimodal model for visual reasoning and agentic AI workflows", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["video"], output: ["text"] }, open_weights: true, limit: { context: 0, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/usdvalidate": { id: "nvidia/usdvalidate", name: "usdvalidate", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-07-24", last_updated: "2025-01-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 0, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/llama-3.1-nemotron-safety-guard-8b-v3": { id: "nvidia/llama-3.1-nemotron-safety-guard-8b-v3", name: "llama-3.1-nemotron-safety-guard-8b-v3", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "nemotron", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-10-28", last_updated: "2025-10-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/llama-3.3-nemotron-super-49b-v1": { id: "nvidia/llama-3.3-nemotron-super-49b-v1", name: "Llama 3.3 Nemotron Super 49B v1", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2025-04-07", last_updated: "2025-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0, output: 0 } }, "nvidia/llama-3.1-nemotron-70b-instruct": { id: "nvidia/llama-3.1-nemotron-70b-instruct", name: "Llama 3.1 Nemotron 70B Instruct", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", family: "nemotron", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-super-120b-a12b": { id: "nvidia/nemotron-3-super-120b-a12b", name: "Nemotron 3 Super", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.2, output: 0.8 } }, "nvidia/nemotron-3-content-safety": { id: "nvidia/nemotron-3-content-safety", name: "nemotron-3-content-safety", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "nemotron", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/cosmos-transfer1-7b": { id: "nvidia/cosmos-transfer1-7b", name: "cosmos-transfer1-7b", description: "Video model for prompt-guided generation, editing, and motion workflows", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-06-13", last_updated: "2025-06-30", modalities: { input: ["text", "image", "video"], output: ["video"] }, open_weights: true, limit: { context: 0, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/llama-3.1-nemotron-ultra-253b-v1": { id: "nvidia/llama-3.1-nemotron-ultra-253b-v1", name: "Llama 3.1 Nemotron Ultra 253B", description: "Flagship Nemotron model for high-throughput reasoning and complex agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2025-04-07", last_updated: "2025-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "nvidia/llama-3_2-nemoretriever-300m-embed-v1": { id: "nvidia/llama-3_2-nemoretriever-300m-embed-v1", name: "llama-3_2-nemoretriever-300m-embed-v1", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-07-24", last_updated: "2025-07-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 2048 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning": { id: "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning", name: "Nemotron 3 Nano Omni", description: "Open Nemotron omni model combining reasoning with text, vision, and audio", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: -1, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-28", last_updated: "2026-04-28", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 65536 }, cost: { input: 0, output: 0 } }, "nvidia/gliner-pii": { id: "nvidia/gliner-pii", name: "gliner-pii", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/rerank-qa-mistral-4b": { id: "nvidia/rerank-qa-mistral-4b", name: "rerank-qa-mistral-4b", description: "Reranking model for improving retrieval quality in search and recommendation systems", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-03-17", last_updated: "2025-01-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/llama-3.1-nemotron-nano-vl-8b-v1": { id: "nvidia/llama-3.1-nemotron-nano-vl-8b-v1", name: "Llama 3.1 Nemotron Nano VL 8B v1", description: "Nemotron multimodal model for visual reasoning and agentic AI workflows", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-04-10", last_updated: "2025-04-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 16384 }, cost: { input: 0, output: 0 } }, "nvidia/synthetic-video-detector": { id: "nvidia/synthetic-video-detector", name: "synthetic-video-detector", description: "Video model for prompt-guided generation, editing, and motion workflows", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["video"], output: ["text"] }, open_weights: true, limit: { context: 0, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/streampetr": { id: "nvidia/streampetr", name: "streampetr", description: "Nemotron multimodal model for visual reasoning and agentic AI workflows", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-voicechat": { id: "nvidia/nemotron-voicechat", name: "nemotron-voicechat", description: "Nemotron multimodal model for visual reasoning and agentic AI workflows", family: "nemotron", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "audio"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "nvidia/llama-nemotron-embed-vl-1b-v2": { id: "nvidia/llama-nemotron-embed-vl-1b-v2", name: "llama-nemotron-embed-vl-1b-v2", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "nemotron", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-02-10", last_updated: "2026-02-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 2048 }, cost: { input: 0, output: 0 } }, "nvidia/nvidia-nemotron-nano-9b-v2": { id: "nvidia/nvidia-nemotron-nano-9b-v2", name: "nvidia-nemotron-nano-9b-v2", description: "Compact Nemotron model for efficient reasoning and deployable AI agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2025-08-18", last_updated: "2025-08-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0, output: 0 } }, "nvidia/riva-translate-4b-instruct-v1.1": { id: "nvidia/riva-translate-4b-instruct-v1.1", name: "riva-translate-4b-instruct-v1_1", description: "Translation model for multilingual conversion, localization, and cross-language workflows", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-12-12", last_updated: "2025-12-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-content-safety-reasoning-4b": { id: "nvidia/nemotron-content-safety-reasoning-4b", name: "nemotron-content-safety-reasoning-4b", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: false, release_date: "2026-01-22", last_updated: "2026-01-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-ultra-550b-a55b": { id: "nvidia/nemotron-3-ultra-550b-a55b", name: "Nemotron 3 Ultra 550B A55B", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 65536 }, cost: { input: 0.5, output: 2.5, cache_read: 0.15 } }, "nvidia/llama-nemotron-rerank-vl-1b-v2": { id: "nvidia/llama-nemotron-rerank-vl-1b-v2", name: "llama-nemotron-rerank-vl-1b-v2", description: "Reranking model for improving retrieval quality in search and recommendation systems", family: "nemotron", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-03-31", last_updated: "2026-03-31", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/nv-embed-v1": { id: "nvidia/nv-embed-v1", name: "nv-embed-v1", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-06-07", last_updated: "2025-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 2048 }, cost: { input: 0, output: 0 } }, "nvidia/cosmos-predict1-5b": { id: "nvidia/cosmos-predict1-5b", name: "cosmos-predict1-5b", description: "Video model for prompt-guided generation, editing, and motion workflows", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-03-18", last_updated: "2025-03-18", modalities: { input: ["text", "image", "video"], output: ["video"] }, open_weights: true, limit: { context: 0, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-mini-4b-instruct": { id: "nvidia/nemotron-mini-4b-instruct", name: "nemotron-mini-4b-instruct", description: "Compact Nemotron model for efficient reasoning and deployable AI agents", family: "nemotron", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-08-21", last_updated: "2024-08-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "nvidia/usdcode": { id: "nvidia/usdcode", name: "usdcode", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-01", last_updated: "2026-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "google/google-paligemma": { id: "google/google-paligemma", name: "paligemma", description: "Gemini multimodal model for text, image, audio, video, and document tasks", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2024-05-14", last_updated: "2024-08-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "google/gemma-3-4b-it": { id: "google/gemma-3-4b-it", name: "Gemma 3 4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-03-12", last_updated: "2025-03-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0, output: 0 } }, "google/gemma-2-2b-it": { id: "google/gemma-2-2b-it", name: "Gemma 2 2b It", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-07-16", last_updated: "2024-07-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "google/gemma-3-12b-it": { id: "google/gemma-3-12b-it", name: "Gemma 3 12B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-03-12", last_updated: "2025-03-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0, output: 0 } }, "google/gemma-4-31b-it": { id: "google/gemma-4-31b-it", name: "Gemma-4-31B-IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 0, output: 0 } }, "google/gemma-3n-e4b-it": { id: "google/gemma-3n-e4b-it", name: "Gemma 3n E4b It", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06", release_date: "2025-06-03", last_updated: "2025-06-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "google/gemma-3n-e2b-it": { id: "google/gemma-3n-e2b-it", name: "Gemma 3n E2b It", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06", release_date: "2025-06-12", last_updated: "2025-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "thinkingmachines/inkling": { id: "thinkingmachines/inkling", name: "Inkling", description: "Multimodal MoE reasoning model (975B total, 41B active) for text, image, and audio", family: "ling", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 16384 }, cost: { input: 0, output: 0 } }, "baai/bge-m3": { id: "baai/bge-m3", name: "BGE M3", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "bge", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-01-30", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 1024 }, cost: { input: 0, output: 0 } }, "qwen/qwen3-coder-480b-a35b-instruct": { id: "qwen/qwen3-coder-480b-a35b-instruct", name: "Qwen3 Coder 480B A35B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 66536 }, cost: { input: 0, output: 0 } }, "qwen/qwen-image-edit": { id: "qwen/qwen-image-edit", name: "Qwen Image Edit", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-19", last_updated: "2025-08-19", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 0, output: 0 } }, "qwen/qwen2.5-coder-32b-instruct": { id: "qwen/qwen2.5-coder-32b-instruct", name: "Qwen2.5 Coder 32b Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-11-06", last_updated: "2024-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "qwen/qwen-image": { id: "qwen/qwen-image", name: "Qwen Image", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 0, output: 0 } }, "qwen/qwen3.5-397b-a17b": { id: "qwen/qwen3.5-397b-a17b", name: "Qwen3.5-397B-A17B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-01", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 8192 }, cost: { input: 0, output: 0 } }, "qwen/qwen3.5-122b-a10b": { id: "qwen/qwen3.5-122b-a10b", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0, output: 0 } }, "qwen/qwen3-next-80b-a3b-instruct": { id: "qwen/qwen3-next-80b-a3b-instruct", name: "Qwen3-Next-80B-A3B-Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2024-12-01", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 16384 }, cost: { input: 0, output: 0 } }, "abacusai/dracarys-llama-3.1-70b-instruct": { id: "abacusai/dracarys-llama-3.1-70b-instruct", name: "dracarys-llama-3.1-70b-instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-09-11", last_updated: "2025-05-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "upstage/solar-10.7b-instruct": { id: "upstage/solar-10.7b-instruct", name: "solar-10.7b-instruct", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-06-05", last_updated: "2025-04-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "black-forest-labs/flux_2-klein-4b": { id: "black-forest-labs/flux_2-klein-4b", name: "FLUX.2 Klein 4B", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-06", release_date: "2026-01-14", last_updated: "2026-01-31", modalities: { input: ["image", "text"], output: ["image"] }, open_weights: true, limit: { context: 40960, output: 40960 }, cost: { input: 0, output: 0 } }, "black-forest-labs/flux_1-schnell": { id: "black-forest-labs/flux_1-schnell", name: "FLUX.1-schnell", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, knowledge: "2024-07", release_date: "2024-08-01", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["image"] }, open_weights: true, limit: { context: 77, input: 77, output: 0 }, cost: { input: 0, output: 0 } }, "black-forest-labs/flux_1-kontext-dev": { id: "black-forest-labs/flux_1-kontext-dev", name: "FLUX.1-Kontext-dev", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-08-12", last_updated: "2025-08-12", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: true, limit: { context: 40960, output: 40960 }, cost: { input: 0, output: 0 } }, "black-forest-labs/flux.1-dev": { id: "black-forest-labs/flux.1-dev", name: "FLUX.1-dev", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-08", release_date: "2024-08-01", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 4096, output: 0 }, cost: { input: 0, output: 0 } }, "mistralai/mistral-medium-3.5-128b": { id: "mistralai/mistral-medium-3.5-128b", name: "Mistral Medium 3.5", description: "Balanced Mistral model for enterprise assistants, multilingual work, and tools", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "mistralai/mistral-nemotron": { id: "mistralai/mistral-nemotron", name: "mistral-nemotron", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "nemotron", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-06-11", last_updated: "2025-06-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "mistralai/mistral-medium-3-instruct": { id: "mistralai/mistral-medium-3-instruct", name: "Mistral Medium 3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, input: 131072, output: 32768 }, cost: { input: 0, output: 0 } }, "mistralai/mistral-small-4-119b-2603": { id: "mistralai/mistral-small-4-119b-2603", name: "mistral-small-4-119b-2603", description: "Efficient Mistral model for fast chat, extraction, and production assistants", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "mistralai/mistral-large-3-675b-instruct-2512": { id: "mistralai/mistral-large-3-675b-instruct-2512", name: "Mistral Large 3 675B Instruct 2512", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0 } }, "mistralai/ministral-14b-instruct-2512": { id: "mistralai/ministral-14b-instruct-2512", name: "Ministral 3 14B Instruct 2512", description: "Compact Mistral VLM for chat and instruction-based workloads", family: "ministral", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0, output: 0 } }, "mistralai/mixtral-8x22b-instruct": { id: "mistralai/mixtral-8x22b-instruct", name: "Mistral: Mixtral 8x22B Instruct", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-04-17", last_updated: "2024-04-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 13108 }, cost: { input: 0, output: 0 } }, "mistralai/magistral-small-2506": { id: "mistralai/magistral-small-2506", name: "Magistral Small 2506", description: "Mistral reasoning model for transparent analysis, math, and complex decisions", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 32768 }, cost: { input: 0, output: 0 } }, "mistralai/mixtral-8x7b-instruct": { id: "mistralai/mixtral-8x7b-instruct", name: "Mistral: Mixtral 8x7B Instruct", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2023-12-10", last_updated: "2026-03-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 16384 }, cost: { input: 0, output: 0 } }, "mistralai/mistral-7b-instruct-v0.3": { id: "mistralai/mistral-7b-instruct-v0.3", name: "Mistral-7B-Instruct-v0.3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-01", last_updated: "2025-04-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 0, output: 0 } }, "bytedance/seed-oss-36b-instruct": { id: "bytedance/seed-oss-36b-instruct", name: "ByteDance-Seed/Seed-OSS-36B-Instruct", description: "Tool-capable chat model for instruction following and agentic application workflows", family: "seed", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-04", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0, output: 0 } }, "meta/llama-3.1-70b-instruct": { id: "meta/llama-3.1-70b-instruct", name: "Llama 3.1 70b Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-07-16", last_updated: "2024-07-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "meta/llama-4-maverick-17b-128e-instruct": { id: "meta/llama-4-maverick-17b-128e-instruct", name: "Llama 4 Maverick 17b 128e Instruct", description: "Open multimodal Llama model for strong reasoning and fast responses", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-02", release_date: "2025-04-01", last_updated: "2025-04-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "meta/llama-guard-4-12b": { id: "meta/llama-guard-4-12b", name: "Llama Guard 4 12B", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "llama", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-05", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "meta/llama-3.2-1b-instruct": { id: "meta/llama-3.2-1b-instruct", name: "Llama 3.2 1b Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2024-09-18", last_updated: "2024-09-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "meta/llama-3.3-70b-instruct": { id: "meta/llama-3.3-70b-instruct", name: "Llama 3.3 70b Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-11-26", last_updated: "2024-11-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "meta/llama-3.2-3b-instruct": { id: "meta/llama-3.2-3b-instruct", name: "Llama 3.2 3B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-09-18", last_updated: "2024-09-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32000 }, cost: { input: 0, output: 0 } }, "meta/llama-3.2-90b-vision-instruct": { id: "meta/llama-3.2-90b-vision-instruct", name: "Llama-3.2-90B-Vision-Instruct", description: "Open Llama multimodal model for image understanding and text reasoning", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "meta/esmfold": { id: "meta/esmfold", name: "esmfold", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-03-15", last_updated: "2025-06-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "meta/llama-3.1-8b-instruct": { id: "meta/llama-3.1-8b-instruct", name: "Llama 3.1 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16000, output: 4096 }, cost: { input: 0, output: 0 } }, "meta/llama-3.2-11b-vision-instruct": { id: "meta/llama-3.2-11b-vision-instruct", name: "Llama 3.2 11b Vision Instruct", description: "Open Llama multimodal model for image understanding and text reasoning", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2024-09-18", last_updated: "2024-09-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "meta/esm2-650m": { id: "meta/esm2-650m", name: "esm2-650m", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-08-29", last_updated: "2025-03-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "poolside/laguna-xs-2.1": { id: "poolside/laguna-xs-2.1", name: "Laguna XS 2.1", description: "Agentic coding model from Poolside in the XS size class for local deployment", family: "laguna", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-02", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0, output: 0 } }, "deepseek-ai/deepseek-v4-flash": { id: "deepseek-ai/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 393216 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "deepseek-ai/deepseek-v4-pro": { id: "deepseek-ai/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 393216 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "stepfun-ai/step-3.5-flash": { id: "stepfun-ai/step-3.5-flash", name: "Step 3.5 Flash", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2026-02-02", last_updated: "2026-02-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 0, output: 0 } }, "stepfun-ai/step-3.7-flash": { id: "stepfun-ai/step-3.7-flash", name: "Step 3.7 Flash", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 0, output: 0 } }, "z-ai/glm-5.2": { id: "z-ai/glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0 } }, "moonshotai/kimi-k2.6": { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0, output: 0 } }, "moonshotai/kimi-k2-instruct-0905": { id: "moonshotai/kimi-k2-instruct-0905", name: "Kimi K2 0905", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0, output: 0 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0, output: 0 } }, "openai/whisper-large-v3": { id: "openai/whisper-large-v3", name: "Whisper Large v3", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "whisper", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2023-09", release_date: "2023-09-01", last_updated: "2025-09-05", modalities: { input: ["audio"], output: ["text"] }, open_weights: true, limit: { context: 0, output: 4096 }, cost: { input: 0, output: 0 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT-OSS-120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08", release_date: "2025-08-04", last_updated: "2025-08-14", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "minimaxai/minimax-m2.7": { id: "minimaxai/minimax-m2.7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-04-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0 } }, "minimaxai/minimax-m3": { id: "minimaxai/minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 16384 }, cost: { input: 0, output: 0 } }, "sarvamai/sarvam-m": { id: "sarvamai/sarvam-m", name: "sarvam-m", description: "Efficient Indian-language reasoning model for chat, coding, and multilingual work", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } } } }, nebius: { id: "nebius", env: ["NEBIUS_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.tokenfactory.nebius.com/v1", name: "Nebius Token Factory", doc: "https://docs.tokenfactory.nebius.com/", models: { "nvidia/nemotron-3-super-120b-a12b": { id: "nvidia/nemotron-3-super-120b-a12b", name: "Nemotron-3-Super-120B-A12B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-02", release_date: "2026-03-11", last_updated: "2026-03-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 32768 }, cost: { input: 0.3, output: 0.9 } }, "nvidia/Nemotron-3-Nano-Omni": { id: "nvidia/Nemotron-3-Nano-Omni", name: "Nemotron-3-Nano-Omni", description: "Open Nemotron omni model combining reasoning with text, vision, and audio", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-01-20", last_updated: "2026-05-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, input: 60000, output: 8192 }, cost: { input: 0.06, output: 0.24, cache_read: 0.006, cache_write: 0.075 } }, "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B": { id: "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B", name: "Nemotron-3-Nano-30B-A3B", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-08-10", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, input: 30000, output: 4096 }, cost: { input: 0.06, output: 0.24, cache_read: 0.006, cache_write: 0.075 } }, "nvidia/Llama-3_1-Nemotron-Ultra-253B-v1": { id: "nvidia/Llama-3_1-Nemotron-Ultra-253B-v1", name: "Llama-3.1-Nemotron-Ultra-253B-v1", description: "Flagship Nemotron model for high-throughput reasoning and complex agents", family: "nemotron", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-15", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 120000, output: 4096 }, cost: { input: 0.6, output: 1.8, cache_read: 0.06, cache_write: 0.75 } }, "google/gemma-3-27b-it": { id: "google/gemma-3-27b-it", name: "Gemma-3-27b-it", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-10", release_date: "2026-01-20", last_updated: "2026-02-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 110000, input: 1e5, output: 8192 }, cost: { input: 0.1, output: 0.3, cache_read: 0.01, cache_write: 0.125 } }, "zai-org/GLM-5": { id: "zai-org/GLM-5", name: "GLM-5", description: "Legacy model retained for compatibility with older integrations", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2026-01", release_date: "2026-03-01", last_updated: "2026-03-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 16384 }, status: "deprecated", cost: { input: 1, output: 3.2, cache_read: 0.1, cache_write: 1 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 432000, output: 432000 }, cost: { input: 1.4, output: 4.4 } }, "Qwen/Qwen3-235B-A22B-Instruct-2507": { id: "Qwen/Qwen3-235B-A22B-Instruct-2507", name: "Qwen3 235B A22B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-25", last_updated: "2025-10-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 8192 }, cost: { input: 0.2, output: 0.6 } }, "Qwen/Qwen3-Next-80B-A3B-Thinking-fast": { id: "Qwen/Qwen3-Next-80B-A3B-Thinking-fast", name: "Qwen3-Next-80B-A3B-Thinking-fast", description: "Legacy model retained for compatibility with older integrations", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-25", last_updated: "2026-05-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8000, input: 7000, output: 8192 }, status: "deprecated", cost: { input: 0.15, output: 1.2, cache_read: 0.015, cache_write: 0.1875 } }, "Qwen/Qwen3-235B-A22B-Thinking-2507-fast": { id: "Qwen/Qwen3-235B-A22B-Thinking-2507-fast", name: "Qwen3-235B-A22B-Thinking-2507-fast", description: "Legacy model retained for compatibility with older integrations", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-25", last_updated: "2026-05-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8000, input: 7000, output: 8192 }, status: "deprecated", cost: { input: 0.5, output: 2, cache_read: 0.05, cache_write: 0.625 } }, "Qwen/Qwen3.5-397B-A17B": { id: "Qwen/Qwen3.5-397B-A17B", name: "Qwen3.5-397B-A17B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-15", last_updated: "2026-05-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 250000, output: 8192 }, cost: { input: 0.6, output: 3.6, cache_read: 0.06, cache_write: 0.75 } }, "Qwen/Qwen3-Embedding-8B": { id: "Qwen/Qwen3-Embedding-8B", name: "Qwen3-Embedding-8B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, knowledge: "2025-10", release_date: "2026-01-10", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, input: 32768, output: 0 }, cost: { input: 0.01, output: 0 } }, "Qwen/Qwen3-Next-80B-A3B-Thinking": { id: "Qwen/Qwen3-Next-80B-A3B-Thinking", name: "Qwen3-Next-80B-A3B-Thinking", description: "Qwen reasoning model for deliberate problem solving, math, and coding", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-12", release_date: "2026-01-28", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 120000, output: 16384 }, cost: { input: 0.15, output: 1.2, reasoning: 1.2, cache_read: 0.015, cache_write: 0.18 } }, "Qwen/Qwen3-30B-A3B-Instruct-2507": { id: "Qwen/Qwen3-30B-A3B-Instruct-2507", name: "Qwen3-30B-A3B-Instruct-2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-12", release_date: "2026-01-28", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 120000, output: 8192 }, cost: { input: 0.1, output: 0.3, cache_read: 0.01, cache_write: 0.125 } }, "Qwen/Qwen2.5-VL-72B-Instruct": { id: "Qwen/Qwen2.5-VL-72B-Instruct", name: "Qwen2.5-VL-72B-Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-20", last_updated: "2026-02-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 120000, output: 8192 }, cost: { input: 0.25, output: 0.75, cache_read: 0.025, cache_write: 0.31 } }, "Qwen/Qwen3-32B": { id: "Qwen/Qwen3-32B", name: "Qwen3-32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-12", release_date: "2026-01-28", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 120000, output: 8192 }, cost: { input: 0.1, output: 0.3, cache_read: 0.01, cache_write: 0.125 } }, "Qwen/Qwen3.5-397B-A17B-fast": { id: "Qwen/Qwen3.5-397B-A17B-fast", name: "Qwen3.5-397B-A17B-fast", description: "Legacy model retained for compatibility with older integrations", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-15", last_updated: "2026-05-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8000, input: 7000, output: 8192 }, status: "deprecated", cost: { input: 0.6, output: 3.6, cache_read: 0.06, cache_write: 0.75 } }, "MiniMaxAI/MiniMax-M2.5-fast": { id: "MiniMaxAI/MiniMax-M2.5-fast", name: "MiniMax-M2.5-fast", description: "Legacy model retained for compatibility with older integrations", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-01-20", last_updated: "2026-05-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8000, input: 7000, output: 8192 }, status: "deprecated", cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "MiniMaxAI/MiniMax-M2.5": { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-01-20", last_updated: "2026-05-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, input: 190000, output: 8192 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "MiniMaxAI/MiniMax-M3": { id: "MiniMaxAI/MiniMax-M3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 0.3, output: 1.2 } }, "deepseek-ai/DeepSeek-V3.2-fast": { id: "deepseek-ai/DeepSeek-V3.2-fast", name: "DeepSeek-V3.2-fast", description: "Legacy model retained for compatibility with older integrations", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-01-27", last_updated: "2026-05-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8000, input: 7000, output: 8192 }, status: "deprecated", cost: { input: 0.4, output: 2, cache_read: 0.04, cache_write: 0.5 } }, "deepseek-ai/DeepSeek-V3.2": { id: "deepseek-ai/DeepSeek-V3.2", name: "DeepSeek-V3.2", description: "Legacy model retained for compatibility with older integrations", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-11", release_date: "2026-01-20", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163000, input: 160000, output: 16384 }, status: "deprecated", cost: { input: 0.3, output: 0.45, reasoning: 0.45, cache_read: 0.03, cache_write: 0.375 } }, "deepseek-ai/DeepSeek-V4-Flash": { id: "deepseek-ai/DeepSeek-V4-Flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.14 } }, "deepseek-ai/DeepSeek-V4-Pro": { id: "deepseek-ai/DeepSeek-V4-Pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 1.75, output: 3.5, cache_read: 0.15 } }, "NousResearch/Hermes-4-70B": { id: "NousResearch/Hermes-4-70B", name: "Hermes-4-70B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-11", release_date: "2026-01-30", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 120000, output: 8192 }, cost: { input: 0.13, output: 0.4, reasoning: 0.4, cache_read: 0.013, cache_write: 0.16 } }, "NousResearch/Hermes-4-405B": { id: "NousResearch/Hermes-4-405B", name: "Hermes-4-405B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-11", release_date: "2026-01-30", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 120000, output: 8192 }, cost: { input: 1, output: 3, reasoning: 3, cache_read: 0.1, cache_write: 1.25 } }, "PrimeIntellect/INTELLECT-3": { id: "PrimeIntellect/INTELLECT-3", name: "INTELLECT-3", description: "Legacy model retained for compatibility with older integrations", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-10", release_date: "2026-01-25", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 120000, output: 8192 }, status: "deprecated", cost: { input: 0.2, output: 1.1, cache_read: 0.02, cache_write: 0.25 } }, "moonshotai/Kimi-K2.5-fast": { id: "moonshotai/Kimi-K2.5-fast", name: "Kimi-K2.5-fast", description: "Legacy model retained for compatibility with older integrations", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-06", release_date: "2025-12-15", last_updated: "2026-02-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 8192 }, status: "deprecated", cost: { input: 0.5, output: 2.5, cache_read: 0.05, cache_write: 0.625 } }, "moonshotai/Kimi-K2.5": { id: "moonshotai/Kimi-K2.5", name: "Kimi-K2.5", description: "Legacy model retained for compatibility with older integrations", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-06", release_date: "2025-12-15", last_updated: "2026-02-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 8192 }, status: "deprecated", cost: { input: 0.5, output: 2.5, reasoning: 2.5, cache_read: 0.05, cache_write: 0.625 } }, "moonshotai/Kimi-K2.7-Code": { id: "moonshotai/Kimi-K2.7-Code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 8000 }, cost: { input: 0.95, output: 4 } }, "moonshotai/Kimi-K3": { id: "moonshotai/Kimi-K3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 8000 }, cost: { input: 3, output: 15, cache_read: 3 } }, "openai/gpt-oss-120b-fast": { id: "openai/gpt-oss-120b-fast", name: "gpt-oss-120b-fast", description: "Legacy model retained for compatibility with older integrations", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-06", release_date: "2025-06-10", last_updated: "2026-05-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8000, input: 7000, output: 8192 }, status: "deprecated", cost: { input: 0.1, output: 0.5, cache_read: 0.01, cache_write: 0.125 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "gpt-oss-120b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-09", release_date: "2026-01-10", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 124000, output: 8192 }, cost: { input: 0.15, output: 0.6, reasoning: 0.6, cache_read: 0.015, cache_write: 0.18 } }, "meta-llama/Llama-3.3-70B-Instruct": { id: "meta-llama/Llama-3.3-70B-Instruct", name: "Llama-3.3-70B-Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08", release_date: "2025-12-05", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 120000, output: 8192 }, cost: { input: 0.13, output: 0.4, cache_read: 0.013, cache_write: 0.16 } } } }, vivgrid: { id: "vivgrid", env: ["VIVGRID_API_KEY"], npm: "@ai-sdk/openai", api: "https://api.vivgrid.com/v1", name: "Vivgrid", doc: "https://docs.vivgrid.com/models", models: { "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT 5.6 Sol", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.15, output: 0.3, reasoning: 0.3, cache_read: 0.03 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 1.2, output: 4.2, cache_read: 0.3 } }, "gemini-3.1-flash-lite-preview": { id: "gemini-3.1-flash-lite-preview", name: "Gemini 3.1 Flash Lite Preview", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, cache_write: 1 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 2.5, output: 15, cache_read: 0.25 } }, "gpt-5.2-codex": { id: "gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-01-14", last_updated: "2026-01-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5.4-nano": { id: "gpt-5.4-nano", name: "GPT-5.4 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "deepseek-v3.2": { id: "deepseek-v3.2", name: "DeepSeek-V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.28, output: 0.42 } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT 5.6 Luna", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 1, output: 6, cache_read: 0.1, cache_write: 1.25 } }, "gpt-5.3-codex": { id: "gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-24", last_updated: "2026-02-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "GPT-5 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.25, output: 2, cache_read: 0.03 } }, "gemini-3.1-pro-preview": { id: "gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "gpt-5.1-codex": { id: "gpt-5.1-codex", name: "GPT-5.1 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT 5.6 Terra", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 3.125 } }, "gpt-5.1-codex-max": { id: "gpt-5.1-codex-max", name: "GPT-5.1 Codex Max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } } } }, google: { id: "google", env: ["GOOGLE_API_KEY", "GOOGLE_GENERATIVE_AI_API_KEY", "GEMINI_API_KEY"], npm: "@ai-sdk/google", name: "Google", doc: "https://ai.google.dev/gemini-api/docs/models", models: { "gemini-2.5-computer-use-preview-10-2025": { id: "gemini-2.5-computer-use-preview-10-2025", name: "Gemini 2.5 Computer Use Preview 10-2025", description: "Specialized Gemini 2.5 model for browser-control agents that automate UI tasks", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-10-07", last_updated: "2025-10-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 65536 }, cost: { input: 1.25, output: 10, tiers: [{ input: 2.5, output: 15, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15 } } }, "deep-research-preview-04-2026": { id: "deep-research-preview-04-2026", name: "Deep Research Preview (Apr-21-2026)", description: "Agentic model for autonomous multi-step research, synthesis, and cited reports", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 131072, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "gemini-3.1-flash-tts-preview": { id: "gemini-3.1-flash-tts-preview", name: "Gemini 3.1 Flash TTS Preview", description: "Low-latency speech generation with steerable prompts and expressive audio tags", family: "gemini-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2026-04-15", last_updated: "2026-04-15", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 8192, output: 16384 }, cost: { input: 1, output: 20 } }, "gemini-flash-latest": { id: "gemini-flash-latest", name: "Gemini Flash Latest", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, input_audio: 1.5 } }, "gemini-embedding-2": { id: "gemini-embedding-2", name: "Gemini Embedding 2", description: "Multimodal embedding model mapping text, images, video, audio, and PDFs into a unified embedding space", family: "gemini", attachment: true, reasoning: false, tool_call: false, temperature: false, knowledge: "2025-11", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1 }, cost: { input: 0.2, output: 0, input_audio: 6.5 } }, "lyria-3-pro-preview": { id: "lyria-3-pro-preview", name: "Lyria 3 Pro Preview", description: "Music generation model for full-length songs from text or images with vocals and structure", family: "lyria", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-03-25", last_updated: "2026-03-25", modalities: { input: ["text", "image"], output: ["text", "audio"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0, output: 0 } }, "gemini-3.5-flash": { id: "gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, input_audio: 1.5 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, input_audio: 1 } }, "gemini-3.5-flash-lite": { id: "gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "lyria-3-clip-preview": { id: "lyria-3-clip-preview", name: "Lyria 3 Clip Preview", description: "Music generation model for short 30-second clips, loops, and previews from text or image prompts", family: "lyria", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-03-25", last_updated: "2026-03-25", modalities: { input: ["text", "image"], output: ["text", "audio"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0, output: 0 } }, "gemini-omni-flash-preview": { id: "gemini-omni-flash-preview", name: "Gemini Omni Flash Preview", description: "Video generation and editing model for fast, conversational text- and image-to-video workflows", family: "gemini", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "video"], output: ["video"] }, open_weights: false, limit: { context: 131072, output: 65536 }, cost: { input: 1.5, output: 17.5 } }, "veo-3.1-generate-preview": { id: "veo-3.1-generate-preview", name: "Veo 3.1", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-10-15", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 480, output: 8192 }, status: "beta" }, "deep-research-max-preview-04-2026": { id: "deep-research-max-preview-04-2026", name: "Deep Research Max Preview (Apr-21-2026)", description: "Maximum-comprehensiveness agentic researcher for multi-step investigation, synthesis, and cited reports", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 131072, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "gemini-3-pro-image-preview": { id: "gemini-3-pro-image-preview", name: "Nano Banana Pro", description: "Nano Banana Pro for higher-fidelity image generation and design-heavy edits", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 2, output: 120 } }, "gemini-3.1-flash-lite-preview": { id: "gemini-3.1-flash-lite-preview", name: "Gemini 3.1 Flash Lite Preview", description: "Legacy model retained for compatibility with older integrations", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, status: "deprecated", cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "gemini-3.5-live-translate-preview": { id: "gemini-3.5-live-translate-preview", name: "Gemini 3.5 Live Translate Preview", description: "Low-latency audio-to-audio model for real-time speech translation across 70+ languages", family: "gemini-pro", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["audio"], output: ["audio", "text"] }, open_weights: false, limit: { context: 16384, output: 32768 }, cost: { input: 3.5, output: 21, input_audio: 3.5, output_audio: 21 } }, "gemini-3-flash-preview": { id: "gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, input_audio: 1 } }, "gemini-3.1-pro-preview-customtools": { id: "gemini-3.1-pro-preview-customtools", name: "Gemini 3.1 Pro Preview Custom Tools", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "gemini-3.1-flash-lite-image": { id: "gemini-3.1-flash-lite-image", name: "Nano Banana 2 Lite", description: "Fastest, most cost-efficient Gemini image model for high-volume 1K generation and editing", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "high"] }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 65536 }, cost: { input: 0.25, output: 30 } }, "gemini-3.1-flash-image-preview": { id: "gemini-3.1-flash-image-preview", name: "Nano Banana 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "high"] }], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 65536 }, cost: { input: 0.5, output: 60 } }, "gemini-robotics-er-1.6-preview": { id: "gemini-robotics-er-1.6-preview", name: "Gemini Robotics-ER 1.6 Preview", description: "Vision-language model for embodied reasoning: spatial understanding, task planning, and physical-world agentic robotics", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 0 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-14", last_updated: "2026-04-14", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 65536 }, cost: { input: 1, output: 5, input_audio: 2 } }, "gemma-4-26b-a4b-it": { id: "gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 } }, "gemini-embedding-001": { id: "gemini-embedding-001", name: "Gemini Embedding 001", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "gemini", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2025-05", release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 2048, output: 1 }, cost: { input: 0.15, output: 0 } }, "veo-3.1-lite-generate-preview": { id: "veo-3.1-lite-generate-preview", name: "Veo 3.1 lite", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-03-31", last_updated: "2026-03-31", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 480, output: 8192 } }, "gemini-2.0-flash": { id: "gemini-2.0-flash", name: "Gemini 2.0 Flash", description: "Earlier Gemini Flash workhorse for responsive multimodal apps and tool use", family: "gemini-flash", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 8192 }, status: "deprecated", cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "gemini-3.6-flash": { id: "gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15, input_audio: 1.5 } }, "veo-3.1-fast-generate-preview": { id: "veo-3.1-fast-generate-preview", name: "Veo 3.1 fast", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-10-15", last_updated: "2026-01-01", modalities: { input: ["text", "image", "video"], output: ["video"] }, open_weights: false, limit: { context: 480, output: 8192 } }, "gemini-3.1-flash-lite": { id: "gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "gemma-4-31b-it": { id: "gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 } }, "gemini-3.1-flash-image": { id: "gemini-3.1-flash-image", name: "Nano Banana 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "high"] }], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "video", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 65536 }, cost: { input: 0.5, output: 60 } }, "gemini-2.5-flash-image": { id: "gemini-2.5-flash-image", name: "Nano Banana", description: "Nano Banana image model for fast generation, edits, and character-consistent assets", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2024-06", release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.3, output: 30, cache_read: 0.075 } }, "gemini-2.5-flash-preview-tts": { id: "gemini-2.5-flash-preview-tts", name: "Gemini 2.5 Flash Preview TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gemini-flash", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-05-01", last_updated: "2025-05-01", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 8192, output: 16384 }, cost: { input: 0.5, output: 10 } }, "gemini-3-pro-image": { id: "gemini-3-pro-image", name: "Nano Banana Pro", description: "Nano Banana Pro for higher-fidelity image generation and design-heavy edits", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 2, output: 120 } }, "gemini-3.1-pro-preview": { id: "gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "gemini-flash-lite-latest": { id: "gemini-flash-lite-latest", name: "Gemini Flash-Lite Latest", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "gemini-3-pro-preview": { id: "gemini-3-pro-preview", name: "Gemini 3 Pro Preview", description: "Preview Gemini flagship for complex reasoning, coding, and rich multimodal prompts", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, status: "deprecated", cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "gemini-2.5-flash-lite": { id: "gemini-2.5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 512, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01, input_audio: 0.3 } }, "gemini-2.5-pro-preview-tts": { id: "gemini-2.5-pro-preview-tts", name: "Gemini 2.5 Pro Preview TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gemini-flash", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-05-01", last_updated: "2025-05-01", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 8192, output: 16384 }, cost: { input: 1, output: 20 } }, "gemini-2.0-flash-lite": { id: "gemini-2.0-flash-lite", name: "Gemini 2.0 Flash-Lite", description: "Legacy model retained for compatibility with older integrations", family: "gemini-flash-lite", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 8192 }, status: "deprecated", cost: { input: 0.075, output: 0.3 } }, "gemini-3.1-flash-live-preview": { id: "gemini-3.1-flash-live-preview", name: "Gemini 3.1 Flash Live Preview", description: "High-quality, low-latency Live API model for real-time dialogue and voice-first AI applications", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-03-26", last_updated: "2026-03-26", modalities: { input: ["text", "image", "video", "audio"], output: ["text", "audio"] }, open_weights: false, limit: { context: 131072, output: 65536 }, cost: { input: 0.75, output: 4.5, input_audio: 3, output_audio: 12 } } } }, thinkingmachines: { id: "thinkingmachines", env: ["TINKER_API_KEY"], npm: "@ai-sdk/anthropic", api: "https://tinker.thinkingmachines.dev/services/tinker-prod/anthropic/api/v1", name: "Thinking Machines", doc: "https://tinker-docs.thinkingmachines.ai/tinker/compatible-apis/anthropic/", models: { "thinkingmachines/Inkling:peft:262144": { id: "thinkingmachines/Inkling:peft:262144", name: "Inkling (256K)", description: "Multimodal MoE reasoning model (975B total, 41B active) for text, image, and audio", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 3.74, output: 9.36, cache_read: 0.748 } }, "thinkingmachines/Inkling": { id: "thinkingmachines/Inkling", name: "Inkling", description: "Multimodal MoE reasoning model (975B total, 41B active) for text, image, and audio", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 1.87, output: 4.68, cache_read: 0.374 } } } }, lilac: { id: "lilac", env: ["LILAC_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.getlilac.com/v1", name: "Lilac", doc: "https://docs.getlilac.com/inference/models", models: { "google/gemma-4-31b-it": { id: "google/gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262100, output: 262100 }, cost: { input: 0.11, output: 0.35 } }, "zai-org/glm-5.2": { id: "zai-org/glm-5.2", name: "GLM 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 524288 }, cost: { input: 0.9, output: 3, cache_read: 0.27 } }, "moonshotai/kimi-k2.6": { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.7, output: 3.5, cache_read: 0.2 } }, "minimaxai/minimax-m3": { id: "minimaxai/minimax-m3", name: "MiniMax M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax-m3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 0.28, output: 1.1, cache_read: 0.05 } } } }, "stepfun-ai-step-plan": { id: "stepfun-ai-step-plan", env: ["STEPFUN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.stepfun.ai/step_plan/v1", name: "StepFun Step Plan (Global)", doc: "https://platform.stepfun.ai/docs/en/step-plan/integrations/reasoning-api", models: { "step-3.5-flash": { id: "step-3.5-flash", name: "Step 3.5 Flash", description: "StepFun flash lane for quick multimodal reasoning and coding assistance", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-01-29", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 } }, "step-3.7-flash": { id: "step-3.7-flash", name: "Step 3.7 Flash", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 } }, "step-3.5-flash-2603": { id: "step-3.5-flash-2603", name: "Step 3.5 Flash 2603", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 } } } }, "zhipuai-coding-plan": { id: "zhipuai-coding-plan", env: ["ZHIPU_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://open.bigmodel.cn/api/coding/paas/v4", name: "Zhipu AI Coding Plan", doc: "https://docs.bigmodel.cn/cn/coding-plan/overview", models: { "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-27", last_updated: "2026-03-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5v-turbo": { id: "glm-5v-turbo", name: "GLM-5V-Turbo", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5-turbo": { id: "glm-5-turbo", name: "GLM-5-Turbo", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-4.7": { id: "glm-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5.2-highspeed": { id: "glm-5.2-highspeed", name: "GLM-5.2 Highspeed", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-4.6v": { id: "glm-4.6v", name: "GLM-4.6V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.3, output: 0.9 } } } }, "nano-gpt": { id: "nano-gpt", env: ["NANO_GPT_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://nano-gpt.com/api/v1", name: "NanoGPT", doc: "https://docs.nano-gpt.com", models: { "ernie-5.0-thinking-preview": { id: "ernie-5.0-thinking-preview", name: "Ernie 5.0 Thinking Preview", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "ernie", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 1, output: 3.5, cache_read: 0.5 } }, "Baichuan4-Turbo": { id: "Baichuan4-Turbo", name: "Baichuan 4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "baichuan", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-08-19", last_updated: "2025-08-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 32768 }, cost: { input: 2.42, output: 2.42, cache_read: 1.21 } }, "qwen3.7-flash": { id: "qwen3.7-flash", name: "Qwen3.7 Flash", description: "Lightweight multimodal Qwen model for high-throughput text, image, and video tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 991808, input: 991808, output: 65536 }, cost: { input: 0.03, output: 0.13, cache_read: 0.006, cache_write: 0.038 } }, "Gemma-4-31B-DarkIdol": { id: "Gemma-4-31B-DarkIdol", name: "Gemma 4 31B DarkIdol", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: false, release_date: "2026-05-01", last_updated: "2026-05-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "qwen3.7-plus": { id: "qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 991808, input: 991808, output: 65536 }, cost: { input: 0.4, output: 1.6, cache_read: 0.08, cache_write: 0.5 } }, "step-2-16k-exp": { id: "step-2-16k-exp", name: "Step-2 16k Exp", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "step", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-10-15", last_updated: "2024-07-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16000, input: 16000, output: 8192 }, cost: { input: 7.004, output: 19.992, cache_read: 3.502 } }, "Qwen3.5-27B-Omega-Evolution-v2.2-Derestricted-Lite": { id: "Qwen3.5-27B-Omega-Evolution-v2.2-Derestricted-Lite", name: "Qwen3.5 27B Omega Evolution v2.2 Derestricted Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-05-02", last_updated: "2026-05-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "Qwen3.5-27B-earica-Derestricted": { id: "Qwen3.5-27B-earica-Derestricted", name: "Qwen3.5 27B earica Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "gemini-2.5-flash-lite-preview-06-17": { id: "gemini-2.5-flash-lite-preview-06-17", name: "Gemini 2.5 Flash Lite Preview", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015 } }, "deepseek-r1-sambanova": { id: "deepseek-r1-sambanova", name: "DeepSeek R1 Fast", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "deepseek", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-02-20", last_updated: "2025-02-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 4096 }, cost: { input: 4.998, output: 6.987, cache_read: 2.499 } }, "Gemma-4-31B-GarnetV2": { id: "Gemma-4-31B-GarnetV2", name: "Gemma 4 31B Garnet V2", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: false, release_date: "2026-05-01", last_updated: "2026-05-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "claude-sonnet-4-thinking:8192": { id: "claude-sonnet-4-thinking:8192", name: "Claude 4 Sonnet Thinking (8K)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "qwen3.8-max-preview": { id: "qwen3.8-max-preview", name: "Qwen3.8 Max Preview", description: "Preview Qwen flagship for million-token multimodal reasoning and long-horizon agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-19", last_updated: "2026-07-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 991000, input: 991000, output: 64000 }, cost: { input: 1.5, output: 5, cache_read: 0.15, cache_write: 2 } }, "holo3-35b-a3b:thinking": { id: "holo3-35b-a3b:thinking", name: "Holo3-35B-A3B Thinking", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, input: 65536, output: 65536 }, cost: { input: 0.25, output: 1.8, cache_read: 0.125 } }, "jamba-large-1.7": { id: "jamba-large-1.7", name: "Jamba Large 1.7", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "jamba", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 4096 }, cost: { input: 1.989, output: 7.99, cache_read: 0.9945 } }, "qwen3.5-omni-flash": { id: "qwen3.5-omni-flash", name: "Qwen3.5 Omni Flash", description: "Omni-modal model for text, vision, audio, and multimodal agent tasks", family: "qwen3.5", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-03-30", last_updated: "2026-03-30", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 49152, input: 49152, output: 16384 }, cost: { input: 0, output: 0 } }, "Qwen3.5-27B-Marvin-DPO-V2-Derestricted": { id: "Qwen3.5-27B-Marvin-DPO-V2-Derestricted", name: "Qwen3.5 27B Marvin DPO V2 Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "Qwen3.5-27B-BlueStar-v3-Derestricted-Lite": { id: "Qwen3.5-27B-BlueStar-v3-Derestricted-Lite", name: "Qwen3.5 27B BlueStar v3 Derestricted Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "gemini-exp-1206": { id: "gemini-exp-1206", name: "Gemini 2.0 Pro 1206", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 2097152, input: 2097152, output: 8192 }, cost: { input: 1.258, output: 4.998, cache_read: 0.629 } }, "Qwen3.5-27B-Marvin-V2-Derestricted": { id: "Qwen3.5-27B-Marvin-V2-Derestricted", name: "Qwen3.5 27B Marvin V2 Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "claude-sonnet-4-thinking:1024": { id: "claude-sonnet-4-thinking:1024", name: "Claude 4 Sonnet Thinking (1K)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "pokee-isaac": { id: "pokee-isaac", name: "Pokee-Isaac 28B", description: "Pokee-Isaac is a 28B agentic model with a roughly 10-million-token context window, function calling, and OpenAI-compatible structured output. Pokee bills in $0.01 increments, rounding each non-zero request up to the next cent.", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-08-04", last_updated: "2026-08-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e7, input: 1e7, output: 60000 }, cost: { input: 0.15, output: 1, cache_read: 0.075 } }, "hunyuan-turbos-20250226": { id: "hunyuan-turbos-20250226", name: "Hunyuan Turbo S", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "hunyuan", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-02-27", last_updated: "2025-02-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 24000, input: 24000, output: 8192 }, cost: { input: 0.187, output: 0.374, cache_read: 0.0935 } }, "qwen3.7-max:thinking": { id: "qwen3.7-max:thinking", name: "Qwen3.7 Max Thinking", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5, cache_write: 3.125 } }, "Qwen3.5-27B-RpRMax-v1": { id: "Qwen3.5-27B-RpRMax-v1", name: "Qwen3.5 27B RpRMax v1", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "claude-opus-4-1-thinking:1024": { id: "claude-opus-4-1-thinking:1024", name: "Claude 4.1 Opus Thinking (1K)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5 } }, "claw-high": { id: "claw-high", name: "Claw High", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-05-11", last_updated: "2026-05-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 2.5 } }, "qwen-max": { id: "qwen-max", name: "Qwen 2.5 Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-04", release_date: "2024-04-03", last_updated: "2025-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, input: 32000, output: 8192 }, cost: { input: 1.5997, output: 6.392, cache_read: 0.79985 } }, "holo3-35b-a3b": { id: "holo3-35b-a3b", name: "Holo3-35B-A3B", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, input: 65536, output: 65536 }, cost: { input: 0.25, output: 1.8, cache_read: 0.125 } }, "gemma-4-e4b-it": { id: "gemma-4-e4b-it", name: "Gemma 4 E4B Instruct", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 16384 }, cost: { input: 0.04, output: 0.2, cache_read: 0.02 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "universal-summarizer": { id: "universal-summarizer", name: "Universal Summarizer", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-23", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 32768 }, cost: { input: 30, output: 30 } }, "phi-4-mini-instruct": { id: "phi-4-mini-instruct", name: "Phi 4 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "phi", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-26", last_updated: "2025-07-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0.17, output: 0.68, cache_read: 0.085 } }, "mercury-coder-small": { id: "mercury-coder-small", name: "Mercury Coder Small", description: "Model by Inception AI. A diffusion large language model that runs incredibly quickly (500+ tokens/second) while matching Claude 3.5 Haiku and GPT-4o-mini. 1st in speed on Copilot arena, and matching 2nd in quality.", family: "mercury", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 16384 }, cost: { input: 0.25, output: 1, cache_read: 0.125 } }, "doubao-seed-1-6-250615": { id: "doubao-seed-1-6-250615", name: "Doubao Seed 1.6", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-06-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 16384 }, cost: { input: 0.204, output: 0.51, cache_read: 0.102 } }, "qwen3.5-122b-a10b:thinking": { id: "qwen3.5-122b-a10b:thinking", name: "Qwen3.5 122B A10B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 81920 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 32768 }, cost: { input: 0.437, output: 3.496, cache_read: 0.103788 } }, "Qwen3.5-27B-Writer-V2-Derestricted": { id: "Qwen3.5-27B-Writer-V2-Derestricted", name: "Qwen3.5 27B Writer V2 Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-06", last_updated: "2026-04-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "Qwen3.5-27B-earica-Derestricted-Lite": { id: "Qwen3.5-27B-earica-Derestricted-Lite", name: "Qwen3.5 27B earica Derestricted Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "command-a-plus-05-2026": { id: "command-a-plus-05-2026", name: "Cohere Command A+ (05/2026)", description: "Cohere's stronger command model for multilingual agents and enterprise workflows", family: "command-a", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: true, temperature: true, knowledge: "2025-04-01", release_date: "2026-05-20", last_updated: "2026-06-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 64000 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "Qwen3.5-27B-BlueStar-Derestricted-Lite": { id: "Qwen3.5-27B-BlueStar-Derestricted-Lite", name: "Qwen3.5 27B BlueStar Derestricted Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-06", last_updated: "2026-04-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "gemini-2.5-flash-preview-04-17": { id: "gemini-2.5-flash-preview-04-17", name: "Gemini 2.5 Flash Preview", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, release_date: "2025-04-17", last_updated: "2025-04-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015 } }, "claude-sonnet-4-thinking:32768": { id: "claude-sonnet-4-thinking:32768", name: "Claude 4 Sonnet Thinking (32K)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "qwen3-coder-30b-a3b-instruct": { id: "qwen3-coder-30b-a3b-instruct", name: "Qwen3 Coder 30B A3B Instruct", description: "Smaller Qwen coder for efficient local agents and repo-level fixes", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.05 } }, "gemini-2.5-flash-preview-05-20:thinking": { id: "gemini-2.5-flash-preview-05-20:thinking", name: "Gemini 2.5 Flash 0520 Thinking", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1048000, input: 1048000, output: 65536 }, cost: { input: 0.15, output: 3.5, cache_read: 0.015 } }, "Qwen3.5-27B-Writer-V2-Derestricted-Lite": { id: "Qwen3.5-27B-Writer-V2-Derestricted-Lite", name: "Qwen3.5 27B Writer V2 Derestricted Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-06", last_updated: "2026-04-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "jamba-large": { id: "jamba-large", name: "Jamba Large", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "jamba", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 4096 }, cost: { input: 1.989, output: 7.99, cache_read: 0.9945 } }, fastgpt: { id: "fastgpt", name: "Web Answer", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-23", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 32768 }, cost: { input: 7.5, output: 7.5 } }, "claude-opus-4-thinking": { id: "claude-opus-4-thinking", name: "Claude 4 Opus Thinking", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5 } }, "Qwen3.5-27B-Infracelestial": { id: "Qwen3.5-27B-Infracelestial", name: "Qwen3.5 27B Infracelestial", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "qwen3.5-27b": { id: "qwen3.5-27b", name: "Qwen3.5 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 260096, input: 260096, output: 65536 }, cost: { input: 0.27, output: 2.16, cache_read: 0.135 } }, "step-r1-v-mini": { id: "step-r1-v-mini", name: "Step R1 V Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "step", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-04-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 2.5, output: 11, cache_read: 1.25 } }, "Qwen3.5-27B-BlueStar-Derestricted": { id: "Qwen3.5-27B-BlueStar-Derestricted", name: "Qwen3.5 27B BlueStar Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-06", last_updated: "2026-04-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "Qwen3.5-27B-Omega-Evolution-v2.2-Derestricted": { id: "Qwen3.5-27B-Omega-Evolution-v2.2-Derestricted", name: "Qwen3.5 27B Omega Evolution v2.2 Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-05-02", last_updated: "2026-05-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "glm-4-air-0111": { id: "glm-4-air-0111", name: "GLM 4 Air 0111", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-01-11", last_updated: "2025-01-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 4096 }, cost: { input: 0.1394, output: 0.1394, cache_read: 0.0697 } }, "learnlm-1.5-pro-experimental": { id: "learnlm-1.5-pro-experimental", name: "Gemini LearnLM Experimental", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-05-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32767, input: 32767, output: 8192 }, cost: { input: 3.502, output: 10.506, cache_read: 1.751 } }, "qwen3.7-max": { id: "qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5, cache_write: 3.125 } }, "gemini-3-pro-image-preview": { id: "gemini-3-pro-image-preview", name: "Gemini 3 Pro Image", description: "Nano Banana Pro for higher-fidelity image generation and design-heavy edits", family: "gemini-pro", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2 } }, "doubao-1.5-pro-32k": { id: "doubao-1.5-pro-32k", name: "Doubao 1.5 Pro 32k", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-11-20", last_updated: "2025-01-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, input: 32000, output: 8192 }, cost: { input: 0.1343, output: 0.3349, cache_read: 0.06715 } }, "Gemma-4-31B-Cognitive-Unshackled": { id: "Gemma-4-31B-Cognitive-Unshackled", name: "Gemma 4 31B Cognitive Unshackled", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: false, release_date: "2026-05-01", last_updated: "2026-05-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "MiniMax-M2": { id: "MiniMax-M2", name: "MiniMax M2", description: "Efficient open MiniMax model built for coding agents and tool-heavy workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 131072 }, cost: { input: 0.17, output: 1.53, cache_read: 0.085 } }, "deepseek-reasoner-cheaper": { id: "deepseek-reasoner-cheaper", name: "Deepseek R1 Cheaper", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "deepseek", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 0.4, output: 1.7, cache_read: 0.2 } }, "Qwen3.5-27B-Musica-v1": { id: "Qwen3.5-27B-Musica-v1", name: "Qwen3.5 27B Musica v1", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-03-27", last_updated: "2026-03-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "hermes-high": { id: "hermes-high", name: "Hermes High", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "hermes", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-05-11", last_updated: "2026-05-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 2.5 } }, "azure-o1": { id: "azure-o1", name: "Azure o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-17", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 1e5 }, cost: { input: 15, output: 60, cache_read: 7.5 } }, "qvq-max": { id: "qvq-max", name: "Qwen: QvQ Max", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-03-28", last_updated: "2025-03-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 1.2, output: 4.8, cache_read: 0.6 } }, "kimi-k2-instruct-fast": { id: "kimi-k2-instruct-fast", name: "Kimi K2 0711 Fast", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "kimi-k2", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-15", last_updated: "2025-07-15", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 16384 }, cost: { input: 0.4, output: 1.8, cache_read: 0.2 } }, "deepseek-chat-cheaper": { id: "deepseek-chat-cheaper", name: "DeepSeek V3/Chat Cheaper", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "deepseek", attachment: true, reasoning: false, tool_call: true, structured_output: true, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 0.1, output: 0.425, cache_read: 0.05 } }, "sonar-deep-research": { id: "sonar-deep-research", name: "Perplexity Deep Research", description: "Research model for long-horizon investigation, synthesis, and analytical reports", family: "sonar-deep-research", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-02-25", last_updated: "2025-02-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 60000, input: 60000, output: 128000 }, cost: { input: 3.4, output: 13.6, cache_read: 1.7 } }, "qwen3.5-omni-plus": { id: "qwen3.5-omni-plus", name: "Qwen3.5 Omni Plus", description: "Omni-modal model for text, vision, audio, and multimodal agent tasks", family: "qwen3.5", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-03-30", last_updated: "2026-03-30", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 983616, input: 983616, output: 65536 }, cost: { input: 0, output: 0 } }, "doubao-seed-2-0-mini-260215": { id: "doubao-seed-2-0-mini-260215", name: "Doubao Seed 2.0 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 32000 }, cost: { input: 0.0493, output: 0.4845, cache_read: 0.02465 } }, "MiniMax-M1": { id: "MiniMax-M1", name: "MiniMax M1", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "minimax", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-01-08", last_updated: "2025-06-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, input: 1e6, output: 131072 }, cost: { input: 0.1394, output: 1.3328, cache_read: 0.0697 } }, "qwen3.5-flash:thinking": { id: "qwen3.5-flash:thinking", name: "Qwen3.5 Flash Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 991808, input: 991808, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.05 } }, "doubao-1.5-vision-pro-32k": { id: "doubao-1.5-vision-pro-32k", name: "Doubao 1.5 Vision Pro 32k", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-11-20", last_updated: "2025-01-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 32000, input: 32000, output: 8192 }, cost: { input: 0.459, output: 1.377, cache_read: 0.2295 } }, sonar: { id: "sonar", name: "Perplexity Simple", description: "Fast web-grounded Sonar for current answers, citations, and lightweight retrieval", family: "sonar", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 127000, input: 127000, output: 128000 }, cost: { input: 1, output: 1, cache_read: 0.5 } }, "glm-zero-preview": { id: "glm-zero-preview", name: "GLM Zero Preview", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-12-20", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8000, input: 8000, output: 4096 }, cost: { input: 1.802, output: 1.802, cache_read: 0.901 } }, "qwen3.5-35b-a3b": { id: "qwen3.5-35b-a3b", name: "Qwen3.5 35B A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 260096, input: 260096, output: 65536 }, cost: { input: 0.225, output: 1.8, cache_read: 0.1125 } }, "sonar-pro": { id: "sonar-pro", name: "Perplexity Pro", description: "Deeper Sonar search model with broader retrieval and stronger synthesis", family: "sonar-pro", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 128000 }, cost: { input: 3, output: 15, cache_read: 1.5 } }, "glm-4-long": { id: "glm-4-long", name: "GLM-4 Long", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 4096 }, cost: { input: 0.2006, output: 0.2006, cache_read: 0.1003 } }, "gemini-2.5-flash-nothinking": { id: "gemini-2.5-flash-nothinking", name: "Gemini 2.5 Flash (No Thinking)", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-06-05", last_updated: "2025-06-05", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "doubao-seed-2-0-pro-260215": { id: "doubao-seed-2-0-pro-260215", name: "Doubao Seed 2.0 Pro", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 128000 }, cost: { input: 0.782, output: 3.876, cache_read: 0.391 } }, "gemini-2.0-pro-exp-02-05": { id: "gemini-2.0-pro-exp-02-05", name: "Gemini 2.0 Pro 0205", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-02-05", last_updated: "2025-02-05", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 2097152, input: 2097152, output: 8192 }, cost: { input: 1.989, output: 7.956, cache_read: 0.49725 } }, "ernie-5.1": { id: "ernie-5.1", name: "ERNIE 5.1", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "ernie", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-05-10", last_updated: "2026-05-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 119000, input: 119000, output: 64000 }, cost: { input: 0.75, output: 3, cache_read: 0.75 } }, "claude-opus-4-5-20251101:thinking": { id: "claude-opus-4-5-20251101:thinking", name: "Claude 4.5 Opus Thinking", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-01", last_updated: "2025-11-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "gemma-4-e2b-it": { id: "gemma-4-e2b-it", name: "Gemma 4 E2B Instruct", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 16384 }, cost: { input: 0.02, output: 0.1, cache_read: 0.01 } }, "exa-answer": { id: "exa-answer", name: "Exa (Answer)", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-23", last_updated: "2025-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 4096, input: 4096, output: 4096 }, cost: { input: 2.5, output: 2.5 } }, "doubao-seed-2-0-lite-260215": { id: "doubao-seed-2-0-lite-260215", name: "Doubao Seed 2.0 Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 32000 }, cost: { input: 0.1462, output: 0.8738, cache_read: 0.0731 } }, "gemini-2.5-flash-lite-preview-09-2025-thinking": { id: "gemini-2.5-flash-lite-preview-09-2025-thinking", name: "Gemini 2.5 Flash Lite Preview (09/2025) \u2013 Thinking", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01 } }, "gemini-2.5-flash-preview-09-2025-thinking": { id: "gemini-2.5-flash-preview-09-2025-thinking", name: "Gemini 2.5 Flash Preview (09/2025) \u2013 Thinking", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "azure-gpt-4o": { id: "azure-gpt-4o", name: "Azure gpt-4o", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, release_date: "2024-01-01", last_updated: "2024-05-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "ernie-5.1:thinking": { id: "ernie-5.1:thinking", name: "ERNIE 5.1 Thinking", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "ernie", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2026-05-10", last_updated: "2026-05-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 119000, input: 119000, output: 64000 }, cost: { input: 0.75, output: 3, cache_read: 0.75 } }, "gemini-2.0-pro-reasoner": { id: "gemini-2.0-pro-reasoner", name: "Gemini 2.0 Pro Reasoner", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-02-05", modalities: { input: ["text", "audio"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 1.292, output: 4.998, cache_read: 0.323 } }, "qwen3.5-flash": { id: "qwen3.5-flash", name: "Qwen3.5 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 991808, input: 991808, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.05 } }, "Qwen3.5-27B-BlueStar-v2-Derestricted": { id: "Qwen3.5-27B-BlueStar-v2-Derestricted", name: "Qwen3.5 27B BlueStar v2 Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-06", last_updated: "2026-04-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "Qwen3.5-27B-Marvin-DPO-V2-Derestricted-Lite": { id: "Qwen3.5-27B-Marvin-DPO-V2-Derestricted-Lite", name: "Qwen3.5 27B Marvin DPO V2 Derestricted Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, deepclaude: { id: "deepclaude", name: "DeepClaude", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-03-10", last_updated: "2025-02-01", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "glm-4-plus-0111": { id: "glm-4-plus-0111", name: "GLM 4 Plus 0111", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-02-19", last_updated: "2025-02-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 4096 }, cost: { input: 9.996, output: 9.996, cache_read: 4.998 } }, "Qwen3.5-27B-NaNovel-Derestricted-Lite": { id: "Qwen3.5-27B-NaNovel-Derestricted-Lite", name: "Qwen3.5 27B NaNovel Derestricted Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "gemini-2.5-flash-preview-09-2025": { id: "gemini-2.5-flash-preview-09-2025", name: "Gemini 2.5 Flash Preview (09/2025)", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "GLM-4.6-Derestricted-v5": { id: "GLM-4.6-Derestricted-v5", name: "GLM 4.6 Derestricted v5", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 8192 }, cost: { input: 0.4, output: 1.5, cache_read: 0.2 } }, "claude-opus-4-thinking:1024": { id: "claude-opus-4-thinking:1024", name: "Claude 4 Opus Thinking (1K)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5 } }, "auto-model-standard": { id: "auto-model-standard", name: "Auto model (Standard)", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-04-16", last_updated: "2024-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 1e6 }, cost: { input: 9.996, output: 19.992, cache_read: 4.998 } }, "gemini-2.5-pro-exp-03-25": { id: "gemini-2.5-pro-exp-03-25", name: "Gemini 2.5 Pro Experimental 0325", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, release_date: "2025-03-25", last_updated: "2025-03-25", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 2.5, output: 10, cache_read: 0.25 } }, "qwen3.5-27b:thinking": { id: "qwen3.5-27b:thinking", name: "Qwen3.5 27B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 260096, input: 260096, output: 65536 }, cost: { input: 0.27, output: 2.16, cache_read: 0.135 } }, "glm-4-plus": { id: "glm-4-plus", name: "GLM-4 Plus", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-09-20", last_updated: "2024-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 4096 }, cost: { input: 7.497, output: 7.497, cache_read: 3.7485 } }, "auto-model-premium": { id: "auto-model-premium", name: "Auto model (Premium)", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-04-16", last_updated: "2024-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 1e6 }, cost: { input: 9.996, output: 19.992, cache_read: 4.998 } }, "brave-research": { id: "brave-research", name: "Brave (Research)", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-02-10", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 5, output: 5 } }, "longcat-2.0:thinking": { id: "longcat-2.0:thinking", name: "LongCat 2.0 Thinking", description: "Meituan LongCat-2.0, a reasoning model with tool calling and a 1M-token context window", family: "longcat", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 262144 }, cost: { input: 0.75, output: 3, cache_read: 0.015 } }, "qwen3.8-max": { id: "qwen3.8-max", name: "Qwen3.8 Max", description: "2.4-trillion-parameter MoE flagship for coding, professional work, multimodal understanding, and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 991000, input: 991000, output: 65536 }, cost: { input: 2, output: 6, cache_read: 0.25, cache_write: 2.5 } }, "Qwen3.5-27B-Writer-Derestricted": { id: "Qwen3.5-27B-Writer-Derestricted", name: "Qwen3.5 27B Writer Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-06", last_updated: "2026-04-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "azure-o3-mini": { id: "azure-o3-mini", name: "Azure o3-mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-01-31", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 65536 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "qwen3-vl-235b-a22b-instruct-original": { id: "qwen3-vl-235b-a22b-instruct-original", name: "Qwen3 VL 235B A22B Instruct Original", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 32768 }, cost: { input: 0.5, output: 1.2, cache_read: 0.25 } }, "claude-sonnet-4-5-20250929": { id: "claude-sonnet-4-5-20250929", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "Qwen3.5-27B-Omega-Evolution-v2.0-Derestricted": { id: "Qwen3.5-27B-Omega-Evolution-v2.0-Derestricted", name: "Qwen3.5 27B Omega Evolution v2.0 Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-06", last_updated: "2026-04-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "deepseek-v3-0324": { id: "deepseek-v3-0324", name: "DeepSeek Chat 0324", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2024-01-01", last_updated: "2025-03-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 0.2, output: 0.77, cache_read: 0.135 } }, "qwen3.8-max:thinking": { id: "qwen3.8-max:thinking", name: "Qwen3.8 Max Thinking", description: "2.4-trillion-parameter MoE flagship for coding, professional work, multimodal understanding, and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 991000, input: 991000, output: 131072 }, cost: { input: 2, output: 6, cache_read: 0.25, cache_write: 2.5 } }, "mirothinker-1-7-deepresearch-mini": { id: "mirothinker-1-7-deepresearch-mini", name: "MiroThinker 1.7 Deep Research Mini", description: "Research model for long-horizon investigation, synthesis, and analytical reports", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2026-05-11", last_updated: "2026-05-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 1.25, output: 10, cache_read: 0.625 } }, "Qwen3.5-27B-Vivid-Durian": { id: "Qwen3.5-27B-Vivid-Durian", name: "Qwen3.5 27B Vivid Durian", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "claude-opus-4-5-20251101": { id: "claude-opus-4-5-20251101", name: "Claude 4.5 Opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-01", last_updated: "2025-11-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "command-a-reasoning-08-2025": { id: "command-a-reasoning-08-2025", name: "Cohere Command A (08/2025)", description: "Cohere reasoning model for multilingual enterprise agents, tools, and complex workflows", family: "command-a", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-06-01", release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 8192 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "jamba-mini": { id: "jamba-mini", name: "Jamba Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "jamba", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 4096 }, cost: { input: 0.1989, output: 0.408, cache_read: 0.09945 } }, "asi1-mini": { id: "asi1-mini", name: "ASI1 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-03-25", last_updated: "2025-03-25", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 1, output: 1, cache_read: 0.5 } }, "perplexity-academic-researcher": { id: "perplexity-academic-researcher", name: "Perplexity Academic Researcher", description: "Sonar Reasoning Pro with Perplexity's academic search mode. Prioritizes scholarly and peer-reviewed sources from academic repositories and returns cited research synthesis.", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2026-07-10", last_updated: "2026-07-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 127000, input: 127000, output: 128000 }, cost: { input: 2, output: 8, cache_read: 1 } }, "glm-4-flash": { id: "glm-4-flash", name: "GLM-4 Flash", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 4096 }, cost: { input: 0.1003, output: 0.1003, cache_read: 0.05015 } }, "glm-4-air": { id: "glm-4-air", name: "GLM-4 Air", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-06-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 4096 }, cost: { input: 0.2006, output: 0.2006, cache_read: 0.1003 } }, "claude-opus-4-thinking:8192": { id: "claude-opus-4-thinking:8192", name: "Claude 4 Opus Thinking (8K)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5 } }, "Gemma-4-31B-Claude-4.6-Opus-Reasoning-Distilled": { id: "Gemma-4-31B-Claude-4.6-Opus-Reasoning-Distilled", name: "Gemma 4 31B Claude 4.6 Opus Reasoning Distilled", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "claude", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2026-05-01", last_updated: "2026-05-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.0306 } }, "celeris-1": { id: "celeris-1", name: "Celeris 1", description: "Celeris 1 is a diffusion language model built for ultra-low-latency classification, extraction, judging, query rewriting, and other short structured responses.", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-07-25", last_updated: "2026-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, input: 8192, output: 8192 }, cost: { input: 2, output: 6, cache_read: 1 } }, "Qwen3.5-27B-BlueStar-v2-Derestricted-Lite": { id: "Qwen3.5-27B-BlueStar-v2-Derestricted-Lite", name: "Qwen3.5 27B BlueStar v2 Derestricted Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-06", last_updated: "2026-04-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "mistral-code-agent-latest": { id: "mistral-code-agent-latest", name: "Mistral Code Agent Latest", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "mistral", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 32768 }, cost: { input: 0.4, output: 2, cache_read: 0.2 } }, "claude-opus-4-thinking:32768": { id: "claude-opus-4-thinking:32768", name: "Claude 4 Opus Thinking (32K)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5 } }, "Qwen3.5-27B-Queen-Derestricted": { id: "Qwen3.5-27B-Queen-Derestricted", name: "Qwen3.5 27B Queen Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "Baichuan4-Air": { id: "Baichuan4-Air", name: "Baichuan 4 Air", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "baichuan", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-08-19", last_updated: "2025-08-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 32768 }, cost: { input: 0.157, output: 0.157, cache_read: 0.0785 } }, "claude-sonnet-4-thinking:64000": { id: "claude-sonnet-4-thinking:64000", name: "Claude 4 Sonnet Thinking (64K)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "claw-low": { id: "claw-low", name: "Claw Low", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-05-11", last_updated: "2026-05-11", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, input: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, cache_write: 0.08333 } }, "qwen-long": { id: "qwen-long", name: "Qwen Long 10M", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-08-01", last_updated: "2025-01-25", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e7, input: 1e7, output: 8192 }, cost: { input: 0.1003, output: 0.408, cache_read: 0.05015 } }, "auto-model": { id: "auto-model", name: "Auto model", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-04-16", last_updated: "2024-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 1e6 }, cost: { input: 0, output: 0 } }, "Qwen3.5-27B-NaNovel-Derestricted": { id: "Qwen3.5-27B-NaNovel-Derestricted", name: "Qwen3.5 27B NaNovel Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "azure-gpt-4o-mini": { id: "azure-gpt-4o-mini", name: "Azure gpt-4o-mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, release_date: "2024-01-01", last_updated: "2024-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "claude-haiku-4-5-20251001-thinking": { id: "claude-haiku-4-5-20251001-thinking", name: "Claude Haiku 4.5 Thinking", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1 } }, "claude-sonnet-4-5-20250929-thinking": { id: "claude-sonnet-4-5-20250929-thinking", name: "Claude Sonnet 4.5 Thinking", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "qwen-plus": { id: "qwen-plus", name: "Qwen Plus", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, temperature: true, knowledge: "2024-04", release_date: "2024-01-25", last_updated: "2025-09-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 995904, input: 995904, output: 32768 }, cost: { input: 0.3995, output: 1.2002, cache_read: 0.19975 } }, "gemini-2.5-pro-preview-05-06": { id: "gemini-2.5-pro-preview-05-06", name: "Gemini 2.5 Pro Preview 0506", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, release_date: "2025-05-06", last_updated: "2025-05-06", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 2.5, output: 10, cache_read: 0.25 } }, "claude-opus-4-1-thinking:8192": { id: "claude-opus-4-1-thinking:8192", name: "Claude 4.1 Opus Thinking (8K)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5 } }, "Gemma-4-31B-Musica-v1": { id: "Gemma-4-31B-Musica-v1", name: "Gemma 4 31B Musica v1", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: false, release_date: "2026-05-01", last_updated: "2026-05-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "Qwen3.5-27B-Derestricted": { id: "Qwen3.5-27B-Derestricted", name: "Qwen3.5 27B Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "venice-uncensored": { id: "venice-uncensored", name: "Venice Uncensored", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "venice", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-10-01", last_updated: "2025-02-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0.4, output: 0.4, cache_read: 0.2 } }, "jamba-mini-1.7": { id: "jamba-mini-1.7", name: "Jamba Mini 1.7", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "jamba", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 4096 }, cost: { input: 0.1989, output: 0.408, cache_read: 0.09945 } }, "claude-sonnet-4-thinking": { id: "claude-sonnet-4-thinking", name: "Claude 4 Sonnet Thinking", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "step-3": { id: "step-3", name: "Step-3", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "step", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-31", last_updated: "2025-07-31", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, input: 65536, output: 8192 }, cost: { input: 0.2499, output: 0.6494, cache_read: 0.12495 } }, "qwen-3.6-plus": { id: "qwen-3.6-plus", name: "Qwen 3.6 Plus", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.6", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 991808, input: 991808, output: 65536 }, cost: { input: 0.325, output: 1.95, cache_read: 0.0325, cache_write: 0.40625 } }, "qwen3-max-2026-01-23": { id: "qwen3-max-2026-01-23", name: "Qwen3 Max 2026-01-23", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-01-26", last_updated: "2026-01-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 32768 }, cost: { input: 1.2002, output: 6.001, cache_read: 0.6001 } }, "hermes-low": { id: "hermes-low", name: "Hermes Low", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "hermes", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-05-11", last_updated: "2026-05-11", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, input: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, cache_write: 0.08333 } }, "deepseek-r1": { id: "deepseek-r1", name: "DeepSeek R1", description: "Classic open reasoning model for transparent math, coding, and deliberate problem solving", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 0.4, output: 1.7, cache_read: 0.2 } }, "gemini-2.5-pro-preview-06-05": { id: "gemini-2.5-pro-preview-06-05", name: "Gemini 2.5 Pro Preview 0605", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, release_date: "2025-06-05", last_updated: "2025-06-05", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 2.5, output: 10, cache_read: 0.25 } }, "Qwen3.5-27B-Writer-Derestricted-Lite": { id: "Qwen3.5-27B-Writer-Derestricted-Lite", name: "Qwen3.5 27B Writer Derestricted Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-06", last_updated: "2026-04-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "claude-haiku-4-5-20251001": { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1 } }, "glm-4": { id: "glm-4", name: "GLM-4", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-01-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 4096 }, cost: { input: 14.994, output: 14.994, cache_read: 7.497 } }, "deepseek-chat": { id: "deepseek-chat", name: "DeepSeek V3/Deepseek Chat", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-09", release_date: "2025-12-01", last_updated: "2026-02-28", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 0.1, output: 0.425, cache_read: 0.05 } }, "gemini-2.5-flash-preview-05-20": { id: "gemini-2.5-flash-preview-05-20", name: "Gemini 2.5 Flash 0520", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1048000, input: 1048000, output: 65536 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015 } }, "qwen-turbo": { id: "qwen-turbo", name: "Qwen Turbo", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-04", release_date: "2024-11-01", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 8192 }, cost: { input: 0.04998, output: 0.2006, cache_read: 0.02499 } }, "doubao-seed-1-8-251215": { id: "doubao-seed-1-8-251215", name: "Doubao Seed 1.8", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 0.612, output: 6.12, cache_read: 0.306 } }, "gemini-2.5-flash-lite-preview-09-2025": { id: "gemini-2.5-flash-lite-preview-09-2025", name: "Gemini 2.5 Flash Lite Preview (09/2025)", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01 } }, "glm-4.1v-thinking-flashx": { id: "glm-4.1v-thinking-flashx", name: "GLM 4.1V Thinking FlashX", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 64000, input: 64000, output: 8192 }, cost: { input: 0.3, output: 0.3, cache_read: 0.15 } }, "glm-z1-air": { id: "glm-z1-air", name: "GLM Z1 Air", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, input: 32000, output: 16384 }, cost: { input: 0.07, output: 0.07, cache_read: 0.035 } }, "Qwen3.5-27B-Omega-Evolution-v2.0-Derestricted-Lite": { id: "Qwen3.5-27B-Omega-Evolution-v2.0-Derestricted-Lite", name: "Qwen3.5 27B Omega Evolution v2.0 Derestricted Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-06", last_updated: "2026-04-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "Gemma-4-31B-Gemopus": { id: "Gemma-4-31B-Gemopus", name: "Gemma 4 31B Gemopus", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: false, release_date: "2026-05-01", last_updated: "2026-05-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "Baichuan-M2": { id: "Baichuan-M2", name: "Baichuan M2 32B Medical", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "baichuan", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-08-19", last_updated: "2025-08-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 32768 }, cost: { input: 15.73, output: 15.73, cache_read: 7.865 } }, "mirothinker-1-7-deepresearch": { id: "mirothinker-1-7-deepresearch", name: "MiroThinker 1.7 Deep Research", description: "Research model for long-horizon investigation, synthesis, and analytical reports", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2026-05-11", last_updated: "2026-05-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 4, output: 25, cache_read: 2 } }, "claude-opus-4-thinking:32000": { id: "claude-opus-4-thinking:32000", name: "Claude 4 Opus Thinking (32K)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5 } }, "claude-opus-4-1-thinking:32768": { id: "claude-opus-4-1-thinking:32768", name: "Claude 4.1 Opus Thinking (32K)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5 } }, "hermes-medium": { id: "hermes-medium", name: "Hermes Medium", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "hermes", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-05-11", last_updated: "2026-05-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, input: 204800, output: 131072 }, cost: { input: 0.315, output: 1.26, cache_read: 0.1575 } }, "qwen3-30b-a3b-instruct-2507": { id: "qwen3-30b-a3b-instruct-2507", name: "Qwen3 30B A3B Instruct 2507", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-02-20", last_updated: "2025-02-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 32768 }, cost: { input: 0.2, output: 0.5, cache_read: 0.1 } }, "doubao-seed-1-6-flash-250615": { id: "doubao-seed-1-6-flash-250615", name: "Doubao Seed 1.6 Flash", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-06-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 16384 }, cost: { input: 0.0374, output: 0.374, cache_read: 0.0187 } }, "mistral-small-31-24b-instruct": { id: "mistral-small-31-24b-instruct", name: "Mistral Small 31 24b Instruct", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "mistral-small", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 131072 }, cost: { input: 0.1, output: 0.3, cache_read: 0.05 } }, brave: { id: "brave", name: "Brave (Answers)", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-02-13", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, input: 8192, output: 8192 }, cost: { input: 5, output: 5 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, cache_write: 0.375 } }, "auto-model-basic": { id: "auto-model-basic", name: "Auto model (Basic)", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-04-16", last_updated: "2024-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 1e6 }, cost: { input: 9.996, output: 19.992, cache_read: 4.998 } }, "Qwen3.5-27B-Anko": { id: "Qwen3.5-27B-Anko", name: "Qwen3.5 27B Anko", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "jamba-large-1.6": { id: "jamba-large-1.6", name: "Jamba Large 1.6", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "jamba", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-03-12", last_updated: "2025-03-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 4096 }, cost: { input: 1.989, output: 7.99, cache_read: 0.9945 } }, "gemma-4-12b-it": { id: "gemma-4-12b-it", name: "Gemma 4 12B Instruct", description: "Google's Gemma 4 12B Instruct is an open-weight multimodal model for text, image, audio, and video understanding, with tool calling and structured output support.", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-08-01", last_updated: "2026-08-01", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 32768 }, cost: { input: 0.06, output: 0.3, cache_read: 0.03 } }, "gemini-2.5-flash-lite": { id: "gemini-2.5-flash-lite", name: "Gemini 2.5 Flash Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01 } }, "claude-sonnet-4-20250514": { id: "claude-sonnet-4-20250514", name: "Claude 4 Sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "phi-4-multimodal-instruct": { id: "phi-4-multimodal-instruct", name: "Phi 4 Multimodal", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "phi", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-26", last_updated: "2025-07-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0.07, output: 0.11, cache_read: 0.035 } }, "claude-opus-4-1-thinking:32000": { id: "claude-opus-4-1-thinking:32000", name: "Claude 4.1 Opus Thinking (32K)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5 } }, "glm-4.1v-thinking-flash": { id: "glm-4.1v-thinking-flash", name: "GLM 4.1V Thinking Flash", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 64000, input: 64000, output: 8192 }, cost: { input: 0.3, output: 0.3, cache_read: 0.15 } }, "claude-opus-4-1-thinking": { id: "claude-opus-4-1-thinking", name: "Claude 4.1 Opus Thinking", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5 } }, "jamba-mini-1.6": { id: "jamba-mini-1.6", name: "Jamba Mini 1.6", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "jamba", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-03-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 4096 }, cost: { input: 0.1989, output: 0.408, cache_read: 0.09945 } }, "Qwen3.5-27B-Queen-Derestricted-Lite": { id: "Qwen3.5-27B-Queen-Derestricted-Lite", name: "Qwen3.5 27B Queen Derestricted Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "qwen3.7-plus:thinking": { id: "qwen3.7-plus:thinking", name: "Qwen3.7 Plus Thinking", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 983616, input: 983616, output: 65536 }, cost: { input: 0.4, output: 1.6, cache_read: 0.08, cache_write: 0.5 } }, "glm-4-airx": { id: "glm-4-airx", name: "GLM-4 AirX", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-06-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8000, input: 8000, output: 4096 }, cost: { input: 2.006, output: 2.006, cache_read: 1.003 } }, "yi-lightning": { id: "yi-lightning", name: "Yi Lightning", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "yi", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-06-15", last_updated: "2024-10-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 12000, input: 12000, output: 4096 }, cost: { input: 0.2006, output: 0.2006, cache_read: 0.1003 } }, "qwen3-vl-235b-a22b-thinking": { id: "qwen3-vl-235b-a22b-thinking", name: "Qwen3 VL 235B A22B Thinking", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32768, input: 32768, output: 32768 }, cost: { input: 0.5, output: 6, cache_read: 0.25 } }, "Gemma-4-31B-Queen": { id: "Gemma-4-31B-Queen", name: "Gemma 4 31B Queen", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: false, release_date: "2026-05-01", last_updated: "2026-05-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "qwen3.5-35b-a3b:thinking": { id: "qwen3.5-35b-a3b:thinking", name: "Qwen3.5 35B A3B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 260096, input: 260096, output: 65536 }, cost: { input: 0.225, output: 1.8, cache_read: 0.1125 } }, "qwen3.6-max-preview": { id: "qwen3.6-max-preview", name: "Qwen3.6 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 245760, input: 245760, output: 65536 }, cost: { input: 1.04, output: 6.24, cache_read: 0.52 } }, "yi-large": { id: "yi-large", name: "Yi Large", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "yi", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-05-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, input: 32000, output: 4096 }, cost: { input: 3.196, output: 3.196, cache_read: 1.598 } }, "sarvam-30b": { id: "sarvam-30b", name: "Sarvam 30B", description: "Efficient Indian-language reasoning model for chat, coding, and multilingual work", family: "sarvam", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-18", last_updated: "2026-02-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, input: 65536, output: 4096 }, cost: { input: 0.028, output: 0.111, cache_read: 0.017 } }, "Qwen3.5-27B-Marvin-V2-Derestricted-Lite": { id: "Qwen3.5-27B-Marvin-V2-Derestricted-Lite", name: "Qwen3.5 27B Marvin V2 Derestricted Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "mistral-code-latest": { id: "mistral-code-latest", name: "Mistral Code Latest", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "mistral", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 32768 }, cost: { input: 0.3, output: 0.9, cache_read: 0.15 } }, "nano-gpt-help": { id: "nano-gpt-help", name: "NanoGPT Help", description: "Text-only NanoGPT support assistant. Questions are processed by the Help inference provider; do not paste secrets or account credentials. Covers the website, models, API, pricing, memory, media generation, and support.", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-06-06", last_updated: "2026-06-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 6000, input: 6000, output: 512 }, cost: { input: 0, output: 0 } }, "mercury-2": { id: "mercury-2", name: "Mercury 2", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "mercury", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 50000 }, cost: { input: 0.25, output: 0.75, cache_read: 0.025 } }, "gemini-2.5-pro-preview-03-25": { id: "gemini-2.5-pro-preview-03-25", name: "Gemini 2.5 Pro Preview 0325", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, release_date: "2025-03-25", last_updated: "2025-03-25", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 2.5, output: 10, cache_read: 0.25 } }, "claude-opus-4-20250514": { id: "claude-opus-4-20250514", name: "Claude 4 Opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5 } }, "brave-pro": { id: "brave-pro", name: "Brave (Pro)", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-02-10", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, input: 8192, output: 8192 }, cost: { input: 5, output: 5 } }, "deepseek-reasoner": { id: "deepseek-reasoner", name: "DeepSeek Reasoner", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-09", release_date: "2025-12-01", last_updated: "2026-02-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 64000, input: 64000, output: 65536 }, cost: { input: 0.4, output: 1.7, cache_read: 0.2 } }, "longcat-2.0": { id: "longcat-2.0", name: "LongCat 2.0", description: "Meituan LongCat-2.0, a reasoning model with tool calling and a 1M-token context window", family: "longcat", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 262144 }, cost: { input: 0.75, output: 3, cache_read: 0.015 } }, "claw-medium": { id: "claw-medium", name: "Claw Medium", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-05-11", last_updated: "2026-05-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, input: 204800, output: 131072 }, cost: { input: 0.315, output: 1.26, cache_read: 0.1575 } }, "step-2-mini": { id: "step-2-mini", name: "Step-2 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "step", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-10-15", last_updated: "2024-07-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8000, input: 8000, output: 4096 }, cost: { input: 0.2006, output: 0.408, cache_read: 0.1003 } }, "yi-medium-200k": { id: "yi-medium-200k", name: "Yi Medium 200k", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "yi", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-03-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 4096 }, cost: { input: 2.499, output: 2.499, cache_read: 1.2495 } }, "Qwen3.5-27B-BlueStar-v3-Derestricted": { id: "Qwen3.5-27B-BlueStar-v3-Derestricted", name: "Qwen3.5 27B BlueStar v3 Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "qwen25-vl-72b-instruct": { id: "qwen25-vl-72b-instruct", name: "Qwen25 VL 72b", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-05-10", last_updated: "2025-05-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32000, input: 32000, output: 32768 }, cost: { input: 0.69989, output: 0.69989, cache_read: 0.349945 } }, "Meta-Llama-3-1-8B-Instruct-FP8": { id: "Meta-Llama-3-1-8B-Instruct-FP8", name: "Llama 3.1 8B (decentralized)", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0.02, output: 0.03, cache_read: 0.01 } }, "claude-opus-4-1-20250805": { id: "claude-opus-4-1-20250805", name: "Claude 4.1 Opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5 } }, "qwen3.5-122b-a10b": { id: "qwen3.5-122b-a10b", name: "Qwen3.5 122B A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 32768 }, cost: { input: 0.437, output: 3.496, cache_read: 0.103788 } }, "doubao-seed-2-0-code-preview-260215": { id: "doubao-seed-2-0-code-preview-260215", name: "Doubao Seed 2.0 Code Preview", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 128000 }, cost: { input: 0.782, output: 3.893, cache_read: 0.391 } }, "doubao-1.5-pro-256k": { id: "doubao-1.5-pro-256k", name: "Doubao 1.5 Pro 256k", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-03-12", last_updated: "2025-03-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 16384 }, cost: { input: 0.799, output: 1.445, cache_read: 0.3995 } }, "azure-gpt-4-turbo": { id: "azure-gpt-4-turbo", name: "Azure gpt-4-turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 4096 }, cost: { input: 10, output: 30 } }, "gemini-2.5-flash-preview-04-17:thinking": { id: "gemini-2.5-flash-preview-04-17:thinking", name: "Gemini 2.5 Flash Preview Thinking", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, release_date: "2025-04-17", last_updated: "2025-04-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 0.15, output: 3.5, cache_read: 0.015 } }, "qwen3.7-flash:thinking": { id: "qwen3.7-flash:thinking", name: "Qwen3.7 Flash Thinking", description: "Lightweight multimodal Qwen model for high-throughput text, image, and video tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 983616, input: 983616, output: 65536 }, cost: { input: 0.03, output: 0.13, cache_read: 0.006, cache_write: 0.038 } }, "ernie-x1.1-preview": { id: "ernie-x1.1-preview", name: "ERNIE X1.1", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "ernie", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-10", last_updated: "2025-09-10", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 64000, input: 64000, output: 8192 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "sonar-reasoning-pro": { id: "sonar-reasoning-pro", name: "Perplexity Reasoning Pro", description: "Web-grounded Sonar for multi-step research questions that need cited reasoning", family: "sonar-reasoning", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 127000, input: 127000, output: 128000 }, cost: { input: 2, output: 8, cache_read: 1 } }, "sarvam-105b": { id: "sarvam-105b", name: "Sarvam 105B", description: "Flagship Indian-language reasoning model for enterprise multilingual applications", family: "sarvam", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-01", last_updated: "2025-09-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 4096 }, cost: { input: 0.045, output: 0.177, cache_read: 0.028 } }, "glm-z1-airx": { id: "glm-z1-airx", name: "GLM Z1 AirX", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, input: 32000, output: 16384 }, cost: { input: 0.7, output: 0.7, cache_read: 0.35 } }, "TEE/gemma4-31b": { id: "TEE/gemma4-31b", name: "Gemma 4 31B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: false, structured_output: true, release_date: "2026-04-04", last_updated: "2026-04-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 131072 }, cost: { input: 0.45, output: 1, cache_read: 0.45 } }, "TEE/deepseek-v3.1": { id: "TEE/deepseek-v3.1", name: "DeepSeek V3.1 TEE", description: "Hybrid-reasoning DeepSeek model with thinking and non-thinking modes", family: "deepseek", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 164000, input: 164000, output: 8192 }, cost: { input: 1, output: 2.5, cache_read: 0.5 } }, "TEE/qwen3.6-35b-a3b": { id: "TEE/qwen3.6-35b-a3b", name: "Qwen3.6 35B A3B TEE", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 262144 }, cost: { input: 0.2, output: 1.27, cache_read: 0.1 } }, "TEE/glm-5.1": { id: "TEE/glm-5.1", name: "GLM 5.1 TEE", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, input: 202752, output: 65535 }, cost: { input: 1.5, output: 5.25, cache_read: 0.3 } }, "TEE/kimi-k2.5-thinking": { id: "TEE/kimi-k2.5-thinking", name: "Kimi K2.5 Thinking TEE", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 65535 }, cost: { input: 0.6, output: 3, cache_read: 0.3 } }, "TEE/deepseek-v4-flash": { id: "TEE/deepseek-v4-flash", name: "DeepSeek V4 Flash TEE", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 1048576 }, cost: { input: 0.2, output: 0.4, cache_read: 0.04 } }, "TEE/kimi-k2.5": { id: "TEE/kimi-k2.5", name: "Kimi K2.5 TEE", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 65535 }, cost: { input: 0.6, output: 3, cache_read: 0.3 } }, "TEE/gpt-oss-20b": { id: "TEE/gpt-oss-20b", name: "GPT-OSS 20B TEE", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 8192 }, cost: { input: 0.2, output: 0.8, cache_read: 0.1 } }, "TEE/qwen3.5-27b": { id: "TEE/qwen3.5-27b", name: "Qwen3.5 27B TEE", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 65536 }, cost: { input: 0.3, output: 2.4, cache_read: 0.15 } }, "TEE/glm-5.2": { id: "TEE/glm-5.2", name: "GLM 5.2 TEE", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 131072 }, cost: { input: 1.4, output: 4.6, cache_read: 0.5 } }, "TEE/kimi-k2.6": { id: "TEE/kimi-k2.6", name: "Kimi K2.6 TEE", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 65536 }, cost: { input: 1.5, output: 5.25, cache_read: 0.375 } }, "TEE/qwen3.6-27b": { id: "TEE/qwen3.6-27b", name: "Qwen3.6 27B TEE", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 65536 }, cost: { input: 0.32, output: 2.7, cache_read: 0.16 } }, "TEE/gemma-3-27b-it": { id: "TEE/gemma-3-27b-it", name: "Gemma 3 27B TEE", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-03-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 8192 }, cost: { input: 0.2, output: 0.8, cache_read: 0.1 } }, "TEE/llama3-3-70b": { id: "TEE/llama3-3-70b", name: "Llama 3.3 70B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-03", last_updated: "2025-07-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 2, output: 2, cache_read: 2 } }, "TEE/gemma-4-26b-a4b-uncensored": { id: "TEE/gemma-4-26b-a4b-uncensored", name: "Gemma 4 26B A4B Uncensored TEE", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-05-23", last_updated: "2026-05-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, input: 65536, output: 65536 }, cost: { input: 0.15, output: 0.7, cache_read: 0.075 } }, "TEE/deepseek-v3.2": { id: "TEE/deepseek-v3.2", name: "DeepSeek V3.2 TEE", description: "Hybrid-reasoning DeepSeek model with thinking and non-thinking modes, sparse attention, and tool-use", family: "deepseek", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 164000, input: 164000, output: 65536 }, cost: { input: 0.5, output: 1, cache_read: 0.25 } }, "TEE/glm-4.7": { id: "TEE/glm-4.7", name: "GLM 4.7 TEE", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, input: 131000, output: 65535 }, cost: { input: 0.85, output: 3.3, cache_read: 0.425 } }, "TEE/gpt-oss-120b": { id: "TEE/gpt-oss-120b", name: "GPT-OSS 120B TEE", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 16384 }, cost: { input: 2, output: 2, cache_read: 2 } }, "TEE/minimax-m2.5": { id: "TEE/minimax-m2.5", name: "MiniMax M2.5 TEE", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, input: 196608, output: 131072 }, cost: { input: 0.2, output: 1.38, cache_read: 0.1 } }, "TEE/gemma-4-31b-it": { id: "TEE/gemma-4-31b-it", name: "Gemma 4 31B IT TEE", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 262144 }, cost: { input: 0.15, output: 0.46, cache_read: 0.075 } }, "TEE/gemma4-31b:thinking": { id: "TEE/gemma4-31b:thinking", name: "Gemma 4 31B Thinking TEE", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, release_date: "2026-05-02", last_updated: "2026-05-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 131072 }, cost: { input: 0.45, output: 1, cache_read: 0.45 } }, "TEE/kimi-k3": { id: "TEE/kimi-k3", name: "Kimi K3 TEE", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 65535 }, cost: { input: 3, output: 15, cache_read: 1.5 } }, "TEE/qwen3.5-397b-a17b": { id: "TEE/qwen3.5-397b-a17b", name: "Qwen3.5 397B A17B TEE", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 65536 }, cost: { input: 0.55, output: 3.5, cache_read: 0.275 } }, "TEE/glm-5.2:thinking": { id: "TEE/glm-5.2:thinking", name: "GLM 5.2 Thinking TEE", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 131072 }, cost: { input: 1.4, output: 4.6, cache_read: 0.5 } }, "TEE/glm-5.1-thinking": { id: "TEE/glm-5.1-thinking", name: "GLM 5.1 Thinking TEE", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, input: 202752, output: 65535 }, cost: { input: 1.5, output: 5.25, cache_read: 0.3 } }, "TEE/qwen3.6-35b-a3b-uncensored": { id: "TEE/qwen3.6-35b-a3b-uncensored", name: "Qwen3.6 35B A3B Uncensored TEE", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 131072 }], tool_call: true, structured_output: true, release_date: "2026-05-23", last_updated: "2026-05-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 131072 }, cost: { input: 0.3, output: 1.5, cache_read: 0.15 } }, "TEE/qwen3.5-122b-a10b": { id: "TEE/qwen3.5-122b-a10b", name: "Qwen3.5 122B A10B TEE", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 262144 }, cost: { input: 0.46, output: 3.68, cache_read: 0.23 } }, "TEE/qwen2.5-vl-72b-instruct": { id: "TEE/qwen2.5-vl-72b-instruct", name: "Qwen2.5 VL 72B TEE", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-02-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, input: 65536, output: 8192 }, cost: { input: 0.7, output: 0.7, cache_read: 0.35 } }, "microsoft/wizardlm-2-8x22b": { id: "microsoft/wizardlm-2-8x22b", name: "WizardLM-2 8x22B", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 65536, input: 65536, output: 8192 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "cohere/north-mini-code": { id: "cohere/north-mini-code", name: "Cohere North Mini Code 1.0", description: "Cohere coding model for practical software engineering and agentic edits", family: "north", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-09-23", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 64000 }, cost: { input: 0.2, output: 0.8, cache_read: 0.1 } }, "cohere/command-r-plus-08-2024": { id: "cohere/command-r-plus-08-2024", name: "Cohere: Command R+", description: "Cohere's RAG workhorse for long-context enterprise search and tool use", family: "command-r", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-06-01", release_date: "2024-08-30", last_updated: "2024-08-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 4096 }, cost: { input: 2.856, output: 14.246, cache_read: 1.428 } }, "baseten/Kimi-K2-Instruct-FP4": { id: "baseten/Kimi-K2-Instruct-FP4", name: "Kimi K2 0711 Instruct FP4", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-07-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 131072 }, cost: { input: 0.4, output: 1.8, cache_read: 0.2 } }, "nvidia/nemotron-3-ultra-550b-a55b:thinking": { id: "nvidia/nemotron-3-ultra-550b-a55b:thinking", name: "Nvidia Nemotron 3 Ultra 550B Thinking", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, input: 1e6, output: 65536 }, cost: { input: 0.5, output: 2.5, cache_read: 0.25 } }, "nvidia/nemotron-3-nano-30b-a3b": { id: "nvidia/nemotron-3-nano-30b-a3b", name: "Nvidia Nemotron 3 Nano 30B", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-12-15", last_updated: "2025-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 262144 }, cost: { input: 0.17, output: 0.68, cache_read: 0.085 } }, "nvidia/Llama-3.1-Nemotron-70B-Instruct-HF": { id: "nvidia/Llama-3.1-Nemotron-70B-Instruct-HF", name: "Nvidia Nemotron 70b", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", family: "nemotron", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.357, output: 0.408, cache_read: 0.1785 } }, "nvidia/nemotron-3-super-120b-a12b": { id: "nvidia/nemotron-3-super-120b-a12b", name: "Nvidia Nemotron 3 Super 120B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-03-01", last_updated: "2026-03-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.05, output: 0.25, cache_read: 0.025 } }, "nvidia/nemotron-3-super-120b-a12b:thinking": { id: "nvidia/nemotron-3-super-120b-a12b:thinking", name: "Nvidia Nemotron 3 Super 120B Thinking", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-03-01", last_updated: "2026-03-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.05, output: 0.25, cache_read: 0.025 } }, "nvidia/Llama-3.3-Nemotron-Super-49B-v1": { id: "nvidia/Llama-3.3-Nemotron-Super-49B-v1", name: "Nvidia Nemotron Super 49B", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", family: "nemotron", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-08", last_updated: "2025-08-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0.15, output: 0.15, cache_read: 0.075 } }, "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning": { id: "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning", name: "Nvidia Nemotron 3 Nano Omni", description: "Open Nemotron omni model combining reasoning with text, vision, and audio", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-28", last_updated: "2026-04-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 65536 }, cost: { input: 0.105, output: 0.42, cache_read: 0.0525 } }, "nvidia/nemotron-3-ultra-550b-a55b": { id: "nvidia/nemotron-3-ultra-550b-a55b", name: "Nvidia Nemotron 3 Ultra 550B", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, input: 1e6, output: 65536 }, cost: { input: 0.5, output: 2.5, cache_read: 0.25 } }, "huihui-ai/Qwen2.5-32B-Instruct-abliterated": { id: "huihui-ai/Qwen2.5-32B-Instruct-abliterated", name: "Qwen 2.5 32B Abliterated", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-01-06", last_updated: "2025-01-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, input: 32768, output: 8192 }, cost: { input: 0.7, output: 0.7, cache_read: 0.35 } }, "huihui-ai/DeepSeek-R1-Distill-Llama-70B-abliterated": { id: "huihui-ai/DeepSeek-R1-Distill-Llama-70B-abliterated", name: "DeepSeek R1 Llama 70B Abliterated", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.7, output: 0.7, cache_read: 0.35 } }, "huihui-ai/Llama-3.3-70B-Instruct-abliterated": { id: "huihui-ai/Llama-3.3-70B-Instruct-abliterated", name: "Llama 3.3 70B Instruct abliterated", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-08-08", last_updated: "2025-08-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 0.7, output: 0.7, cache_read: 0.35 } }, "huihui-ai/DeepSeek-R1-Distill-Qwen-32B-abliterated": { id: "huihui-ai/DeepSeek-R1-Distill-Qwen-32B-abliterated", name: "DeepSeek R1 Qwen Abliterated", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 1.4, output: 1.4, cache_read: 0.7 } }, "deepcogito/cogito-v1-preview-qwen-32B": { id: "deepcogito/cogito-v1-preview-qwen-32B", name: "Cogito v1 Preview Qwen 32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-05-10", last_updated: "2025-05-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 32768 }, cost: { input: 1.8, output: 1.8, cache_read: 0.9 } }, "google/gemini-flash-latest": { id: "google/gemini-flash-latest", name: "Gemini Flash Latest", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15 } }, "google/gemini-3.5-flash": { id: "google/gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, input: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15 } }, "google/gemma-4-31b-it:thinking": { id: "google/gemma-4-31b-it:thinking", name: "Gemma 4 31B Thinking", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 131072 }, cost: { input: 0.1, output: 0.35, cache_read: 0.05 } }, "google/gemini-3.5-flash-lite": { id: "google/gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, input: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, cache_write: 0.08333 } }, "google/gemma-4-26b-a4b-it:thinking": { id: "google/gemma-4-26b-a4b-it:thinking", name: "Gemma 4 26B A4B Thinking", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 131072 }, cost: { input: 0.13, output: 0.4, cache_read: 0.065 } }, "google/gemini-3.5-flash-thinking": { id: "google/gemini-3.5-flash-thinking", name: "Gemini 3.5 Flash Thinking", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, input: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15 } }, "google/gemini-pro-latest": { id: "google/gemini-pro-latest", name: "Gemini Pro Latest", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2026-03-29", last_updated: "2026-03-29", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 0.375 } }, "google/gemini-3.1-pro-preview-high": { id: "google/gemini-3.1-pro-preview-high", name: "Gemini 3.1 Pro (Preview High)", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-02-21", last_updated: "2026-02-21", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 0.375 } }, "google/gemini-3-flash-preview": { id: "google/gemini-3-flash-preview", name: "Gemini 3 Flash (Preview)", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05 } }, "google/gemini-3.1-pro-preview-customtools": { id: "google/gemini-3.1-pro-preview-customtools", name: "Gemini 3.1 Pro (Preview Custom Tools)", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 0.375 } }, "google/gemma-4-26b-a4b-it": { id: "google/gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 131072 }, cost: { input: 0.13, output: 0.4, cache_read: 0.065 } }, "google/gemini-3.6-flash": { id: "google/gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, input: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15 } }, "google/gemini-3-flash-preview-thinking": { id: "google/gemini-3-flash-preview-thinking", name: "Gemini 3 Flash Thinking", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05 } }, "google/gemini-3.1-flash-lite": { id: "google/gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, input: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, cache_write: 0.08333 } }, "google/gemma-4-31b-it": { id: "google/gemma-4-31b-it", name: "Gemma 4 31B", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 131072 }, cost: { input: 0.1, output: 0.35, cache_read: 0.05 } }, "google/gemini-3.1-pro-preview": { id: "google/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro (Preview)", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 0.375 } }, "google/gemini-flash-lite-latest": { id: "google/gemini-flash-lite-latest", name: "Gemini Flash Lite Latest", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, input: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, cache_write: 0.08333 } }, "google/gemini-3.1-pro-preview-low": { id: "google/gemini-3.1-pro-preview-low", name: "Gemini 3.1 Pro (Preview Low)", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-02-21", last_updated: "2026-02-21", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 0.375 } }, "thinkingmachines/inkling:thinking": { id: "thinkingmachines/inkling:thinking", name: "Inkling Thinking", description: "Multimodal MoE reasoning model (975B total, 41B active) for text, image, and audio", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 1048000, input: 1048000, output: 32768 }, cost: { input: 1, output: 4.05, cache_read: 0.17 } }, "thinkingmachines/Inkling-Small": { id: "thinkingmachines/Inkling-Small", name: "Inkling Small", description: "Multimodal MoE reasoning model (276B total, 12B active) for text, image, and audio", family: "ling", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-30", last_updated: "2026-07-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 524288, input: 524288, output: 32768 }, cost: { input: 0.5, output: 1.2, cache_read: 0.1 } }, "thinkingmachines/Inkling-Small:thinking": { id: "thinkingmachines/Inkling-Small:thinking", name: "Inkling Small Thinking", description: "Multimodal MoE reasoning model (276B total, 12B active) for text, image, and audio", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "max"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-30", last_updated: "2026-07-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 524288, input: 524288, output: 32768 }, cost: { input: 0.5, output: 1.2, cache_read: 0.1 } }, "thinkingmachines/inkling": { id: "thinkingmachines/inkling", name: "Inkling", description: "Multimodal MoE reasoning model (975B total, 41B active) for text, image, and audio", family: "ling", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 1048000, input: 1048000, output: 32768 }, cost: { input: 1, output: 4.05, cache_read: 0.17 } }, "zai-org/glm-4.6v": { id: "zai-org/glm-4.6v", name: "GLM 4.6V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 24000 }, cost: { input: 0.3, output: 0.9, cache_read: 0.15 } }, "zai-org/glm-5": { id: "zai-org/glm-5", name: "GLM 5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 128000 }, cost: { input: 0.5, output: 2.55, cache_read: 0.13 } }, "zai-org/glm-5:thinking": { id: "zai-org/glm-5:thinking", name: "GLM 5 Thinking", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 128000 }, cost: { input: 0.5, output: 2.55, cache_read: 0.13 } }, "zai-org/GLM-4.5:thinking": { id: "zai-org/GLM-4.5:thinking", name: "GLM 4.5 (Thinking)", description: "Hybrid-reasoning GLM release that made the 4.5 line broadly useful", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 0.3, output: 1.3, cache_read: 0.15 } }, "zai-org/glm-5.1": { id: "zai-org/glm-5.1", name: "GLM 5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 131072 }, cost: { input: 0.75, output: 2.6, cache_read: 0.15 } }, "zai-org/glm-4.6-original": { id: "zai-org/glm-4.6-original", name: "GLM 4.6 Original", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: false, release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 65535 }, cost: { input: 0.35, output: 1.4, cache_read: 0.175 } }, "zai-org/GLM-4.5-Air": { id: "zai-org/GLM-4.5-Air", name: "GLM 4.5 Air", description: "Lighter GLM-4.5 variant for fast coding assistance and cheaper agents", family: "glm-air", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 98304 }, cost: { input: 0.12, output: 0.8, cache_read: 0.06 } }, "zai-org/glm-4.7-flash": { id: "zai-org/glm-4.7-flash", name: "GLM 4.7 Flash", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 128000 }, cost: { input: 0.07, output: 0.4, cache_read: 0.035 } }, "zai-org/glm-5.2": { id: "zai-org/glm-5.2", name: "GLM 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 131072 }, cost: { input: 0.42, output: 1.32, cache_read: 0.078 } }, "zai-org/glm-4.7-original": { id: "zai-org/glm-4.7-original", name: "GLM 4.7 Original", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 65535 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "zai-org/glm-5-original": { id: "zai-org/glm-5-original", name: "GLM 5 Original", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 128000 }, cost: { input: 1, output: 3.2, cache_read: 0.2 } }, "zai-org/glm-5-original:thinking": { id: "zai-org/glm-5-original:thinking", name: "GLM 5 Original Thinking", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 128000 }, cost: { input: 1, output: 3.2, cache_read: 0.2 } }, "zai-org/glm-4.7-flash-original": { id: "zai-org/glm-4.7-flash-original", name: "GLM 4.7 Flash Original", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 128000 }, cost: { input: 0.07, output: 0.4, cache_read: 0.035 } }, "zai-org/GLM-4.6-turbo:thinking": { id: "zai-org/GLM-4.6-turbo:thinking", name: "GLM 4.6 Turbo (Thinking)", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2025-10-02", last_updated: "2025-10-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 204800 }, cost: { input: 1, output: 3, cache_read: 0.5 } }, "zai-org/glm-5.1:thinking": { id: "zai-org/glm-5.1:thinking", name: "GLM 5.1 Thinking", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 131072 }, cost: { input: 0.75, output: 2.6, cache_read: 0.15 } }, "zai-org/glm-4.5": { id: "zai-org/glm-4.5", name: "GLM 4.5", description: "Hybrid-reasoning GLM release that made the 4.5 line broadly useful", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 0.3, output: 1.3, cache_read: 0.15 } }, "zai-org/glm-4.7-original:thinking": { id: "zai-org/glm-4.7-original:thinking", name: "GLM 4.7 Original Thinking", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 65535 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "zai-org/glm-4.7": { id: "zai-org/glm-4.7", name: "GLM 4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 65535 }, cost: { input: 0.2, output: 0.8, cache_read: 0.1 } }, "zai-org/GLM-4.6-turbo": { id: "zai-org/GLM-4.6-turbo", name: "GLM 4.6 Turbo", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-10-02", last_updated: "2025-10-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 204800 }, cost: { input: 1, output: 3, cache_read: 0.5 } }, "zai-org/glm-latest": { id: "zai-org/glm-latest", name: "GLM Latest", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, release_date: "2026-05-03", last_updated: "2026-05-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 131072 }, cost: { input: 0.42, output: 1.32, cache_read: 0.078 } }, "zai-org/GLM-4.5-Air:thinking": { id: "zai-org/GLM-4.5-Air:thinking", name: "GLM 4.5 Air (Thinking)", description: "Lighter GLM-4.5 variant for fast coding assistance and cheaper agents", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 98304 }, cost: { input: 0.12, output: 0.8, cache_read: 0.06 } }, "zai-org/glm-4.6v-flash-original": { id: "zai-org/glm-4.6v-flash-original", name: "GLM 4.6V Flash", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 24000 }, cost: { input: 0.1, output: 0.4, cache_read: 0.05 } }, "zai-org/glm-4.6v-original": { id: "zai-org/glm-4.6v-original", name: "GLM 4.6V Original", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 24000 }, cost: { input: 0.6, output: 0.9, cache_read: 0.3 } }, "zai-org/glm-4.7-flash:thinking": { id: "zai-org/glm-4.7-flash:thinking", name: "GLM 4.7 Flash Thinking", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 128000 }, cost: { input: 0.07, output: 0.4, cache_read: 0.035 } }, "zai-org/glm-4.7-flash-original:thinking": { id: "zai-org/glm-4.7-flash-original:thinking", name: "GLM 4.7 Flash Original Thinking", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 128000 }, cost: { input: 0.07, output: 0.4, cache_read: 0.035 } }, "zai-org/glm-5.2:thinking": { id: "zai-org/glm-5.2:thinking", name: "GLM 5.2 Thinking", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 131072 }, cost: { input: 0.42, output: 1.32, cache_read: 0.078 } }, "zai-org/glm-4.7:thinking": { id: "zai-org/glm-4.7:thinking", name: "GLM 4.7 Thinking", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 65535 }, cost: { input: 0.2, output: 0.8, cache_read: 0.1 } }, "featherless-ai/Qwerky-72B": { id: "featherless-ai/Qwerky-72B", name: "Qwerky 72B", description: "General-purpose chat model for instruction following, writing, and analysis", family: "qwerky", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, input: 32000, output: 8192 }, cost: { input: 0.5, output: 0.5, cache_read: 0.25 } }, "unsloth/gemma-3-4b-it": { id: "unsloth/gemma-3-4b-it", name: "Gemma 3 4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "unsloth", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-03-10", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 0.2006, output: 0.2006, cache_read: 0.1003 } }, "unsloth/gemma-3-27b-it": { id: "unsloth/gemma-3-27b-it", name: "Gemma 3 27B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "unsloth", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-03-10", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 96000 }, cost: { input: 0.2992, output: 0.2992, cache_read: 0.1496 } }, "unsloth/gemma-3-12b-it": { id: "unsloth/gemma-3-12b-it", name: "Gemma 3 12B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "unsloth", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-03-10", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 131072 }, cost: { input: 0.272, output: 0.272, cache_read: 0.136 } }, "perceptron/perceptron-mk1": { id: "perceptron/perceptron-mk1", name: "Perceptron Mk1", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, release_date: "2026-05-12", last_updated: "2026-05-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 8192 }, cost: { input: 0.15, output: 1.5, cache_read: 0.075 } }, "sakana/fugu-ultra": { id: "sakana/fugu-ultra", name: "Fugu Ultra", description: "Quality-first multi-agent model for hard research, analysis, and competitions", family: "fugu", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-06-15", last_updated: "2026-06-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 16384 }, cost: { input: 5.25, output: 31.5, cache_read: 0.525 } }, "sakana/fugu-ultra-v1.1": { id: "sakana/fugu-ultra-v1.1", name: "Fugu Ultra v1.1", description: "Sakana AI's upgraded Fugu Ultra release with stronger coding, agentic task execution, and advanced reasoning through dynamic orchestration of frontier models.", family: "fugu", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh", "max"] }], tool_call: true, structured_output: true, release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 16384 }, cost: { input: 5.25, output: 31.5, cache_read: 0.525 } }, "Steelskull/L3.3-MS-Nevoria-70b": { id: "Steelskull/L3.3-MS-Nevoria-70b", name: "Steelskull Nevoria 70b", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "Steelskull/L3.3-MS-Evayale-70B": { id: "Steelskull/L3.3-MS-Evayale-70B", name: "Evayale 70b ", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "Steelskull/L3.3-Cu-Mai-R1-70b": { id: "Steelskull/L3.3-Cu-Mai-R1-70b", name: "Llama 3.3 70B Cu Mai", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "Steelskull/L3.3-Electra-R1-70b": { id: "Steelskull/L3.3-Electra-R1-70b", name: "Steelskull Electra R1 70b", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 0.69989, output: 0.69989, cache_read: 0.349945 } }, "Steelskull/L3.3-Nevoria-R1-70b": { id: "Steelskull/L3.3-Nevoria-R1-70b", name: "Steelskull Nevoria R1 70b", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "qwen/qwen3-32b": { id: "qwen/qwen3-32b", name: "Qwen 3 32b", description: "Dense open Qwen model for self-hosted chat, reasoning, and coding", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 41000, input: 41000, output: 32768 }, cost: { input: 0.1, output: 0.3, cache_read: 0.05 } }, "qwen/qwen3-30b-a3b": { id: "qwen/qwen3-30b-a3b", name: "Qwen3 30B A3B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-02-27", last_updated: "2025-02-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 41000, input: 41000, output: 32768 }, cost: { input: 0.1, output: 0.3, cache_read: 0.05 } }, "qwen/Qwen3-235B-A22B-Instruct-2507": { id: "qwen/Qwen3-235B-A22B-Instruct-2507", name: "Qwen 3 235b A22B 2507", description: "Updated large open Qwen3 MoE instruct model for multilingual chat, coding, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-21", last_updated: "2025-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 262144 }, cost: { input: 0.13, output: 0.5, cache_read: 0.065 } }, "qwen/qwen3.5-plus": { id: "qwen/qwen3.5-plus", name: "Qwen3.5 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 983616, input: 983616, output: 65536 }, cost: { input: 0.4, output: 2.4, cache_read: 0.04 } }, "qwen/Qwen3-235B-A22B-Instruct-2507-TEE": { id: "qwen/Qwen3-235B-A22B-Instruct-2507-TEE", name: "Qwen 3 235b A22B 2507 (TEE)", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 262144 }, cost: { input: 0.13, output: 0.5, cache_read: 0.065 } }, "qwen/qwen3-next-80b-a3b-thinking": { id: "qwen/qwen3-next-80b-a3b-thinking", name: "Qwen3 Next 80B A3B (Thinking)", description: "Efficient Qwen thinking model for local reasoning, math, and coding agents", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 32768 }, cost: { input: 0.15, output: 0.65, cache_read: 0.075 } }, "qwen/qwen3.5-9b": { id: "qwen/qwen3.5-9b", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 65536 }, cost: { input: 0.05, output: 0.15, cache_read: 0.025 } }, "qwen/Qwen3-VL-235B-A22B-Instruct": { id: "qwen/Qwen3-VL-235B-A22B-Instruct", name: "Qwen3 VL 235B A22B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 262144 }, cost: { input: 0.3, output: 1.2, cache_read: 0.15 } }, "qwen/qwen3-14b": { id: "qwen/qwen3-14b", name: "Qwen 3 14b", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 41000, input: 41000, output: 32768 }, cost: { input: 0.08, output: 0.24, cache_read: 0.04 } }, "qwen/Qwen3-8B": { id: "qwen/Qwen3-8B", name: "Qwen 3 8B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 41000, input: 41000, output: 32768 }, cost: { input: 0.47, output: 0.47, cache_read: 0.235 } }, "qwen/qwen3-235b-a22b": { id: "qwen/qwen3-235b-a22b", name: "Qwen 3 235b A22B", description: "Large open Qwen MoE for multilingual reasoning, coding, and tool use", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 41000, input: 41000, output: 32768 }, cost: { input: 0.3, output: 0.5, cache_read: 0.15 } }, "qwen/qwen3-max": { id: "qwen/qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen3 model for coding agents, complex reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 32768 }, cost: { input: 1.2002, output: 6.001, cache_read: 0.6001 } }, "qwen/qwen3.5-397b-a17b-thinking": { id: "qwen/qwen3.5-397b-a17b-thinking", name: "Qwen3.5 397B A17B Thinking", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 258048, input: 258048, output: 65536 }, cost: { input: 0.6, output: 3.6, cache_read: 0.3 } }, "qwen/qwen3-coder-plus": { id: "qwen/qwen3-coder-plus", name: "Qwen3 Coder Plus", description: "Hosted Qwen coder for software agents, repo edits, and long-context code", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 1, output: 5, cache_read: 0.5 } }, "qwen/qwen3-coder-flash": { id: "qwen/qwen3-coder-flash", name: "Qwen3 Coder Flash", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 0.3, output: 1.5, cache_read: 0.15 } }, "qwen/Qwen3.6-35B-A3B": { id: "qwen/Qwen3.6-35B-A3B", name: "Qwen3.6 35B A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.112, output: 0.8, cache_read: 0.056 } }, "qwen/qwen-2.5-72b-instruct": { id: "qwen/qwen-2.5-72b-instruct", name: "Qwen2.5 72B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-03", last_updated: "2025-07-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 8192 }, cost: { input: 0.357, output: 0.408, cache_read: 0.1785 } }, "qwen/qwen3.5-397b-a17b": { id: "qwen/qwen3.5-397b-a17b", name: "Qwen3.5 397B A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 258048, input: 258048, output: 65536 }, cost: { input: 0.6, output: 3.6, cache_read: 0.3 } }, "qwen/qwen3.5-plus-thinking": { id: "qwen/qwen3.5-plus-thinking", name: "Qwen3.5 Plus Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 983616, input: 983616, output: 65536 }, cost: { input: 0.4, output: 2.4, cache_read: 0.04 } }, "qwen/Qwen3-Next-80B-A3B-Instruct": { id: "qwen/Qwen3-Next-80B-A3B-Instruct", name: "Qwen3 Next 80B A3B (Instruct)", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 262144 }, cost: { input: 0.15, output: 0.65, cache_read: 0.075 } }, "qwen/Qwen2.5-Coder-32B-Instruct": { id: "qwen/Qwen2.5-Coder-32B-Instruct", name: "Qwen 2.5 Coder 32b", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-03", last_updated: "2025-07-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, input: 32000, output: 8192 }, cost: { input: 0.2006, output: 0.2006, cache_read: 0.1003 } }, "qwen/Qwen3.6-35B-A3B:thinking": { id: "qwen/Qwen3.6-35B-A3B:thinking", name: "Qwen3.6 35B A3B Thinking", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.112, output: 0.8, cache_read: 0.056 } }, "qwen/qwen3-coder": { id: "qwen/qwen3-coder", name: "Qwen 3 Coder 480B", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262000, input: 262000, output: 65536 }, cost: { input: 0.13, output: 0.5, cache_read: 0.065 } }, "qwen/qwen3-coder-next": { id: "qwen/qwen3-coder-next", name: "Qwen3 Coder Next", description: "Open-weight Qwen coding model for agents, repository edits, and multi-turn tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-09", release_date: "2026-02-03", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 65536 }, cost: { input: 0.2, output: 1.5, cache_read: 0.1 } }, "qwen/Qwen3-235B-A22B-Thinking-2507": { id: "qwen/Qwen3-235B-A22B-Thinking-2507", name: "Qwen 3 235b A22B 2507 Thinking", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-11", last_updated: "2025-09-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 262144 }, cost: { input: 0.3, output: 0.5, cache_read: 0.15 } }, "EVA-UNIT-01/EVA-Qwen2.5-32B-v0.2": { id: "EVA-UNIT-01/EVA-Qwen2.5-32B-v0.2", name: "EVA-Qwen2.5-32B-v0.2", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-26", last_updated: "2025-07-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.799, output: 0.799, cache_read: 0.3995 } }, "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.1": { id: "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.1", name: "EVA-LLaMA-3.33-70B-v0.1", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 2.006, output: 2.006, cache_read: 1.003 } }, "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.0": { id: "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.0", name: "EVA Llama 3.33 70B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-26", last_updated: "2025-07-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 2.006, output: 2.006, cache_read: 1.003 } }, "EVA-UNIT-01/EVA-Qwen2.5-72B-v0.2": { id: "EVA-UNIT-01/EVA-Qwen2.5-72B-v0.2", name: "EVA-Qwen2.5-72B-v0.2", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.799, output: 0.799, cache_read: 0.3995 } }, "tencent/hy3": { id: "tencent/hy3", name: "Tencent Hy3", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 262144 }, cost: { input: 0.066, output: 0.26, cache_read: 0.029 } }, "tencent/Hunyuan-MT-7B": { id: "tencent/Hunyuan-MT-7B", name: "Hunyuan MT 7B", description: "Translation model for multilingual conversion, localization, and cross-language workflows", family: "hunyuan", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-08-15", last_updated: "2025-09-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, input: 8192, output: 8192 }, cost: { input: 10, output: 20, cache_read: 5 } }, "THUDM/GLM-Z1-9B-0414": { id: "THUDM/GLM-Z1-9B-0414", name: "GLM Z1 9B 0414", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm-z", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-04-14", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, input: 32000, output: 8000 }, cost: { input: 0.2, output: 0.2, cache_read: 0.1 } }, "THUDM/GLM-4-32B-0414": { id: "THUDM/GLM-4-32B-0414", name: "GLM 4 32B 0414", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-04-14", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 0.2, output: 0.2, cache_read: 0.1 } }, "THUDM/GLM-4-9B-0414": { id: "THUDM/GLM-4-9B-0414", name: "GLM 4 9B 0414", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-04-14", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, input: 32000, output: 8000 }, cost: { input: 0.2, output: 0.2, cache_read: 0.1 } }, "abacusai/Dracarys-72B-Instruct": { id: "abacusai/Dracarys-72B-Instruct", name: "Llama 3.1 70B Dracarys 2", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-08-02", last_updated: "2025-08-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "pamanseau/OpenReasoning-Nemotron-32B": { id: "pamanseau/OpenReasoning-Nemotron-32B", name: "OpenReasoning Nemotron 32B", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, input: 32768, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.05 } }, "upstage/solar-pro-3": { id: "upstage/solar-pro-3", name: "Solar Pro 3", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "solar-pro", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 128000 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015 } }, "GalrionSoftworks/MN-LooseCannon-12B-v1": { id: "GalrionSoftworks/MN-LooseCannon-12B-v1", name: "MN-LooseCannon-12B-v1", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "mistralai/Devstral-Small-2505": { id: "mistralai/Devstral-Small-2505", name: "Mistral Devstral Small 2505", description: "Mistral coding agent model for repository tasks and software engineering workflows", family: "devstral", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-08-02", last_updated: "2025-08-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, input: 32768, output: 8192 }, cost: { input: 0.06, output: 0.06, cache_read: 0.03 } }, "mistralai/mistral-large": { id: "mistralai/mistral-large", name: "Mistral Large 2411", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-02-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 256000 }, cost: { input: 2.006, output: 6.001, cache_read: 0.2 } }, "mistralai/mistral-small-4-119b-2603:thinking": { id: "mistralai/mistral-small-4-119b-2603:thinking", name: "Mistral Small 4 119B Thinking", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.4, output: 1.4, cache_read: 0.2 } }, "mistralai/Mistral-Nemo-Instruct-2407": { id: "mistralai/Mistral-Nemo-Instruct-2407", name: "Mistral Nemo", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.1003, output: 0.1207, cache_read: 0.05015 } }, "mistralai/devstral-2-123b-instruct-2512": { id: "mistralai/devstral-2-123b-instruct-2512", name: "Devstral 2 123B", description: "Mistral coding agent model for repository tasks and software engineering workflows", family: "devstral", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-09", last_updated: "2025-12-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 65536 }, cost: { input: 0.4, output: 1.4, cache_read: 0.2 } }, "mistralai/ministral-8b-2512": { id: "mistralai/ministral-8b-2512", name: "Ministral 8B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-04", last_updated: "2025-12-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 32768 }, cost: { input: 0.15, output: 0.15, cache_read: 0.075 } }, "mistralai/ministral-14b-2512": { id: "mistralai/ministral-14b-2512", name: "Ministral 14B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-04", last_updated: "2025-12-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 32768 }, cost: { input: 0.2, output: 0.2, cache_read: 0.1 } }, "mistralai/ministral-3b-2512": { id: "mistralai/ministral-3b-2512", name: "Ministral 3B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-04", last_updated: "2025-12-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 32768 }, cost: { input: 0.1, output: 0.1, cache_read: 0.05 } }, "mistralai/mistral-small-4-119b-2603": { id: "mistralai/mistral-small-4-119b-2603", name: "Mistral Small 4 119B", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.4, output: 1.4, cache_read: 0.2 } }, "mistralai/mistral-large-3-675b-instruct-2512": { id: "mistralai/mistral-large-3-675b-instruct-2512", name: "Mistral Large 3 675B", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-25", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 256000 }, cost: { input: 1, output: 3, cache_read: 0.5 } }, "mistralai/ministral-14b-instruct-2512": { id: "mistralai/ministral-14b-instruct-2512", name: "Ministral 3 14B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 32768 }, cost: { input: 0.1, output: 0.4, cache_read: 0.05 } }, "mistralai/mixtral-8x22b-instruct-v0.1": { id: "mistralai/mixtral-8x22b-instruct-v0.1", name: "Mixtral 8x22B", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mixtral", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, input: 65536, output: 65536 }, cost: { input: 2, output: 6, cache_read: 0.2 } }, "mistralai/mistral-medium-3.1": { id: "mistralai/mistral-medium-3.1", name: "Mistral Medium 3.1", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, input: 131072, output: 32768 }, cost: { input: 0.4, output: 2, cache_read: 0.2 } }, "mistralai/mistral-saba": { id: "mistralai/mistral-saba", name: "Mistral Saba", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-02-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, input: 32000, output: 32768 }, cost: { input: 0.1989, output: 0.595, cache_read: 0.09945 } }, "mistralai/codestral-2508": { id: "mistralai/codestral-2508", name: "Codestral 2508", description: "Mistral coding model for code completion, generation, and developer workflows", family: "codestral", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-08-01", last_updated: "2025-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 32768 }, cost: { input: 0.3, output: 0.9, cache_read: 0.15 } }, "mistralai/mistral-medium-3": { id: "mistralai/mistral-medium-3", name: "Mistral Medium 3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, input: 131072, output: 32768 }, cost: { input: 0.4, output: 2, cache_read: 0.2 } }, "bytedance/doubao-seed-character": { id: "bytedance/doubao-seed-character", name: "Doubao Seed Character", description: "ByteDance's character-focused Doubao Seed model for roleplay, persona consistency, dialogue, and creative character interactions. It supports text and image input with a 128k context window. Requests route through ZenMux to ByteDance; ZenMux does not publish a model-API zero-retention or training guarantee, so avoid sensitive data.", family: "seed", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2026-07-18", last_updated: "2026-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 32768 }, cost: { input: 0.1179, output: 0.2947, cache_read: 0.0236, cache_write: 0.0025 } }, "bytedance/doubao-seed-2.1-turbo": { id: "bytedance/doubao-seed-2.1-turbo", name: "Doubao Seed 2.1 Turbo", description: "Fast, lower-cost model in the Doubao Seed 2.1 family for everyday chat, coding assistance, document work, and high-throughput productivity tasks. Supports a 256k context window and up to 128k output tokens. Note: privacy and logging guarantees may be limited.", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-06-23", last_updated: "2026-06-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 128000 }, cost: { input: 0.5, output: 2.5, cache_read: 0.25 } }, "bytedance/doubao-seed-2.1-pro": { id: "bytedance/doubao-seed-2.1-pro", name: "Doubao Seed 2.1 Pro", description: "Higher-capability model in the Doubao Seed 2.1 family for agentic coding, long-context analysis, complex instruction following, and productivity workflows. Supports a 256k context window and up to 128k output tokens. Note: privacy and logging guarantees may be limited.", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-06-23", last_updated: "2026-06-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 128000 }, cost: { input: 1, output: 5, cache_read: 0.5 } }, "soob3123/amoral-gemma3-27B-v2": { id: "soob3123/amoral-gemma3-27B-v2", name: "Amoral Gemma3 27B v2", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-05-23", last_updated: "2025-05-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, input: 32768, output: 8192 }, cost: { input: 0.3, output: 0.3, cache_read: 0.15 } }, "soob3123/GrayLine-Qwen3-8B": { id: "soob3123/GrayLine-Qwen3-8B", name: "Grayline Qwen3 8B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 32768 }, cost: { input: 0.3, output: 0.3, cache_read: 0.15 } }, "soob3123/Veiled-Calla-12B": { id: "soob3123/Veiled-Calla-12B", name: "Veiled Calla 12B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-04-13", last_updated: "2025-04-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, input: 32768, output: 8192 }, cost: { input: 0.3, output: 0.3, cache_read: 0.15 } }, "nex-agi/nex-n2-mini": { id: "nex-agi/nex-n2-mini", name: "Nex N2 Mini", description: "Nex AGI's open-source agentic mixture-of-experts model in the Nex N2 family. It accepts text and image input and is built for coding, tool use, structured outputs, and optional reasoning with a 256K context window.", family: "agi", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, release_date: "2026-06-24", last_updated: "2026-06-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 262144 }, cost: { input: 0.025, output: 0.1, cache_read: 0.0025 } }, "nex-agi/nex-n2-pro": { id: "nex-agi/nex-n2-pro", name: "Nex N2 Pro", description: "Nex AGI's open-source agentic reasoning model, post-trained on Qwen3.5-397B-A17B. It is built for agentic coding, software engineering, deep research, tool use, and long-horizon tasks with a 256K context window.", family: "agi", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 262144 }, cost: { input: 0.5, output: 2.5, cache_read: 0.25 } }, "inflatebot/MN-12B-Mag-Mell-R1": { id: "inflatebot/MN-12B-Mag-Mell-R1", name: "Mag Mell R1", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "LLM360/K2-Think": { id: "LLM360/K2-Think", name: "K2-Think", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-26", last_updated: "2025-07-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 32768 }, cost: { input: 0.17, output: 0.68, cache_read: 0.085 } }, "undi95/remm-slerp-l2-13b": { id: "undi95/remm-slerp-l2-13b", name: "ReMM SLERP 13B", description: "Open Llama multimodal model for image understanding and text reasoning", family: "llama", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 6144, input: 6144, output: 4096 }, cost: { input: 0.799, output: 1.207, cache_read: 0.3995 } }, "meta/muse-spark-1.1": { id: "meta/muse-spark-1.1", name: "Muse Spark 1.1", description: "Muse Spark is a natively multimodal reasoning model with support for tool-use, visual chain of thought, and multi-agent orchestration.", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-04-08", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 65536 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "meta/muse-spark-1.2-contributor": { id: "meta/muse-spark-1.2-contributor", name: "Muse Spark 1.2 Contributor (Data Used for Training)", description: "A much cheaper opt-in version of Muse Spark 1.2 with the same multimodal coding and agentic capabilities. Prompts and outputs sent to this Contributor model may be used by Meta for training and to improve its products; use the standard Muse Spark 1.2 model if you do not want your data used for training.", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, release_date: "2026-08-05", last_updated: "2026-08-05", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 65536 }, cost: { input: 0.1, output: 0.2, cache_read: 0.002 } }, "meta/muse-spark-1.2": { id: "meta/muse-spark-1.2", name: "Muse Spark 1.2", description: "Muse Spark 1.2 is a coding-focused update to Muse Spark 1.1 with improvements in code generation, complex debugging, codebase understanding, and end-to-end developer workflows.", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-05", last_updated: "2026-08-05", modalities: { input: ["text", "image", "video", "pdf", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 65536 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "nanogpt/coding-router:max": { id: "nanogpt/coding-router:max", name: "Coding Router Max", description: "Automatic model router for matching prompts to suitable backends and budgets", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-05-12", last_updated: "2026-05-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "nanogpt/coding-router:medium": { id: "nanogpt/coding-router:medium", name: "Coding Router Medium", description: "Automatic model router for matching prompts to suitable backends and budgets", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-05-12", last_updated: "2026-05-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "nanogpt/coding-router:high": { id: "nanogpt/coding-router:high", name: "Coding Router High", description: "Automatic model router for matching prompts to suitable backends and budgets", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-05-12", last_updated: "2026-05-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 1.1, output: 2.2, cache_read: 0.11 } }, "nanogpt/coding-router:low": { id: "nanogpt/coding-router:low", name: "Coding Router Low", description: "Automatic model router for matching prompts to suitable backends and budgets", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-05-12", last_updated: "2026-05-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "nanogpt/coding-router": { id: "nanogpt/coding-router", name: "Coding Router", description: "Automatic model router for matching prompts to suitable backends and budgets", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-05-12", last_updated: "2026-05-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 1.1, output: 2.2, cache_read: 0.11 } }, "mlabonne/NeuralDaredevil-8B-abliterated": { id: "mlabonne/NeuralDaredevil-8B-abliterated", name: "Neural Daredevil 8B abliterated", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, input: 8192, output: 8192 }, cost: { input: 0.44, output: 0.44, cache_read: 0.22 } }, "MiniMaxAI/MiniMax-M1-80k": { id: "MiniMaxAI/MiniMax-M1-80k", name: "MiniMax M1 80K", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-01-08", last_updated: "2025-06-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 131072 }, cost: { input: 0.6052, output: 2.4225, cache_read: 0.3026 } }, "inclusionai/ling-3.0-flash": { id: "inclusionai/ling-3.0-flash", name: "Ling 3.0 Flash", description: "Ling-3.0-flash is a 124B-parameter Mixture-of-Experts model with approximately 5.1B parameters active per token. It prioritizes token efficiency and production-scale agentic inference, helping coding and tool-using agents complete more work within constrained latency and serving budgets.", family: "ling", attachment: false, reasoning: false, tool_call: true, structured_output: false, release_date: "2026-07-23", last_updated: "2026-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, input: 262144, output: 32768 }, cost: { input: 0.075, output: 0.22, cache_read: 0.015 } }, "inclusionai/ring-2.6-1t": { id: "inclusionai/ring-2.6-1t", name: "Ring 2.6 1T", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "ring", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-05-08", last_updated: "2026-05-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, input: 262144, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.06 } }, "inclusionai/ling-2.6-1t": { id: "inclusionai/ling-2.6-1t", name: "Ling 2.6 1T", description: "Tool-capable chat model for instruction following and agentic application workflows", family: "ling", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, input: 262144, output: 32768 }, cost: { input: 0.3, output: 2.5, cache_read: 0.06 } }, "inclusionai/ling-3.0-flash:thinking": { id: "inclusionai/ling-3.0-flash:thinking", name: "Ling 3.0 Flash Thinking", description: "Ling-3.0-flash Thinking enables visible reasoning on inclusionAI's token-efficient 124B-parameter Mixture-of-Experts model for harder coding, tool use, planning, and production-scale agent workflows.", family: "ling", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: false, release_date: "2026-07-23", last_updated: "2026-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, input: 262144, output: 32768 }, cost: { input: 0.075, output: 0.22, cache_read: 0.015 } }, "inclusionai/ling-2.6-flash": { id: "inclusionai/ling-2.6-flash", name: "Ling 2.6 Flash", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "ling", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 32768 }, cost: { input: 0.1, output: 0.3, cache_read: 0.02 } }, "Salesforce/Llama-xLAM-2-70b-fc-r": { id: "Salesforce/Llama-xLAM-2-70b-fc-r", name: "Llama-xLAM-2 70B fc-r", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-04-13", last_updated: "2025-04-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 2.5, output: 2.5, cache_read: 1.25 } }, "ReadyArt/MS3.2-The-Omega-Directive-24B-Unslop-v2.0": { id: "ReadyArt/MS3.2-The-Omega-Directive-24B-Unslop-v2.0", name: "Omega Directive 24B Unslop v2.0", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 32768 }, cost: { input: 0.5, output: 0.5, cache_read: 0.25 } }, "crofai/greg-2-super": { id: "crofai/greg-2-super", name: "Greg 2 Super", description: "Greg 2 Super is CrofAI's balanced Greg 2 model for strong UI design, frontend iteration, coding, writing, and everyday agent tasks at a lower cost than Ultra.", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-06-19", last_updated: "2026-06-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 229376, input: 229376, output: 229376 }, cost: { input: 1.5, output: 5, cache_read: 0.25 } }, "crofai/greg-2-ultra": { id: "crofai/greg-2-ultra", name: "Greg 2 Ultra", description: "Greg 2 Ultra is CrofAI's most capable Greg 2 model, tuned for premium UI design, agentic coding, creative writing, and higher-end general reasoning tasks.", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-06-19", last_updated: "2026-06-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 229376, input: 229376, output: 229376 }, cost: { input: 3, output: 10, cache_read: 0.5 } }, "mistral/mistral-medium-3.5": { id: "mistral/mistral-medium-3.5", name: "Mistral Medium 3.5", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 32768 }, cost: { input: 1.5, output: 7.5, cache_read: 0.75 } }, "mistral/mistral-medium-3.5:thinking": { id: "mistral/mistral-medium-3.5:thinking", name: "Mistral Medium 3.5 Thinking", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 32768 }, cost: { input: 1.5, output: 7.5, cache_read: 0.75 } }, "meganova-ai/manta-pro-1.0": { id: "meganova-ai/manta-pro-1.0", name: "Manta Pro 1.0", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "nova", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-20", last_updated: "2025-12-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 32768 }, cost: { input: 0.06, output: 0.5, cache_read: 0.03 } }, "meganova-ai/manta-mini-1.0": { id: "meganova-ai/manta-mini-1.0", name: "Manta Mini 1.0", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-20", last_updated: "2025-12-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, input: 8192, output: 8192 }, cost: { input: 0.02, output: 0.16, cache_read: 0.01 } }, "meganova-ai/manta-flash-1.0": { id: "meganova-ai/manta-flash-1.0", name: "Manta Flash 1.0", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-20", last_updated: "2025-12-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 0.02, output: 0.16, cache_read: 0.01 } }, "Doctor-Shotgun/MS3.2-24B-Magnum-Diamond": { id: "Doctor-Shotgun/MS3.2-24B-Magnum-Diamond", name: "MS3.2 24B Magnum Diamond", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 32768 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "chutesai/Mistral-Small-3.2-24B-Instruct-2506": { id: "chutesai/Mistral-Small-3.2-24B-Instruct-2506", name: "Mistral Small 3.2 24b Instruct", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "chutesai", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 131072 }, cost: { input: 0.2, output: 0.4, cache_read: 0.1 } }, "VongolaChouko/Starcannon-Unleashed-12B-v1.0": { id: "VongolaChouko/Starcannon-Unleashed-12B-v1.0", name: "Mistral Nemo Starcannon 12b v1", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "shisa-ai/shisa-v2.1-llama3.3-70b": { id: "shisa-ai/shisa-v2.1-llama3.3-70b", name: "Shisa V2.1 Llama 3.3 70B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, input: 32768, output: 4096 }, cost: { input: 0.5, output: 0.5, cache_read: 0.25 } }, "shisa-ai/shisa-v2-llama3.3-70b": { id: "shisa-ai/shisa-v2-llama3.3-70b", name: "Shisa V2 Llama 3.3 70B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-26", last_updated: "2025-07-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0.5, output: 0.5, cache_read: 0.25 } }, "poolside/laguna-s-2.1:thinking": { id: "poolside/laguna-s-2.1:thinking", name: "Laguna S 2.1 Thinking", description: "Agentic coding model from Poolside in the XS size class for local deployment", family: "laguna", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 131072 }, cost: { input: 0.1, output: 0.2, cache_read: 0.01 } }, "poolside/laguna-s-2.1": { id: "poolside/laguna-s-2.1", name: "Laguna S 2.1", description: "Agentic coding model from Poolside in the XS size class for local deployment", family: "laguna", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 131072 }, cost: { input: 0.1, output: 0.2, cache_read: 0.01 } }, "poolside/laguna-m.1": { id: "poolside/laguna-m.1", name: "Laguna M.1", description: "Poolside's open-weight model for agentic coding and long-horizon work", family: "laguna", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-04-28", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 32768 }, cost: { input: 0.2, output: 0.4, cache_read: 0.1 } }, "nothingiisreal/L3.1-70B-Celeste-V0.1-BF16": { id: "nothingiisreal/L3.1-70B-Celeste-V0.1-BF16", name: "Llama 3.1 70B Celeste v0.1", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "dmind/dmind-1-mini": { id: "dmind/dmind-1-mini", name: "DMind-1-Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 8192 }, cost: { input: 0.2, output: 0.4, cache_read: 0.1 } }, "failspy/Meta-Llama-3-70B-Instruct-abliterated-v3.5": { id: "failspy/Meta-Llama-3-70B-Instruct-abliterated-v3.5", name: "Llama 3 70B abliterated", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-26", last_updated: "2025-07-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, input: 8192, output: 8192 }, cost: { input: 0.7, output: 0.7, cache_read: 0.35 } }, "minimax/minimax-m2-her": { id: "minimax/minimax-m2-her", name: "MiniMax M2-her", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-01-12", last_updated: "2026-01-24", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 65532, input: 65532, output: 2048 }, cost: { input: 0.302, output: 1.207, cache_read: 0.151 } }, "minimax/minimax-m2.7-turbo": { id: "minimax/minimax-m2.7-turbo", name: "MiniMax M2.7 Turbo", description: "Efficient MiniMax model for quick assistance, coding, and routine automation", family: "minimax-m2.7", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, input: 204800, output: 131072 }, cost: { input: 0.6, output: 2.4, cache_read: 0.3 } }, "minimax/minimax-m2.7": { id: "minimax/minimax-m2.7", name: "MiniMax M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, input: 204800, output: 131072 }, cost: { input: 0.315, output: 1.26, cache_read: 0.1575 } }, "minimax/minimax-m3:thinking": { id: "minimax/minimax-m3:thinking", name: "MiniMax M3 Thinking", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 512000, input: 512000, output: 80000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "minimax/minimax-m3": { id: "minimax/minimax-m3", name: "MiniMax M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 512000, input: 512000, output: 80000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "minimax/minimax-m2.5": { id: "minimax/minimax-m2.5", name: "MiniMax M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, input: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.15 } }, "minimax/minimax-01": { id: "minimax/minimax-01", name: "MiniMax 01", description: "MiniMax multimodal coding model for long-context reasoning and agent tasks", family: "minimax", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-01-15", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1000192, input: 1000192, output: 16384 }, cost: { input: 0.1394, output: 1.122, cache_read: 0.0697 } }, "minimax/minimax-m2.1": { id: "minimax/minimax-m2.1", name: "MiniMax M2.1", description: "Earlier MiniMax agent model for practical coding and productivity tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 131072 }, cost: { input: 0.33, output: 1.32, cache_read: 0.165 } }, "minimax/minimax-latest": { id: "minimax/minimax-latest", name: "MiniMax Latest", description: "MiniMax multimodal coding model for long-context reasoning and agent tasks", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, release_date: "2026-05-03", last_updated: "2026-05-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 512000, input: 512000, output: 80000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "MarinaraSpaghetti/NemoMix-Unleashed-12B": { id: "MarinaraSpaghetti/NemoMix-Unleashed-12B", name: "NemoMix 12B Unleashed", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, input: 32768, output: 8192 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "deepseek/deepseek-v4-flash:thinking": { id: "deepseek/deepseek-v4-flash:thinking", name: "DeepSeek V4 Flash (Thinking)", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 384000 }, cost: { input: 0.07, output: 0.14, cache_read: 0.014 } }, "deepseek/deepseek-latest": { id: "deepseek/deepseek-latest", name: "DeepSeek Latest", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, structured_output: true, release_date: "2026-05-03", last_updated: "2026-05-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 384000 }, cost: { input: 1.1, output: 2.2, cache_read: 0.11 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 384000 }, cost: { input: 0.07, output: 0.14, cache_read: 0.014 } }, "deepseek/deepseek-v4-flash-0731:thinking": { id: "deepseek/deepseek-v4-flash-0731:thinking", name: "DeepSeek V4 Flash 0731 (Thinking)", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, input: 1e6, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.014 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 384000 }, cost: { input: 1.1, output: 2.2, cache_read: 0.11 } }, "deepseek/deepseek-v4-pro-cheaper": { id: "deepseek/deepseek-v4-pro-cheaper", name: "DeepSeek V4 Pro Cheaper", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, structured_output: true, release_date: "2026-04-25", last_updated: "2026-04-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 384000 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "deepseek/deepseek-v4-flash-0731-cheaper:thinking": { id: "deepseek/deepseek-v4-flash-0731-cheaper:thinking", name: "DeepSeek V4 Flash 0731 Cheaper (Thinking)", description: "DeepSeek V4 Flash 0731 Cheaper Thinking enables reasoning by default on the same re-post-trained Mixture-of-Experts model with a 1M-token context window. This route goes directly to DeepSeek to use its lower cached-input pricing. \u26A0\uFE0F Privacy and logging guarantees are limited.", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, structured_output: true, release_date: "2026-08-01", last_updated: "2026-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.014 } }, "deepseek/deepseek-v4-flash-0731-cheaper": { id: "deepseek/deepseek-v4-flash-0731-cheaper", name: "DeepSeek V4 Flash 0731 Cheaper", description: "DeepSeek V4 Flash 0731 Cheaper is the same re-post-trained Mixture-of-Experts model with a 1M-token context window. This route goes directly to DeepSeek to use its lower cached-input pricing. \u26A0\uFE0F Privacy and logging guarantees are limited.", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, structured_output: true, release_date: "2026-08-01", last_updated: "2026-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.014 } }, "deepseek/deepseek-v4-flash-0731": { id: "deepseek/deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, input: 1e6, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.014 } }, "deepseek/deepseek-v3.2": { id: "deepseek/deepseek-v3.2", name: "DeepSeek V3.2", description: "Hybrid-reasoning DeepSeek model with thinking and non-thinking modes, sparse attention, and tool-use", family: "deepseek", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 163000, input: 163000, output: 65536 }, cost: { input: 0.28, output: 0.42, cache_read: 0.14 } }, "deepseek/deepseek-v4-flash-latest": { id: "deepseek/deepseek-v4-flash-latest", name: "DeepSeek V4 Flash Latest", description: "Compatibility alias that routes to the newest dated DeepSeek V4 Flash release. Currently routes to DeepSeek V4 Flash 0731. \u26A0\uFE0F This route goes directly to DeepSeek, so privacy and logging guarantees are limited.", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, structured_output: true, release_date: "2026-08-02", last_updated: "2026-08-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.014 } }, "deepseek/deepseek-v4-pro:thinking": { id: "deepseek/deepseek-v4-pro:thinking", name: "DeepSeek V4 Pro (Thinking)", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 384000 }, cost: { input: 1.1, output: 2.2, cache_read: 0.11 } }, "deepseek/deepseek-prover-v2-671b": { id: "deepseek/deepseek-prover-v2-671b", name: "DeepSeek Prover v2 671B", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-11-15", last_updated: "2025-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 160000, input: 160000, output: 16384 }, cost: { input: 1, output: 2.5, cache_read: 0.5 } }, "deepseek/deepseek-v3.2:thinking": { id: "deepseek/deepseek-v3.2:thinking", name: "DeepSeek V3.2 Thinking", description: "Hybrid-reasoning DeepSeek model with thinking and non-thinking modes, sparse attention, and tool-use", family: "deepseek", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 163000, input: 163000, output: 65536 }, cost: { input: 0.28, output: 0.42, cache_read: 0.14 } }, "deepseek/deepseek-v4-pro-cheaper:thinking": { id: "deepseek/deepseek-v4-pro-cheaper:thinking", name: "DeepSeek V4 Pro Cheaper (Thinking)", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, structured_output: true, release_date: "2026-04-25", last_updated: "2026-04-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 384000 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "amazon/nova-2-lite-v1": { id: "amazon/nova-2-lite-v1", name: "Amazon Nova 2 Lite", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 65535 }, cost: { input: 0.51, output: 4.25, cache_read: 0.255 } }, "amazon/nova-pro-v1": { id: "amazon/nova-pro-v1", name: "Amazon Nova Pro 1.0", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "nova-pro", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-12-03", last_updated: "2024-12-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 300000, input: 300000, output: 32000 }, cost: { input: 0.799, output: 3.196, cache_read: 0.3995 } }, "amazon/nova-micro-v1": { id: "amazon/nova-micro-v1", name: "Amazon Nova Micro 1.0", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova-micro", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 5120 }, cost: { input: 0.0357, output: 0.1394, cache_read: 0.01785 } }, "amazon/nova-lite-v1": { id: "amazon/nova-lite-v1", name: "Amazon Nova Lite 1.0", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova-lite", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-12-03", last_updated: "2024-12-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 300000, input: 300000, output: 5120 }, cost: { input: 0.0595, output: 0.238, cache_read: 0.02975 } }, "Gryphe/MythoMax-L2-13b": { id: "Gryphe/MythoMax-L2-13b", name: "MythoMax 13B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-08-08", last_updated: "2025-08-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 4000, input: 4000, output: 4096 }, cost: { input: 0.1003, output: 0.1003, cache_read: 0.05015 } }, "LatitudeGames/Wayfarer-Large-70B-Llama-3.3": { id: "LatitudeGames/Wayfarer-Large-70B-Llama-3.3", name: "Llama 3.3 70B Wayfarer", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-02-20", last_updated: "2025-02-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 0.7, output: 0.7, cache_read: 0.35 } }, "ibm-granite/granite-4.1-8b": { id: "ibm-granite/granite-4.1-8b", name: "Granite 4.1 8B", description: "Tool-capable chat model for instruction following and agentic application workflows", family: "granite", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 131072 }, cost: { input: 0.05, output: 0.1, cache_read: 0.05 } }, "x-ai/grok-4.20-multi-agent": { id: "x-ai/grok-4.20-multi-agent", name: "Grok 4.20 Multi-Agent", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: false, structured_output: true, release_date: "2026-03-31", last_updated: "2026-03-31", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, input: 2000000, output: 131072 }, cost: { input: 2, output: 6, cache_read: 1 } }, "x-ai/grok-4.3": { id: "x-ai/grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 1e6 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "x-ai/grok-4.5": { id: "x-ai/grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, input: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.5 } }, "x-ai/grok-build-0.1": { id: "x-ai/grok-build-0.1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 1, output: 2, cache_read: 0.2 } }, "x-ai/grok-4.20": { id: "x-ai/grok-4.20", name: "Grok 4.20", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2026-03-31", last_updated: "2026-03-31", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, input: 2000000, output: 131072 }, cost: { input: 2, output: 6, cache_read: 1 } }, "x-ai/grok-latest": { id: "x-ai/grok-latest", name: "Grok Latest", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2026-05-03", last_updated: "2026-05-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, input: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.5 } }, "alibaba/qwen3.6-27b:thinking": { id: "alibaba/qwen3.6-27b:thinking", name: "Qwen3.6 27B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 131072 }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 260096, input: 260096, output: 65536 }, cost: { input: 0.203, output: 2.24, cache_read: 0.1015 } }, "alibaba/qwen3.6-27b": { id: "alibaba/qwen3.6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 260096, input: 260096, output: 65536 }, cost: { input: 0.203, output: 2.24, cache_read: 0.1015 } }, "alibaba/qwen3.6-flash": { id: "alibaba/qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 991808, input: 991808, output: 65536 }, cost: { input: 0.19, output: 1.16, cache_read: 0.02, cache_write: 0.24 } }, "kwaipilot/kat-coder-pro-v2": { id: "kwaipilot/kat-coder-pro-v2", name: "KAT Coder Pro V2", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "kat-coder", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-03-28", last_updated: "2026-03-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 80000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.15 } }, "kwaipilot/kat-coder-pro-v2.5": { id: "kwaipilot/kat-coder-pro-v2.5", name: "KAT Coder Pro V2.5", description: "Higher-capability KAT Coder model for complex code generation, repository-scale editing, debugging, and agentic software-development workflows.", family: "kat-coder", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-07-14", last_updated: "2026-07-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 80000 }, cost: { input: 0.74, output: 2.96, cache_read: 0.15 } }, "kwaipilot/kat-coder-air-v2.5": { id: "kwaipilot/kat-coder-air-v2.5", name: "KAT Coder Air V2.5", description: "Fast, cost-efficient KAT Coder model for code generation, editing, debugging, and agentic software-development workflows.", family: "kat-coder", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-07-14", last_updated: "2026-07-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 80000 }, cost: { input: 0.15, output: 0.6, cache_read: 0.03 } }, "Envoid/Llama-3.05-NT-Storybreaker-Ministral-70B": { id: "Envoid/Llama-3.05-NT-Storybreaker-Ministral-70B", name: "Llama 3.05 Storybreaker Ministral 70b", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "Envoid/Llama-3.05-Nemotron-Tenyxchat-Storybreaker-70B": { id: "Envoid/Llama-3.05-Nemotron-Tenyxchat-Storybreaker-70B", name: "Nemotron Tenyxchat Storybreaker 70b", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", family: "nemotron", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "NeverSleep/Lumimaid-v0.2-70B": { id: "NeverSleep/Lumimaid-v0.2-70B", name: "Lumimaid v0.2", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 1, output: 1.5, cache_read: 0.5 } }, "Sao10K/L3.3-70B-Euryale-v2.3": { id: "Sao10K/L3.3-70B-Euryale-v2.3", name: "Llama 3.3 70B Euryale", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 20480, input: 20480, output: 16384 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "Sao10K/L3-8B-Stheno-v3.2": { id: "Sao10K/L3-8B-Stheno-v3.2", name: "Sao10K Stheno 8b", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-11-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.2006, output: 0.2006, cache_read: 0.1003 } }, "Sao10K/L3.1-70B-Euryale-v2.2": { id: "Sao10K/L3.1-70B-Euryale-v2.2", name: "Llama 3.1 70B Euryale", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 20480, input: 20480, output: 16384 }, cost: { input: 0.306, output: 0.357, cache_read: 0.153 } }, "Sao10K/L3.1-70B-Hanami-x1": { id: "Sao10K/L3.1-70B-Hanami-x1", name: "Llama 3.1 70B Hanami", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "deepseek-ai/deepseek-v3.2-exp": { id: "deepseek-ai/deepseek-v3.2-exp", name: "DeepSeek V3.2 Exp", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-09-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, input: 163840, output: 65536 }, cost: { input: 0.28, output: 0.42, cache_read: 0.14 } }, "deepseek-ai/DeepSeek-R1-0528": { id: "deepseek-ai/DeepSeek-R1-0528", name: "DeepSeek R1 0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2025-05-28", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 163840 }, cost: { input: 0.4, output: 1.7, cache_read: 0.2 } }, "deepseek-ai/DeepSeek-V3.1": { id: "deepseek-ai/DeepSeek-V3.1", name: "DeepSeek V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-26", last_updated: "2025-07-26", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 0.2, output: 0.7, cache_read: 0.1 } }, "deepseek-ai/deepseek-v3.2-exp-thinking": { id: "deepseek-ai/deepseek-v3.2-exp-thinking", name: "DeepSeek V3.2 Exp Thinking", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-09-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, input: 163840, output: 65536 }, cost: { input: 0.28, output: 0.42, cache_read: 0.14 } }, "deepseek-ai/DeepSeek-V3.1:thinking": { id: "deepseek-ai/DeepSeek-V3.1:thinking", name: "DeepSeek V3.1 Thinking", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek-thinking", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 0.2, output: 0.7, cache_read: 0.1 } }, "deepseek-ai/DeepSeek-V3.1-Terminus:thinking": { id: "deepseek-ai/DeepSeek-V3.1-Terminus:thinking", name: "DeepSeek V3.1 Terminus (Thinking)", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek-thinking", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2024-01-01", last_updated: "2025-09-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 0.25, output: 0.7, cache_read: 0.125 } }, "deepseek-ai/DeepSeek-V3.1-Terminus": { id: "deepseek-ai/DeepSeek-V3.1-Terminus", name: "DeepSeek V3.1 Terminus", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2025-08-02", last_updated: "2025-08-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 0.25, output: 0.7, cache_read: 0.125 } }, "aion-labs/aion-2.0": { id: "aion-labs/aion-2.0", name: "AionLabs: Aion-2.0", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, input: 131072, output: 32768 }, cost: { input: 0.8, output: 1.6, cache_read: 0.2 } }, "aion-labs/aion-3.0-mini": { id: "aion-labs/aion-3.0-mini", name: "AionLabs: Aion 3.0 Mini", description: "Aion 3.0 Mini is a DeepSeek-family collaborative generation model tuned for immersive roleplay and storytelling, with stronger narrative structure, tension, conflict, and nuanced mature themes.", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2026-07-07", last_updated: "2026-07-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, input: 131072, output: 32768 }, cost: { input: 0.7, output: 1.4, cache_read: 0.18 } }, "aion-labs/aion-rp-llama-3.1-8b": { id: "aion-labs/aion-rp-llama-3.1-8b", name: "Llama 3.1 8b (uncensored)", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 16384 }, cost: { input: 0.8, output: 1.6, cache_read: 0.4 } }, "aion-labs/aion-3.0": { id: "aion-labs/aion-3.0", name: "AionLabs: Aion 3.0", description: "Aion 3.0 is a GLM-family collaborative generation model tuned for immersive roleplay and storytelling, with stronger narrative structure, tension, conflict, and nuanced mature themes.", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2026-07-07", last_updated: "2026-07-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, input: 131072, output: 32768 }, cost: { input: 3, output: 6, cache_read: 0.75 } }, "aion-labs/aion-2.5": { id: "aion-labs/aion-2.5", name: "AionLabs: Aion-2.5", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, input: 131072, output: 32768 }, cost: { input: 1, output: 3, cache_read: 0.35 } }, "inflection/inflection-3-pi": { id: "inflection/inflection-3-pi", name: "Inflection 3 Pi", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-11-21", last_updated: "2024-10-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8000, input: 8000, output: 4096 }, cost: { input: 2.499, output: 9.996, cache_read: 1.2495 } }, "inflection/inflection-3-productivity": { id: "inflection/inflection-3-productivity", name: "Inflection 3 Productivity", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-11-21", last_updated: "2024-10-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8000, input: 8000, output: 4096 }, cost: { input: 2.499, output: 9.996, cache_read: 1.2495 } }, "xiaomi/mimo-v2.5:thinking": { id: "xiaomi/mimo-v2.5:thinking", name: "MiMo V2.5 Thinking", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028, cache_write: 0 } }, "xiaomi/mimo-v2.5": { id: "xiaomi/mimo-v2.5", name: "MiMo V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028, cache_write: 0 } }, "xiaomi/mimo-v2.5-pro-crof": { id: "xiaomi/mimo-v2.5-pro-crof", name: "MiMo V2.5 Pro (Crof)", description: "MiMo V2.5 Pro is Xiaomi's long-context flagship general model for coding and agentic orchestration. This separately served variant is intended for users concerned about censorship on the regular Xiaomi MiMo V2.5 Pro, and it is included in the NanoGPT subscription.", family: "mimo-v2.5-pro", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2026-07-23", last_updated: "2026-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, input: 1e6, output: 131072 }, cost: { input: 0.4, output: 0.8, cache_read: 0.003 } }, "xiaomi/mimo-v2.5-pro:thinking": { id: "xiaomi/mimo-v2.5-pro:thinking", name: "MiMo V2.5 Pro Thinking", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 131072 }, cost: { input: 0.435, output: 0.87, cache_read: 0.0036, cache_write: 0 } }, "xiaomi/mimo-v2.5-pro": { id: "xiaomi/mimo-v2.5-pro", name: "MiMo V2.5 Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 131072 }, cost: { input: 0.435, output: 0.87, cache_read: 0.0036, cache_write: 0 } }, "xiaomi/mimo-v2.5-pro-crof:thinking": { id: "xiaomi/mimo-v2.5-pro-crof:thinking", name: "MiMo V2.5 Pro Thinking (Crof)", description: "MiMo V2.5 Pro with Xiaomi thinking enabled for coding, long-context reasoning, and agentic orchestration. This separately served thinking variant is intended for users concerned about censorship on the regular Xiaomi MiMo V2.5 Pro, and it is included in the NanoGPT subscription.", family: "mimo-v2.5-pro", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2026-07-23", last_updated: "2026-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, input: 1e6, output: 131072 }, cost: { input: 0.4, output: 0.8, cache_read: 0.003 } }, "anthropic/claude-opus-4.8:thinking": { id: "anthropic/claude-opus-4.8:thinking", name: "Claude Opus 4.8 Thinking", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "anthropic/claude-sonnet-4.6": { id: "anthropic/claude-sonnet-4.6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "anthropic/claude-opus-4.6:thinking": { id: "anthropic/claude-opus-4.6:thinking", name: "Claude 4.6 Opus Thinking", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "anthropic/claude-fable-5": { id: "anthropic/claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-sonnet-latest": { id: "anthropic/claude-sonnet-latest", name: "Claude Sonnet Latest", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, release_date: "2026-03-01", last_updated: "2026-03-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "anthropic/claude-opus-latest": { id: "anthropic/claude-opus-latest", name: "Claude Opus Latest", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, release_date: "2026-03-29", last_updated: "2026-03-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4.7": { id: "anthropic/claude-opus-4.7", name: "Claude 4.7 Opus", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "anthropic/claude-sonnet-4.6:thinking": { id: "anthropic/claude-sonnet-4.6:thinking", name: "Claude Sonnet 4.6 Thinking", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "anthropic/claude-sonnet-5:thinking": { id: "anthropic/claude-sonnet-5:thinking", name: "Claude Sonnet 5 Thinking", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "anthropic/claude-haiku-latest": { id: "anthropic/claude-haiku-latest", name: "Claude Haiku Latest", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, release_date: "2026-03-29", last_updated: "2026-03-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1 } }, "anthropic/claude-fable-latest": { id: "anthropic/claude-fable-latest", name: "Claude Fable Latest", description: "Compatibility alias for Claude Fable.", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4.6:thinking:medium": { id: "anthropic/claude-opus-4.6:thinking:medium", name: "Claude 4.6 Opus Thinking Medium", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "anthropic/claude-opus-4.7:thinking": { id: "anthropic/claude-opus-4.7:thinking", name: "Claude 4.7 Opus Thinking", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "anthropic/claude-opus-4.8": { id: "anthropic/claude-opus-4.8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "anthropic/claude-sonnet-5": { id: "anthropic/claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "anthropic/claude-opus-5": { id: "anthropic/claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4.6:thinking:max": { id: "anthropic/claude-opus-4.6:thinking:max", name: "Claude 4.6 Opus Thinking Max", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "anthropic/claude-opus-4.6:thinking:low": { id: "anthropic/claude-opus-4.6:thinking:low", name: "Claude 4.6 Opus Thinking Low", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "anthropic/claude-opus-4.6": { id: "anthropic/claude-opus-4.6", name: "Claude 4.6 Opus", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "stepfun-ai/step-3.5-flash": { id: "stepfun-ai/step-3.5-flash", name: "Step 3.5 Flash", description: "StepFun flash lane for quick multimodal reasoning and coding assistance", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-01-29", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0.1, output: 0.3, cache_read: 0.05 } }, "stepfun-ai/step-3.5-flash-2603": { id: "stepfun-ai/step-3.5-flash-2603", name: "Step 3.5 Flash 2603", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0.1, output: 0.3, cache_read: 0.05 } }, "NousResearch/hermes-3-llama-3.1-70b": { id: "NousResearch/hermes-3-llama-3.1-70b", name: "Hermes 3 70B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "nousresearch", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-01-07", last_updated: "2026-01-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, input: 65536, output: 8192 }, cost: { input: 0.408, output: 0.408, cache_read: 0.204 } }, "NousResearch/hermes-4-405b:thinking": { id: "NousResearch/hermes-4-405b:thinking", name: "Hermes 4 Large (Thinking)", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "nousresearch", attachment: false, reasoning: false, tool_call: false, structured_output: true, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 0.3, output: 1.2, cache_read: 0.15 } }, "NousResearch/hermes-4-405b": { id: "NousResearch/hermes-4-405b", name: "Hermes 4 Large", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "nousresearch", attachment: false, reasoning: false, tool_call: false, structured_output: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 0.3, output: 1.2, cache_read: 0.15 } }, "NousResearch/Hermes-4-70B:thinking": { id: "NousResearch/Hermes-4-70B:thinking", name: "Hermes 4 (Thinking)", description: "General-purpose chat model for instruction following, writing, and analysis", family: "nousresearch", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-17", last_updated: "2025-09-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 0.2006, output: 0.3995, cache_read: 0.1003 } }, "NousResearch/hermes-4-70b": { id: "NousResearch/hermes-4-70b", name: "Hermes 4 Medium", description: "General-purpose chat model for instruction following, writing, and analysis", family: "nousresearch", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-03", last_updated: "2025-07-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 0.2006, output: 0.3995, cache_read: 0.1003 } }, "z-ai/glm-4.5v:thinking": { id: "z-ai/glm-4.5v:thinking", name: "GLM 4.5V Thinking", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 64000, input: 64000, output: 96000 }, cost: { input: 0.6, output: 1.8, cache_read: 0.3 } }, "z-ai/glm-4.6": { id: "z-ai/glm-4.6", name: "GLM 4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 65535 }, cost: { input: 0.35, output: 1.4, cache_read: 0.175 } }, "z-ai/glm-4.5v": { id: "z-ai/glm-4.5v", name: "GLM 4.5V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 64000, input: 64000, output: 96000 }, cost: { input: 0.6, output: 1.8, cache_read: 0.3 } }, "z-ai/glm-5-turbo": { id: "z-ai/glm-5-turbo", name: "GLM 5 Turbo", description: "Faster GLM-5 lane for coding agents that need lower latency", family: "glm", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202800, input: 202800, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24 } }, "z-ai/glm-5v-turbo": { id: "z-ai/glm-5v-turbo", name: "GLM 5V Turbo", description: "Fast GLM vision model for screenshots, documents, and multimodal agent tasks", family: "glm", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 202800, input: 202800, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24 } }, "z-ai/glm-4.6:thinking": { id: "z-ai/glm-4.6:thinking", name: "GLM 4.6 Thinking", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 65535 }, cost: { input: 0.35, output: 1.4, cache_read: 0.175 } }, "z-ai/glm-5v-turbo:thinking": { id: "z-ai/glm-5v-turbo:thinking", name: "GLM 5V Turbo Thinking", description: "Fast GLM vision model for screenshots, documents, and multimodal agent tasks", family: "glm", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 202800, input: 202800, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24 } }, "moonshotai/kimi-k2.5": { id: "moonshotai/kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 65536 }, cost: { input: 0.3, output: 1.9, cache_read: 0.15 } }, "moonshotai/kimi-k2.6:thinking": { id: "moonshotai/kimi-k2.6:thinking", name: "Kimi K2.6 Thinking", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 65536 }, cost: { input: 0.5, output: 2.6, cache_read: 0.125 } }, "moonshotai/kimi-k2-instruct-0711": { id: "moonshotai/kimi-k2-instruct-0711", name: "Kimi K2 0711", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2024-01-01", last_updated: "2025-07-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 0.4, output: 1.8, cache_read: 0.2 } }, "moonshotai/kimi-k2.7-code-highspeed": { id: "moonshotai/kimi-k2.7-code-highspeed", name: "Kimi K2.7 Code High-Speed", description: "Lower-latency Kimi Code variant for interactive edits and coding-agent loops", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 65536 }, cost: { input: 1.9, output: 8, cache_read: 0.32 } }, "moonshotai/kimi-k2.6": { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 65536 }, cost: { input: 0.5, output: 2.6, cache_read: 0.125 } }, "moonshotai/Kimi-K2-Instruct-0905": { id: "moonshotai/Kimi-K2-Instruct-0905", name: "Kimi K2 0905", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 262144 }, cost: { input: 0.4, output: 1.8, cache_read: 0.2 } }, "moonshotai/kimi-latest": { id: "moonshotai/kimi-latest", name: "Kimi Latest", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, release_date: "2026-05-03", last_updated: "2026-05-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 1048576 }, cost: { input: 2.5, output: 13.5, cache_read: 0.25 } }, "moonshotai/kimi-k2.7-code": { id: "moonshotai/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 65536 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "moonshotai/kimi-k2-thinking": { id: "moonshotai/kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Thinking Kimi model for slower research passes, planning, and hard technical questions", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-08", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 98304 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "moonshotai/kimi-k3": { id: "moonshotai/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 1048576 }, cost: { input: 2.5, output: 13.5, cache_read: 0.25 } }, "moonshotai/kimi-k2-instruct": { id: "moonshotai/kimi-k2-instruct", name: "Kimi K2 Instruct", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2024-01-01", last_updated: "2025-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 8192 }, cost: { input: 0.4, output: 1.8, cache_read: 0.2 } }, "moonshotai/kimi-k2.5:thinking": { id: "moonshotai/kimi-k2.5:thinking", name: "Kimi K2.5 Thinking", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 65536 }, cost: { input: 0.3, output: 1.9, cache_read: 0.15 } }, "openai/gpt-5.1-codex-mini": { id: "openai/gpt-5.1-codex-mini", name: "GPT 5.1 Codex Mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/gpt-chat-latest": { id: "openai/gpt-chat-latest", name: "GPT Chat Latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, release_date: "2026-05-03", last_updated: "2026-05-03", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 1050000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "openai/gpt-4.1-mini": { id: "openai/gpt-4.1-mini", name: "GPT 4.1 Mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, input: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "openai/gpt-4o": { id: "openai/gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.6-sol": { id: "openai/gpt-5.6-sol", name: "GPT 5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 1050000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "openai/o3-mini-high": { id: "openai/o3-mini-high", name: "OpenAI o3-mini (High)", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2024-01-01", last_updated: "2025-01-31", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-5.1-2025-11-13": { id: "openai/gpt-5.1-2025-11-13", name: "GPT-5.1 (2025-11-13)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2024-01-01", last_updated: "2025-11-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 32768 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4.1-nano": { id: "openai/gpt-4.1-nano", name: "GPT 4.1 Nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, input: 1047576, output: 32768 }, cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0.2, output: 0.3 } }, "openai/gpt-oss-safeguard-20b": { id: "openai/gpt-oss-safeguard-20b", name: "GPT OSS Safeguard 20B", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, release_date: "2026-02-23", last_updated: "2025-10-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0.075, output: 0.3 } }, "openai/o3-mini": { id: "openai/o3-mini", name: "OpenAI o3-mini", description: "Smaller o-series reasoner for economical coding, math, and planning tasks", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-5.6-sol-pro": { id: "openai/gpt-5.6-sol-pro", name: "GPT 5.6 Sol Pro", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 1050000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT 5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "openai/gpt-4o-mini": { id: "openai/gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT 5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/o4-mini-deep-research": { id: "openai/o4-mini-deep-research", name: "OpenAI o4-mini Deep Research", description: "Research model for long-horizon investigation, synthesis, and analytical reports", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium"] }], tool_call: false, structured_output: false, temperature: false, knowledge: "2024-05", release_date: "2024-06-26", last_updated: "2024-06-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 1e5 }, cost: { input: 2.2, output: 8.8, cache_read: 1.1 } }, "openai/o4-mini-high": { id: "openai/o4-mini-high", name: "OpenAI o4-mini high", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2025-12-04", last_updated: "2025-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/o3-deep-research": { id: "openai/o3-deep-research", name: "OpenAI o3 Deep Research", description: "Research model for long-horizon investigation, synthesis, and analytical reports", family: "o", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium"] }], tool_call: false, structured_output: false, temperature: false, knowledge: "2024-05", release_date: "2024-06-26", last_updated: "2024-06-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 1e5 }, cost: { input: 11, output: 44, cache_read: 5.5 } }, "openai/gpt-5-codex": { id: "openai/gpt-5-codex", name: "GPT-5 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 32768 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-3.5-turbo": { id: "openai/gpt-3.5-turbo", name: "GPT-3.5 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2021-09-01", release_date: "2023-03-01", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16385, input: 16385, output: 4096 }, cost: { input: 0.5, output: 1.5 } }, "openai/gpt-latest": { id: "openai/gpt-latest", name: "GPT Latest", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, release_date: "2026-03-29", last_updated: "2026-03-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 1050000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "openai/o1-preview": { id: "openai/o1-preview", name: "OpenAI o1-preview", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-09-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 32768 }, cost: { input: 15, output: 60, cache_read: 7.5 } }, "openai/gpt-4o-2024-11-20": { id: "openai/gpt-4o-2024-11-20", name: "GPT-4o (2024-11-20)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-09", release_date: "2024-11-20", last_updated: "2024-11-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-4o-search-preview": { id: "openai/gpt-4o-search-preview", name: "GPT-4o Search Preview", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-03-10", last_updated: "2024-05-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/o3-pro-2025-06-10": { id: "openai/o3-pro-2025-06-10", name: "OpenAI o3-pro (2025-06-10)", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-pro", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2024-01-01", last_updated: "2025-06-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 1e5 }, cost: { input: 22, output: 88, cache_read: 11 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT 5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 922000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25 } }, "openai/gpt-5.6-luna-pro": { id: "openai/gpt-5.6-luna-pro", name: "GPT 5.6 Luna Pro", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 1050000, output: 128000 }, cost: { input: 0.1, output: 0.6, cache_read: 0.01, cache_write: 0.125 } }, "openai/gpt-5.2-codex": { id: "openai/gpt-5.2-codex", name: "GPT 5.2 Codex", description: "Code-specialist GPT for repository edits, reviews, and long-running software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT 5.4 Nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "openai/gpt-5-pro": { id: "openai/gpt-5-pro", name: "GPT 5 Pro", description: "Higher-accuracy GPT-5 tier for tough analysis, coding reviews, and planning", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: false, structured_output: false, temperature: false, knowledge: "2024-09-30", release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 15, output: 120, cache_read: 1.5 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT 5.4 Mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0.35, output: 0.75 } }, "openai/o1": { id: "openai/o1", name: "OpenAI o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: false, knowledge: "2023-09", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 1e5 }, cost: { input: 15, output: 60, cache_read: 7.5 } }, "openai/gpt-5.6-luna": { id: "openai/gpt-5.6-luna", name: "GPT 5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 1050000, output: 128000 }, cost: { input: 0.1, output: 0.6, cache_read: 0.01, cache_write: 0.125 } }, "openai/o3-mini-low": { id: "openai/o3-mini-low", name: "OpenAI o3-mini (Low)", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2026-01-31", last_updated: "2025-01-31", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT 5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.3-codex": { id: "openai/gpt-5.3-codex", name: "GPT 5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT 5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/o1-pro": { id: "openai/o1-pro", name: "OpenAI o1 Pro", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-pro", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: false, knowledge: "2023-09", release_date: "2025-03-19", last_updated: "2025-03-19", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 1e5 }, cost: { input: 150, output: 600, cache_read: 75 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT 5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4-turbo-preview": { id: "openai/gpt-4-turbo-preview", name: "GPT-4 Turbo Preview", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 4096 }, cost: { input: 10, output: 30 } }, "openai/gpt-4-turbo": { id: "openai/gpt-4-turbo", name: "GPT-4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-12", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 4096 }, cost: { input: 10, output: 30 } }, "openai/gpt-4o-2024-08-06": { id: "openai/gpt-4o-2024-08-06", name: "GPT-4o (2024-08-06)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-09", release_date: "2024-08-06", last_updated: "2024-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.1-codex": { id: "openai/gpt-5.1-codex", name: "GPT 5.1 Codex", description: "Codex GPT for repository edits, code review, and practical software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-5-nano": { id: "openai/gpt-5-nano", name: "GPT 5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "openai/gpt-4o-mini-search-preview": { id: "openai/gpt-4o-mini-search-preview", name: "GPT-4o mini Search Preview", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-03-10", last_updated: "2024-07-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "openai/o3": { id: "openai/o3", name: "OpenAI o3", description: "Deliberate o-series reasoner for hard math, coding, and multi-step analysis", family: "o", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 1 } }, "openai/gpt-5.6-terra": { id: "openai/gpt-5.6-terra", name: "GPT 5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 1050000, output: 128000 }, cost: { input: 1, output: 6, cache_read: 0.1, cache_write: 1.25 } }, "openai/gpt-5.6-terra-pro": { id: "openai/gpt-5.6-terra-pro", name: "GPT 5.6 Terra Pro", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 1050000, output: 128000 }, cost: { input: 1, output: 6, cache_read: 0.1, cache_write: 1.25 } }, "openai/gpt-4.1": { id: "openai/gpt-4.1", name: "GPT 4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, input: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/o4-mini": { id: "openai/o4-mini", name: "OpenAI o4-mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-5.1-codex-max": { id: "openai/gpt-5.1-codex-max", name: "GPT 5.1 Codex Max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 2.5, output: 20, cache_read: 0.25 } }, "meta-llama/llama-3.3-70b-instruct": { id: "meta-llama/llama-3.3-70b-instruct", name: "Llama 3.3 70b Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 16384 }, cost: { input: 0.05, output: 0.23, cache_read: 0.025 } }, "meta-llama/llama-4-maverick": { id: "meta-llama/llama-4-maverick", name: "Llama 4 Maverick", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: false, structured_output: true, release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 65536 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "meta-llama/llama-4-scout": { id: "meta-llama/llama-4-scout", name: "Llama 4 Scout", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: true, reasoning: false, tool_call: true, structured_output: true, release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 328000, input: 328000, output: 65536 }, cost: { input: 0.085, output: 0.46, cache_read: 0.0425 } }, "meta-llama/llama-3.2-3b-instruct": { id: "meta-llama/llama-3.2-3b-instruct", name: "Llama 3.2 3b Instruct", description: "Open Llama multimodal model for image understanding and text reasoning", family: "llama", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-09-25", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 8192 }, cost: { input: 0.0306, output: 0.0493, cache_read: 0.0153 } }, "meta-llama/llama-3.1-8b-instruct": { id: "meta-llama/llama-3.1-8b-instruct", name: "Llama 3.1 8b Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 16384 }, cost: { input: 0.0544, output: 0.085, cache_read: 0.0272 } }, "arcee-ai/trinity-large-thinking": { id: "arcee-ai/trinity-large-thinking", name: "Trinity Large Thinking", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "trinity", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 80000 }, cost: { input: 0.25, output: 0.9, cache_read: 0.125 } }, "bytedance-seed/seed-2.0-lite": { id: "bytedance-seed/seed-2.0-lite", name: "ByteDance Seed 2.0 Lite", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: true, release_date: "2026-03-10", last_updated: "2026-03-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, input: 262144, output: 131072 }, cost: { input: 0.25, output: 2, cache_read: 0.125 } }, "TheDrummer/Cydonia-24B-v2": { id: "TheDrummer/Cydonia-24B-v2", name: "The Drummer Cydonia 24B v2", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-02-17", last_updated: "2025-02-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 32768 }, cost: { input: 0.1003, output: 0.1207, cache_read: 0.05015 } }, "TheDrummer/Cydonia-24B-v4": { id: "TheDrummer/Cydonia-24B-v4", name: "The Drummer Cydonia 24B v4", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-22", last_updated: "2025-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 32768 }, cost: { input: 0.2006, output: 0.2414, cache_read: 0.1003 } }, "TheDrummer/Cydonia-24B-v4.3": { id: "TheDrummer/Cydonia-24B-v4.3", name: "The Drummer Cydonia 24B v4.3", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-25", last_updated: "2025-12-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, input: 32768, output: 32768 }, cost: { input: 0.12, output: 0.15, cache_read: 0.06 } }, "TheDrummer/Anubis-70B-v1": { id: "TheDrummer/Anubis-70B-v1", name: "Anubis 70B v1", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, input: 65536, output: 16384 }, cost: { input: 0.31, output: 0.31, cache_read: 0.155 } }, "TheDrummer/skyfall-36b-v2": { id: "TheDrummer/skyfall-36b-v2", name: "TheDrummer Skyfall 36B V2", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-03-10", last_updated: "2025-03-10", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 32000, input: 32000, output: 32768 }, cost: { input: 0.55, output: 0.8, cache_read: 0.25 } }, "TheDrummer/Anubis-70B-v1.1": { id: "TheDrummer/Anubis-70B-v1.1", name: "Anubis 70B v1.1", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 16384 }, cost: { input: 0.31, output: 0.31, cache_read: 0.155 } }, "TheDrummer/Rocinante-12B-v1.1": { id: "TheDrummer/Rocinante-12B-v1.1", name: "Rocinante 12b", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.408, output: 0.595, cache_read: 0.204 } }, "TheDrummer/Magidonia-24B-v4.3": { id: "TheDrummer/Magidonia-24B-v4.3", name: "The Drummer Magidonia 24B v4.3", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-25", last_updated: "2025-12-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, input: 32768, output: 32768 }, cost: { input: 0.1003, output: 0.1207, cache_read: 0.05015 } }, "TheDrummer/Cydonia-24B-v4.1": { id: "TheDrummer/Cydonia-24B-v4.1", name: "The Drummer Cydonia 24B v4.1", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-08-19", last_updated: "2025-08-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 131072 }, cost: { input: 0.35, output: 0.55, cache_read: 0.16 } }, "TheDrummer/UnslopNemo-12B-v4.1": { id: "TheDrummer/UnslopNemo-12B-v4.1", name: "UnslopNemo 12b v4", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 8192, input: 8192, output: 8192 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "Tongyi-Zhiwen/QwenLong-L1-32B": { id: "Tongyi-Zhiwen/QwenLong-L1-32B", name: "QwenLong L1 32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 40960 }, cost: { input: 0.14, output: 0.6, cache_read: 0.07 } }, "stepfun/step-3.7-flash:thinking": { id: "stepfun/step-3.7-flash:thinking", name: "Step 3.7 Flash Thinking", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 256000 }, cost: { input: 0.2, output: 1.15, cache_read: 0.04 } }, "anthracite-org/magnum-v2-72b": { id: "anthracite-org/magnum-v2-72b", name: "Magnum V2 72B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 2.006, output: 2.992, cache_read: 1.003 } }, "anthracite-org/magnum-v4-72b": { id: "anthracite-org/magnum-v4-72b", name: "Magnum v4 72B", description: "Open Llama multimodal model for image understanding and text reasoning", family: "llama", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 2.006, output: 2.992, cache_read: 1.003 } } } }, fastrouter: { id: "fastrouter", env: ["FASTROUTER_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://go.fastrouter.ai/api/v1", name: "FastRouter", doc: "https://fastrouter.ai/models", models: { "google/veo3.1-fast": { id: "google/veo3.1-fast", name: "Veo 3.1 Fast", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-05-01", last_updated: "2026-05-01", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 400000, output: 0 } }, "google/gemini-3.5-flash": { id: "google/gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9 } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.0375 } }, "google/veo3.1-lite": { id: "google/veo3.1-lite", name: "Veo 3.1 Lite", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-05-01", last_updated: "2026-05-01", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 400000, output: 0 } }, "google/gemini-3-pro-image-preview": { id: "google/gemini-3-pro-image-preview", name: "Nano Banana Pro", description: "Nano Banana Pro for higher-fidelity image generation and design-heavy edits", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 32768 }, cost: { input: 2, output: 12 } }, "google/gemini-3.1-flash-image-preview": { id: "google/gemini-3.1-flash-image-preview", name: "Nano Banana 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 65536 }, cost: { input: 0.5, output: 3 } }, "google/imagen-4.0-fast": { id: "google/imagen-4.0-fast", name: "Imagen 4 Fast", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "imagen", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/veo3.1": { id: "google/veo3.1", name: "Veo 3.1", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-05-01", last_updated: "2026-05-01", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 400000, output: 0 } }, "google/gemma-4-31b-it": { id: "google/gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.13, output: 0.38 } }, "google/gemini-3.1-pro-preview": { id: "google/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12 } }, "google/imagen-4.0-ultra": { id: "google/imagen-4.0-ultra", name: "Imagen 4 Ultra", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "imagen", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.31 } }, "qwen/qwen3-coder": { id: "qwen/qwen3-coder", name: "Qwen3 Coder", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 66536 }, cost: { input: 0.3, output: 1.2 } }, "leonardo-ai/lucid-origin": { id: "leonardo-ai/lucid-origin", name: "Lucid Origin", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "lucid", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-06-01", last_updated: "2025-06-01", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 4096, output: 0 } }, "leonardo-ai/lucid-realism": { id: "leonardo-ai/lucid-realism", name: "Lucid Realism", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "lucid", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-06-01", last_updated: "2025-06-01", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 4096, output: 0 } }, "bytedance/seedance-2": { id: "bytedance/seedance-2", name: "Seedance 2", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "seed", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 4096, output: 0 } }, "minimax/minimax-m2.7-highspeed": { id: "minimax/minimax-m2.7-highspeed", name: "MiniMax-M2.7-highspeed", description: "Low-latency M2.7 variant for interactive coding plans and agent loops", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.4 } }, "minimax/minimax-m2.7": { id: "minimax/minimax-m2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 1.74, output: 3.48 } }, "wanx/wan-v2-6": { id: "wanx/wan-v2-6", name: "Wan 2.6", description: "Video model for prompt-guided generation, editing, and motion workflows", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: true, limit: { context: 400000, output: 0 } }, "x-ai/grok-4": { id: "x-ai/grok-4", name: "Grok 4", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.75, cache_write: 15 } }, "x-ai/grok-4.3": { id: "x-ai/grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5 } }, "x-ai/grok-build-0.1": { id: "x-ai/grok-build-0.1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1, output: 2 } }, "deepseek-ai/deepseek-r1-distill-llama-70b": { id: "deepseek-ai/deepseek-r1-distill-llama-70b", name: "DeepSeek R1 Distill Llama 70B", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2024-10", release_date: "2025-01-23", last_updated: "2025-01-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.03, output: 0.14 } }, "anthropic/claude-sonnet-4.6": { id: "anthropic/claude-sonnet-4.6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 32000 }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15 } }, "anthropic/claude-opus-4.1": { id: "anthropic/claude-opus-4.1", name: "Claude Opus 4.1", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 32000 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-sonnet-4": { id: "anthropic/claude-sonnet-4", name: "Claude Sonnet 4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 32000 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-opus-4.8": { id: "anthropic/claude-opus-4.8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 32000 }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25 } }, "z-ai/glm-5": { id: "z-ai/glm-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.95, output: 3.15 } }, "z-ai/glm-5.1": { id: "z-ai/glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 1.05, output: 3.5 } }, "moonshotai/kimi-k2.6": { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.75, output: 3.5 } }, "moonshotai/kimi-k2": { id: "moonshotai/kimi-k2", name: "Kimi K2", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-07-11", last_updated: "2025-07-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.55, output: 2.2 } }, "openai/gpt-image-2": { id: "openai/gpt-image-2", name: "GPT Image 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 128000, output: 0 } }, "openai/gpt-5.5-pro": { id: "openai/gpt-5.5-pro", name: "GPT-5.5 Pro", description: "Highest-accuracy GPT-5.5 tier for slower, precision-heavy reasoning and coding", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180 } }, "openai/gpt-realtime-1.5": { id: "openai/gpt-realtime-1.5", name: "GPT Realtime 1.5", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-06-01", last_updated: "2025-06-01", modalities: { input: ["text", "audio", "image"], output: ["text", "audio"] }, open_weights: false, limit: { context: 32000, output: 4096 }, cost: { input: 4, output: 16 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0.05, output: 0.2 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30 } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT-5", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-10-01", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 0.6 } }, "openai/gpt-5.3-codex": { id: "openai/gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT-5 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2024-10-01", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/gpt-5-nano": { id: "openai/gpt-5-nano", name: "GPT-5 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2024-10-01", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "openai/gpt-4.1": { id: "openai/gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "sarvam/sarvam-30b": { id: "sarvam/sarvam-30b", name: "Sarvam 30B", description: "Efficient Indian-language reasoning model for chat, coding, and multilingual work", family: "sarvam", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-18", last_updated: "2026-02-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.02, output: 0.1 } }, "sarvam/sarvam-105b": { id: "sarvam/sarvam-105b", name: "Sarvam 105B", description: "Flagship Indian-language reasoning model for enterprise multilingual applications", family: "sarvam", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-09-01", last_updated: "2025-09-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.04, output: 0.16 } } } }, nearai: { id: "nearai", env: ["NEARAI_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://cloud-api.near.ai/v1", name: "NEAR AI Cloud", doc: "https://docs.near.ai/", models: { "google/gemini-3.5-flash": { id: "google/gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, input_audio: 1.5 } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, input_audio: 1 } }, "google/gemini-3-pro": { id: "google/gemini-3-pro", name: "Gemini 3 Pro Preview", description: "Preview Gemini flagship for complex reasoning, coding, and rich multimodal prompts", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 15, cache_read: 0 } }, "google/gemini-3.1-flash-lite": { id: "google/gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "google/gemini-2.5-flash-lite": { id: "google/gemini-2.5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01, input_audio: 0.3 } }, "google/gemma-4-31B-it": { id: "google/gemma-4-31B-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.13, output: 0.4, cache_read: 0.026 } }, "zai-org/GLM-5.1-FP8": { id: "zai-org/GLM-5.1-FP8", name: "GLM-5.1 FP8", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-27", last_updated: "2026-03-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 0.85, output: 3.3 } }, "black-forest-labs/FLUX.2-klein-4B": { id: "black-forest-labs/FLUX.2-klein-4B", name: "FLUX.2 Klein 4B", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-14", last_updated: "2026-01-14", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 1, output: 1 } }, "Qwen/Qwen3.5-122B-A10B": { id: "Qwen/Qwen3.5-122B-A10B", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.4, output: 3.2 } }, "Qwen/Qwen3-Reranker-0.6B": { id: "Qwen/Qwen3-Reranker-0.6B", name: "Qwen3 Reranker 0.6B", description: "Reranking model for improving retrieval quality in search and recommendation systems", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-06-03", last_updated: "2025-06-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 1024 }, cost: { input: 0.01, output: 0.01 } }, "Qwen/Qwen3-30B-A3B-Instruct-2507": { id: "Qwen/Qwen3-30B-A3B-Instruct-2507", name: "Qwen3 30B-A3B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-29", last_updated: "2025-07-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.15, output: 0.55 } }, "Qwen/Qwen3.6-35B-A3B-FP8": { id: "Qwen/Qwen3.6-35B-A3B-FP8", name: "Qwen 3.6 35B A3B FP8", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.17, output: 1.1, cache_read: 0.056 } }, "Qwen/Qwen3-VL-30B-A3B-Instruct": { id: "Qwen/Qwen3-VL-30B-A3B-Instruct", name: "Qwen3-VL 30B-A3B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 32768 }, cost: { input: 0.15, output: 0.55 } }, "Qwen/Qwen3-Embedding-0.6B": { id: "Qwen/Qwen3-Embedding-0.6B", name: "Qwen3 Embedding 0.6B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-06-03", last_updated: "2025-06-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 1024 }, cost: { input: 0.01, output: 0 } }, "anthropic/claude-sonnet-4-6": { id: "anthropic/claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-haiku-4-5": { id: "anthropic/claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "anthropic/claude-opus-4-6": { id: "anthropic/claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-4-5": { id: "anthropic/claude-sonnet-4-5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15.5, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-opus-4-7": { id: "anthropic/claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "openai/gpt-4.1-mini": { id: "openai/gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "openai/gpt-4.1-nano": { id: "openai/gpt-4.1-nano", name: "GPT-4.1 nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "openai/o3-mini": { id: "openai/o3-mini", name: "o3-mini", description: "Smaller o-series reasoner for economical coding, math, and planning tasks", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/whisper-large-v3": { id: "openai/whisper-large-v3", name: "Whisper Large v3", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "whisper", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2023-11-06", last_updated: "2023-11-06", modalities: { input: ["audio"], output: ["text"] }, open_weights: true, limit: { context: 448, output: 448 }, cost: { input: 0.01, output: 0 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT-OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 32768 }, cost: { input: 0.15, output: 0.55 } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.8, output: 15.5, cache_read: 0.18 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-5-nano": { id: "openai/gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "openai/o3": { id: "openai/o3", name: "o3", description: "Deliberate o-series reasoner for hard math, coding, and multi-step analysis", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/gpt-4.1": { id: "openai/gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/o4-mini": { id: "openai/o4-mini", name: "o4-mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.275 } } } }, daoxe: { id: "daoxe", env: ["DAOXE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://daoxe.com/v1", name: "DaoXE", doc: "https://daoxe.com/pricing", models: { "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "grok-4.3": { id: "grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25 } }, "grok-4.5": { id: "grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.5 } }, "claude-haiku-4-5-20251001": { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 5 } }, "gemini-3.1-pro-preview": { id: "gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2 } } } }, crof: { id: "crof", env: ["CROF_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://crof.ai/v1", name: "CrofAI", doc: "https://crof.ai/docs", models: { "glm-5": { id: "glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.48, output: 1.9, cache_read: 0.1, cache_write: 0 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.45, output: 2.15, cache_read: 0.08, cache_write: 0 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.12, output: 0.21, cache_read: 0.003 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.35, output: 1.7, cache_read: 0.07 } }, "greg-1-mini": { id: "greg-1-mini", name: "Greg 1 Mini", description: "Efficient model for low-latency assistance, extraction, and routine automation", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 229376, output: 229376 }, cost: { input: 0.07, output: 0.15, cache_read: 0.01 } }, "glm-4.7-flash": { id: "glm-4.7-flash", name: "GLM-4.7-Flash", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.04, output: 0.3, cache_read: 0.008, cache_write: 0 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.5, output: 2.2, cache_read: 0.08 } }, "qwen3.5-9b": { id: "qwen3.5-9b", name: "Qwen3.5 9B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-13", last_updated: "2026-03-13", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.04, output: 0.15, cache_read: 0.008 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.5, output: 1.99, cache_read: 0.05 } }, "qwen3.6-27b": { id: "qwen3.6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.2, output: 1.5, cache_read: 0.04 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.35, output: 0.8, cache_read: 0.003 } }, "greg-2-super": { id: "greg-2-super", name: "Greg 2 Super", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-06-14", last_updated: "2026-06-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 229376, output: 229376 }, cost: { input: 1.5, output: 5, cache_read: 0.25 } }, "deepseek-v4-flash-0731": { id: "deepseek-v4-flash-0731", name: "DeepSeek V4 Flash (New)", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.12, output: 0.21, cache_read: 0.003 } }, "greg-rp": { id: "greg-rp", name: "Greg (Roleplay)", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 229376, output: 229376 }, cost: { input: 0.1, output: 0.3, cache_read: 0.02 } }, "deepseek-v3.2": { id: "deepseek-v3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-07-22", last_updated: "2025-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 163840 }, cost: { input: 0.18, output: 0.35, cache_read: 0.04 } }, "greg-2-ultra": { id: "greg-2-ultra", name: "Greg 2 Ultra", description: "Flagship model for demanding analysis, coding, and production agent workflows", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-06-14", last_updated: "2026-06-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 229376, output: 229376 }, cost: { input: 3, output: 10, cache_read: 0.5 } }, "glm-4.7": { id: "glm-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.25, output: 1.1, cache_read: 0.05, cache_write: 0 } }, "minimax-m2.5": { id: "minimax-m2.5", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.11, output: 0.95, cache_read: 0.02, cache_write: 0.375 } }, "gemma-4-31b-it": { id: "gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.1, output: 0.3, cache_read: 0.02 } }, "deepseek-v4-pro-lightning": { id: "deepseek-v4-pro-lightning", name: "DeepSeek V4 Pro Lightning", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.8, output: 1.6, cache_read: 0.02 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.55, output: 2.25, cache_read: 0.05 } }, "kimi-k3-eco": { id: "kimi-k3-eco", name: "Kimi K3 Eco", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 1, output: 4, cache_read: 0.1 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 262144 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 2, output: 8, cache_read: 0.25 } }, "mimo-v2.5-pro": { id: "mimo-v2.5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.4, output: 0.8, cache_read: 0.003, tiers: [{ input: 2, output: 6, cache_read: 0.4, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.4 } } }, "qwen3.5-397b-a17b": { id: "qwen3.5-397b-a17b", name: "Qwen3.5 397B-A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.35, output: 1.75, cache_read: 0.07 } }, "kimi-k2.5-lightning": { id: "kimi-k2.5-lightning", name: "Kimi K2.5 (Lightning)", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-02-06", last_updated: "2026-02-06", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 1, output: 3, cache_read: 0.2 } } } }, qvac: { id: "qvac", env: ["QVAC_API_KEY"], npm: "@qvac/ai-sdk-provider", name: "QVAC", doc: "https://www.npmjs.com/package/@qvac/ai-sdk-provider", models: { "gemma4-31b": { id: "gemma4-31b", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "qwen3.6-35b-a3b": { id: "qwen3.6-35b-a3b", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0, output: 0 } }, "gpt-oss-20b": { id: "gpt-oss-20b", name: "GPT OSS 20B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0, output: 0 } }, "qwen3.5-9b": { id: "qwen3.5-9b", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 0, output: 0 } }, "qwen3.6-27b": { id: "qwen3.6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0, output: 0 } }, "qwen3.5-4b": { id: "qwen3.5-4b", name: "Qwen3.5 4B", description: "Qwen instruction model for multilingual chat and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-11-01", last_updated: "2025-11-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 0, output: 0 } }, "qwen3.5-0.8b": { id: "qwen3.5-0.8b", name: "Qwen3.5 0.8B", description: "Qwen instruction model for multilingual chat and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-11-01", last_updated: "2025-11-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 0, output: 0 } }, "qwen3.5-2b": { id: "qwen3.5-2b", name: "Qwen3.5 2B", description: "Qwen instruction model for multilingual chat and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-11-01", last_updated: "2025-11-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 0, output: 0 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0, output: 0 } } } }, "abliteration-ai": { id: "abliteration-ai", env: ["ABLIT_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.abliteration.ai/v1", name: "abliteration.ai", doc: "https://docs.abliteration.ai/models", models: { "abliterated-model-large": { id: "abliterated-model-large", name: "Abliterated Model Large", description: "GLM-5.2 model abliterated and finetuned for cyber, ML red teaming, and agent testing", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }, { type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-25", last_updated: "2026-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 999990 }, cost: { input: 5, output: 5, cache_read: 0.5 } }, "abliterated-model": { id: "abliterated-model", name: "Abliterated Model", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }, { type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-01-06", last_updated: "2026-07-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 150000, input: 150000, output: 8192 }, cost: { input: 3, output: 3, cache_read: 0.3 } } } }, "alibaba-coding-plan-cn": { id: "alibaba-coding-plan-cn", env: ["ALIBABA_CODING_PLAN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://coding.dashscope.aliyuncs.com/v1", name: "Alibaba Coding Plan (China)", doc: "https://help.aliyun.com/zh/model-studio/coding-plan", models: { "qwen3.7-plus": { id: "qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5": { id: "glm-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 16384 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3.5-plus": { id: "qwen3.5-plus", name: "Qwen3.5 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3.7-max": { id: "qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5, cache_write: 3.125 } }, "qwen3-coder-plus": { id: "qwen3-coder-plus", name: "Qwen3 Coder Plus", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-4.7": { id: "glm-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 16384 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3-max-2026-01-23": { id: "qwen3-max-2026-01-23", name: "Qwen3 Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-23", last_updated: "2026-01-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "MiniMax-M2.5": { id: "MiniMax-M2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 24576 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3.6-flash": { id: "qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.1875, output: 1.125, cache_write: 0.234375 } }, "qwen3-coder-next": { id: "qwen3-coder-next", name: "Qwen3 Coder Next", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-03", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3.6-plus": { id: "qwen3.6-plus", name: "Qwen3.6 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, llmgateway: { id: "llmgateway", env: ["LLMGATEWAY_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.llmgateway.io/v1", name: "LLM Gateway", doc: "https://llmgateway.io/docs", models: { "qwen3-coder-480b-a35b-instruct": { id: "qwen3-coder-480b-a35b-instruct", name: "Qwen3-Coder 480B-A35B Instruct", description: "Open Qwen coding heavyweight for repository reasoning and agentic engineering", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.3, output: 1.3 } }, "gpt-5.1-codex-mini": { id: "gpt-5.1-codex-mini", name: "GPT-5.1 Codex mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "grok-4": { id: "grok-4", name: "Grok 4", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 3, output: 15, cache_read: 0.75 } }, "mistral-small-2506": { id: "mistral-small-2506", name: "Mistral Small 3.2", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-06-20", last_updated: "2025-06-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.1, output: 0.3 } }, "qwen3.7-flash": { id: "qwen3.7-flash", name: "Qwen3.7 Flash", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-27", last_updated: "2026-07-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 0.03, output: 0.13, cache_read: 0.006, cache_write: 0.0375 } }, "minimax-m2.7-highspeed": { id: "minimax-m2.7-highspeed", name: "MiniMax-M2.7-highspeed", description: "Low-latency M2.7 variant for interactive coding plans and agent loops", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.4, cache_read: 0.06, cache_write: 0.375 } }, "qwen3.7-plus": { id: "qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.4, output: 1.6, cache_read: 0.08, cache_write: 0.5 } }, "qwen3-vl-plus": { id: "qwen3-vl-plus", name: "Qwen3-VL Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.2, output: 1.6, reasoning: 4.8, cache_read: 0.04, cache_write: 0.25 } }, "grok-4-5": { id: "grok-4-5", name: "Grok 4.5", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.5 } }, "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "grok-build-0-1": { id: "grok-build-0-1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1, output: 2, cache_read: 0.2, tiers: [{ input: 2, output: 4, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2, output: 4, cache_read: 0.4 } } }, "qwen3-32b": { id: "qwen3-32b", name: "Qwen3 32B", description: "Dense open Qwen model for self-hosted chat, reasoning, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 16384 }, cost: { input: 0.1, output: 0.3, reasoning: 8.4 } }, "glm-4.6v": { id: "glm-4.6v", name: "GLM-4.6V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.3, output: 0.9, cache_read: 0.05 } }, "gpt-5.2-pro": { id: "gpt-5.2-pro", name: "GPT-5.2 Pro", description: "Higher-accuracy GPT-5.2 variant for tougher reasoning and review workflows", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 21, output: 168 } }, "seed-1-8-251228": { id: "seed-1-8-251228", name: "Seed 1.8 (251228)", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-18", last_updated: "2025-12-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8192 }, cost: { input: 0.25, output: 2, cache_read: 0.05 } }, "gpt-5.5-pro": { id: "gpt-5.5-pro", name: "GPT-5.5 Pro", description: "Highest-accuracy GPT-5.5 tier for slower, precision-heavy reasoning and coding", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "gpt-4.1-mini": { id: "gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "gpt-4o": { id: "gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "llama-3.1-70b-instruct": { id: "llama-3.1-70b-instruct", name: "Llama 3.1 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 2048 }, status: "beta", cost: { input: 0.72, output: 0.72 } }, "glm-5": { id: "glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 203000, output: 131072 }, cost: { input: 0.72, output: 2.3, cache_read: 0.144, cache_write: 0 } }, "muse-spark-1.1": { id: "muse-spark-1.1", name: "Muse Spark 1.1", description: "Muse Spark is a natively multimodal reasoning model with support for tool-use, visual chain of thought, and multi-agent orchestration.", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-08", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 32000 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "gemini-3.5-flash": { id: "gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, cache_write: 0.08333 } }, "qwen3.6-35b-a3b": { id: "qwen3.6-35b-a3b", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.248, output: 1.485 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "gpt-5.4-pro": { id: "gpt-5.4-pro", name: "GPT-5.4 Pro", description: "More exact GPT-5.4 tier for demanding professional reasoning and agent tasks", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180 } }, "fugu-ultra": { id: "fugu-ultra", name: "Fugu Ultra", description: "Quality-first multi-agent model for hard research, analysis, and competitions", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-06-22", last_updated: "2026-06-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "claude-3-opus": { id: "claude-3-opus", name: "Claude 3 Opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2024-03-04", last_updated: "2024-03-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "grok-4-20-beta-0309-non-reasoning": { id: "grok-4-20-beta-0309-non-reasoning", name: "Grok 4.20 (Non-Reasoning)", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 2, output: 6, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "qwen2-5-vl-72b-instruct": { id: "qwen2-5-vl-72b-instruct", name: "Qwen2.5-VL 72B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 8192 }, cost: { input: 0.25, output: 0.75 } }, "glm-4.5-air": { id: "glm-4.5-air", name: "GLM-4.5-Air", description: "Lighter GLM-4.5 variant for fast coding assistance and cheaper agents", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 98304 }, cost: { input: 0.13, output: 0.85, cache_read: 0.025, cache_write: 0 } }, "qwen-max": { id: "qwen-max", name: "Qwen Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-04-03", last_updated: "2025-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 8192 }, cost: { input: 1.6, output: 6.4 } }, "qwen-omni-turbo": { id: "qwen-omni-turbo", name: "Qwen-Omni Turbo", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-01-19", last_updated: "2025-03-26", modalities: { input: ["text", "image", "audio", "video"], output: ["text", "audio"] }, open_weights: false, limit: { context: 32768, output: 2048 }, cost: { input: 0.2, output: 0.8 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }, { type: "budget_tokens", min: 1, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.931, output: 2.93, cache_read: 0.173, cache_write: 0 } }, "llama-3-70b-instruct": { id: "llama-3-70b-instruct", name: "Llama 3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-04-18", last_updated: "2024-04-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8000 }, cost: { input: 0.51, output: 0.74 } }, "seed-1-6-250915": { id: "seed-1-6-250915", name: "Seed 1.6 (250915)", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8192 }, cost: { input: 0.25, output: 2, cache_read: 0.05 } }, "gemini-3.5-flash-lite": { id: "gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, cache_write: 0.08333 } }, "gpt-4o-mini-transcribe": { id: "gpt-4o-mini-transcribe", name: "GPT-4o Mini Transcribe", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-03-20", last_updated: "2025-03-20", modalities: { input: ["text", "audio"], output: ["text"] }, open_weights: false, limit: { context: 16000, output: 16000 }, cost: { input: 1.25, output: 5 } }, "qwen3-235b-a22b-thinking-2507": { id: "qwen3-235b-a22b-thinking-2507", name: "Qwen3 235B A22B Thinking (2507)", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-08", last_updated: "2025-07-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 8192 }, cost: { input: 0.3, output: 3 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1050000, output: 384000 }, cost: { input: 0.076, output: 0.153, cache_read: 0.014 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.405, output: 1.98, cache_read: 0.225 } }, "minimax-m2.7": { id: "minimax-m2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.08, output: 0.32, cache_read: 0.017, cache_write: 0.375 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gpt-4.1-nano": { id: "gpt-4.1-nano", name: "GPT-4.1 nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "qwen3-coder-30b-a3b-instruct": { id: "qwen3-coder-30b-a3b-instruct", name: "Qwen3-Coder 30B-A3B Instruct", description: "Smaller Qwen coder for efficient local agents and repo-level fixes", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 65536 }, cost: { input: 0.07, output: 0.27 } }, "gpt-oss-20b": { id: "gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32766 }, cost: { input: 0.04, output: 0.15 } }, "glm-4.7-flash": { id: "glm-4.7-flash", name: "GLM-4.7-Flash", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0.06, output: 0.4, cache_read: 0.01, cache_write: 0 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.55, output: 1.9255, cache_read: 0.1375, cache_write: 0 } }, "glm-4.7-flashx": { id: "glm-4.7-flashx", name: "GLM-4.7-FlashX", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0.07, output: 0.4, cache_read: 0.01, cache_write: 0 } }, "qwen3.7-max": { id: "qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 1.25, output: 3.75, cache_read: 0.125, cache_write: 3.125 } }, "ministral-8b-2512": { id: "ministral-8b-2512", name: "Ministral 8B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "mistral", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 8192 }, cost: { input: 0.15, output: 0.15 } }, "qwen3-next-80b-a3b-thinking": { id: "qwen3-next-80b-a3b-thinking", name: "Qwen3-Next 80B-A3B (Thinking)", description: "Efficient Qwen thinking model for local reasoning, math, and coding agents", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 1.2 } }, "ministral-14b-2512": { id: "ministral-14b-2512", name: "Ministral 14B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "mistral", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 8192 }, cost: { input: 0.2, output: 0.2 } }, "ministral-3b-2512": { id: "ministral-3b-2512", name: "Ministral 3B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "mistral", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.1, output: 0.1 } }, "qwen3.5-9b": { id: "qwen3.5-9b", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.1, output: 0.15 } }, "gpt-5.2-chat-latest": { id: "gpt-5.2-chat-latest", name: "GPT-5.2 Chat", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "o3-mini": { id: "o3-mini", name: "o3-mini", description: "Smaller o-series reasoner for economical coding, math, and planning tasks", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "qwen-plus-latest": { id: "qwen-plus-latest", name: "Qwen Plus Latest", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-01-25", last_updated: "2025-01-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 8192 }, cost: { input: 0.4, output: 1.2, cache_read: 0.08, cache_write: 0.5 } }, "kimi-k2.7-code-highspeed": { id: "kimi-k2.7-code-highspeed", name: "Kimi K2.7 Code Highspeed", description: "Lower-latency Kimi Code variant for interactive edits and coding-agent loops", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.9, output: 8, cache_read: 0.38 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.22, output: 1.137, cache_read: 0.048 } }, "minimax-m2.1-lightning": { id: "minimax-m2.1-lightning", name: "MiniMax M2.1 Lightning", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 131072 }, cost: { input: 0.12, output: 0.48 } }, "grok-4-20-beta-0309-reasoning": { id: "grok-4-20-beta-0309-reasoning", name: "Grok 4.20 (Reasoning)", description: "Reasoning Grok for document-heavy analysis and long-horizon tool use", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 2, output: 6, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "gemini-pro-latest": { id: "gemini-pro-latest", name: "Gemini Pro Latest", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-27", last_updated: "2026-02-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2 } }, "glm-4-32b-0414-128k": { id: "glm-4-32b-0414-128k", name: "GLM-4 32B (0414-128k)", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.1, output: 0.1 } }, sonar: { id: "sonar", name: "Sonar", description: "Fast web-grounded Sonar for current answers, citations, and lightweight retrieval", family: "sonar", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 130000, output: 4096 }, cost: { input: 1, output: 1 } }, "seed-1-6-flash-250715": { id: "seed-1-6-flash-250715", name: "Seed 1.6 Flash (250715)", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-26", last_updated: "2025-07-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8192 }, cost: { input: 0.07, output: 0.3, cache_read: 0.015 } }, "sonar-pro": { id: "sonar-pro", name: "Sonar Pro", description: "Deeper Sonar search model with broader retrieval and stronger synthesis", family: "sonar-pro", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 3, output: 15 } }, "nemotron-3-nano-omni": { id: "nemotron-3-nano-omni", name: "Nemotron 3 Nano Omni", description: "Omni-modal model for text, vision, audio, and multimodal agent tasks", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-28", last_updated: "2026-04-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.06, output: 0.24 } }, "llama-3.2-11b-instruct": { id: "llama-3.2-11b-instruct", name: "Llama 3.2 11B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.07, output: 0.33 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "gemini-3-flash-preview": { id: "gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05 } }, "gpt-4o-mini": { id: "gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "llama-4-scout-17b-instruct": { id: "llama-4-scout-17b-instruct", name: "Llama 4 Scout 17B Instruct", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 2048 }, cost: { input: 0.18, output: 0.59 } }, "minimax-m3": { id: "minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 128000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "gpt-5": { id: "gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "qwen3-max": { id: "qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen3 model for coding agents, complex reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.845, output: 3.38, cache_read: 0.6, cache_write: 3.75 } }, "gemma-4-26b-a4b-it": { id: "gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.07, output: 0.34 } }, "llama-3.3-70b-instruct": { id: "llama-3.3-70b-instruct", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 4096 }, cost: { input: 0.13, output: 0.4 } }, "gpt-3.5-turbo": { id: "gpt-3.5-turbo", name: "GPT-3.5-turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2021-09-01", release_date: "2023-03-01", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16385, output: 4096 }, cost: { input: 0.5, output: 1.5, cache_read: 0 } }, "claude-sonnet-4-5": { id: "claude-sonnet-4-5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "minicpm-v-4.5": { id: "minicpm-v-4.5", name: "MiniCPM-V 4.5", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 }, cost: { input: 0.658, output: 1.11 } }, hy3: { id: "hy3", name: "Hy3", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 64000 }, cost: { input: 0.14, output: 0.58, cache_read: 0.035 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1050000, output: 384000 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "glm-4.6": { id: "glm-4.6", name: "GLM-4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.55, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "grok-4-3": { id: "grok-4-3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.3125, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "gpt-4o-search-preview": { id: "gpt-4o-search-preview", name: "GPT-4o Search Preview", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2024-10-01", last_updated: "2024-10-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10 } }, "qwen3-coder-plus": { id: "qwen3-coder-plus", name: "Qwen3 Coder Plus", description: "Hosted Qwen coder for software agents, repo edits, and long-context code", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 6, output: 60, cache_read: 1.2, cache_write: 7.5 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25 } }, "llama-4-maverick-17b-instruct": { id: "llama-4-maverick-17b-instruct", name: "Llama 4 Maverick 17B Instruct", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 2048 }, cost: { input: 0.27, output: 0.85 } }, "gpt-5.3-chat-latest": { id: "gpt-5.3-chat-latest", name: "GPT-5.3 Chat (latest)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "minimax-m2.5-highspeed": { id: "minimax-m2.5-highspeed", name: "MiniMax-M2.5-highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-13", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.4, cache_read: 0.03, cache_write: 0.375 } }, "qwen3.8-max": { id: "qwen3.8-max", name: "Qwen3.8 Max Preview", description: "Preview Qwen flagship for million-token multimodal reasoning and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "xhigh"] }, { type: "budget_tokens" }], tool_call: true, temperature: true, release_date: "2026-07-19", last_updated: "2026-07-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 1.815, output: 5.4461, cache_read: 0.21, cache_write: 2.5 } }, "grok-4-1-fast-reasoning": { id: "grok-4-1-fast-reasoning", name: "Grok 4.1 Fast Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-11-19", last_updated: "2025-11-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "qwen3-235b-a22b-fp8": { id: "qwen3-235b-a22b-fp8", name: "Qwen3 235B A22B FP8", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-28", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 8192 }, cost: { input: 0.2, output: 0.8 } }, "glm-4.5": { id: "glm-4.5", name: "GLM-4.5", description: "Hybrid-reasoning GLM release that made the 4.5 line broadly useful", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 98304 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "cosmos3-super-reasoner": { id: "cosmos3-super-reasoner", name: "Cosmos 3 Super Reasoner", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.1, output: 0.3 } }, "claude-sonnet-4-5-20250929": { id: "claude-sonnet-4-5-20250929", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "glm-4.5v": { id: "glm-4.5v", name: "GLM-4.5V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.6, output: 1.8, cache_read: 0.11 } }, "gpt-5.2-codex": { id: "gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Code-specialist GPT for repository edits, reviews, and long-running software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "qwen3-coder-flash": { id: "qwen3-coder-flash", name: "Qwen3 Coder Flash", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.3, output: 1.5, cache_read: 0.06, cache_write: 0.375 } }, "glm-4.6v-flashx": { id: "glm-4.6v-flashx", name: "GLM-4.6V FlashX", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16000 }, cost: { input: 0.04, output: 0.4, cache_read: 0.004 } }, "qwen2-5-vl-32b-instruct": { id: "qwen2-5-vl-32b-instruct", name: "Qwen2.5 VL 32B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-03-15", last_updated: "2025-03-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 1.4, output: 4.2 } }, "claude-opus-4-5-20251101": { id: "claude-opus-4-5-20251101", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }, { type: "budget_tokens", min: 1024, max: 31999 }], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-01", last_updated: "2025-11-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gpt-5.4-nano": { id: "gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "gemma-3-27b": { id: "gemma-3-27b", name: "Gemma 3 27B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-03-12", last_updated: "2025-03-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 110000, output: 110000 }, cost: { input: 0.1, output: 0.3 } }, "qwen3-235b-a22b-instruct-2507": { id: "qwen3-235b-a22b-instruct-2507", name: "Qwen3 235B A22B Instruct (2507)", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-08", last_updated: "2025-07-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 8192 }, cost: { input: 0.09, output: 0.58 } }, "qwen3-vl-235b-a22b-instruct": { id: "qwen3-vl-235b-a22b-instruct", name: "Qwen3 VL 235B A22B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 8192 }, cost: { input: 0.2, output: 0.88, cache_read: 0.11 } }, "qwen35-397b-a17b": { id: "qwen35-397b-a17b", name: "Qwen3.5 397B-A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.6, output: 3.6 } }, "gpt-5-pro": { id: "gpt-5-pro", name: "GPT-5 Pro", description: "Higher-accuracy GPT-5 tier for tough analysis, coding reviews, and planning", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 272000 }, cost: { input: 15, output: 120 } }, "qwen-flash": { id: "qwen-flash", name: "Qwen Flash", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.05, output: 0.4, cache_read: 0.01, cache_write: 0.0625 } }, "codestral-2508": { id: "codestral-2508", name: "Codestral", description: "Mistral coding model for code completion, generation, and developer workflows", family: "mistral", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-07-30", last_updated: "2025-07-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 0.3, output: 0.9 } }, "llama-3.1-nemotron-ultra-253b": { id: "llama-3.1-nemotron-ultra-253b", name: "Llama 3.1 Nemotron Ultra 253B", description: "Flagship Nemotron model for high-throughput reasoning and complex agents", family: "nemotron", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-04-07", last_updated: "2025-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.6, output: 1.8 } }, "deepseek-v3.2": { id: "deepseek-v3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 16384 }, cost: { input: 0.26, output: 0.38, cache_read: 0.13 } }, "gemini-3.6-flash": { id: "gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15, cache_write: 0.08333 } }, "muse-spark-1.2": { id: "muse-spark-1.2", name: "Muse Spark 1.2", description: "Muse Spark 1.2 is a coding-focused update to Muse Spark 1.1 with improvements in code generation, complex debugging, codebase understanding, and end-to-end developer workflows.", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-05", last_updated: "2026-08-05", modalities: { input: ["text", "image", "video", "pdf", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "qwen3-vl-flash": { id: "qwen3-vl-flash", name: "Qwen3 VL Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-09", last_updated: "2025-10-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.01 } }, "mimo-v2.5": { id: "mimo-v2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028, tiers: [{ input: 0.8, output: 4, cache_read: 0.16, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.8, output: 4, cache_read: 0.16 } } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "gemini-3.1-flash-lite": { id: "gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, cache_write: 0.08333 } }, "qwen-plus": { id: "qwen-plus", name: "Qwen Plus", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-01-25", last_updated: "2025-09-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.4, output: 1.2, reasoning: 4, cache_read: 0.08, cache_write: 0.5 } }, "glm-4.7": { id: "glm-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.38, output: 1.98, cache_read: 0.19, cache_write: 0 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32766 }, cost: { input: 0.032, output: 0.14, cache_read: 0.032 } }, "minimax-m2.5": { id: "minimax-m2.5", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 228700, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "minimax-m2": { id: "minimax-m2", name: "MiniMax-M2", description: "Efficient open MiniMax model built for coding agents and tool-heavy workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 128000 }, cost: { input: 0.2, output: 1, cache_read: 0.03 } }, o1: { id: "o1", name: "o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2023-09", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 15, output: 60, cache_read: 7.5 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, cache_write: 0.25 } }, "gemma-4-31b-it": { id: "gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.102, output: 0.297, cache_read: 0.012 } }, "hermes-4-405b": { id: "hermes-4-405b", name: "Hermes 4 405B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "hermes", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 1, output: 3 } }, "llama-3.2-3b-instruct": { id: "llama-3.2-3b-instruct", name: "Llama 3.2 3B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-09-18", last_updated: "2024-09-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32000 }, cost: { input: 0.03, output: 0.05 } }, "gpt-5.2": { id: "gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5.3-codex": { id: "gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "claude-haiku-4-5-20251001": { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "glm-4.5-airx": { id: "glm-4.5-airx", name: "GLM-4.5 AirX", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.1, output: 4.5, cache_read: 0.22 } }, "minimax-text-01": { id: "minimax-text-01", name: "MiniMax Text 01", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-01-15", last_updated: "2025-01-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0.2, output: 1.1 } }, "kimi-k2": { id: "kimi-k2", name: "Kimi K2", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-11", last_updated: "2025-07-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 0.57, output: 2.3, cache_read: 0.5 } }, "gemini-3.1-pro-preview": { id: "gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "qwen3.6-flash": { id: "qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.05, cache_write: 0.3125 } }, "gpt-5.1": { id: "gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "claude-haiku-4-5-free": { id: "claude-haiku-4-5-free", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 200000 }, cost: { input: 0, output: 0 } }, "qwen3-30b-a3b-instruct-2507": { id: "qwen3-30b-a3b-instruct-2507", name: "Qwen3 30B A3B Instruct (2507)", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-08", last_updated: "2025-07-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 8192 }, cost: { input: 0.1, output: 0.3 } }, "devstral-2512": { id: "devstral-2512", name: "Devstral 2", description: "Mistral's coding-agent model for repository work, terminal tasks, and software fixes", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-12", release_date: "2025-12-09", last_updated: "2025-12-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0.4, output: 2 } }, "gpt-4-turbo": { id: "gpt-4-turbo", name: "GPT-4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-12", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 10, output: 30 } }, "kimi-k2-thinking": { id: "kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Thinking Kimi model for slower research passes, planning, and hard technical questions", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-08", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 2.5, cache_read: 0.06 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "grok-4-1-fast-non-reasoning": { id: "grok-4-1-fast-non-reasoning", name: "Grok 4.1 Fast Non-Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-11-19", last_updated: "2025-11-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, auto: { id: "auto", name: "Auto Route", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "gpt-5.1-codex": { id: "gpt-5.1-codex", name: "GPT-5.1 Codex", description: "Codex GPT for repository edits, code review, and practical software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, custom: { id: "custom", name: "Custom Model", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "gpt-5-nano": { id: "gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "qwen3-vl-30b-a3b-instruct": { id: "qwen3-vl-30b-a3b-instruct", name: "Qwen3 VL 30B A3B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-02", last_updated: "2025-10-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 8192 }, cost: { input: 0.15, output: 0.6 } }, "mimo-v2.5-pro": { id: "mimo-v2.5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0.435, output: 0.87, cache_read: 0.0036, tiers: [{ input: 2, output: 6, cache_read: 0.4, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.4 } } }, "gpt-4o-mini-search-preview": { id: "gpt-4o-mini-search-preview", name: "GPT-4o Mini Search Preview", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2024-10-01", last_updated: "2024-10-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gemini-2.5-flash-lite": { id: "gemini-2.5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01 } }, "minimax-m2.1": { id: "minimax-m2.1", name: "MiniMax-M2.1", description: "Earlier MiniMax agent model for practical coding and productivity tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.27, output: 1.1 } }, o3: { id: "o3", name: "o3", description: "Deliberate o-series reasoner for hard math, coding, and multi-step analysis", family: "o", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 2.5 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: false, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "nemotron-3-ultra-550b": { id: "nemotron-3-ultra-550b", name: "Nemotron 3 Ultra 550B A55B", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 128000 }, cost: { input: 0.5, output: 2.5, cache_read: 0.15 } }, "mistral-large-latest": { id: "mistral-large-latest", name: "Mistral Large (latest)", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 262144 }, cost: { input: 4, output: 12 } }, "qwen3-vl-235b-a22b-thinking": { id: "qwen3-vl-235b-a22b-thinking", name: "Qwen3 VL 235B A22B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.98, output: 3.95 } }, "qwen3.6-max-preview": { id: "qwen3.6-max-preview", name: "Qwen3.6 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 1.3, output: 7.8, cache_read: 0.13, cache_write: 1.625 } }, "glm-4.5-x": { id: "glm-4.5-x", name: "GLM-4.5 X", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, status: "beta", cost: { input: 2.2, output: 8.9, cache_read: 0.45 } }, "nemotron-3-nano-30b": { id: "nemotron-3-nano-30b", name: "Nemotron 3 Nano 30B", description: "Compact Nemotron model for efficient reasoning and deployable AI agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-15", last_updated: "2025-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.06, output: 0.24 } }, "gpt-4.1": { id: "gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "qwen-coder-plus": { id: "qwen-coder-plus", name: "Qwen Coder Plus", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-09-18", last_updated: "2024-09-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.502, output: 1.004 } }, "o4-mini": { id: "o4-mini", name: "o4-mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.275 } }, "grok-4-20-reasoning": { id: "grok-4-20-reasoning", name: "Grok 4.20 (Reasoning)", description: "Reasoning Grok for document-heavy analysis and long-horizon tool use", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "kimi-k3-fast": { id: "kimi-k3-fast", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1040384, output: 131072 }, cost: { input: 4.5, output: 22.5, cache_read: 0.45 } }, "claude-opus-5": { id: "claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "qwen3-coder-next": { id: "qwen3-coder-next", name: "Qwen3 Coder Next", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.108, output: 0.675, cache_read: 0.06 } }, "gpt-4": { id: "gpt-4", name: "GPT-4", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-11", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 8192 }, cost: { input: 30, output: 60 } }, "nemotron-3-super-120b": { id: "nemotron-3-super-120b", name: "Nemotron 3 Super 120B", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.3, output: 0.9 } }, "qwen3.6-plus": { id: "qwen3.6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 0.625, tiers: [{ input: 2, output: 6, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.2, cache_write: 2.5 } } }, "claude-opus-4-1-20250805": { id: "claude-opus-4-1-20250805", name: "Claude Opus 4.1", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }, { type: "budget_tokens", min: 1024, max: 31999 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "seed-1-6-250615": { id: "seed-1-6-250615", name: "Seed 1.6 (250615)", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-06-25", last_updated: "2025-06-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8192 }, cost: { input: 0.25, output: 2, cache_read: 0.05 } }, "qwen-max-latest": { id: "qwen-max-latest", name: "Qwen Max Latest", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-01-25", last_updated: "2025-01-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 8192 }, cost: { input: 1.6, output: 6.4 } }, "qwen3-next-80b-a3b-instruct": { id: "qwen3-next-80b-a3b-instruct", name: "Qwen3-Next 80B-A3B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 1.2 } }, "gpt-4o-transcribe": { id: "gpt-4o-transcribe", name: "GPT-4o Transcribe", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-03-20", last_updated: "2025-03-20", modalities: { input: ["text", "audio"], output: ["text"] }, open_weights: false, limit: { context: 16000, output: 16000 }, cost: { input: 2.5, output: 10 } }, "grok-4-20-non-reasoning": { id: "grok-4-20-non-reasoning", name: "Grok 4.20 (Non-Reasoning)", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "hermes-4-70b": { id: "hermes-4-70b", name: "Hermes 4 70B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "hermes", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.13, output: 0.4 } }, "sonar-reasoning-pro": { id: "sonar-reasoning-pro", name: "Sonar Reasoning Pro", description: "Web-grounded Sonar for multi-step research questions that need cited reasoning", family: "sonar-reasoning", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 2, output: 8 } }, "mistral-large-2512": { id: "mistral-large-2512", name: "Mistral Large 3", description: "Mistral's largest general model for enterprise agents, coding, and multilingual reasoning", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.5, output: 1.5 } } } }, kenari: { id: "kenari", env: ["KENARI_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://kenari.id/v1", name: "Kenari", doc: "https://kenari.id/docs", models: { "gpt-image-2": { id: "gpt-image-2", name: "GPT-Image-2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 272000, output: 16384 }, cost: { input: 0, output: 0 } }, "mimo-v2-5": { id: "mimo-v2-5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0 } }, "grok-4-5": { id: "grok-4-5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 0, output: 0 } }, "grok-build-0-1": { id: "grok-build-0-1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0, output: 0 } }, "nemotron-3-nano-30b-a3b": { id: "nemotron-3-nano-30b-a3b", name: "Nemotron 3 Nano 30B A3B", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-12-15", last_updated: "2025-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0 } }, "kimi-k2-6": { id: "kimi-k2-6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 0, output: 0 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0, output: 0 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 0, output: 0 } }, "gpt-oss-20b": { id: "gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0, output: 0 } }, "kimi-k2-7-code:free": { id: "kimi-k2-7-code:free", name: "Kimi K2.7 Code (Free)", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0 } }, "gpt-5-6-luna": { id: "gpt-5-6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, cost: { input: 0, output: 0 } }, "mimo-v2-5:free": { id: "mimo-v2-5:free", name: "MiMo-V2.5 (Free)", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0 } }, "nemotron-3-super-120b-a12b": { id: "nemotron-3-super-120b-a12b", name: "Nemotron 3 Super 120B A12B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium"] }], tool_call: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0 } }, "minimax-m3": { id: "minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 512000, output: 128000 }, cost: { input: 0, output: 0 } }, "gemini-3-1-flash-lite": { id: "gemini-3-1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0, output: 0 } }, "kimi-k2-7-code": { id: "kimi-k2-7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0 } }, "gpt-5-4-mini": { id: "gpt-5-4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0, output: 0 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0, output: 0 } }, "deepseek-v4-flash:free": { id: "deepseek-v4-flash:free", name: "DeepSeek V4 Flash (Free)", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0, output: 0 } }, "glm-5-2": { id: "glm-5-2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0 } }, "gemini-2-5-flash-lite": { id: "gemini-2-5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0, output: 0 } }, "qwen3-7-plus": { id: "qwen3-7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0, output: 0 } }, "gpt-5-6-terra": { id: "gpt-5-6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, cost: { input: 0, output: 0 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0, output: 0 } }, "gemma-4-31b-it": { id: "gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "nemotron-3-ultra-550b-a55b": { id: "nemotron-3-ultra-550b-a55b", name: "Nemotron 3 Ultra 550B A55B", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high"] }], tool_call: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 0, output: 0 } }, "gpt-5-6-sol": { id: "gpt-5-6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, cost: { input: 0, output: 0 } }, "glm-4-7-flash:free": { id: "glm-4-7-flash:free", name: "GLM-4.7-Flash (Free)", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0, output: 0 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 0, output: 0 } }, "glm-5-1": { id: "glm-5-1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0, output: 0 } }, "gemini-2-5-flash": { id: "gemini-2-5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0, output: 0 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 0, output: 0 } }, "nemotron-3-super-120b-a12b:free": { id: "nemotron-3-super-120b-a12b:free", name: "Nemotron 3 Super 120B A12B (Free)", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium"] }], tool_call: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0 } }, "kimi-k2-6:free": { id: "kimi-k2-6:free", name: "Kimi K2.6 (Free)", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0 } }, "mimo-v2-5-pro": { id: "mimo-v2-5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0 } }, "gpt-5-5": { id: "gpt-5-5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0, output: 0 } } } }, friendli: { id: "friendli", env: ["FRIENDLI_TOKEN"], npm: "@ai-sdk/openai-compatible", api: "https://api.friendli.ai/serverless/v1", name: "Friendli", doc: "https://friendli.ai/docs/guides/serverless_endpoints/introduction", models: { "google/gemma-4-31B-it": { id: "google/gemma-4-31B-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.14, output: 0.4 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "zai-org/GLM-5.1": { id: "zai-org/GLM-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "MiniMaxAI/MiniMax-M2.5": { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 196608 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "deepseek-ai/DeepSeek-V3.2": { id: "deepseek-ai/DeepSeek-V3.2", name: "DeepSeek-V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 163840 }, cost: { input: 0.5, output: 1.5, cache_read: 0.25 } } } }, opencode: { id: "opencode", env: ["OPENCODE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://opencode.ai/zen/v1", name: "OpenCode Zen", doc: "https://opencode.ai/docs/zen", models: { "gpt-5.1-codex-mini": { id: "gpt-5.1-codex-mini", name: "GPT-5.1 Codex Mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "trinity-large-preview-free": { id: "trinity-large-preview-free", name: "Trinity Large Preview", description: "Legacy model retained for compatibility with older integrations", family: "trinity", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2026-01-28", last_updated: "2026-01-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, status: "deprecated", cost: { input: 0, output: 0 } }, "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, interleaved: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-02-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gpt-5.5-pro": { id: "gpt-5.5-pro", name: "GPT-5.5 Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 30, output: 180, cache_read: 30 } }, "hy3-preview-free": { id: "hy3-preview-free", name: "Hy3 preview Free", description: "Legacy model retained for compatibility with older integrations", family: "hy3-free", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "glm-5": { id: "glm-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.2 } }, "gemini-3.5-flash": { id: "gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, provider: { npm: "@ai-sdk/google" }, cost: { input: 1.5, output: 9, cache_read: 0.15, input_audio: 1.5 } }, "gpt-5.3-codex-spark": { id: "gpt-5.3-codex-spark", name: "GPT-5.3 Codex Spark", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex-spark", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "gpt-5.4-pro": { id: "gpt-5.4-pro", name: "GPT-5.4 Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 30, output: 180, cache_read: 30 } }, "qwen3.5-plus": { id: "qwen3.5-plus", name: "Qwen3.5 Plus", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, cache_write: 0.25 } }, "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 45, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1, cache_write: 12.5 } } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "gemini-3.5-flash-lite": { id: "gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, provider: { npm: "@ai-sdk/google" }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "minimax-m3-free": { id: "minimax-m3-free", name: "MiniMax-M3 Free", description: "Legacy model retained for compatibility with older integrations", family: "minimax-m3-free", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-31", last_updated: "2026-05-31", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 32000 }, status: "deprecated", provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0, output: 0, cache_read: 0 } }, "glm-4.7-free": { id: "glm-4.7-free", name: "GLM-4.7 Free", description: "Legacy model retained for compatibility with older integrations", family: "glm-free", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "gemini-3.1-pro": { id: "gemini-3.1-pro", name: "Gemini 3.1 Pro Preview", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, provider: { npm: "@ai-sdk/google" }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-10", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.6, output: 3, cache_read: 0.08 } }, "minimax-m2.7": { id: "minimax-m2.7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "north-mini-code-free": { id: "north-mini-code-free", name: "North Mini Code Free", description: "Cohere coding model for practical software engineering and agentic edits", family: "north-free", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-09-23", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0, output: 0 } }, "longcat-2.0-free": { id: "longcat-2.0-free", name: "LongCat-2.0 Free", description: "Meituan LongCat-2.0, a reasoning model with tool calling and a 1M-token context window", family: "longcat", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0 } }, "qwen3.6-plus-free": { id: "qwen3.6-plus-free", name: "Qwen3.6 Plus Free", description: "Legacy model retained for compatibility with older integrations", family: "qwen-free", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, status: "deprecated", provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0, output: 0, cache_read: 0 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "ling-3.0-flash-free": { id: "ling-3.0-flash-free", name: "Ling-3.0-flash Free", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "ling", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-23", last_updated: "2026-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "laguna-s-2.1-free": { id: "laguna-s-2.1-free", name: "Laguna S 2.1 Free", description: "Agentic coding model from Poolside in the XS size class for local deployment", family: "laguna", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 32000 }, cost: { input: 0, output: 0, cache_read: 0 } }, "deepseek-v4-flash-free": { id: "deepseek-v4-flash-free", name: "DeepSeek V4 Flash Free", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0, output: 0, cache_read: 0 } }, "gemini-3-flash": { id: "gemini-3-flash", name: "Gemini 3 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, provider: { npm: "@ai-sdk/google" }, cost: { input: 0.5, output: 3, cache_read: 0.05 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-10", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "glm-5-free": { id: "glm-5-free", name: "GLM-5 Free", description: "Legacy model retained for compatibility with older integrations", family: "glm-free", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "mimo-v2-omni-free": { id: "mimo-v2-omni-free", name: "MiMo V2 Omni Free", description: "Legacy model retained for compatibility with older integrations", family: "mimo-omni-free", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 64000 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "claude-opus-4-1": { id: "claude-opus-4-1", name: "Claude Opus 4.1", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, status: "deprecated", provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "minimax-m3": { id: "minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 512000, output: 128000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "gpt-5": { id: "gpt-5", name: "GPT-5", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 1.07, output: 8.5, cache_read: 0.107 } }, "minimax-m2.5-free": { id: "minimax-m2.5-free", name: "MiniMax-M2.5 Free", description: "Legacy model retained for compatibility with older integrations", family: "minimax-free", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, status: "deprecated", provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0, output: 0, cache_read: 0 } }, "gpt-5-codex": { id: "gpt-5-codex", name: "GPT-5 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 1.07, output: 8.5, cache_read: 0.107 } }, "claude-sonnet-4-5": { id: "claude-sonnet-4-5", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, interleaved: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "minimax-m2.1-free": { id: "minimax-m2.1-free", name: "MiniMax-M2.1 Free", description: "Legacy model retained for compatibility with older integrations", family: "minimax-free", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, status: "deprecated", provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0, output: 0, cache_read: 0 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 1.74, output: 3.84, cache_read: 0.145 } }, "gemini-3-pro": { id: "gemini-3-pro", name: "Gemini 3 Pro", description: "Legacy model retained for compatibility with older integrations", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, status: "deprecated", provider: { npm: "@ai-sdk/google" }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "glm-4.6": { id: "glm-4.6", name: "GLM-4.6", description: "Legacy model retained for compatibility with older integrations", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, status: "deprecated", cost: { input: 0.6, output: 2.2, cache_read: 0.1 } }, "mimo-v2-flash-free": { id: "mimo-v2-flash-free", name: "MiMo V2 Flash Free", description: "Legacy model retained for compatibility with older integrations", family: "mimo-flash-free", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "ling-3.0-tiny-free": { id: "ling-3.0-tiny-free", name: "Ling-3.0-tiny Free", description: "Compact MoE model for responsive agents, instruction following, and multi-turn conversations", family: "ling", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-08-06", last_updated: "2026-08-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "grok-code": { id: "grok-code", name: "Grok Code Fast 1", description: "Legacy model retained for compatibility with older integrations", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-08-20", last_updated: "2025-08-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "gpt-5.2-codex": { id: "gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-01-14", last_updated: "2026-01-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5.4-nano": { id: "gpt-5.4-nano", name: "GPT-5.4 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "gemini-3.6-flash": { id: "gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, provider: { npm: "@ai-sdk/google" }, cost: { input: 1.5, output: 7.5, cache_read: 0.15, input_audio: 1.5 } }, "hy3-free": { id: "hy3-free", name: "Hy3 Free", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "hy3-free", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-06-26", last_updated: "2026-06-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 190000, output: 64000 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "kimi-k2.5-free": { id: "kimi-k2.5-free", name: "Kimi K2.5 Free", description: "Legacy model retained for compatibility with older integrations", family: "kimi-free", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-10", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "claude-sonnet-4": { id: "claude-sonnet-4", name: "Claude Sonnet 4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "glm-4.7": { id: "glm-4.7", name: "GLM-4.7", description: "Legacy model retained for compatibility with older integrations", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, status: "deprecated", cost: { input: 0.6, output: 2.2, cache_read: 0.1 } }, "minimax-m2.5": { id: "minimax-m2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, cache_write: 0.25, tiers: [{ input: 0.4, output: 1.8, cache_read: 0.04, cache_write: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 0.4, output: 1.8, cache_read: 0.04, cache_write: 0.5 } } }, "mimo-v2.5-free": { id: "mimo-v2.5-free", name: "MiMo V2.5 Free", description: "MiMo omni model for text, image, video, audio, and agents", family: "mimo-v2.5-free", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 32000 }, cost: { input: 0, output: 0, cache_read: 0 } }, "gpt-5.2": { id: "gpt-5.2", name: "GPT-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5.3-codex": { id: "gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-24", last_updated: "2026-02-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "grok-4.5": { id: "grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 2, output: 6, cache_read: 0.5, tiers: [{ input: 4, output: 12, cache_read: 1, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 12, cache_read: 1 } } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "kimi-k2": { id: "kimi-k2", name: "Kimi K2", description: "Legacy model retained for compatibility with older integrations", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0.4, output: 2.5, cache_read: 0.4 } }, "gpt-5.1": { id: "gpt-5.1", name: "GPT-5.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 1.07, output: 8.5, cache_read: 0.107 } }, "big-pickle": { id: "big-pickle", name: "Big Pickle", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "big-pickle", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-10-17", last_updated: "2025-10-17", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 160000, output: 32000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "nemotron-3-super-free": { id: "nemotron-3-super-free", name: "Nemotron 3 Super Free", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron-free", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2026-02", release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 128000 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "kimi-k2-thinking": { id: "kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Legacy model retained for compatibility with older integrations", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-10", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0.4, output: 2.5, cache_read: 0.4 } }, "grok-build-0.1": { id: "grok-build-0.1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 1, output: 2, cache_read: 0.2 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "gpt-5.1-codex": { id: "gpt-5.1-codex", name: "GPT-5.1 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 1.07, output: 8.5, cache_read: 0.107 } }, "gpt-5-nano": { id: "gpt-5-nano", name: "GPT-5 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "claude-3-5-haiku": { id: "claude-3-5-haiku", name: "Claude Haiku 3.5", description: "Legacy model retained for compatibility with older integrations", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07-31", release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, status: "deprecated", provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0.8, output: 4, cache_read: 0.08, cache_write: 1 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "minimax-m2.1": { id: "minimax-m2.1", name: "MiniMax-M2.1", description: "Legacy model retained for compatibility with older integrations", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, status: "deprecated", cost: { input: 0.3, output: 1.2, cache_read: 0.1 } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 3.125, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, cache_write: 6.25, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5, cache_write: 6.25 } } }, "claude-opus-4-5": { id: "claude-opus-4-5", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "nemotron-3-ultra-free": { id: "nemotron-3-ultra-free", name: "Nemotron 3 Ultra Free", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron-free", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2026-02", release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 0, output: 0, cache_read: 0 } }, "claude-opus-5": { id: "claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gpt-5.1-codex-max": { id: "gpt-5.1-codex-max", name: "GPT-5.1 Codex Max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "qwen3-coder": { id: "qwen3-coder", name: "Qwen3 Coder", description: "Legacy model retained for compatibility with older integrations", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, status: "deprecated", cost: { input: 0.45, output: 1.8 } }, "qwen3.6-plus": { id: "qwen3.6-plus", name: "Qwen3.6 Plus", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 0.625 } }, "ring-2.6-1t-free": { id: "ring-2.6-1t-free", name: "Ring 2.6 1T Free", description: "Legacy model retained for compatibility with older integrations", family: "ring-1t-free", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-06", release_date: "2026-05-08", last_updated: "2026-05-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 66000 }, status: "deprecated", cost: { input: 0, output: 0 } }, "mimo-v2-pro-free": { id: "mimo-v2-pro-free", name: "MiMo V2 Pro Free", description: "Legacy model retained for compatibility with older integrations", family: "mimo-pro-free", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 64000 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "ling-2.6-flash-free": { id: "ling-2.6-flash-free", name: "Ling 2.6 Flash Free", description: "Legacy model retained for compatibility with older integrations", family: "ling-flash-free", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262100, output: 32800 }, status: "deprecated", cost: { input: 0, output: 0 } } } }, sakana: { id: "sakana", env: ["SAKANA_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.sakana.ai/v1", name: "Sakana AI", doc: "https://console.sakana.ai/models", models: { "fugu-ultra-20260615": { id: "fugu-ultra-20260615", name: "Fugu Ultra", description: "Quality-first multi-agent model for hard research, analysis, and competitions", family: "fugu", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-06-15", last_updated: "2026-06-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, provider: { shape: "responses" }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "fugu-ultra": { id: "fugu-ultra", name: "Fugu Ultra", description: "Quality-first multi-agent model for hard research, analysis, and competitions", family: "fugu", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-06-15", last_updated: "2026-06-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, provider: { shape: "responses" }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, fugu: { id: "fugu", name: "Fugu", description: "Multi-agent model for routing expert agents across complex analytical tasks", family: "fugu", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-06-15", last_updated: "2026-06-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, provider: { shape: "responses" } } } }, trustedrouter: { id: "trustedrouter", env: ["TRUSTEDROUTER_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.trustedrouter.com/v1", name: "TrustedRouter", doc: "https://trustedrouter.com/docs", models: { synth: { id: "synth", name: "Synth", description: "TrustedRouter synthesis orchestration alias that combines multiple model responses into one answer.", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-20", last_updated: "2026-06-27", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 } }, zdr: { id: "zdr", name: "Zero Data Retention", description: "TrustedRouter privacy routing alias that prefers zero data retention model endpoints.", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-27", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 } }, e2e: { id: "e2e", name: "End-to-End Encrypted", description: "TrustedRouter privacy routing alias for end-to-end encrypted provider routes where available.", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-27", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 } }, auto: { id: "auto", name: "Auto", description: "TrustedRouter automatic routing alias that chooses a healthy supported model endpoint for the request.", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-01", last_updated: "2026-06-27", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 } }, cheap: { id: "cheap", name: "Cheap", description: "TrustedRouter low-cost routing alias that prefers inexpensive healthy model endpoints.", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-01", last_updated: "2026-06-27", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 } }, "synth-code": { id: "synth-code", name: "Synth Code", description: "TrustedRouter code synthesis orchestration alias that combines multiple model responses into one answer.", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-20", last_updated: "2026-06-27", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 } }, fast: { id: "fast", name: "Fast", description: "TrustedRouter speed routing alias that prefers low-latency healthy model endpoints.", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-27", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 } } } }, "salad-cloud": { id: "salad-cloud", env: ["SALAD_CLOUD_API_KEY"], npm: "@saladtechnologies-oss/ai-sdk-provider", name: "SaladCloud AI Gateway", doc: "https://docs.salad.com/ai-gateway/explanation/overview", models: { "qwen3.6-35b-a3b": { id: "qwen3.6-35b-a3b", name: "Qwen3.6 35B-A3B", description: "Qwen MoE for agentic tasks, complex reasoning, code generation, and instruction following", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 262144 }, cost: { input: 0.09, output: 0.6 } } } }, "atomic-chat": { id: "atomic-chat", env: ["ATOMIC_CHAT_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "http://127.0.0.1:1337/v1", name: "Atomic Chat", doc: "https://atomic.chat", models: { "Qwen3_5-9B-Q4_K_M": { id: "Qwen3_5-9B-Q4_K_M", name: "Qwen 3.5 9B (Q4_K_M)", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-05", last_updated: "2026-04-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 0, output: 0 } }, "gemma-4-E4B-it-IQ4_XS": { id: "gemma-4-E4B-it-IQ4_XS", name: "Gemma 4 E4B Instruct (IQ4_XS)", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 0, output: 0 } }, "Qwen3_5-9B-MLX-4bit": { id: "Qwen3_5-9B-MLX-4bit", name: "Qwen 3.5 9B (MLX 4-bit)", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-05", last_updated: "2026-04-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 0, output: 0 } }, "gemma-4-E4B-it-MLX-4bit": { id: "gemma-4-E4B-it-MLX-4bit", name: "Gemma 4 E4B Instruct (MLX 4-bit)", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 0, output: 0 } }, "Meta-Llama-3_1-8B-Instruct-GGUF": { id: "Meta-Llama-3_1-8B-Instruct-GGUF", name: "Meta Llama 3.1 8B Instruct (GGUF)", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 4096 }, cost: { input: 0, output: 0 } } } }, inception: { id: "inception", env: ["INCEPTION_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.inceptionlabs.ai/v1/", name: "Inception", doc: "https://platform.inceptionlabs.ai/docs", models: { "mercury-edit-2": { id: "mercury-edit-2", name: "Mercury Edit 2", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, release_date: "2026-03-30", last_updated: "2026-03-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.25, output: 0.75, cache_read: 0.025 } }, "mercury-2": { id: "mercury-2", name: "Mercury 2", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "mercury", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-02-24", last_updated: "2026-02-24", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 50000 }, cost: { input: 0.25, output: 0.75, cache_read: 0.025 } } } }, "stepfun-step-plan": { id: "stepfun-step-plan", env: ["STEPFUN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.stepfun.com/step_plan/v1", name: "StepFun Step Plan (China)", doc: "https://platform.stepfun.com/docs/zh/step-plan/integrations/reasoning-api", models: { "step-3.5-flash": { id: "step-3.5-flash", name: "Step 3.5 Flash", description: "StepFun flash lane for quick multimodal reasoning and coding assistance", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-01-29", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 } }, "step-3.7-flash": { id: "step-3.7-flash", name: "Step 3.7 Flash", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 } }, "step-3.5-flash-2603": { id: "step-3.5-flash-2603", name: "Step 3.5 Flash 2603", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 } }, "step-router-v1": { id: "step-router-v1", name: "Step Router v1", description: "StepFun routing model that dispatches requests to the appropriate Step model.", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 256000 } } } }, "cloudflare-workers-ai": { id: "cloudflare-workers-ai", env: ["CLOUDFLARE_ACCOUNT_ID", "CLOUDFLARE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1", name: "Cloudflare Workers AI", doc: "https://developers.cloudflare.com/workers-ai/models/", models: { "@cf/aisingapore/gemma-sea-lion-v4-27b-it": { id: "@cf/aisingapore/gemma-sea-lion-v4-27b-it", name: "Gemma Sea Lion V4 27B It", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.351, output: 0.555 } }, "@cf/nvidia/nemotron-3-120b-a12b": { id: "@cf/nvidia/nemotron-3-120b-a12b", name: "Nemotron 3 Super 120B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: true, structured_output: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.5, output: 1.5 } }, "@cf/google/gemma-4-26b-a4b-it": { id: "@cf/google/gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 0.1, output: 0.3 } }, "@cf/zai-org/glm-4.7-flash": { id: "@cf/zai-org/glm-4.7-flash", name: "GLM-4.7-Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.0605, output: 0.4 } }, "@cf/zai-org/glm-5.2": { id: "@cf/zai-org/glm-5.2", name: "Glm 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "@cf/qwen/qwen3-30b-a3b-fp8": { id: "@cf/qwen/qwen3-30b-a3b-fp8", name: "Qwen3 30B A3b fp8", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-04-30", last_updated: "2025-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.0509, output: 0.335 } }, "@cf/qwen/qwq-32b": { id: "@cf/qwen/qwq-32b", name: "Qwq 32B", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-03-05", last_updated: "2025-03-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 24000, output: 24000 }, cost: { input: 0.66, output: 1 } }, "@cf/qwen/qwen2.5-coder-32b-instruct": { id: "@cf/qwen/qwen2.5-coder-32b-instruct", name: "Qwen2.5 Coder 32B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-02-27", last_updated: "2025-02-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.66, output: 1 } }, "@cf/mistralai/mistral-small-3.1-24b-instruct": { id: "@cf/mistralai/mistral-small-3.1-24b-instruct", name: "Mistral Small 3.1 24B Instruct", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-03-18", last_updated: "2025-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.351, output: 0.555 } }, "@cf/meta/llama-3.2-1b-instruct": { id: "@cf/meta/llama-3.2-1b-instruct", name: "Llama 3.2 1B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-12", release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 60000, output: 60000 }, cost: { input: 0.027, output: 0.201 } }, "@cf/meta/llama-3.2-3b-instruct": { id: "@cf/meta/llama-3.2-3b-instruct", name: "Llama 3.2 3B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-12", release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 80000, output: 80000 }, cost: { input: 0.0509, output: 0.335 } }, "@cf/meta/llama-3.3-70b-instruct-fp8-fast": { id: "@cf/meta/llama-3.3-70b-instruct-fp8-fast", name: "Llama 3.3 70B Instruct fp8 Fast", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 24000, output: 24000 }, cost: { input: 0.293, output: 2.253 } }, "@cf/meta/llama-guard-3-8b": { id: "@cf/meta/llama-guard-3-8b", name: "Llama Guard 3 8B", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-01-22", last_updated: "2025-01-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.484, output: 0.03 } }, "@cf/meta/llama-3.2-11b-vision-instruct": { id: "@cf/meta/llama-3.2-11b-vision-instruct", name: "Llama 3.2 11B Vision Instruct", description: "Open Llama multimodal model for image understanding and text reasoning", family: "llama", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.0485, output: 0.676 } }, "@cf/meta/llama-3.1-8b-instruct-fp8": { id: "@cf/meta/llama-3.1-8b-instruct-fp8", name: "Llama 3.1 8B Instruct fp8", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2024-07-25", last_updated: "2024-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 32000 }, cost: { input: 0.152, output: 0.287 } }, "@cf/meta/llama-4-scout-17b-16e-instruct": { id: "@cf/meta/llama-4-scout-17b-16e-instruct", name: "Llama 4 Scout 17B 16E Instruct", description: "Open Llama with long-context vision for efficient multimodal agents", family: "llama", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 16384 }, cost: { input: 0.27, output: 0.85 } }, "@cf/ibm-granite/granite-4.0-h-micro": { id: "@cf/ibm-granite/granite-4.0-h-micro", name: "Granite 4.0 H Micro", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "granite", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-10-07", last_updated: "2025-10-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 131000 }, cost: { input: 0.017, output: 0.112 } }, "@cf/deepseek-ai/deepseek-r1-distill-qwen-32b": { id: "@cf/deepseek-ai/deepseek-r1-distill-qwen-32b", name: "Deepseek R1 Distill Qwen 32B", description: "Classic open reasoning model for transparent math, coding, and deliberate problem solving", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 80000, output: 80000 }, cost: { input: 0.497, output: 4.881 } }, "@cf/moonshotai/kimi-k2.6": { id: "@cf/moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 256000 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "@cf/moonshotai/kimi-k2.7-code": { id: "@cf/moonshotai/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "@cf/openai/gpt-oss-20b": { id: "@cf/openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.2, output: 0.3 } }, "@cf/openai/gpt-oss-120b": { id: "@cf/openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.35, output: 0.75 } } } }, modelscope: { id: "modelscope", env: ["MODELSCOPE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api-inference.modelscope.cn/v1", name: "ModelScope", doc: "https://modelscope.cn/docs/model-service/API-Inference/intro", models: { "Qwen/Qwen3-235B-A22B-Instruct-2507": { id: "Qwen/Qwen3-235B-A22B-Instruct-2507", name: "Qwen3 235B A22B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04-28", last_updated: "2025-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0, output: 0 } }, "Qwen/Qwen3-Coder-30B-A3B-Instruct": { id: "Qwen/Qwen3-Coder-30B-A3B-Instruct", name: "Qwen3 Coder 30B A3B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-31", last_updated: "2025-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0, output: 0 } }, "Qwen/Qwen3-30B-A3B-Thinking-2507": { id: "Qwen/Qwen3-30B-A3B-Thinking-2507", name: "Qwen3 30B A3B Thinking 2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-30", last_updated: "2025-07-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "Qwen/Qwen3-30B-A3B-Instruct-2507": { id: "Qwen/Qwen3-30B-A3B-Instruct-2507", name: "Qwen3 30B A3B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-30", last_updated: "2025-07-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0, output: 0 } }, "Qwen/Qwen3-235B-A22B-Thinking-2507": { id: "Qwen/Qwen3-235B-A22B-Thinking-2507", name: "Qwen3-235B-A22B-Thinking-2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0, output: 0 } }, "ZhipuAI/GLM-4.5": { id: "ZhipuAI/GLM-4.5", name: "GLM-4.5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0, output: 0 } }, "ZhipuAI/GLM-4.6": { id: "ZhipuAI/GLM-4.6", name: "GLM-4.6", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-07", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 98304 }, cost: { input: 0, output: 0 } } } }, "github-copilot": { id: "github-copilot", env: ["GITHUB_TOKEN"], npm: "@ai-sdk/openai-compatible", api: "https://api.githubcopilot.com", name: "GitHub Copilot", doc: "https://docs.github.com/en/copilot", models: { "gemini-3.5-flash": { id: "gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }, { type: "budget_tokens", min: 256, max: 24000 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 128000, output: 64000 }, cost: { input: 1.5, output: 9, cache_read: 0.15, input_audio: 1.5 } }, "claude-sonnet-4.6": { id: "claude-sonnet-4.6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024, max: 32000 }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 168000, output: 32000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 45, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1, cache_write: 12.5 } } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "mai-code-1-flash-picker": { id: "mai-code-1-flash-picker", name: "MAI-Code-1-Flash", description: "Microsoft coding model built for fast, efficient assistance in everyday developer workflows", family: "mai", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-12", release_date: "2026-06-02", last_updated: "2026-06-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 128000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "claude-opus-4.5": { id: "claude-opus-4.5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 32000 }], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 168000, output: 32000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "claude-opus-4.7": { id: "claude-opus-4.7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 168000, output: 32000 }, experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-sonnet-4.5": { id: "claude-sonnet-4.5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 32000 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 168000, output: 32000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "gpt-5.2-codex": { id: "gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Code-specialist GPT for repository edits, reviews, and long-running software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5.4-nano": { id: "gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "gemini-3.6-flash": { id: "gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }, { type: "budget_tokens", min: 256, max: 32000 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 936000, output: 64000 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15 } }, "claude-sonnet-4": { id: "claude-sonnet-4", name: "Claude Sonnet 4 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 216000, input: 128000, output: 16000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, tiers: [{ input: 0.4, output: 1.8, cache_read: 0.04, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 0.4, output: 1.8, cache_read: 0.04 } } }, "gpt-5.2": { id: "gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "claude-haiku-4.5": { id: "claude-haiku-4.5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 32000 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 136000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "gpt-5.3-codex": { id: "gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 264000, input: 128000, output: 64000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "grok-4.5": { id: "grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, input: 372000, output: 128000 }, cost: { input: 2, output: 6, cache_read: 0.5, tiers: [{ input: 4, output: 12, cache_read: 1, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 12, cache_read: 1 } } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 224000, output: 32000 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "gemini-3.1-pro-preview": { id: "gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 256, max: 32000 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 936000, output: 64000 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "claude-opus-4.8": { id: "claude-opus-4.8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 168000, output: 64000 }, experimental: { modes: { fast: { cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "gpt-4.1": { id: "gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "claude-opus-5": { id: "claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 936000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-opus-4.6": { id: "claude-opus-4.6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 168000, output: 32000 }, experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } } } }, "302ai": { id: "302ai", env: ["302AI_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.302.ai/v1", name: "302.AI", doc: "https://doc.302.ai", models: { "qwen3-coder-480b-a35b-instruct": { id: "qwen3-coder-480b-a35b-instruct", name: "qwen3-coder-480b-a35b-instruct", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.86, output: 3.43 } }, "grok-4.20-beta-0309-reasoning": { id: "grok-4.20-beta-0309-reasoning", name: "grok-4.20-beta-0309-reasoning", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 2, output: 6 } }, "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "claude-sonnet-4-6", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-18", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15 } }, "glm-4.6v": { id: "glm-4.6v", name: "GLM-4.6V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.145, output: 0.43 } }, "gpt-4.1-mini": { id: "gpt-4.1-mini", name: "gpt-4.1-mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6 } }, "gpt-4o": { id: "gpt-4o", name: "gpt-4o", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-05-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10 } }, "glm-5": { id: "glm-5", name: "glm-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.6 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "claude-haiku-4-5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-16", last_updated: "2025-10-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5 } }, "gpt-5.4-pro": { id: "gpt-5.4-pro", name: "gpt-5.4-pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, cache_read: 0, cache_write: 0, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "grok-4-fast-reasoning": { id: "grok-4-fast-reasoning", name: "grok-4-fast-reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 0.2, output: 0.5 } }, "qwen3-30b-a3b": { id: "qwen3-30b-a3b", name: "Qwen3-30B-A3B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04-29", last_updated: "2025-04-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.11, output: 1.08 } }, "glm-4.5-air": { id: "glm-4.5-air", name: "glm-4.5-air", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-29", last_updated: "2025-07-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.1143, output: 0.286 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "gemini-2.5-flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.3, output: 2.5 } }, "glm-5.1": { id: "glm-5.1", name: "glm-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-10", last_updated: "2026-04-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 0.86, output: 3.5 } }, "doubao-seed-1-6-vision-250815": { id: "doubao-seed-1-6-vision-250815", name: "doubao-seed-1-6-vision-250815", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 }, cost: { input: 0.114, output: 1.143 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "claude-opus-4-6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024, max: 127999 }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-06", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25 } }, "gpt-4.1-nano": { id: "gpt-4.1-nano", name: "gpt-4.1-nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.1, output: 0.4 } }, "kimi-k2-thinking-turbo": { id: "kimi-k2-thinking-turbo", name: "kimi-k2-thinking-turbo", description: "Kimi reasoning model for long-horizon research, planning, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 1.265, output: 9.119 } }, "claude-opus-4-1-20250805-thinking": { id: "claude-opus-4-1-20250805-thinking", name: "claude-opus-4-1-20250805-thinking", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-05-27", last_updated: "2025-05-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75 } }, "chatgpt-4o-latest": { id: "chatgpt-4o-latest", name: "chatgpt-4o-latest", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2023-09", release_date: "2024-08-08", last_updated: "2024-08-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 5, output: 15 } }, "glm-4.7-flashx": { id: "glm-4.7-flashx", name: "glm-4.7-flashx", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-20", last_updated: "2026-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0.0715, output: 0.429 } }, "gemini-3-pro-image-preview": { id: "gemini-3-pro-image-preview", name: "gemini-3-pro-image-preview", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-06", release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 64000 }, cost: { input: 2, output: 120 } }, "ministral-14b-2512": { id: "ministral-14b-2512", name: "ministral-14b-2512", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.33, output: 0.33 } }, "MiniMax-M2": { id: "MiniMax-M2", name: "MiniMax-M2", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-10-26", last_updated: "2025-10-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 0.33, output: 1.32 } }, "gpt-5.2-chat-latest": { id: "gpt-5.2-chat-latest", name: "gpt-5.2-chat-latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-12", last_updated: "2025-12-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14 } }, "grok-4.1": { id: "grok-4.1", name: "grok-4.1", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 2, output: 10 } }, "gemini-2.5-flash-nothink": { id: "gemini-2.5-flash-nothink", name: "gemini-2.5-flash-nothink", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-24", last_updated: "2025-06-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.3, output: 2.5 } }, "MiniMax-M1": { id: "MiniMax-M1", name: "MiniMax-M1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-06-16", last_updated: "2025-06-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 0.132, output: 1.254 } }, "MiniMax-M2.7": { id: "MiniMax-M2.7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-19", last_updated: "2026-03-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "claude-opus-4-6-thinking": { id: "claude-opus-4-6-thinking", name: "claude-opus-4-6-thinking", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2026-02-06", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25 } }, "gemini-3-flash-preview": { id: "gemini-3-flash-preview", name: "gemini-3-flash-preview", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-12-18", last_updated: "2025-12-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.5, output: 3 } }, "deepseek-v3.2-thinking": { id: "deepseek-v3.2-thinking", name: "DeepSeek-V3.2-Thinking", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.29, output: 0.43 } }, "gpt-5": { id: "gpt-5", name: "gpt-5", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-08", last_updated: "2025-08-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10 } }, "qwen3-235b-a22b": { id: "qwen3-235b-a22b", name: "Qwen3-235B-A22B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04-29", last_updated: "2025-04-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.29, output: 2.86 } }, "MiniMax-M2.1": { id: "MiniMax-M2.1", name: "MiniMax-M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-12-19", last_updated: "2025-12-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "gemini-3.1-flash-image-preview": { id: "gemini-3.1-flash-image-preview", name: "gemini-3.1-flash-image-preview", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2026-02-27", last_updated: "2026-02-27", modalities: { input: ["text", "image", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.5, output: 60 } }, "claude-sonnet-4-5": { id: "claude-sonnet-4-5", name: "claude-sonnet-4-5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15 } }, "grok-4.20-multi-agent-beta-0309": { id: "grok-4.20-multi-agent-beta-0309", name: "grok-4.20-multi-agent-beta-0309", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 2, output: 6 } }, "grok-4-fast-non-reasoning": { id: "grok-4-fast-non-reasoning", name: "grok-4-fast-non-reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 0.2, output: 0.5 } }, "glm-4.6": { id: "glm-4.6", name: "glm-4.6", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.286, output: 1.142 } }, "gemini-2.5-flash-preview-09-2025": { id: "gemini-2.5-flash-preview-09-2025", name: "gemini-2.5-flash-preview-09-2025", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-09-26", last_updated: "2025-09-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.3, output: 2.5 } }, "gpt-5.4": { id: "gpt-5.4", name: "gpt-5.4", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 0, tiers: [{ input: 5, output: 22.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5 } } }, "grok-4-1-fast-reasoning": { id: "grok-4-1-fast-reasoning", name: "grok-4-1-fast-reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 0.2, output: 0.5 } }, "glm-4.5": { id: "glm-4.5", name: "GLM-4.5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-29", last_updated: "2025-07-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.286, output: 1.142 } }, "qwen3-max-2025-09-23": { id: "qwen3-max-2025-09-23", name: "qwen3-max-2025-09-23", description: "Flagship model for demanding analysis, coding, and production agent workflows", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-24", last_updated: "2025-09-24", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 258048, output: 65536 }, cost: { input: 0.86, output: 3.43 } }, "claude-sonnet-4-5-20250929": { id: "claude-sonnet-4-5-20250929", name: "claude-sonnet-4-5-20250929", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15 } }, "glm-4.5v": { id: "glm-4.5v", name: "GLM-4.5V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-08-12", last_updated: "2025-08-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 64000, output: 16384 }, cost: { input: 0.29, output: 0.86 } }, "kimi-k2-0905-preview": { id: "kimi-k2-0905-preview", name: "kimi-k2-0905-preview", description: "Kimi model for long-context chat, coding, and agentic reasoning", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.632, output: 2.53 } }, "claude-opus-4-5-20251101": { id: "claude-opus-4-5-20251101", name: "claude-opus-4-5-20251101", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-25", last_updated: "2025-11-25", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25 } }, "gpt-5.4-nano": { id: "gpt-5.4-nano", name: "gpt-5.4-nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-19", last_updated: "2026-03-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25 } }, "qwen3-235b-a22b-instruct-2507": { id: "qwen3-235b-a22b-instruct-2507", name: "qwen3-235b-a22b-instruct-2507", description: "Tool-capable chat model for instruction following and agentic application workflows", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-30", last_updated: "2025-07-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 65536 }, cost: { input: 0.29, output: 1.143 } }, "claude-3-5-haiku-latest": { id: "claude-3-5-haiku-latest", name: "claude-3-5-haiku-latest", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07-31", release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 0.8, output: 4 } }, "gpt-5-pro": { id: "gpt-5-pro", name: "gpt-5-pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-10-08", last_updated: "2025-10-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 272000 }, cost: { input: 15, output: 120 } }, "qwen-flash": { id: "qwen-flash", name: "Qwen-Flash", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.022, output: 0.22 } }, "deepseek-v3.2": { id: "deepseek-v3.2", name: "deepseek-v3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.29, output: 0.43 } }, "doubao-seed-1-6-thinking-250715": { id: "doubao-seed-1-6-thinking-250715", name: "doubao-seed-1-6-thinking-250715", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-07-15", last_updated: "2025-07-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 16000 }, cost: { input: 0.121, output: 1.21 } }, "glm-for-coding": { id: "glm-for-coding", name: "glm-for-coding", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 0.086, output: 0.343 } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "gpt-5.4-mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-19", last_updated: "2026-03-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5 } }, "claude-sonnet-4-5-20250929-thinking": { id: "claude-sonnet-4-5-20250929-thinking", name: "claude-sonnet-4-5-20250929-thinking", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15 } }, "qwen-plus": { id: "qwen-plus", name: "Qwen-Plus", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.12, output: 1.2 } }, "glm-4.7": { id: "glm-4.7", name: "glm-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.286, output: 1.142 } }, "gpt-5.2": { id: "gpt-5.2", name: "gpt-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-12", last_updated: "2025-12-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14 } }, "gemini-2.5-flash-image": { id: "gemini-2.5-flash-image", name: "gemini-2.5-flash-image", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-10-08", last_updated: "2025-10-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.3, output: 30 } }, "claude-3-5-haiku-20241022": { id: "claude-3-5-haiku-20241022", name: "claude-3-5-haiku-20241022", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07-31", release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 0.8, output: 4 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "gpt-5-mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-08", last_updated: "2025-08-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2 } }, "claude-haiku-4-5-20251001": { id: "claude-haiku-4-5-20251001", name: "claude-haiku-4-5-20251001", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-16", last_updated: "2025-10-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5 } }, "deepseek-chat": { id: "deepseek-chat", name: "Deepseek-Chat", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-11-29", last_updated: "2024-11-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.29, output: 0.43 } }, "doubao-seed-1-8-251215": { id: "doubao-seed-1-8-251215", name: "doubao-seed-1-8-251215", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-12-18", last_updated: "2025-12-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 224000, output: 64000 }, cost: { input: 0.114, output: 0.286 } }, "gemini-2.5-flash-lite-preview-09-2025": { id: "gemini-2.5-flash-lite-preview-09-2025", name: "gemini-2.5-flash-lite-preview-09-2025", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-09-26", last_updated: "2025-09-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.1, output: 0.4 } }, "glm-4.5-airx": { id: "glm-4.5-airx", name: "glm-4.5-airx", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-29", last_updated: "2025-07-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.572, output: 1.714 } }, "claude-opus-4-5-20251101-thinking": { id: "claude-opus-4-5-20251101-thinking", name: "claude-opus-4-5-20251101-thinking", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-11-25", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25 } }, "gpt-5.1": { id: "gpt-5.1", name: "gpt-5.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10 } }, "gpt-5.4-nano-2026-03-17": { id: "gpt-5.4-nano-2026-03-17", name: "gpt-5.4-nano-2026-03-17", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-19", last_updated: "2026-03-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25 } }, "kimi-k2-thinking": { id: "kimi-k2-thinking", name: "kimi-k2-thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.575, output: 2.3 } }, "MiniMax-M2.7-highspeed": { id: "MiniMax-M2.7-highspeed", name: "MiniMax-M2.7-highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-19", last_updated: "2026-03-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 4.8 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "gemini-2.5-pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 1.25, output: 10 } }, "grok-4-1-fast-non-reasoning": { id: "grok-4-1-fast-non-reasoning", name: "grok-4-1-fast-non-reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 0.2, output: 0.5 } }, "gemini-3-pro-preview": { id: "gemini-3-pro-preview", name: "gemini-3-pro-preview", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-11-19", last_updated: "2025-11-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 2, output: 12 } }, "glm-5-turbo": { id: "glm-5-turbo", name: "glm-5-turbo", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 0.72, output: 3.2 } }, "glm-5v-turbo": { id: "glm-5v-turbo", name: "GLM-5V-Turbo", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 0.72, output: 3.2 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "claude-opus-4-7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "claude-sonnet-4-20250514": { id: "claude-sonnet-4-20250514", name: "claude-sonnet-4-20250514", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15 } }, "gemini-2.0-flash-lite": { id: "gemini-2.0-flash-lite", name: "gemini-2.0-flash-lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-11", release_date: "2025-06-16", last_updated: "2025-06-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 8192 }, cost: { input: 0.075, output: 0.3 } }, "claude-opus-4-5": { id: "claude-opus-4-5", name: "claude-opus-4-5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-25", last_updated: "2025-11-25", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25 } }, "grok-4.20-beta-0309-non-reasoning": { id: "grok-4.20-beta-0309-non-reasoning", name: "grok-4.20-beta-0309-non-reasoning", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 2, output: 6 } }, "gpt-5.4-mini-2026-03-17": { id: "gpt-5.4-mini-2026-03-17", name: "gpt-5.4-mini-2026-03-17", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-19", last_updated: "2026-03-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5 } }, "glm-4.5-x": { id: "glm-4.5-x", name: "glm-4.5-x", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-29", last_updated: "2025-07-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.143, output: 2.29 } }, "gpt-4.1": { id: "gpt-4.1", name: "gpt-4.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8 } }, "claude-opus-4-20250514": { id: "claude-opus-4-20250514", name: "claude-opus-4-20250514", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 31999 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75 } }, "claude-sonnet-4-6-thinking": { id: "claude-sonnet-4-6-thinking", name: "claude-sonnet-4-6-thinking", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-08", release_date: "2026-02-18", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15 } }, "deepseek-reasoner": { id: "deepseek-reasoner", name: "Deepseek-Reasoner", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.29, output: 0.43 } }, "gpt-5-thinking": { id: "gpt-5-thinking", name: "gpt-5-thinking", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-08-08", last_updated: "2025-08-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10 } }, "doubao-seed-code-preview-251028": { id: "doubao-seed-code-preview-251028", name: "doubao-seed-code-preview-251028", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-11-11", last_updated: "2025-11-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 }, cost: { input: 0.17, output: 1.14 } }, "gpt-5.1-chat-latest": { id: "gpt-5.1-chat-latest", name: "gpt-5.1-chat-latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.25, output: 10 } }, "claude-opus-4-1-20250805": { id: "claude-opus-4-1-20250805", name: "claude-opus-4-1-20250805", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 31999 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75 } }, "qwen-max-latest": { id: "qwen-max-latest", name: "Qwen-Max-Latest", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-04-03", last_updated: "2025-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.343, output: 1.372 } }, "mistral-large-2512": { id: "mistral-large-2512", name: "mistral-large-2512", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 262144 }, cost: { input: 1.1, output: 3.3 } } } }, helicone: { id: "helicone", env: ["HELICONE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://ai-gateway.helicone.ai/v1", name: "Helicone", doc: "https://helicone.ai/models", models: { "gpt-5.1-codex-mini": { id: "gpt-5.1-codex-mini", name: "OpenAI: GPT-5.1 Codex Mini", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-codex", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.024999999999999998 } }, "grok-4": { id: "grok-4", name: "xAI Grok 4", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-07-09", last_updated: "2024-07-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 3, output: 15, cache_read: 0.75 } }, "qwen2.5-coder-7b-fast": { id: "qwen2.5-coder-7b-fast", name: "Qwen2.5 Coder 7B fast", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-09", release_date: "2024-09-15", last_updated: "2024-09-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 8192 }, cost: { input: 0.03, output: 0.09 } }, "qwen3-32b": { id: "qwen3-32b", name: "Qwen3 32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04-28", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 40960 }, cost: { input: 0.29, output: 0.59 } }, "gpt-4.1-mini": { id: "gpt-4.1-mini", name: "OpenAI GPT-4.1 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.39999999999999997, output: 1.5999999999999999, cache_read: 0.09999999999999999 } }, "gpt-4o": { id: "gpt-4o", name: "OpenAI GPT-4o", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-05", release_date: "2024-05-13", last_updated: "2024-05-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "kimi-k2-0711": { id: "kimi-k2-0711", name: "Kimi K2 (07/11)", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0.5700000000000001, output: 2.3 } }, "claude-3.7-sonnet": { id: "claude-3.7-sonnet", name: "Anthropic: Claude 3.7 Sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-02", release_date: "2025-02-19", last_updated: "2025-02-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.30000000000000004, cache_write: 3.75 } }, "grok-4-fast-reasoning": { id: "grok-4-fast-reasoning", name: "xAI: Grok 4 Fast Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-09-01", last_updated: "2025-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 0.19999999999999998, output: 0.5, cache_read: 0.049999999999999996 } }, "qwen3-30b-a3b": { id: "qwen3-30b-a3b", name: "Qwen3 30B A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-06-01", last_updated: "2025-06-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 41000, output: 41000 }, cost: { input: 0.08, output: 0.29 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Google Gemini 2.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.3, output: 2.5, cache_read: 0.075, cache_write: 0.3 } }, "gpt-4.1-nano": { id: "gpt-4.1-nano", name: "OpenAI GPT-4.1 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.09999999999999999, output: 0.39999999999999997, cache_read: 0.024999999999999998 } }, "qwen3-coder-30b-a3b-instruct": { id: "qwen3-coder-30b-a3b-instruct", name: "Qwen3 Coder 30B A3B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-31", last_updated: "2025-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.09999999999999999, output: 0.3 } }, "gpt-oss-20b": { id: "gpt-oss-20b", name: "OpenAI GPT-OSS 20b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2024-06", release_date: "2024-06-01", last_updated: "2024-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.049999999999999996, output: 0.19999999999999998 } }, "chatgpt-4o-latest": { id: "chatgpt-4o-latest", name: "OpenAI ChatGPT-4o", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2024-08-14", last_updated: "2024-08-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 5, output: 20, cache_read: 2.5 } }, "o3-mini": { id: "o3-mini", name: "OpenAI o3 Mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2023-10", release_date: "2023-10-01", last_updated: "2023-10-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "grok-code-fast-1": { id: "grok-code-fast-1", name: "xAI Grok Code Fast 1", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2024-08-25", last_updated: "2024-08-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 1e4 }, cost: { input: 0.19999999999999998, output: 1.5, cache_read: 0.02 } }, "sonar-deep-research": { id: "sonar-deep-research", name: "Perplexity Sonar Deep Research", description: "Sonar search model for current answers, retrieval, and citation-backed chat", family: "sonar-deep-research", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-01-27", last_updated: "2025-01-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 127000, output: 4096 }, cost: { input: 2, output: 8 } }, sonar: { id: "sonar", name: "Perplexity Sonar", description: "Sonar search model for current answers, retrieval, and citation-backed chat", family: "sonar", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-01-27", last_updated: "2025-01-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 127000, output: 4096 }, cost: { input: 1, output: 1 } }, "llama-3.3-70b-versatile": { id: "llama-3.3-70b-versatile", name: "Meta Llama 3.3 70B Versatile", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32678 }, cost: { input: 0.59, output: 0.7899999999999999 } }, "sonar-pro": { id: "sonar-pro", name: "Perplexity Sonar Pro", description: "Advanced Sonar search model for deeper research and cited synthesis", family: "sonar-pro", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-01-27", last_updated: "2025-01-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, cost: { input: 3, output: 15 } }, "mistral-large-2411": { id: "mistral-large-2411", name: "Mistral-Large", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-07-24", last_updated: "2024-07-24", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32768 }, cost: { input: 2, output: 6 } }, "deepseek-r1-distill-llama-70b": { id: "deepseek-r1-distill-llama-70b", name: "DeepSeek R1 Distill Llama 70B", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-01-20", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 0.03, output: 0.13 } }, "claude-3.5-haiku": { id: "claude-3.5-haiku", name: "Anthropic: Claude 3.5 Haiku", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 0.7999999999999999, output: 4, cache_read: 0.08, cache_write: 1 } }, "claude-opus-4-1": { id: "claude-opus-4-1", name: "Anthropic: Claude Opus 4.1", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 31999 }], tool_call: true, temperature: true, knowledge: "2025-08", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "o3-pro": { id: "o3-pro", name: "OpenAI o3 Pro", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-pro", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2024-06", release_date: "2024-06-01", last_updated: "2024-06-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 20, output: 80 } }, "gpt-4o-mini": { id: "gpt-4o-mini", name: "OpenAI GPT-4o-mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "gpt-5": { id: "gpt-5", name: "OpenAI GPT-5", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.12500000000000003 } }, "llama-3.1-8b-instant": { id: "llama-3.1-8b-instant", name: "Meta Llama 3.1 8B Instant", description: "Compact Llama instruction model for fast chat and local deployment", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-07-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32678 }, cost: { input: 0.049999999999999996, output: 0.08 } }, "claude-4.5-opus": { id: "claude-4.5-opus", name: "Anthropic: Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-11", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-4.5-sonnet": { id: "claude-4.5-sonnet", name: "Anthropic: Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.30000000000000004, cache_write: 3.75 } }, "gpt-5-codex": { id: "gpt-5-codex", name: "OpenAI: GPT-5 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.12500000000000003 } }, "llama-3.3-70b-instruct": { id: "llama-3.3-70b-instruct", name: "Meta Llama 3.3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16400 }, cost: { input: 0.13, output: 0.39 } }, "grok-4-fast-non-reasoning": { id: "grok-4-fast-non-reasoning", name: "xAI Grok 4 Fast Non-Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-09-19", last_updated: "2025-09-19", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 0.19999999999999998, output: 0.5, cache_read: 0.049999999999999996 } }, "glm-4.6": { id: "glm-4.6", name: "Zai GLM-4.6", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131072 }, cost: { input: 0.44999999999999996, output: 1.5 } }, "gpt-5-chat-latest": { id: "gpt-5-chat-latest", name: "OpenAI GPT-5 Chat Latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-codex", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2024-09", release_date: "2024-09-30", last_updated: "2024-09-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.25, output: 10, cache_read: 0.12500000000000003 } }, "claude-4.5-haiku": { id: "claude-4.5-haiku", name: "Anthropic: Claude 4.5 Haiku", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-10", release_date: "2025-10-01", last_updated: "2025-10-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 1, output: 5, cache_read: 0.09999999999999999, cache_write: 1.25 } }, "grok-4-1-fast-reasoning": { id: "grok-4-1-fast-reasoning", name: "xAI Grok 4.1 Fast Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-11", release_date: "2025-11-17", last_updated: "2025-11-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 0.19999999999999998, output: 0.5, cache_read: 0.049999999999999996 } }, "claude-sonnet-4-5-20250929": { id: "claude-sonnet-4-5-20250929", name: "Anthropic: Claude Sonnet 4.5 (20250929)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.30000000000000004, cache_write: 3.75 } }, "hermes-2-pro-llama-3-8b": { id: "hermes-2-pro-llama-3-8b", name: "Hermes 2 Pro Llama 3 8B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-05", release_date: "2024-05-27", last_updated: "2024-05-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.14, output: 0.14 } }, "ernie-4.5-21b-a3b-thinking": { id: "ernie-4.5-21b-a3b-thinking", name: "Baidu Ernie 4.5 21B A3B Thinking", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "ernie", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2025-03", release_date: "2025-03-16", last_updated: "2025-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8000 }, cost: { input: 0.07, output: 0.28 } }, "deepseek-v3": { id: "deepseek-v3", name: "DeepSeek V3", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2024-12-26", last_updated: "2024-12-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.56, output: 1.68, cache_read: 0.07 } }, "llama-prompt-guard-2-22m": { id: "llama-prompt-guard-2-22m", name: "Meta Llama Prompt Guard 2 22M", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-10", release_date: "2024-10-01", last_updated: "2024-10-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 512, output: 2 }, cost: { input: 0.01, output: 0.01 } }, "mistral-nemo": { id: "mistral-nemo", name: "Mistral Nemo", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-07", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16400 }, cost: { input: 20, output: 40 } }, "qwen3-vl-235b-a22b-instruct": { id: "qwen3-vl-235b-a22b-instruct", name: "Qwen3 VL 235B A22B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 16384 }, cost: { input: 0.3, output: 1.5 } }, "gpt-5-pro": { id: "gpt-5-pro", name: "OpenAI: GPT-5 Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32768 }, cost: { input: 15, output: 120 } }, "llama-4-maverick": { id: "llama-4-maverick", name: "Meta Llama 4 Maverick 17B 128E", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.15, output: 0.6 } }, "deepseek-v3.2": { id: "deepseek-v3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-09-22", last_updated: "2025-09-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 65536 }, cost: { input: 0.27, output: 0.41 } }, "claude-sonnet-4": { id: "claude-sonnet-4", name: "Anthropic: Claude Sonnet 4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-05-14", last_updated: "2025-05-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.30000000000000004, cache_write: 3.75 } }, "deepseek-tng-r1t2-chimera": { id: "deepseek-tng-r1t2-chimera", name: "DeepSeek TNG R1T2 Chimera", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek-thinking", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-02", last_updated: "2025-07-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 130000, output: 163840 }, cost: { input: 0.3, output: 1.2 } }, "gemma-3-12b-it": { id: "gemma-3-12b-it", name: "Google Gemma 3 12B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-12", release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.049999999999999996, output: 0.09999999999999999 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "OpenAI GPT-OSS 120b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2024-06", release_date: "2024-06-01", last_updated: "2024-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.04, output: 0.16 } }, o1: { id: "o1", name: "OpenAI: o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 15, output: 60, cache_read: 7.5 } }, "llama-4-scout": { id: "llama-4-scout", name: "Meta Llama 4 Scout 17B 16E", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.08, output: 0.3 } }, "llama-3.1-8b-instruct-turbo": { id: "llama-3.1-8b-instruct-turbo", name: "Meta Llama 3.1 8B Instruct Turbo", description: "Compact Llama instruction model for fast chat and local deployment", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.02, output: 0.03 } }, "claude-3.5-sonnet-v2": { id: "claude-3.5-sonnet-v2", name: "Anthropic: Claude 3.5 Sonnet v2", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 3, output: 15, cache_read: 0.30000000000000004, cache_write: 3.75 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "OpenAI GPT-5 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.024999999999999998 } }, "claude-haiku-4-5-20251001": { id: "claude-haiku-4-5-20251001", name: "Anthropic: Claude 4.5 Haiku (20251001)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-10", release_date: "2025-10-01", last_updated: "2025-10-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 1, output: 5, cache_read: 0.09999999999999999, cache_write: 1.25 } }, "mistral-small": { id: "mistral-small", name: "Mistral Small 3.2", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-06-20", last_updated: "2025-06-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.075, output: 0.2 } }, "deepseek-v3.1-terminus": { id: "deepseek-v3.1-terminus", name: "DeepSeek V3.1 Terminus", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-09-22", last_updated: "2025-09-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.27, output: 1, cache_read: 0.21600000000000003 } }, "gpt-5.1": { id: "gpt-5.1", name: "OpenAI GPT-5.1", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.12500000000000003 } }, "kimi-k2-thinking": { id: "kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-11", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 262144 }, cost: { input: 0.48, output: 2 } }, "gemma2-9b-it": { id: "gemma2-9b-it", name: "Google Gemma 2", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-06", release_date: "2024-06-25", last_updated: "2024-06-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 8192 }, cost: { input: 0.01, output: 0.03 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "Google Gemini 2.5 Pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.3125, cache_write: 1.25 } }, "grok-4-1-fast-non-reasoning": { id: "grok-4-1-fast-non-reasoning", name: "xAI Grok 4.1 Fast Non-Reasoning", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "grok", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-11", release_date: "2025-11-17", last_updated: "2025-11-17", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 0.19999999999999998, output: 0.5, cache_read: 0.049999999999999996 } }, "gpt-5.1-codex": { id: "gpt-5.1-codex", name: "OpenAI: GPT-5.1 Codex", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-codex", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.12500000000000003 } }, "llama-3.1-8b-instruct": { id: "llama-3.1-8b-instruct", name: "Meta Llama 3.1 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 16384 }, cost: { input: 0.02, output: 0.049999999999999996 } }, "claude-opus-4": { id: "claude-opus-4", name: "Anthropic: Claude Opus 4", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 31999 }], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-05-14", last_updated: "2025-05-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "gpt-5-nano": { id: "gpt-5-nano", name: "OpenAI GPT-5 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.049999999999999996, output: 0.39999999999999997, cache_read: 0.005 } }, "gemini-3-pro-preview": { id: "gemini-3-pro-preview", name: "Google Gemini 3 Pro Preview", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, temperature: true, knowledge: "2025-11", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.19999999999999998 } }, "gemini-2.5-flash-lite": { id: "gemini-2.5-flash-lite", name: "Google Gemini 2.5 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 512, max: 24576 }], tool_call: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-22", last_updated: "2025-07-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.09999999999999999, output: 0.39999999999999997, cache_read: 0.024999999999999998, cache_write: 0.09999999999999999 } }, o3: { id: "o3", name: "OpenAI o3", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2024-06", release_date: "2024-06-01", last_updated: "2024-06-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "llama-prompt-guard-2-86m": { id: "llama-prompt-guard-2-86m", name: "Meta Llama Prompt Guard 2 86M", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-10", release_date: "2024-10-01", last_updated: "2024-10-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 512, output: 2 }, cost: { input: 0.01, output: 0.01 } }, "gpt-4.1": { id: "gpt-4.1", name: "OpenAI GPT-4.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "o4-mini": { id: "o4-mini", name: "OpenAI o4 Mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2024-06", release_date: "2024-06-01", last_updated: "2024-06-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.275 } }, "claude-3-haiku-20240307": { id: "claude-3-haiku-20240307", name: "Anthropic: Claude 3 Haiku", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-03", release_date: "2024-03-07", last_updated: "2024-03-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, cost: { input: 0.25, output: 1.25, cache_read: 0.03, cache_write: 0.3 } }, "grok-3-mini": { id: "grok-3-mini", name: "xAI Grok 3 Mini", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06", release_date: "2024-06-01", last_updated: "2024-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.3, output: 0.5, cache_read: 0.075 } }, "o1-mini": { id: "o1-mini", name: "OpenAI: o1-mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 65536 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "kimi-k2-0905": { id: "kimi-k2-0905", name: "Kimi K2 (09/05)", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 16384 }, cost: { input: 0.5, output: 2, cache_read: 0.39999999999999997 } }, "gpt-4.1-mini-2025-04-14": { id: "gpt-4.1-mini-2025-04-14", name: "OpenAI GPT-4.1 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.39999999999999997, output: 1.5999999999999999, cache_read: 0.09999999999999999 } }, "deepseek-reasoner": { id: "deepseek-reasoner", name: "DeepSeek Reasoner", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-01-20", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, cost: { input: 0.56, output: 1.68, cache_read: 0.07 } }, "qwen3-coder": { id: "qwen3-coder", name: "Qwen3 Coder 480B A35B Instruct Turbo", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 16384 }, cost: { input: 0.22, output: 0.95 } }, "gpt-5.1-chat-latest": { id: "gpt-5.1-chat-latest", name: "OpenAI GPT-5.1 Chat", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-codex", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.25, output: 10, cache_read: 0.12500000000000003 } }, "claude-opus-4-1-20250805": { id: "claude-opus-4-1-20250805", name: "Anthropic: Claude Opus 4.1 (20250805)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 31999 }], tool_call: true, temperature: true, knowledge: "2025-08", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "grok-3": { id: "grok-3", name: "xAI Grok 3", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06", release_date: "2024-06-01", last_updated: "2024-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.75 } }, "sonar-reasoning": { id: "sonar-reasoning", name: "Perplexity Sonar Reasoning", description: "Web-grounded reasoning model for multi-step research and cited answers", family: "sonar-reasoning", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-01-27", last_updated: "2025-01-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 127000, output: 4096 }, cost: { input: 1, output: 5 } }, "qwen3-next-80b-a3b-instruct": { id: "qwen3-next-80b-a3b-instruct", name: "Qwen3 Next 80B A3B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 16384 }, cost: { input: 0.14, output: 1.4 } }, "qwen3-235b-a22b-thinking": { id: "qwen3-235b-a22b-thinking", name: "Qwen3 235B A22B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2025-07", release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 81920 }, cost: { input: 0.3, output: 2.9000000000000004 } }, "llama-guard-4": { id: "llama-guard-4", name: "Meta Llama Guard 4 12B", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 1024 }, cost: { input: 0.21, output: 0.21 } }, "sonar-reasoning-pro": { id: "sonar-reasoning-pro", name: "Perplexity Sonar Reasoning Pro", description: "Web-grounded reasoning model for multi-step research and cited answers", family: "sonar-reasoning", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-01-27", last_updated: "2025-01-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 127000, output: 4096 }, cost: { input: 2, output: 8 } } } }, "alibaba-coding-plan": { id: "alibaba-coding-plan", env: ["ALIBABA_CODING_PLAN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://coding-intl.dashscope.aliyuncs.com/v1", name: "Alibaba Coding Plan", doc: "https://www.alibabacloud.com/help/en/model-studio/coding-plan", models: { "qwen3.7-plus": { id: "qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5": { id: "glm-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 16384 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3.5-plus": { id: "qwen3.5-plus", name: "Qwen3.5 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3.7-max": { id: "qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5, cache_write: 3.125 } }, "qwen3-coder-plus": { id: "qwen3-coder-plus", name: "Qwen3 Coder Plus", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-4.7": { id: "glm-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 16384 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3-max-2026-01-23": { id: "qwen3-max-2026-01-23", name: "Qwen3 Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-23", last_updated: "2026-01-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "MiniMax-M2.5": { id: "MiniMax-M2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, input: 196601, output: 24576 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3.6-flash": { id: "qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.1875, output: 1.125, cache_write: 0.234375 } }, "qwen3-coder-next": { id: "qwen3-coder-next", name: "Qwen3 Coder Next", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-03", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3.6-plus": { id: "qwen3.6-plus", name: "Qwen3.6 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, watsonx: { id: "watsonx", env: ["WATSONX_AI_APIKEY", "WATSONX_AI_PROJECT_ID"], npm: "watsonx-ai-provider", name: "watsonx.ai", doc: "https://www.ibm.com/docs/en/watsonx/saas?topic=solutions-supported-foundation-models", models: { "mistralai/mistral-small-3-1-24b-instruct-2503": { id: "mistralai/mistral-small-3-1-24b-instruct-2503", name: "Mistral Small 3.1 24B", description: "Efficient multimodal model for instruction following, coding, reasoning, and function calling", family: "mistral-small", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06", release_date: "2025-03-17", last_updated: "2025-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.106, output: 0.318 } }, "ibm/granite-4-h-small": { id: "ibm/granite-4-h-small", name: "Granite-4.0-H-Small", description: "Open-weight hybrid model for enterprise chat, coding, retrieval-augmented generation, and tool-calling workloads", family: "granite", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-02", last_updated: "2025-10-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.0636, output: 0.265 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.159, output: 0.636 } }, "meta-llama/llama-4-maverick-17b-128e-instruct-fp8": { id: "meta-llama/llama-4-maverick-17b-128e-instruct-fp8", name: "Llama 4 Maverick 17B 128E Instruct FP8", description: "Open multimodal Llama for strong reasoning with efficient everyday serving", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.371, output: 1.484 } }, "meta-llama/llama-3-3-70b-instruct": { id: "meta-llama/llama-3-3-70b-instruct", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 4096 }, cost: { input: 0.7526, output: 0.7526 } } } }, submodel: { id: "submodel", env: ["SUBMODEL_INSTAGEN_ACCESS_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://llm.submodel.ai/v1", name: "submodel", doc: "https://submodel.gitbook.io", models: { "zai-org/GLM-4.5-Air": { id: "zai-org/GLM-4.5-Air", name: "GLM 4.5 Air", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-air", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.1, output: 0.5 } }, "zai-org/GLM-4.5-FP8": { id: "zai-org/GLM-4.5-FP8", name: "GLM 4.5 FP8", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.2, output: 0.8 } }, "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8": { id: "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", name: "Qwen3 Coder 480B A35B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-08-23", last_updated: "2025-08-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.2, output: 0.8 } }, "Qwen/Qwen3-235B-A22B-Instruct-2507": { id: "Qwen/Qwen3-235B-A22B-Instruct-2507", name: "Qwen3 235B A22B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-08-23", last_updated: "2025-08-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.2, output: 0.3 } }, "Qwen/Qwen3-235B-A22B-Thinking-2507": { id: "Qwen/Qwen3-235B-A22B-Thinking-2507", name: "Qwen3 235B A22B Thinking 2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-08-23", last_updated: "2025-08-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.2, output: 0.6 } }, "deepseek-ai/DeepSeek-R1-0528": { id: "deepseek-ai/DeepSeek-R1-0528", name: "DeepSeek R1 0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-08-23", last_updated: "2025-08-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 75000, output: 163840 }, cost: { input: 0.5, output: 2.15 } }, "deepseek-ai/DeepSeek-V3-0324": { id: "deepseek-ai/DeepSeek-V3-0324", name: "DeepSeek V3 0324", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-08-23", last_updated: "2025-08-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 75000, output: 163840 }, cost: { input: 0.2, output: 0.8 } }, "deepseek-ai/DeepSeek-V3.1": { id: "deepseek-ai/DeepSeek-V3.1", name: "DeepSeek V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-08-23", last_updated: "2025-08-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 75000, output: 163840 }, cost: { input: 0.2, output: 0.8 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-08-23", last_updated: "2025-08-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.1, output: 0.5 } } } }, neon: { id: "neon", env: ["NEON_AI_GATEWAY_BASE_URL", "NEON_AI_GATEWAY_TOKEN"], npm: "@ai-sdk/openai-compatible", api: "${NEON_AI_GATEWAY_BASE_URL}/v1", name: "Neon", doc: "https://neon.com/docs", models: { "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "gemini-3-5-flash": { id: "gemini-3-5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, input_audio: 1.5 } }, "gpt-5-4": { id: "gpt-5-4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 127999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gpt-5-4-nano": { id: "gpt-5-4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "gpt-oss-20b": { id: "gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 25000 }, cost: { input: 0.05, output: 0.2 } }, "gemini-3-1-pro": { id: "gemini-3-1-pro", name: "Gemini 3.1 Pro Preview Custom Tools", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "gemini-3-5-flash-lite": { id: "gemini-3-5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "gpt-5-5-pro": { id: "gpt-5-5-pro", name: "GPT-5.5 Pro", description: "Highest-accuracy GPT-5.5 tier for slower, precision-heavy reasoning and coding", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 30, output: 180, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "gemini-3-flash": { id: "gemini-3-flash", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, input_audio: 1 } }, "gpt-5-6-luna": { id: "gpt-5-6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 1, output: 6, cache_read: 0.1, tiers: [{ input: 2, output: 9, cache_read: 0.2, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 2, output: 9, cache_read: 0.2 } } }, "claude-opus-4-1": { id: "claude-opus-4-1", name: "Claude Opus 4.1 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 31999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "gpt-5": { id: "gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "gemini-3-1-flash-lite": { id: "gemini-3-1-flash-lite", name: "Gemini 3.1 Flash Lite Preview", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "claude-sonnet-4-5": { id: "claude-sonnet-4-5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gpt-5-4-mini": { id: "gpt-5-4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "glm-5-2": { id: "glm-5-2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 65536 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "gpt-5-3-codex": { id: "gpt-5-3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "llama-4-maverick": { id: "llama-4-maverick", name: "Llama 4 Maverick 17B Instruct", description: "Open multimodal Llama for strong reasoning with efficient everyday serving", family: "llama", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 8192 }, cost: { input: 0.5, output: 1.5 } }, "gpt-5-6-terra": { id: "gpt-5-6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "meta-llama-3-3-70b-instruct": { id: "meta-llama-3-3-70b-instruct", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.5, output: 1.5 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 25000 }, cost: { input: 0.072, output: 0.28 } }, "qwen35-122b-a10b": { id: "qwen35-122b-a10b", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 25000 }, cost: { input: 0.22, output: 2.2 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "meta-llama-3-1-8b-instruct": { id: "meta-llama-3-1-8b-instruct", name: "Llama 3.1 8B Instruct", description: "Meta's compact open-weight Llama 3.1 model for fast, low-cost text generation", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12-31", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.15, output: 0.45 } }, "gpt-5-6-sol": { id: "gpt-5-6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "gemini-3-6-flash": { id: "gemini-3-6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15, input_audio: 1.5 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 65536 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "gpt-5-nano": { id: "gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, inkling: { id: "inkling", name: "Inkling", description: "Multimodal MoE reasoning model (975B total, 41B active) for text, image, and audio", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high", "max"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 65536 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-opus-4-5": { id: "claude-opus-4-5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "gpt-5-2": { id: "gpt-5-2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5-1": { id: "gpt-5-1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "gemma-3-12b": { id: "gemma-3-12b", name: "Gemma 3 12B", description: "Google's open-weight Gemma 3 vision-language model for text and image understanding", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-08-31", release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.15, output: 0.5 } }, "claude-opus-5": { id: "claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "qwen3-next-80b-a3b-instruct": { id: "qwen3-next-80b-a3b-instruct", name: "Qwen3-Next 80B-A3B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 1e4 }, cost: { input: 0.15, output: 1.2 } }, "gpt-5-5": { id: "gpt-5-5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } } } }, infomaniak: { id: "infomaniak", env: ["INFOMANIAK_API_KEY", "INFOMANIAK_PRODUCT_ID"], npm: "@ai-sdk/openai-compatible", api: "https://api.infomaniak.com/2/ai/${INFOMANIAK_PRODUCT_ID}/openai/v1", name: "Infomaniak", doc: "https://www.infomaniak.com/en/hosting/ai-services/open-source-models", models: { mini_lm_l12_v2: { id: "mini_lm_l12_v2", name: "All-MiniLM-L12-v2", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2021-08-30", last_updated: "2026-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128, input: 128, output: 384 }, cost: { input: 0, output: 0 } }, bge_multilingual_gemma2: { id: "bge_multilingual_gemma2", name: "BGE Multilingual Gemma2", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-07-25", last_updated: "2026-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8000, input: 8000, output: 3584 }, cost: { input: 0.08, output: 0 } }, "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-FP8": { id: "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-FP8", name: "Nemotron 3 Nano 30B A3B FP8", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, temperature: true, release_date: "2025-12-15", last_updated: "2026-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, input: 1e6, output: 262144 }, status: "beta", cost: { input: 0.06, output: 0.25 } }, "google/gemma-4-31B-it": { id: "google/gemma-4-31B-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e5, input: 1e5, output: 32768 }, cost: { input: 0.25, output: 0.5 } }, "mistralai/Mistral-Small-4-119B-2603": { id: "mistralai/Mistral-Small-4-119B-2603", name: "Mistral Small 4", description: "Fast Mistral production model for chat, extraction, and cost-sensitive agents", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: true, temperature: true, knowledge: "2025-06", release_date: "2026-03-16", last_updated: "2026-08-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0.25, output: 0.93 } }, "mistralai/Ministral-3-14B-Instruct-2512": { id: "mistralai/Ministral-3-14B-Instruct-2512", name: "Ministral 3 14B Instruct", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2026-08-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1e5, input: 1e5, output: 25600 }, status: "beta", cost: { input: 0.37, output: 0.5 } }, "swiss-ai/Apertus-v1.5-70B": { id: "swiss-ai/Apertus-v1.5-70B", name: "Apertus v1.5 70B", description: "Open, ethically-sourced Swiss AI model for multilingual, multimodal chat and instruction following", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-07-24", last_updated: "2026-08-01", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 1e5, input: 1e5, output: 8192 }, status: "beta", cost: { input: 0.87, output: 3.1 } }, "Qwen/Qwen3.5-397B-A17B-FP8": { id: "Qwen/Qwen3.5-397B-A17B-FP8", name: "Qwen3.5 397B-A17B FP8", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-08-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 65536 }, status: "beta", cost: { input: 0.99, output: 4.46 } }, "Qwen/Qwen3.5-122B-A10B-FP8": { id: "Qwen/Qwen3.5-122B-A10B-FP8", name: "Qwen3.5 122B-A10B FP8", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-08-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 65536 }, cost: { input: 0.5, output: 3.97 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-08-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, status: "beta", cost: { input: 0.74, output: 3.72 } } } }, ambient: { id: "ambient", env: ["AMBIENT_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.ambient.xyz/v1", name: "Ambient", doc: "https://ambient.xyz", models: { "zai-org/GLM-5.1-FP8": { id: "zai-org/GLM-5.1-FP8", name: "GLM 5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0, cache_write: 0 } }, "zai-org/GLM-5.2-FP8": { id: "zai-org/GLM-5.2-FP8", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, cost: { input: 1.2, output: 4.2, cache_read: 0.26, cache_write: 0 } }, "ambient/large": { id: "ambient/large", name: "Ambient Large", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, cost: { input: 1.05, output: 4.4, cache_read: 0.2, cache_write: 0 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek model for efficient chat, coding help, and agent loops", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028, cache_write: 0 } }, "deepseek/deepseek-v4-flash-0731": { id: "deepseek/deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Fast DeepSeek model for efficient chat, coding help, and agent loops", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028, cache_write: 0 } }, "xiaomi/mimo-v2.5": { id: "xiaomi/mimo-v2.5", name: "MiMo-V2.5", description: "MiMo omni model for text, image, video, audio, and agents", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.4, output: 2, cache_read: 0.08, cache_write: 0 } }, "z-ai/glm-5.2": { id: "z-ai/glm-5.2", name: "GLM-5.2", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, cost: { input: 1.05, output: 4.4, cache_read: 0.2, cache_write: 0 } }, "moonshotai/kimi-k2.6": { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.2, cache_write: 0 } }, "moonshotai/kimi-k2.7-code": { id: "moonshotai/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.7, output: 3.5, cache_read: 0.15, cache_write: 0 } }, "stepfun/step-3.7-flash": { id: "stepfun/step-3.7-flash", name: "Step 3.7 Flash", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.19, output: 1.14, cache_read: 0.03, cache_write: 0 } } } }, dinference: { id: "dinference", env: ["DINFERENCE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.dinference.com/v1", name: "DInference", doc: "https://dinference.com", models: { "glm-5": { id: "glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.75, output: 2.4 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 1.25, output: 3.89 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 1.25, output: 3.89 } }, "glm-4.7": { id: "glm-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.45, output: 1.65 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-08", last_updated: "2025-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.0675, output: 0.27 } }, "minimax-m2.5": { id: "minimax-m2.5", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 32000 }, cost: { input: 0.22, output: 0.88 } } } }, "privatemode-ai": { id: "privatemode-ai", env: ["PRIVATEMODE_API_KEY", "PRIVATEMODE_ENDPOINT"], npm: "@ai-sdk/openai-compatible", api: "http://localhost:8080/v1", name: "Privatemode AI", doc: "https://docs.privatemode.ai/api/overview", models: { "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0 } }, "whisper-large-v3": { id: "whisper-large-v3", name: "Whisper large-v3", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "whisper", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-09", release_date: "2023-09-01", last_updated: "2023-09-01", modalities: { input: ["audio"], output: ["text"] }, open_weights: true, limit: { context: 0, output: 4096 }, cost: { input: 0, output: 0 } }, "voxtral-mini-3b": { id: "voxtral-mini-3b", name: "Voxtral Mini 3B", description: "Speech-to-text model for audio transcription, translation, and audio understanding", family: "voxtral", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-07", last_updated: "2025-07", modalities: { input: ["audio"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 32000 }, cost: { input: 0, output: 0 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "gpt-oss-120b", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08", release_date: "2025-08-04", last_updated: "2025-08-14", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0, output: 0 } }, "qwen3-embedding-4b": { id: "qwen3-embedding-4b", name: "Qwen3-Embedding 4B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-06", release_date: "2025-06-06", last_updated: "2025-06-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 2560 }, cost: { input: 0, output: 0 } } } }, unorouter: { id: "unorouter", env: ["UNOROUTER_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.unorouter.com/v1", name: "UnoRouter", doc: "https://unorouter.com/models", models: { "step-3.7-flash:free": { id: "step-3.7-flash:free", name: "Step 3.7 Flash", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0, output: 0 } }, "nemotron-3-ultra-550b-a55b:free": { id: "nemotron-3-ultra-550b-a55b:free", name: "Nemotron 3 Ultra 550B A55B", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 0, output: 0 } }, "gpt-5.5:free": { id: "gpt-5.5:free", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0, output: 0 } }, "gemini-3.5-flash": { id: "gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.1857, output: 1.1142 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.0625, output: 0.125 } }, "minimax-m2.7": { id: "minimax-m2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.819, output: 3.276 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 0.425, output: 2.125 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.6001, output: 5.0288 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.2675, output: 5.3368 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0.1875, output: 1.125 } }, "qwen3.5-397b-a17b:free": { id: "qwen3.5-397b-a17b:free", name: "Qwen3.5 397B-A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0, output: 0 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.8999, output: 1.7999 } }, "deepseek-v4-flash:free": { id: "deepseek-v4-flash:free", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0, output: 0 } }, "glm-4.5-flash:free": { id: "glm-4.5-flash:free", name: "GLM-4.5-Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 98304 }, cost: { input: 0, output: 0 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 1.8, output: 10.8 } }, "gpt-5.2": { id: "gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.05, output: 8.4 } }, "claude-haiku-4-5-20251001": { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1.2, output: 6 } }, "gpt-5.4:free": { id: "gpt-5.4:free", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0, output: 0 } }, "glm-5.2:free": { id: "glm-5.2:free", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 1.44, output: 7.2 } }, "minimax-m2.7:free": { id: "minimax-m2.7:free", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0 } }, "deepseek-v4-pro:free": { id: "deepseek-v4-pro:free", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0, output: 0 } }, "gemma-4-31b-it:free": { id: "gemma-4-31b-it:free", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } } } }, frogbot: { id: "frogbot", env: ["FROGBOT_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://app.frogbot.ai/api/v1", name: "FrogBot", doc: "https://docs.frogbot.ai", models: { "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-02-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gpt-4o": { id: "gpt-4o", name: "GPT-4o", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-07-17", last_updated: "2025-07-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.075 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "kimi-k2-6": { id: "kimi-k2-6", name: "Kimi-K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "1970-01-01", last_updated: "1970-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi-K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "1970-01-01", last_updated: "1970-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "gpt-5-4-nano": { id: "gpt-5-4-nano", name: "GPT-5.4 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "zai-glm-5-1": { id: "zai-glm-5-1", name: "Z.AI GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-01-20", last_updated: "2025-02-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 198000, output: 8192 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "gpt-oss-20b": { id: "gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "1970-01-01", last_updated: "1970-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.07, output: 0.2 } }, "minimax-m2-5": { id: "minimax-m2-5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2025-01-15", last_updated: "2025-02-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 192000, output: 8192 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "minimax-m2-7": { id: "minimax-m2-7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 192000, output: 8192 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "grok-code-fast-1": { id: "grok-code-fast-1", name: "Grok 4.1 Fast (Reasoning)", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2023-10", release_date: "2025-08-28", last_updated: "2025-08-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 0.2, output: 1.5, cache_read: 0.02 } }, "gemini-3-flash-preview": { id: "gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05 } }, "qwen-3-6-plus": { id: "qwen-3-6-plus", name: "Qwen 3.6 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-03", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.5, output: 3, cache_read: 0.1 } }, "gpt-5-4-mini": { id: "gpt-5-4-mini", name: "GPT-5.4 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek v4 Pro", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2026-01", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 1.74, output: 3.48, cache_read: 0.14 } }, "grok-4-3": { id: "grok-4-3", name: "Grok 4.3", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-11", release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "grok-4-1-fast-reasoning": { id: "grok-4-1-fast-reasoning", name: "Grok 4.1 Fast (Reasoning)", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-11", release_date: "2025-11-25", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 128000 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "gpt-5-3-codex": { id: "gpt-5-3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "1970-01-01", last_updated: "1970-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 0.6 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-03-20", last_updated: "2025-06-05", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.31 } }, "grok-4-1-fast-non-reasoning": { id: "grok-4-1-fast-non-reasoning", name: "Grok 4.1 Fast (Non-Reasoning)", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-11", release_date: "2025-11-25", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 128000 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gemini-3-1-pro-preview": { id: "gemini-3-1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-01", release_date: "2026-02-18", last_updated: "2026-02-18", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 2, output: 12, cache_read: 0.2 } }, "gpt-5-5": { id: "gpt-5-5", name: "GPT-5.5", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 272000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25 } } } }, "the-grid-ai": { id: "the-grid-ai", env: ["THEGRID_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.thegrid.ai/v1", name: "The Grid AI", doc: "https://thegrid.ai/docs", models: { "agent-standard": { id: "agent-standard", name: "Agent Standard", description: "Price-optimized models for fast tool calls, simple agent loops, high-throughput automation, and orchestration. Any model that meets the contract spec can serve your request.", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-05-04", last_updated: "2026-07-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 120000, output: 16000 }, status: "beta" }, "text-prime": { id: "text-prime", name: "Text Prime", description: "Reliable models for everyday text generation, editing, and analysis across diverse workflows. Any model that meets the contract spec can serve your request.", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-26", last_updated: "2026-07-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 196608, input: 120000, output: 30000 } }, "agent-prime": { id: "agent-prime", name: "Agent Prime", description: "Reliable models for dependable agentic applications, multi-step tool use, and reasoning workflows. Any model that meets the contract spec can serve your request.", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-05-04", last_updated: "2026-07-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 196608, input: 120000, output: 30000 }, status: "beta" }, "code-standard": { id: "code-standard", name: "Code Standard", description: "Price-optimized models for rapid autocomplete, linting, high-frequency suggestions, and batch edits. Any model that meets the contract spec can serve your request.", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-05-04", last_updated: "2026-07-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 120000, output: 16000 }, status: "beta" }, "code-max": { id: "code-max", name: "Code Max", description: "Frontier models for complex research, architectural decisions, debugging, and multi-file development. Any model that meets the contract spec can serve your request.", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-05-04", last_updated: "2026-07-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 922000, output: 128000 }, status: "beta" }, "agent-max": { id: "agent-max", name: "Agent Max", description: "Frontier models for autonomous research, deep multi-step tool chains, and complex long-horizon tasks. Any model that meets the contract spec can serve your request.", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-05-04", last_updated: "2026-07-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 922000, output: 128000 }, status: "beta" }, "text-max": { id: "text-max", name: "Text Max", description: "Frontier models for deep reasoning, long context, and complex workflows. Any model that meets the contract spec can serve your request.", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-02-26", last_updated: "2026-07-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 922000, output: 128000 } }, "text-standard": { id: "text-standard", name: "Text Standard", description: "Price-optimized models with low-latency, high-throughput and shorter maximum outputs. Any model that meets the contract spec can serve your request.", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-26", last_updated: "2026-07-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 120000, output: 16000 } }, "code-prime": { id: "code-prime", name: "Code Prime", description: "Reliable models for everyday software tasks, code completion, review, and standard debugging. Any model that meets the contract spec can serve your request.", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-05-04", last_updated: "2026-07-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 196608, input: 120000, output: 30000 }, status: "beta" } } }, "sap-ai-core": { id: "sap-ai-core", env: ["AICORE_SERVICE_KEY"], npm: "@jerome-benoit/sap-ai-provider-v2", name: "SAP AI Core", doc: "https://help.sap.com/docs/sap-ai-core", models: { "anthropic--claude-4.5-sonnet": { id: "anthropic--claude-4.5-sonnet", name: "anthropic--claude-4.5-sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gpt-4.1-mini": { id: "gpt-4.1-mini", name: "gpt-4.1-mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "nvidia--llama-3.2-nv-embedqa-1b": { id: "nvidia--llama-3.2-nv-embedqa-1b", name: "nvidia--llama-3.2-nv-embedqa-1b", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 4096 }, cost: { input: 0.07, output: 0 } }, "gemini-3.5-flash": { id: "gemini-3.5-flash", name: "gemini-3.5-flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, input_audio: 1.5 } }, "anthropic--claude-4.8-opus": { id: "anthropic--claude-4.8-opus", name: "anthropic--claude-4.8-opus", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "gemini-2.5-flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-04-17", last_updated: "2025-06-05", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, input_audio: 1 } }, "anthropic--claude-4.6-opus": { id: "anthropic--claude-4.6-opus", name: "anthropic--claude-4.6-opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic--claude-4.5-opus": { id: "anthropic--claude-4.5-opus", name: "anthropic--claude-4.5-opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic--claude-3.7-sonnet": { id: "anthropic--claude-3.7-sonnet", name: "anthropic--claude-3.7-sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2024-10-31", release_date: "2025-02-24", last_updated: "2025-02-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, status: "deprecated", cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "amazon--titan-embed-text": { id: "amazon--titan-embed-text", name: "amazon--titan-embed-text", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-04-30", last_updated: "2024-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 }, cost: { input: 0.14, output: 0 } }, "gpt-4.1-nano": { id: "gpt-4.1-nano", name: "gpt-4.1-nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.08, output: 0.26 } }, "amazon--nova-micro": { id: "amazon--nova-micro", name: "amazon--nova-micro", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova-micro", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-12-03", last_updated: "2024-12-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.03, output: 0.1 } }, "amazon--nova-pro": { id: "amazon--nova-pro", name: "amazon--nova-pro", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "nova-pro", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2024-12-03", last_updated: "2024-12-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 8192 }, cost: { input: 0.56, output: 2.13 } }, "sonar-deep-research": { id: "sonar-deep-research", name: "sonar-deep-research", description: "Sonar search model for current answers, retrieval, and citation-backed chat", family: "sonar-deep-research", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: false, temperature: false, knowledge: "2025-01", release_date: "2025-02-01", last_updated: "2025-09-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32768 }, cost: { input: 2, output: 8, reasoning: 3 } }, "amazon--nova-lite": { id: "amazon--nova-lite", name: "amazon--nova-lite", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.3, output: 2.37 } }, sonar: { id: "sonar", name: "sonar", description: "Sonar search model for current answers, retrieval, and citation-backed chat", family: "sonar", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 1, output: 1 } }, "sonar-pro": { id: "sonar-pro", name: "sonar-pro", description: "Advanced Sonar search model for deeper research and cited synthesis", family: "sonar-pro", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 3, output: 15 } }, "anthropic--claude-4.5-haiku": { id: "anthropic--claude-4.5-haiku", name: "anthropic--claude-4.5-haiku", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "gpt-5.5": { id: "gpt-5.5", name: "gpt-5.5", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "gpt-5": { id: "gpt-5", name: "gpt-5", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "mistralai--mistral-small": { id: "mistralai--mistral-small", name: "mistralai--mistral-small", description: "Fast Mistral production model for chat, extraction, and cost-sensitive agents", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.07, output: 0.28 } }, "gpt-5.4": { id: "gpt-5.4", name: "gpt-5.4", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25 } }, "sap-abap-1": { id: "sap-abap-1", name: "sap-abap-1", description: "SAP-hosted model for ABAP code generation and enterprise development tasks", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-11-26", last_updated: "2025-11-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 4096 }, cost: { input: 0.48, output: 1.7 } }, "anthropic--claude-3-opus": { id: "anthropic--claude-3-opus", name: "anthropic--claude-3-opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-08-31", release_date: "2024-02-29", last_updated: "2024-02-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, status: "deprecated", cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic--claude-4-opus": { id: "anthropic--claude-4-opus", name: "anthropic--claude-4-opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, status: "deprecated", cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic--claude-4.7-opus": { id: "anthropic--claude-4.7-opus", name: "anthropic--claude-4.7-opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gemini-3.1-flash-lite": { id: "gemini-3.1-flash-lite", name: "gemini-3.1-flash-lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "gpt-5.2": { id: "gpt-5.2", name: "gpt-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 9.44, cache_read: 0.12 } }, "anthropic--claude-3-sonnet": { id: "anthropic--claude-3-sonnet", name: "anthropic--claude-3-sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-08-31", release_date: "2024-03-04", last_updated: "2024-03-04", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, status: "deprecated", cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gemini-embedding": { id: "gemini-embedding", name: "Gemini Embedding 001", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "gemini", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2025-05", release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 2048, output: 1 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "gpt-5-mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "anthropic--claude-4-sonnet": { id: "anthropic--claude-4-sonnet", name: "anthropic--claude-4-sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic--claude-3-haiku": { id: "anthropic--claude-3-haiku", name: "anthropic--claude-3-haiku", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-08-31", release_date: "2024-03-13", last_updated: "2024-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, cost: { input: 0.25, output: 1.25, cache_read: 0.03, cache_write: 0.3 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "gemini-2.5-pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-03-25", last_updated: "2025-06-05", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "mistralai--mistral-medium-instruct": { id: "mistralai--mistral-medium-instruct", name: "mistralai--mistral-medium-instruct", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-05-07", last_updated: "2025-05-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.36, output: 1.22 } }, "gpt-5-nano": { id: "gpt-5-nano", name: "gpt-5-nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "gemini-2.5-flash-lite": { id: "gemini-2.5-flash-lite", name: "gemini-2.5-flash-lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 512, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01, input_audio: 0.3 } }, "cohere--command-a-reasoning": { id: "cohere--command-a-reasoning", name: "cohere--command-a-reasoning", description: "Cohere reasoning model for multilingual enterprise agents, tools, and complex workflows", family: "command-a", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high"] }, { type: "budget_tokens", min: 1 }], tool_call: true, temperature: true, knowledge: "2024-06-01", release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 32000 }, cost: { input: 0.63, output: 5.05 } }, "gpt-4.1": { id: "gpt-4.1", name: "gpt-4.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.32 } }, "anthropic--claude-4.6-sonnet": { id: "anthropic--claude-4.6-sonnet", name: "anthropic--claude-4.6-sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-08", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "text-embedding-3-large": { id: "text-embedding-3-large", name: "text-embedding-3-large", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8191, output: 3072 }, cost: { input: 0.09, output: 0 } }, "anthropic--claude-3.5-sonnet": { id: "anthropic--claude-3.5-sonnet", name: "anthropic--claude-3.5-sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04-30", release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, status: "deprecated", cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "text-embedding-3-small": { id: "text-embedding-3-small", name: "text-embedding-3-small", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8191, output: 1536 }, cost: { input: 0.02, output: 0 } } } }, upstage: { id: "upstage", env: ["UPSTAGE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.upstage.ai/v1/solar", name: "Upstage", doc: "https://developers.upstage.ai/docs/apis/chat", models: { "solar-pro3": { id: "solar-pro3", name: "solar-pro3", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "solar-pro", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.25, output: 0.25 } }, "solar-mini": { id: "solar-mini", name: "solar-mini", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "solar-mini", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2024-06-12", last_updated: "2025-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 4096 }, cost: { input: 0.15, output: 0.15 } }, "solar-pro2": { id: "solar-pro2", name: "solar-pro2", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "solar-pro", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "high"] }], tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 65536, output: 8192 }, cost: { input: 0.25, output: 0.25 } }, "solar-pro4": { id: "solar-pro4", name: "Solar Pro 4", description: "Upstage's flagship model, specialized for agentic use", family: "solar-pro", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-02", release_date: "2026-08-06", last_updated: "2026-08-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 524288, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } } } }, "cline-pass": { id: "cline-pass", env: ["CLINE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.cline.bot/api/v1", name: "ClinePass", doc: "https://docs.cline.bot/getting-started/clinepass", models: { "cline-pass/qwen3.7-plus": { id: "cline-pass/qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.4, output: 1.6, cache_read: 0.04, cache_write: 0.5, tiers: [{ input: 1.2, output: 4.8, cache_read: 0.12, cache_write: 1.5, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 1.2, output: 4.8, cache_read: 0.12, cache_write: 1.5 } } }, "cline-pass/deepseek-v4-flash": { id: "cline-pass/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "cline-pass/glm-5.2": { id: "cline-pass/glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "cline-pass/qwen3.7-max": { id: "cline-pass/qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5, cache_write: 3.125 } }, "cline-pass/kimi-k2.6": { id: "cline-pass/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "cline-pass/minimax-m3": { id: "cline-pass/minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 512000, output: 128000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "cline-pass/deepseek-v4-pro": { id: "cline-pass/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 1.74, output: 3.48, cache_read: 0.0145 } }, "cline-pass/mimo-v2.5": { id: "cline-pass/mimo-v2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "cline-pass/kimi-k2.7-code": { id: "cline-pass/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "cline-pass/kimi-k3": { id: "cline-pass/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "cline-pass/mimo-v2.5-pro": { id: "cline-pass/mimo-v2.5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1.74, output: 3.48, cache_read: 0.0145 } } } }, "regolo-ai": { id: "regolo-ai", env: ["REGOLO_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.regolo.ai/v1", name: "Regolo AI", doc: "https://docs.regolo.ai/", models: { "gemma4-31b": { id: "gemma4-31b", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1e5, output: 1e5 }, cost: { input: 0.46, output: 2.42 } }, "brick-complexity-pro": { id: "brick-complexity-pro", name: "Brick Complexity Pro", description: "Complexity classifier that powers the Brick semantic router by extracting query difficulty", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-02-06", last_updated: "2026-02-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e5, output: 15000 }, cost: { input: 0.12, output: 0.46 } }, "qwen3.5-122b": { id: "qwen3.5-122b", name: "Qwen3.5-122B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-01", last_updated: "2026-02-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.9, output: 3.6 } }, "apertus-70b": { id: "apertus-70b", name: "Apertus 70B", description: "Fully open 70B multilingual LLM supporting 1800+ languages with 65K context. Trained on 15T tokens of compliant open data. Apache 2.0, EU AI Act compliant.", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-09-02", last_updated: "2025-09-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 30000, output: 30000 }, cost: { input: 0.46, output: 2.42 } }, "faster-whisper-large-v3": { id: "faster-whisper-large-v3", name: "Faster Whisper Large v3", description: "Open Whisper checkpoint for robust multilingual transcription and captioning", family: "whisper", attachment: false, reasoning: false, tool_call: false, release_date: "2024-10-01", last_updated: "2024-10-01", modalities: { input: ["audio"], output: ["text"] }, open_weights: true, limit: { context: 448, output: 4096 }, cost: { input: 0, output: 0 } }, "gpt-oss-20b": { id: "gpt-oss-20b", name: "GPT-OSS-20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2026-03-01", last_updated: "2026-03-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.4, output: 1.8 } }, "qwen3.5-9b": { id: "qwen3.5-9b", name: "Qwen3.5-9B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-01", last_updated: "2026-02-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 8192 }, cost: { input: 0.15, output: 0.6 } }, "qwen3.6-27b": { id: "qwen3.6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 120000, output: 120000 }, cost: { input: 0.58, output: 2.42 } }, "llama-3.3-70b-instruct": { id: "llama-3.3-70b-instruct", name: "Llama 3.3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-04-28", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.6, output: 2.7 } }, "brick-v1-beta": { id: "brick-v1-beta", name: "Brick v1 Beta", description: "Semantic router by Regolo.ai that directs each request to the most suitable model, optimizing costs and performance", family: "model-router", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-02-06", last_updated: "2026-02-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e5, output: 15000 }, status: "beta", cost: { input: 0, output: 0 } }, "qwen3-reranker-4b": { id: "qwen3-reranker-4b", name: "Qwen3-Reranker-4B", description: "Reranking model for improving retrieval quality in search and recommendation systems", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-02-01", last_updated: "2026-02-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 0.12, output: 0.12 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT-OSS-120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1, output: 4.2 } }, "deepseek-ocr-2": { id: "deepseek-ocr-2", name: "DeepSeek OCR 2", description: "High-accuracy OCR model for extracting text from documents, screenshots, receipts, and natural scenes", attachment: true, reasoning: false, tool_call: false, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 4000, output: 4000 }, cost: { input: 0, output: 0 } }, "mistral-small-4-119b": { id: "mistral-small-4-119b", name: "Mistral Small 4 119B", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-15", last_updated: "2026-03-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 16384 }, cost: { input: 0.75, output: 3 } }, "qwen-image": { id: "qwen-image", name: "Qwen-Image", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-03-01", last_updated: "2026-03-01", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 8192, output: 4096 }, cost: { input: 0.5, output: 2 } }, "glm5.2": { id: "glm5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 96000, output: 96000 }, cost: { input: 2.31, output: 6 } }, "qwen3-coder-next": { id: "qwen3-coder-next", name: "Qwen3-Coder-Next", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-01", last_updated: "2026-03-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.3, output: 1.2 } }, "qwen3-embedding-8b": { id: "qwen3-embedding-8b", name: "Qwen3-Embedding-8B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-02-01", last_updated: "2026-02-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 0.1, output: 0.1 } } } }, aiand: { id: "aiand", env: ["AIAND_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.aiand.com/v1", name: "ai&", doc: "https://docs.aiand.com/", models: { "google/gemma-4-31b-it": { id: "google/gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.2, output: 0.5 } }, "zai-org/glm-5.2": { id: "zai-org/glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1, output: 4 } }, "qwen/qwen3.6-27b": { id: "qwen/qwen3.6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0, output: 0 } }, "deepseek-ai/deepseek-v4-flash": { id: "deepseek-ai/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 0.15, output: 0.25 } }, "deepseek-ai/deepseek-v4-pro": { id: "deepseek-ai/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 1, output: 2.5 } }, "moonshotai/kimi-k2.7-code": { id: "moonshotai/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.75, output: 3.5 } }, "moonshotai/kimi-k3": { id: "moonshotai/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 12.5, cache_read: 0.5 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 0.6 } } } }, pioneer: { id: "pioneer", env: ["PIONEER_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.pioneer.ai/v1", name: "Pioneer", doc: "https://agent.pioneer.ai/llms.txt", models: { "qwen3.7-plus": { id: "qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.32, output: 1.28, cache_read: 0.064, cache_write: 0.4 } }, "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "mistral-medium-3.5": { id: "mistral-medium-3.5", name: "Mistral Medium 3.5", description: "Balanced Mistral model for enterprise assistants, multilingual work, and tools", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 1.5, output: 7.5, cache_read: 1.5, cache_write: 1.5 } }, "gpt-4.1-mini": { id: "gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.2, cache_write: 0.4 } }, "gpt-4o": { id: "gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25, cache_write: 2.5 } }, "gemini-3.5-flash": { id: "gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, cache_write: 0.083333 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "gemini-3.5-flash-lite": { id: "gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65000 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, cache_write: 0.3 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 11, output: 55, cache_read: 1.1, cache_write: 13.75 } }, "gemini-3.1-pro": { id: "gemini-3.1-pro", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 0.375 } }, "claude-3-7-sonnet-latest": { id: "claude-3-7-sonnet-latest", name: "Claude Sonnet 3.7", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-10-31", release_date: "2025-02-19", last_updated: "2025-02-19", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gpt-4.1-nano": { id: "gpt-4.1-nano", name: "GPT-4.1 nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.1, output: 0.4, cache_read: 0.05, cache_write: 0.1 } }, "qwen3.7-max": { id: "qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 1.25, output: 3.75, cache_read: 0.25, cache_write: 1.5625 } }, "gemini-3-flash": { id: "gemini-3-flash", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 0.083333 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 5 } }, "claude-opus-4-1": { id: "claude-opus-4-1", name: "Claude Opus 4.1 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "gpt-4o-mini": { id: "gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075, cache_write: 0.15 } }, "claude-sonnet-4-5": { id: "claude-sonnet-4-5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "mistral-large-3": { id: "mistral-large-3", name: "Mistral Large 3", description: "Mistral's largest general model for enterprise agents, coding, and multilingual reasoning", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 131072 }, cost: { input: 0.5, output: 1.5, cache_read: 0.5, cache_write: 0.5 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 2.5 } }, "gpt-5.4-nano": { id: "gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02, cache_write: 0.2 } }, "gemini-3.6-flash": { id: "gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15, cache_write: 1.5 } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075, cache_write: 0.75 } }, "gemini-3.1-flash-lite": { id: "gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65000 }, cost: { input: 0.25, output: 1.5, cache_read: 0.03, cache_write: 0.25 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 1, output: 6, cache_read: 0.1, cache_write: 1.25 } }, "gpt-5.3-codex": { id: "gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175, cache_write: 1.75 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025, cache_write: 0.25 } }, "grok-4.5": { id: "grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 131072 }, cost: { input: 2, output: 6, cache_read: 0.5, cache_write: 2 } }, "qwen3.6-flash": { id: "qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.1875, output: 1.125, cache_read: 0.0375, cache_write: 0.234375 } }, "gpt-5.1": { id: "gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125, cache_write: 1.25 } }, "gpt-5-nano": { id: "gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005, cache_write: 0.05 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 3.125 } }, "claude-opus-4-5": { id: "claude-opus-4-5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "qwen3.6-max-preview": { id: "qwen3.6-max-preview", name: "Qwen3.6 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 1.04, output: 6.24, cache_read: 0.208, cache_write: 1.3 } }, "devstral-2": { id: "devstral-2", name: "Devstral 2", description: "Mistral's coding-agent model for repository work, terminal tasks, and software fixes", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-12", release_date: "2025-12-09", last_updated: "2025-12-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 131072 }, cost: { input: 0.4, output: 2, cache_read: 0.4, cache_write: 0.4 } }, "gpt-4.1": { id: "gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 1, cache_write: 2 } }, "claude-opus-5": { id: "claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "qwen3.6-plus": { id: "qwen3.6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.325, output: 1.95, cache_read: 0.065, cache_write: 0.40625 } }, "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-FP8": { id: "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-FP8", name: "Nemotron 3 Super 120B A12B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 32000 }, cost: { input: 0.09, output: 0.45, cache_read: 0.09, cache_write: 0.09 } }, "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B-BF16": { id: "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B-BF16", name: "Nemotron 3 Ultra 550B A55B", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 65000 }, cost: { input: 0.5, output: 2.5, cache_read: 0.15, cache_write: 0.5 } }, "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16": { id: "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16", name: "Nemotron 3 Nano 30B A3B", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2025-12-15", last_updated: "2025-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.05, output: 0.2, cache_read: 0.05, cache_write: 0.05 } }, "google/gemma-4-12B-it": { id: "google/gemma-4-12B-it", name: "Gemma 4 12B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-05-31", last_updated: "2026-05-31", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.25, output: 0.25, cache_read: 0.25, cache_write: 0.25 } }, "google/gemma-3-4b-pt": { id: "google/gemma-3-4b-pt", name: "Gemma 3 4B (Pretrained)", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2025-02-28", last_updated: "2025-02-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.15, output: 0.15, cache_read: 0.15, cache_write: 0.15 } }, "google/diffusiongemma-26B-A4B-it": { id: "google/diffusiongemma-26B-A4B-it", name: "DiffusionGemma 26B-A4B IT", description: "Gemini model for general assistance, reasoning, and multimodal workflows", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-05-31", last_updated: "2026-05-31", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 131072 }, cost: { input: 0.5, output: 0.5, cache_read: 0.5, cache_write: 0.5 } }, "google/gemma-4-E2B-it": { id: "google/gemma-4-E2B-it", name: "Gemma 4 E2B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.1, output: 0.1, cache_read: 0.1, cache_write: 0.1 } }, "google/gemma-4-E4B-it": { id: "google/gemma-4-E4B-it", name: "Gemma 4 E4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.2, output: 0.2, cache_read: 0.2, cache_write: 0.2 } }, "google/gemma-4-31B-it": { id: "google/gemma-4-31B-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.5, output: 0.5, cache_read: 0.5, cache_write: 0.5 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 128000 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26, cache_write: 1.4 } }, "zai-org/GLM-5.1": { id: "zai-org/GLM-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 0.98, output: 3.08, cache_read: 0.182, cache_write: 0.98 } }, "sakana/fugu-ultra": { id: "sakana/fugu-ultra", name: "Fugu Ultra", description: "Quality-first multi-agent model for hard research, analysis, and competitions", family: "fugu", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-06-15", last_updated: "2026-06-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 5 } }, "fastino/gliner2-large-v1": { id: "fastino/gliner2-large-v1", name: "GLiNER2 Large", description: "Flagship model for demanding analysis, coding, and production agent workflows", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-06-30", last_updated: "2025-06-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 4096 }, cost: { input: 0.15, output: 0.15, cache_read: 0.15, cache_write: 0.15 } }, "fastino/gliguard-LLMGuardrails-300M": { id: "fastino/gliguard-LLMGuardrails-300M", name: "GLiGuard LLM Guardrails 300M", description: "Tool-capable chat model for instruction following and agentic application workflows", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 4096 }, cost: { input: 0.15, output: 0.15, cache_read: 0.15, cache_write: 0.15 } }, "fastino/gliner2-multi-v1": { id: "fastino/gliner2-multi-v1", name: "GLiNER2 Multi", description: "Tool-capable chat model for instruction following and agentic application workflows", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-11-30", last_updated: "2025-11-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 4096 }, cost: { input: 0.15, output: 0.15, cache_read: 0.15, cache_write: 0.15 } }, "fastino/gliner2-base-v1": { id: "fastino/gliner2-base-v1", name: "GLiNER2 Base", description: "Tool-capable chat model for instruction following and agentic application workflows", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-06-30", last_updated: "2025-06-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 4096 }, cost: { input: 0.15, output: 0.15, cache_read: 0.15, cache_write: 0.15 } }, "fastino/gliner2-multi-large-v1": { id: "fastino/gliner2-multi-large-v1", name: "GLiNER2 Multi Large", description: "Flagship model for demanding analysis, coding, and production agent workflows", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-11-30", last_updated: "2025-11-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 4096 }, cost: { input: 0.15, output: 0.15, cache_read: 0.15, cache_write: 0.15 } }, "fastino/gliner2-privacy-filter-PII-multi": { id: "fastino/gliner2-privacy-filter-PII-multi", name: "GLiNER2 Privacy Filter PII (Multi)", description: "Tool-capable chat model for instruction following and agentic application workflows", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 4096 }, cost: { input: 0.15, output: 0.15, cache_read: 0.15, cache_write: 0.15 } }, "mistralai/Mistral-Nemo-Instruct-2407": { id: "mistralai/Mistral-Nemo-Instruct-2407", name: "Mistral Nemo", description: "Efficient Mistral-NVIDIA open model for multilingual chat and local deployment", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-07-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 128000 }, cost: { input: 0.02, output: 0.03, cache_read: 0.02, cache_write: 0.02 } }, "mistralai/Mistral-Small-4-119B-2603": { id: "mistralai/Mistral-Small-4-119B-2603", name: "Mistral Small 4", description: "Fast Mistral production model for chat, extraction, and cost-sensitive agents", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-06", release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015, cache_write: 0.15 } }, "mistralai/Codestral-22B-v0.1": { id: "mistralai/Codestral-22B-v0.1", name: "Codestral-22B-v0.1", description: "Open Mistral code model for fill-in-the-middle and 80+ programming languages", family: "codestral", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-05-29", last_updated: "2024-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 0.3, output: 0.9, cache_read: 0.3, cache_write: 0.3 } }, "mistralai/Magistral-Small-2506": { id: "mistralai/Magistral-Small-2506", name: "Magistral Small", description: "Open Mistral reasoning model for transparent step-by-step problem solving", family: "magistral", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2025-06-10", last_updated: "2025-06-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 64000 }, cost: { input: 0.5, output: 1.5, cache_read: 0.5, cache_write: 0.5 } }, "mistralai/Mistral-7B-Instruct-v0.3": { id: "mistralai/Mistral-7B-Instruct-v0.3", name: "Mistral 7B Instruct v0.3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2023-04-30", last_updated: "2023-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.2, output: 0.2, cache_read: 0.2, cache_write: 0.2 } }, "mistralai/Ministral-8B-Instruct-2410": { id: "mistralai/Ministral-8B-Instruct-2410", name: "Ministral 8B Instruct", description: "Efficient open Mistral edge model for on-device chat and function calling", family: "ministral", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-10-16", last_updated: "2024-10-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 0.15, output: 0.15, cache_read: 0.15, cache_write: 0.15 } }, "mistralai/Pixtral-12B-2409": { id: "mistralai/Pixtral-12B-2409", name: "Pixtral 12B", description: "Mistral vision-language model for image understanding and multimodal chat", family: "pixtral", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2024-09-01", last_updated: "2024-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 0.15, output: 0.15, cache_read: 0.15, cache_write: 0.15 } }, "pioneer/auto": { id: "pioneer/auto", name: "Pioneer Auto", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2024-01-01", last_updated: "2025-06-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 4096 } }, "meta/muse-spark-1.1": { id: "meta/muse-spark-1.1", name: "Muse Spark 1.1", description: "Muse Spark is a natively multimodal reasoning model with support for tool-use, visual chain of thought, and multi-agent orchestration.", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-08", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15, cache_write: 1.25 } }, "Qwen/Qwen3.5-9B": { id: "Qwen/Qwen3.5-9B", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.3, output: 0.3, cache_read: 0.3, cache_write: 0.3 } }, "Qwen/Qwen3-235B-A22B-Instruct-2507": { id: "Qwen/Qwen3-235B-A22B-Instruct-2507", name: "Qwen3 235B-A22B Instruct 2507", description: "Updated large open Qwen3 MoE instruct model for multilingual chat, coding, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-07-21", last_updated: "2025-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 1.2, output: 1.2, cache_read: 1.2, cache_write: 1.2 } }, "Qwen/Qwen3-8B": { id: "Qwen/Qwen3-8B", name: "Qwen3 8B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-03-31", release_date: "2025-03-31", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.2, output: 0.2, cache_read: 0.2, cache_write: 0.2 } }, "Qwen/Qwen3.6-27B": { id: "Qwen/Qwen3.6-27B", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.6, output: 0.6, cache_read: 0.6, cache_write: 0.6 } }, "Qwen/Qwen3-1.7B-Base": { id: "Qwen/Qwen3-1.7B-Base", name: "Qwen3 1.7B Base", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2025-03-31", last_updated: "2025-03-31", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.1, output: 0.1, cache_read: 0.1, cache_write: 0.1 } }, "Qwen/Qwen3.6-35B-A3B": { id: "Qwen/Qwen3.6-35B-A3B", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.14, output: 1, cache_read: 0.028, cache_write: 0.175 } }, "Qwen/Qwen2.5-Coder-0.5B": { id: "Qwen/Qwen2.5-Coder-0.5B", name: "Qwen2.5-Coder-0.5B", description: "Tiny open Qwen code model for lightweight completion and on-device coding", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-11-12", last_updated: "2024-11-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.1, output: 0.1, cache_read: 0.1, cache_write: 0.1 } }, "Qwen/Qwen3-32B": { id: "Qwen/Qwen3-32B", name: "Qwen3 32B", description: "Dense open Qwen model for self-hosted chat, reasoning, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.9, output: 0.9, cache_read: 0.9, cache_write: 0.9 } }, "Qwen/Qwen3-4B-Instruct-2507": { id: "Qwen/Qwen3-4B-Instruct-2507", name: "Qwen3 4B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2025-07-31", last_updated: "2025-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 131072 }, cost: { input: 0.2, output: 0.2, cache_read: 0.2, cache_write: 0.2 } }, "Qwen/Qwen3-4B-Base": { id: "Qwen/Qwen3-4B-Base", name: "Qwen3 4B Base", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2025-03-31", last_updated: "2025-03-31", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.15, output: 0.15, cache_read: 0.15, cache_write: 0.15 } }, "LiquidAI/LFM2-24B-A2B": { id: "LiquidAI/LFM2-24B-A2B", name: "LFM2 24B A2B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "liquid", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-01-31", last_updated: "2026-02-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.03, output: 0.12, cache_read: 0.03, cache_write: 0.03 } }, "HuggingFaceTB/SmolLM3-3B-Base": { id: "HuggingFaceTB/SmolLM3-3B-Base", name: "SmolLM3 3B Base", description: "Tool-capable chat model for instruction following and agentic application workflows", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2025-06-30", last_updated: "2025-06-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.15, output: 0.15, cache_read: 0.15, cache_write: 0.15 } }, "MiniMaxAI/MiniMax-M2.7": { id: "MiniMaxAI/MiniMax-M2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.279, output: 1.2, cache_read: 0.279, cache_write: 0.279 } }, "MiniMaxAI/MiniMax-M3": { id: "MiniMaxAI/MiniMax-M3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06, cache_write: 0.3 } }, "poolside/laguna-s-2.1": { id: "poolside/laguna-s-2.1", name: "Laguna S 2.1", description: "Agentic coding model from Poolside in the XS size class for local deployment", family: "laguna", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0.1, output: 0.2, cache_read: 0.01, cache_write: 0.1 } }, "deepseek-ai/DeepSeek-V3": { id: "deepseek-ai/DeepSeek-V3", name: "DeepSeek-V3", description: "Open DeepSeek MoE chat model for coding, math, and general reasoning", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-12-26", last_updated: "2024-12-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 8192 }, cost: { input: 0.27, output: 1.12, cache_read: 0.135, cache_write: 0.27 } }, "deepseek-ai/DeepSeek-V3.1": { id: "deepseek-ai/DeepSeek-V3.1", name: "DeepSeek-V3.1", description: "Hybrid-reasoning DeepSeek model with thinking and non-thinking modes", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 131072 }, cost: { input: 0.56, output: 1.68, cache_read: 0.56, cache_write: 0.56 } }, "deepseek-ai/DeepSeek-V4-Flash": { id: "deepseek-ai/DeepSeek-V4-Flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0.1, output: 0.2, cache_read: 0.0197, cache_write: 0.1 } }, "deepseek-ai/DeepSeek-V4-Pro": { id: "deepseek-ai/DeepSeek-V4-Pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625, cache_write: 0.435 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.95, output: 4, cache_read: 0.34, cache_write: 0.95 } }, "moonshotai/Kimi-K2.7-Code": { id: "moonshotai/Kimi-K2.7-Code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.95, output: 4, cache_read: 0.19, cache_write: 0.95 } }, "moonshotai/Kimi-K3": { id: "moonshotai/Kimi-K3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.07, output: 0.3, cache_read: 0.035, cache_write: 0.07 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015, cache_write: 0.15 } }, "meta-llama/Llama-3.3-70B-Instruct": { id: "meta-llama/Llama-3.3-70B-Instruct", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.9, output: 0.9, cache_read: 0.9, cache_write: 0.9 } }, "meta-llama/Llama-3.1-8B-Instruct": { id: "meta-llama/Llama-3.1-8B-Instruct", name: "Llama 3.1 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2023-12-31", release_date: "2024-06-30", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.2, output: 0.2, cache_read: 0.2, cache_write: 0.2 } }, "meta-llama/Llama-3.2-1B-Instruct": { id: "meta-llama/Llama-3.2-1B-Instruct", name: "Llama 3.2 1B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2023-12-31", release_date: "2024-08-31", last_updated: "2024-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 60000 }, cost: { input: 0.1, output: 0.201, cache_read: 0.1, cache_write: 0.1 } }, "meta-llama/Llama-3.2-1B": { id: "meta-llama/Llama-3.2-1B", name: "Llama-3.2-1B", description: "Compact open Llama base model for lightweight and on-device use", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2023-12", release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.1, output: 0.1, cache_read: 0.1, cache_write: 0.1 } }, "meta-llama/Llama-3.2-3B": { id: "meta-llama/Llama-3.2-3B", name: "Llama-3.2-3B", description: "Small open Llama base model for lightweight text generation and self-hosting", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2023-12", release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.1, output: 0.1, cache_read: 0.1, cache_write: 0.1 } }, "meta-llama/Llama-3.2-3B-Instruct": { id: "meta-llama/Llama-3.2-3B-Instruct", name: "Llama 3.2 3B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2023-12-31", release_date: "2024-08-31", last_updated: "2024-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 80000 }, cost: { input: 0.1, output: 0.335, cache_read: 0.1, cache_write: 0.1 } }, "XiaomiMiMo/MiMo-V2.5-Pro": { id: "XiaomiMiMo/MiMo-V2.5-Pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1050000, output: 131072 }, cost: { input: 0.435, output: 0.87, cache_read: 0.0036, cache_write: 0.435 } }, "XiaomiMiMo/MiMo-V2.5": { id: "XiaomiMiMo/MiMo-V2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1050000, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028, cache_write: 0.14 } } } }, siliconflow: { id: "siliconflow", env: ["SILICONFLOW_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.siliconflow.com/v1", name: "SiliconFlow", doc: "https://cloud.siliconflow.com/models", models: { "google/gemma-4-26B-A4B-it": { id: "google/gemma-4-26B-A4B-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.12, output: 0.4 } }, "google/gemma-4-31B-it": { id: "google/gemma-4-31B-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.13, output: 0.4 } }, "zai-org/GLM-5": { id: "zai-org/GLM-5", name: "zai-org/GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-06-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 205000, output: 205000 }, cost: { input: 0.95, output: 2.55, cache_read: 0.2 } }, "zai-org/GLM-4.5-Air": { id: "zai-org/GLM-4.5-Air", name: "zai-org/GLM-4.5-Air", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-air", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-28", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.14, output: 0.86 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1049000, output: 262000 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26, cache_write: 0 } }, "zai-org/GLM-5.1": { id: "zai-org/GLM-5.1", name: "zai-org/GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-08", last_updated: "2026-04-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 205000, output: 205000 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26, cache_write: 0 } }, "zai-org/GLM-5V-Turbo": { id: "zai-org/GLM-5V-Turbo", name: "zai-org/GLM-5V-Turbo", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24, cache_write: 0 } }, "tencent/Hunyuan-A13B-Instruct": { id: "tencent/Hunyuan-A13B-Instruct", name: "tencent/Hunyuan-A13B-Instruct", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "hunyuan", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-06-30", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.14, output: 0.57 } }, "tencent/Hy3-preview": { id: "tencent/Hy3-preview", name: "Hy3 preview", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, temperature: true, release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.066, output: 0.26, cache_read: 0.029 } }, "Qwen/Qwen3.5-27B": { id: "Qwen/Qwen3.5-27B", name: "Qwen3.5 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.25, output: 2 } }, "Qwen/Qwen2.5-7B-Instruct": { id: "Qwen/Qwen2.5-7B-Instruct", name: "Qwen/Qwen2.5-7B-Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-09-18", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 33000, output: 4000 }, cost: { input: 0.05, output: 0.05 } }, "Qwen/Qwen3.5-9B": { id: "Qwen/Qwen3.5-9B", name: "Qwen/Qwen3.5-9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-03", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.1, output: 0.15 } }, "Qwen/Qwen3-14B": { id: "Qwen/Qwen3-14B", name: "Qwen/Qwen3-14B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-30", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.07, output: 0.28 } }, "Qwen/Qwen2.5-72B-Instruct": { id: "Qwen/Qwen2.5-72B-Instruct", name: "Qwen/Qwen2.5-72B-Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-09-18", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 33000, output: 4000 }, cost: { input: 0.59, output: 0.59 } }, "Qwen/Qwen3.5-122B-A10B": { id: "Qwen/Qwen3.5-122B-A10B", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.26, output: 2.08 } }, "Qwen/Qwen3-Coder-30B-A3B-Instruct": { id: "Qwen/Qwen3-Coder-30B-A3B-Instruct", name: "Qwen/Qwen3-Coder-30B-A3B-Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-01", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.07, output: 0.28 } }, "Qwen/Qwen3-VL-235B-A22B-Instruct": { id: "Qwen/Qwen3-VL-235B-A22B-Instruct", name: "Qwen/Qwen3-VL-235B-A22B-Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-04", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.3, output: 1.5 } }, "Qwen/Qwen3-8B": { id: "Qwen/Qwen3-8B", name: "Qwen/Qwen3-8B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-30", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.06, output: 0.06 } }, "Qwen/Qwen3.5-35B-A3B": { id: "Qwen/Qwen3.5-35B-A3B", name: "Qwen3.5 35B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.24, output: 1.8 } }, "Qwen/Qwen3.6-27B": { id: "Qwen/Qwen3.6-27B", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.3, output: 3.2 } }, "Qwen/Qwen3.5-397B-A17B": { id: "Qwen/Qwen3.5-397B-A17B", name: "Qwen3.5 397B-A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.39, output: 2.34 } }, "Qwen/Qwen3-VL-235B-A22B-Thinking": { id: "Qwen/Qwen3-VL-235B-A22B-Thinking", name: "Qwen/Qwen3-VL-235B-A22B-Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-04", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.45, output: 3.5 } }, "Qwen/Qwen3.6-35B-A3B": { id: "Qwen/Qwen3.6-35B-A3B", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.2, output: 1.6 } }, "Qwen/Qwen3-VL-30B-A3B-Thinking": { id: "Qwen/Qwen3-VL-30B-A3B-Thinking", name: "Qwen/Qwen3-VL-30B-A3B-Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-11", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.29, output: 1 } }, "Qwen/Qwen3-VL-8B-Instruct": { id: "Qwen/Qwen3-VL-8B-Instruct", name: "Qwen/Qwen3-VL-8B-Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-15", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.18, output: 0.68 } }, "Qwen/Qwen3-30B-A3B-Instruct-2507": { id: "Qwen/Qwen3-30B-A3B-Instruct-2507", name: "Qwen/Qwen3-30B-A3B-Instruct-2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-30", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.09, output: 0.3 } }, "Qwen/Qwen3-Coder-480B-A35B-Instruct": { id: "Qwen/Qwen3-Coder-480B-A35B-Instruct", name: "Qwen/Qwen3-Coder-480B-A35B-Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-31", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.25, output: 1 } }, "Qwen/Qwen3-VL-32B-Instruct": { id: "Qwen/Qwen3-VL-32B-Instruct", name: "Qwen/Qwen3-VL-32B-Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-21", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.2, output: 0.6 } }, "Qwen/Qwen3-VL-30B-A3B-Instruct": { id: "Qwen/Qwen3-VL-30B-A3B-Instruct", name: "Qwen/Qwen3-VL-30B-A3B-Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-05", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.29, output: 1 } }, "Qwen/Qwen3-32B": { id: "Qwen/Qwen3-32B", name: "Qwen/Qwen3-32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-30", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.14, output: 0.57 } }, "Qwen/Qwen3-VL-32B-Thinking": { id: "Qwen/Qwen3-VL-32B-Thinking", name: "Qwen/Qwen3-VL-32B-Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-21", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.2, output: 1.5 } }, "Qwen/Qwen3-235B-A22B-Thinking-2507": { id: "Qwen/Qwen3-235B-A22B-Thinking-2507", name: "Qwen/Qwen3-235B-A22B-Thinking-2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-28", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.13, output: 0.6 } }, "MiniMaxAI/MiniMax-M2.5": { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMaxAI/MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-15", last_updated: "2026-06-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 197000, output: 131000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "inclusionAI/Ling-flash-2.0": { id: "inclusionAI/Ling-flash-2.0", name: "inclusionAI/Ling-flash-2.0", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "ling", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-18", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.14, output: 0.57 } }, "ByteDance-Seed/Seed-OSS-36B-Instruct": { id: "ByteDance-Seed/Seed-OSS-36B-Instruct", name: "ByteDance-Seed/Seed-OSS-36B-Instruct", description: "Tool-capable chat model for instruction following and agentic application workflows", family: "seed", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-04", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.21, output: 0.57 } }, "deepseek-ai/DeepSeek-V3": { id: "deepseek-ai/DeepSeek-V3", name: "deepseek-ai/DeepSeek-V3", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-12-26", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.25, output: 1 } }, "deepseek-ai/DeepSeek-R1": { id: "deepseek-ai/DeepSeek-R1", name: "deepseek-ai/DeepSeek-R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-05-28", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.5, output: 2.18 } }, "deepseek-ai/DeepSeek-V3.2": { id: "deepseek-ai/DeepSeek-V3.2", name: "deepseek-ai/DeepSeek-V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-03", last_updated: "2025-12-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.27, output: 0.42 } }, "deepseek-ai/DeepSeek-V3.2-Exp": { id: "deepseek-ai/DeepSeek-V3.2-Exp", name: "deepseek-ai/DeepSeek-V3.2-Exp", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-10", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.27, output: 0.41 } }, "deepseek-ai/DeepSeek-V3.1": { id: "deepseek-ai/DeepSeek-V3.1", name: "deepseek-ai/DeepSeek-V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-25", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.27, output: 1 } }, "deepseek-ai/DeepSeek-V4-Flash": { id: "deepseek-ai/DeepSeek-V4-Flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "deepseek-ai/DeepSeek-V4-Pro": { id: "deepseek-ai/DeepSeek-V4-Pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 1.74, output: 3.48, cache_read: 0.145 } }, "deepseek-ai/DeepSeek-V3.1-Terminus": { id: "deepseek-ai/DeepSeek-V3.1-Terminus", name: "deepseek-ai/DeepSeek-V3.1-Terminus", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-29", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.27, output: 1 } }, "stepfun-ai/Step-3.5-Flash": { id: "stepfun-ai/Step-3.5-Flash", name: "stepfun-ai/Step-3.5-Flash", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", family: "step", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.1, output: 0.3 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "moonshotai/Kimi-K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-21", last_updated: "2026-06-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.77, output: 4, cache_read: 0.2 } }, "moonshotai/Kimi-K2.5": { id: "moonshotai/Kimi-K2.5", name: "moonshotai/Kimi-K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.45, output: 2.25, cache_read: 0.07 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "openai/gpt-oss-20b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-13", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 8000 }, cost: { input: 0.04, output: 0.18 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "openai/gpt-oss-120b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-13", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 8000 }, cost: { input: 0.05, output: 0.45 } }, "baidu/ERNIE-4.5-300B-A47B": { id: "baidu/ERNIE-4.5-300B-A47B", name: "baidu/ERNIE-4.5-300B-A47B", description: "Tool-capable chat model for instruction following and agentic application workflows", family: "ernie", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-02", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.28, output: 1.1 } } } }, "ai-router": { id: "ai-router", env: ["AI_ROUTER_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.ai-router.dev/v1", name: "AI-ROUTER", doc: "https://ai-router.dev/openai-compatible-api-gateway/", models: { "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 1, output: 6, cache_read: 0.1, cache_write: 1.25 } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 3.125 } } } }, zenmux: { id: "zenmux", env: ["ZENMUX_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://zenmux.ai/api/v1", name: "ZenMux", doc: "https://docs.zenmux.ai", models: { "kuaishou/kat-coder-pro-v2": { id: "kuaishou/kat-coder-pro-v2", name: "KAT-Coder-Pro-V2", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-30", last_updated: "2026-03-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 80000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "google/gemini-3.5-flash": { id: "google/gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15 } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["pdf", "image", "text", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048000, output: 64000 }, cost: { input: 0.3, output: 2.5, cache_read: 0.07, cache_write: 1 } }, "google/gemini-3.1-flash-lite-preview": { id: "google/gemini-3.1-flash-lite-preview", name: "Gemini 3.1 Flash Lite Preview", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-03-20", last_updated: "2025-03-20", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 65530 }, cost: { input: 0.25, output: 1.5 } }, "google/gemini-3-flash-preview": { id: "google/gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "pdf", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048000, output: 64000 }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 1 } }, "google/gemini-3.1-flash-lite": { id: "google/gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025 } }, "google/gemini-3.1-pro-preview": { id: "google/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2026-02-19", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "pdf", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048000, output: 64000 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 4.5 } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["pdf", "image", "text", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048000, output: 64000 }, cost: { input: 1.25, output: 10, cache_read: 0.31, cache_write: 4.5 } }, "google/gemini-2.5-flash-lite": { id: "google/gemini-2.5-flash-lite", name: "Gemini 2.5 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-07-22", last_updated: "2025-07-22", modalities: { input: ["pdf", "image", "text", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048000, output: 64000 }, cost: { input: 0.1, output: 0.4, cache_read: 0.03, cache_write: 1 } }, "qwen/qwen3.7-plus": { id: "qwen/qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.4, output: 1.6, cache_read: 0.08, cache_write: 0.5, tiers: [{ input: 1.2, output: 4.8, cache_read: 0.24, cache_write: 1.5, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 1.2, output: 4.8, cache_read: 0.24, cache_write: 1.5 } } }, "qwen/qwen3.5-plus": { id: "qwen/qwen3.5-plus", name: "Qwen3.5 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.8, output: 4.8 } }, "qwen/qwen3.7-max": { id: "qwen/qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5, cache_write: 3.125 } }, "qwen/qwen3.5-flash": { id: "qwen/qwen3.5-flash", name: "Qwen3.5 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1020000, output: 1020000 }, cost: { input: 0.1, output: 0.4 } }, "qwen/qwen3-max": { id: "qwen/qwen3-max", name: "Qwen3-Max-Thinking", description: "Qwen reasoning model for deliberate problem solving, math, and coding", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-01-23", last_updated: "2026-01-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 1.2, output: 6 } }, "qwen/qwen3-coder-plus": { id: "qwen/qwen3-coder-plus", name: "Qwen3-Coder-Plus", description: "Qwen coding model for software agents, repository edits, and code reasoning", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "qwen/qwen3.6-plus": { id: "qwen/qwen3.6-plus", name: "Qwen3.6-Plus", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-03-30", last_updated: "2026-03-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 0.625, tiers: [{ input: 2, output: 6, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.2, cache_write: 2.5 } } }, "tencent/hy3-preview": { id: "tencent/hy3-preview", name: "Hy3 preview", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, temperature: true, release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0.172, output: 0.572, cache_read: 0.058, cache_write: 0 } }, "sapiens-ai/agnes-1.5-pro": { id: "sapiens-ai/agnes-1.5-pro", name: "Agnes 1.5 Pro", description: "Flagship model for demanding analysis, coding, and production agent workflows", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-21", last_updated: "2026-03-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.16, output: 0.8 } }, "sapiens-ai/agnes-1.5-lite": { id: "sapiens-ai/agnes-1.5-lite", name: "Agnes 1.5 Lite", description: "Efficient model for low-latency assistance, extraction, and routine automation", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-26", last_updated: "2026-03-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.12, output: 0.6 } }, "volcengine/doubao-seed-code": { id: "volcengine/doubao-seed-code", name: "Doubao-Seed-Code", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-11-11", last_updated: "2025-11-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 0.17, output: 1.12, cache_read: 0.03 } }, "volcengine/doubao-seed-2.0-pro": { id: "volcengine/doubao-seed-2.0-pro", name: "Doubao-Seed-2.0-pro", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2026-02-14", release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 0.45, output: 2.24, cache_read: 0.09, cache_write: 0.0024 } }, "volcengine/doubao-seed-2.0-lite": { id: "volcengine/doubao-seed-2.0-lite", name: "Doubao-Seed-2.0-lite", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2026-02-14", release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 0.09, output: 0.51, cache_read: 0.02, cache_write: 0.0024 } }, "volcengine/doubao-seed-1.8": { id: "volcengine/doubao-seed-1.8", name: "Doubao-Seed-1.8", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-12-18", last_updated: "2025-12-18", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 0.11, output: 0.28, cache_read: 0.02, cache_write: 0.0024 } }, "volcengine/doubao-seed-2.0-code": { id: "volcengine/doubao-seed-2.0-code", name: "Doubao Seed 2.0 Code", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 }, cost: { input: 0.9, output: 4.48 } }, "volcengine/doubao-seed-2.0-mini": { id: "volcengine/doubao-seed-2.0-mini", name: "Doubao-Seed-2.0-mini", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2026-02-14", release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 0.03, output: 0.28, cache_read: 0.01, cache_write: 0.0024 } }, "inclusionai/ling-1t": { id: "inclusionai/ling-1t", name: "Ling-1T", description: "Tool-capable chat model for instruction following and agentic application workflows", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-10-09", last_updated: "2025-10-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, cost: { input: 0.56, output: 2.24, cache_read: 0.11 } }, "inclusionai/ring-1t": { id: "inclusionai/ring-1t", name: "Ring-1T", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-10-12", last_updated: "2025-10-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, cost: { input: 0.56, output: 2.24, cache_read: 0.11 } }, "inclusionai/ring-2.6-1t": { id: "inclusionai/ring-2.6-1t", name: "inclusionAI: Ring-2.6-1T", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-12-31", release_date: "2026-05-07", last_updated: "2026-05-14", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 65000 }, cost: { input: 0.3, output: 2.5, cache_read: 0.06 } }, "minimax/minimax-m2.7-highspeed": { id: "minimax/minimax-m2.7-highspeed", name: "MiniMax M2.7 highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131070 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 0.611, output: 2.4439 } }, "minimax/minimax-m2.5-lightning": { id: "minimax/minimax-m2.5-lightning", name: "MiniMax M2.5 highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-02-13", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131072 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 0.6, output: 4.8, cache_read: 0.06, cache_write: 0.75 } }, "minimax/minimax-m2.7": { id: "minimax/minimax-m2.7", name: "MiniMax M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131070 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 0.3055, output: 1.2219 } }, "minimax/minimax-m3": { id: "minimax/minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 512000, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 0.6, output: 2.4 } }, "minimax/minimax-m2.5": { id: "minimax/minimax-m2.5", name: "MiniMax M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-02-13", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131072 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "minimax/minimax-m2": { id: "minimax/minimax-m2", name: "MiniMax M2", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.38 } }, "minimax/minimax-m2.1": { id: "minimax/minimax-m2.1", name: "MiniMax M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.38 } }, "deepseek/deepseek-v3.2-exp": { id: "deepseek/deepseek-v3.2-exp", name: "DeepSeek-V3.2-Exp", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163000, output: 64000 }, cost: { input: 0.22, output: 0.33 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "deepseek/deepseek-v3.2": { id: "deepseek/deepseek-v3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-12-05", last_updated: "2025-12-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, cost: { input: 0.28, output: 0.43 } }, "deepseek/deepseek-chat": { id: "deepseek/deepseek-chat", name: "DeepSeek-V3.2 (Non-thinking Mode)", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, cost: { input: 0.28, output: 0.42, cache_read: 0.03 } }, "x-ai/grok-4": { id: "x-ai/grok-4", name: "Grok 4", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.75 } }, "x-ai/grok-4.2-fast": { id: "x-ai/grok-4.2-fast", name: "Grok 4.2 Fast", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 3, output: 9 } }, "x-ai/grok-4.1-fast": { id: "x-ai/grok-4.1-fast", name: "Grok 4.1 Fast", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 64000 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "x-ai/grok-4.3": { id: "x-ai/grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, cache_write: 0, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, cache_write: 0, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4, cache_write: 0 } } }, "x-ai/grok-4-fast": { id: "x-ai/grok-4-fast", name: "Grok 4 Fast", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-09-19", last_updated: "2025-09-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 64000 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "x-ai/grok-code-fast-1": { id: "x-ai/grok-code-fast-1", name: "Grok Code Fast 1", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 0.2, output: 1.5, cache_read: 0.02 } }, "x-ai/grok-4.2-fast-non-reasoning": { id: "x-ai/grok-4.2-fast-non-reasoning", name: "Grok 4.2 Fast Non Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 3, output: 9 } }, "x-ai/grok-4.5": { id: "x-ai/grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.5, tiers: [{ input: 4, output: 12, cache_read: 1, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 12, cache_read: 1 } } }, "x-ai/grok-build-0.1": { id: "x-ai/grok-build-0.1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1, output: 2, cache_read: 0.2 } }, "x-ai/grok-4.1-fast-non-reasoning": { id: "x-ai/grok-4.1-fast-non-reasoning", name: "Grok 4.1 Fast Non Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 64000 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "xiaomi/mimo-v2-omni": { id: "xiaomi/mimo-v2-omni", name: "MiMo V2 Omni", description: "MiMo omni model for text, image, video, audio, and agents", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 265000, output: 265000 }, cost: { input: 0.4, output: 2, cache_read: 0.08 } }, "xiaomi/mimo-v2-flash": { id: "xiaomi/mimo-v2-flash", name: "MiMo-V2-Flash", description: "MiMo flash model for fast multimodal assistance and agent workflows", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-12-01", release_date: "2025-12-16", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.1, output: 0.3, cache_read: 0.01 } }, "xiaomi/mimo-v2-pro": { id: "xiaomi/mimo-v2-pro", name: "MiMo V2 Pro", description: "Earlier MiMo Pro model for multimodal agents, reasoning, and code tasks", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 256000 }, cost: { input: 1, output: 3, cache_read: 0.2, tiers: [{ input: 2, output: 6, cache_read: 0.4, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.4 } } }, "xiaomi/mimo-v2.5": { id: "xiaomi/mimo-v2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.4, output: 2, cache_read: 0.08, tiers: [{ input: 0.8, output: 4, cache_read: 0.16, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.8, output: 4, cache_read: 0.16 } } }, "xiaomi/mimo-v2.5-pro": { id: "xiaomi/mimo-v2.5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1, output: 3, cache_read: 0.2, tiers: [{ input: 2, output: 6, cache_read: 0.4, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.4 } } }, "anthropic/claude-3.7-sonnet": { id: "anthropic/claude-3.7-sonnet", name: "Claude 3.7 Sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-02-24", last_updated: "2025-02-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-sonnet-4.6": { id: "anthropic/claude-sonnet-4.6", name: "Claude Sonnet 4.6", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-18", last_updated: "2026-02-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-fable-5": { id: "anthropic/claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4.1": { id: "anthropic/claude-opus-4.1", name: "Claude Opus 4.1", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-opus-4.5": { id: "anthropic/claude-opus-4.5", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-3.5-haiku": { id: "anthropic/claude-3.5-haiku", name: "Claude 3.5 Haiku", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2024-11-04", last_updated: "2024-11-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 0.8, output: 4, cache_read: 0.08, cache_write: 1 } }, "anthropic/claude-opus-4.7": { id: "anthropic/claude-opus-4.7", name: "Claude Opus 4.7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-5-free": { id: "anthropic/claude-sonnet-5-free", name: "Claude Sonnet 5 (Free)", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "anthropic/claude-sonnet-4.5": { id: "anthropic/claude-sonnet-4.5", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-sonnet-4": { id: "anthropic/claude-sonnet-4", name: "Claude Sonnet 4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-haiku-4.5": { id: "anthropic/claude-haiku-4.5", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "anthropic/claude-opus-4": { id: "anthropic/claude-opus-4", name: "Claude Opus 4", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-opus-4.8": { id: "anthropic/claude-opus-4.8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-5": { id: "anthropic/claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 4 } }, "anthropic/claude-opus-4.6": { id: "anthropic/claude-opus-4.6", name: "Claude Opus 4.6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-06", last_updated: "2026-02-06", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "z-ai/glm-4.6v": { id: "z-ai/glm-4.6v", name: "GLM 4.6V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0.14, output: 0.42, cache_read: 0.03 } }, "z-ai/glm-5": { id: "z-ai/glm-5", name: "GLM 5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01-01", release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.58, output: 2.6, cache_read: 0.14 } }, "z-ai/glm-4.5-air": { id: "z-ai/glm-4.5-air", name: "GLM 4.5 Air", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, cost: { input: 0.11, output: 0.56, cache_read: 0.02 } }, "z-ai/glm-5.1": { id: "z-ai/glm-5.1", name: "GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-03", last_updated: "2026-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 0.8781, output: 3.5126, cache_read: 0.1903 } }, "z-ai/glm-5.2": { id: "z-ai/glm-5.2", name: "GLM 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.5, cache_read: 0.26 } }, "z-ai/glm-4.7-flashx": { id: "z-ai/glm-4.7-flashx", name: "GLM 4.7 FlashX", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01-01", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0.07, output: 0.42, cache_read: 0.01 } }, "z-ai/glm-4.6": { id: "z-ai/glm-4.6", name: "GLM 4.6", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0.35, output: 1.54, cache_read: 0.07 } }, "z-ai/glm-4.7-flash-free": { id: "z-ai/glm-4.7-flash-free", name: "GLM 4.7 Flash (Free)", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01-01", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0, output: 0 } }, "z-ai/glm-4.6v-flash": { id: "z-ai/glm-4.6v-flash", name: "GLM 4.6V FlashX", description: "GLM vision model for visual reasoning, documents, and multimodal agents", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0.02, output: 0.21, cache_read: 0.0043 } }, "z-ai/glm-4.6v-flash-free": { id: "z-ai/glm-4.6v-flash-free", name: "GLM 4.6V Flash (Free)", description: "GLM vision model for visual reasoning, documents, and multimodal agents", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0, output: 0 } }, "z-ai/glm-4.5": { id: "z-ai/glm-4.5", name: "GLM 4.5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, cost: { input: 0.35, output: 1.54, cache_read: 0.07 } }, "z-ai/glm-5.2-free": { id: "z-ai/glm-5.2-free", name: "GLM 5.2 (Free)", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0 } }, "z-ai/glm-4.7": { id: "z-ai/glm-4.7", name: "GLM 4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01-01", release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0.28, output: 1.14, cache_read: 0.06 } }, "z-ai/glm-5-turbo": { id: "z-ai/glm-5-turbo", name: "GLM 5 Turbo", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 0.88, output: 3.48 } }, "z-ai/glm-5v-turbo": { id: "z-ai/glm-5v-turbo", name: "GLM 5V Turbo", description: "GLM vision model for visual reasoning, documents, and multimodal agents", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 0.726, output: 3.1946, cache_read: 0.1743 } }, "moonshotai/kimi-k2.5": { id: "moonshotai/kimi-k2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: false, knowledge: "2025-01-01", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 64000 }, cost: { input: 0.58, output: 3.02, cache_read: 0.1 } }, "moonshotai/kimi-k2-thinking-turbo": { id: "moonshotai/kimi-k2-thinking-turbo", name: "Kimi K2 Thinking Turbo", description: "Kimi reasoning model for long-horizon research, planning, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 64000 }, cost: { input: 1.15, output: 8, cache_read: 0.15 } }, "moonshotai/kimi-k2.6": { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: false, knowledge: "2025-01-01", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262140, output: 262140 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "moonshotai/kimi-k2.7-code-free": { id: "moonshotai/kimi-k2.7-code-free", name: "Kimi K2.7 Code (Free)", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0, cache_read: 0 } }, "moonshotai/kimi-k2.7-code": { id: "moonshotai/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "moonshotai/kimi-k2-thinking": { id: "moonshotai/kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 64000 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "moonshotai/kimi-k3": { id: "moonshotai/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "moonshotai/kimi-k3-free": { id: "moonshotai/kimi-k3-free", name: "Kimi K3 (Free)", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0 } }, "moonshotai/kimi-k2-0905": { id: "moonshotai/kimi-k2-0905", name: "Kimi K2 0905", description: "Kimi model for long-context chat, coding, and agentic reasoning", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-09-04", last_updated: "2025-09-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 64000 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "openai/gpt-5.1-codex-mini": { id: "openai/gpt-5.1-codex-mini", name: "GPT-5.1-Codex-Mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 64000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 0.25, output: 2, cache_read: 0.03 } }, "openai/gpt-5.2-pro": { id: "openai/gpt-5.2-pro", name: "GPT-5.2-Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 21, output: 168 } }, "openai/gpt-5.5-pro": { id: "openai/gpt-5.5-pro", name: "GPT-5.5 Pro", description: "Highest-accuracy GPT-5.5 tier for slower, precision-heavy reasoning and coding", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "openai/gpt-5.4-pro": { id: "openai/gpt-5.4-pro", name: "GPT-5.4 Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 45, output: 225 } }, "openai/gpt-5.6-sol": { id: "openai/gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 45, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1, cache_write: 12.5 } } }, "openai/gpt-5.5-instant": { id: "openai/gpt-5.5-instant", name: "GPT-5.5 Instant", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-12-01", release_date: "2026-05-05", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 12.5, output: 75, cache_read: 1.25 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT-5", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 64000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 1.25, output: 10, cache_read: 0.12 } }, "openai/gpt-5.1-chat": { id: "openai/gpt-5.1-chat", name: "GPT-5.1 Chat", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 1.25, output: 10, cache_read: 0.12 } }, "openai/gpt-5-codex": { id: "openai/gpt-5-codex", name: "GPT-5 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 64000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 1.25, output: 10, cache_read: 0.12 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT-5.4", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 3.75, output: 18.75 } }, "openai/gpt-5.2-codex": { id: "openai/gpt-5.2-codex", name: "GPT-5.2-Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2025-01-01", release_date: "2026-01-15", last_updated: "2026-01-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 64000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 1.75, output: 14, cache_read: 0.17 } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT-5.4 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 0.2, output: 1.25 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT-5.4 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 0.75, output: 4.5 } }, "openai/gpt-5.6-luna": { id: "openai/gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 1, output: 6, cache_read: 0.1, cache_write: 1.25, tiers: [{ input: 2, output: 9, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 2, output: 9, cache_read: 0.2, cache_write: 2.5 } } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2025-01-01", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 64000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 1.75, output: 14, cache_read: 0.17 } }, "openai/gpt-5.3-codex": { id: "openai/gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 1.75, output: 14 } }, "openai/gpt-5.3-chat": { id: "openai/gpt-5.3-chat", name: "GPT-5.3 Chat", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16380 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 1.75, output: 14 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT-5.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 64000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 1.25, output: 10, cache_read: 0.12 } }, "openai/gpt-5.1-codex": { id: "openai/gpt-5.1-codex", name: "GPT-5.1-Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 64000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 1.25, output: 10, cache_read: 0.12 } }, "openai/gpt-5.6-terra": { id: "openai/gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 3.125, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, cache_write: 6.25, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5, cache_write: 6.25 } } }, "baidu/ernie-5.0-thinking-preview": { id: "baidu/ernie-5.0-thinking-preview", name: "ERNIE 5.0", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-01-22", last_updated: "2026-01-22", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, cost: { input: 0.84, output: 3.37 } }, "stepfun/step-3.5-flash": { id: "stepfun/step-3.5-flash", name: "Step 3.5 Flash", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-02-02", last_updated: "2026-02-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 0.1, output: 0.3 } }, "stepfun/step-3.7-flash": { id: "stepfun/step-3.7-flash", name: "Step 3.7 Flash", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0.2, output: 1.15 } }, "stepfun/step-3": { id: "stepfun/step-3", name: "Step-3", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-07-31", last_updated: "2025-07-31", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: false, limit: { context: 65536, output: 64000 }, cost: { input: 0.21, output: 0.57 } }, "stepfun/step-3.7-flash-free": { id: "stepfun/step-3.7-flash-free", name: "Step 3.7 Flash (Free)", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0, output: 0 } } } }, inference: { id: "inference", env: ["INFERENCE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://inference.net/v1", name: "Inference", doc: "https://inference.net/models", models: { "google/gemma-3": { id: "google/gemma-3", name: "Google Gemma 3", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 125000, output: 4096 }, cost: { input: 0.15, output: 0.3 } }, "qwen/qwen-2.5-7b-vision-instruct": { id: "qwen/qwen-2.5-7b-vision-instruct", name: "Qwen 2.5 7B Vision Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 125000, output: 4096 }, cost: { input: 0.2, output: 0.2 } }, "qwen/qwen3-embedding-4b": { id: "qwen/qwen3-embedding-4b", name: "Qwen 3 Embedding 4B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2024-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 2048 }, cost: { input: 0.01, output: 0 } }, "meta/llama-3.2-1b-instruct": { id: "meta/llama-3.2-1b-instruct", name: "Llama 3.2 1B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16000, output: 4096 }, cost: { input: 0.01, output: 0.01 } }, "meta/llama-3.2-3b-instruct": { id: "meta/llama-3.2-3b-instruct", name: "Llama 3.2 3B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16000, output: 4096 }, cost: { input: 0.02, output: 0.02 } }, "meta/llama-3.1-8b-instruct": { id: "meta/llama-3.1-8b-instruct", name: "Llama 3.1 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16000, output: 4096 }, cost: { input: 0.025, output: 0.025 } }, "meta/llama-3.2-11b-vision-instruct": { id: "meta/llama-3.2-11b-vision-instruct", name: "Llama 3.2 11B Vision Instruct", description: "Open Llama multimodal model for image understanding and text reasoning", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 16000, output: 4096 }, cost: { input: 0.055, output: 0.055 } }, "osmosis/osmosis-structure-0.6b": { id: "osmosis/osmosis-structure-0.6b", name: "Osmosis Structure 0.6B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "osmosis", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 4000, output: 2048 }, cost: { input: 0.1, output: 0.5 } }, "mistral/mistral-nemo-12b-instruct": { id: "mistral/mistral-nemo-12b-instruct", name: "Mistral Nemo 12B Instruct", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16000, output: 4096 }, cost: { input: 0.038, output: 0.1 } } } }, evroc: { id: "evroc", env: ["EVROC_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://models.think.evroc.com/v1", name: "evroc", doc: "https://docs.evroc.com/products/think/overview.html", models: { "intfloat/multilingual-e5-large-instruct": { id: "intfloat/multilingual-e5-large-instruct", name: "E5 Multi-Lingual Large Embeddings 0.6B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, release_date: "2024-06-01", last_updated: "2024-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512, output: 512 }, cost: { input: 0.114, output: 0.114 } }, "nvidia/Llama-3.3-70B-Instruct-FP8": { id: "nvidia/Llama-3.3-70B-Instruct-FP8", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 1.15, output: 1.15 } }, "google/gemma-4-26B-A4B-it": { id: "google/gemma-4-26B-A4B-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.144, output: 0.575 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1.4375, output: 5.75 } }, "mistralai/Mistral-Medium-3.5-128B": { id: "mistralai/Mistral-Medium-3.5-128B", name: "Mistral Medium 3.5", description: "Balanced Mistral model for enterprise assistants, multilingual work, and tools", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.725, output: 6.9 } }, "mistralai/Voxtral-Small-24B-2507": { id: "mistralai/Voxtral-Small-24B-2507", name: "Voxtral Small 24B", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "voxtral", attachment: false, reasoning: false, tool_call: false, release_date: "2025-03-01", last_updated: "2025-03-01", modalities: { input: ["audio", "text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 32000 }, cost: { input: 0.0023, output: 0.0023, output_audio: 2.3 } }, "evroc/roc": { id: "evroc/roc", name: "roc", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2026-01", release_date: "2026-06-06", last_updated: "2026-06-06", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 2.875, output: 11.516 } }, "Qwen/Qwen3-Embedding-8B": { id: "Qwen/Qwen3-Embedding-8B", name: "Qwen3 Embedding 8B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, release_date: "2025-07-30", last_updated: "2025-07-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 4096 }, cost: { input: 0.115, output: 0.115 } }, "Qwen/Qwen3.6-35B-A3B-FP8": { id: "Qwen/Qwen3.6-35B-A3B-FP8", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.345, output: 1.38 } }, "Qwen/Qwen3-Reranker-4B": { id: "Qwen/Qwen3-Reranker-4B", name: "Qwen3 Reranker 4B", description: "Reranking model for improving retrieval quality in search and recommendation systems", family: "qwen", attachment: false, reasoning: false, tool_call: false, release_date: "2025-07-30", last_updated: "2025-07-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 4096 }, cost: { input: 0.0575, output: 0 } }, "Qwen/Qwen3-VL-30B-A3B-Instruct": { id: "Qwen/Qwen3-VL-30B-A3B-Instruct", name: "Qwen3 VL 30B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, release_date: "2025-07-30", last_updated: "2025-07-30", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e5, output: 1e5 }, cost: { input: 0.23, output: 0.92 } }, "KBLab/kb-whisper-large": { id: "KBLab/kb-whisper-large", name: "KB Whisper", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "whisper", attachment: false, reasoning: false, tool_call: false, release_date: "2024-10-01", last_updated: "2024-10-01", modalities: { input: ["audio"], output: ["text"] }, open_weights: true, limit: { context: 448, output: 448 }, cost: { input: 0.0023, output: 0.0023, output_audio: 2.3 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.4375, output: 5.75 } }, "openai/whisper-large-v3": { id: "openai/whisper-large-v3", name: "Whisper 3 Large", description: "Open Whisper checkpoint for robust multilingual transcription and captioning", family: "whisper", attachment: false, reasoning: false, tool_call: false, release_date: "2024-10-01", last_updated: "2024-10-01", modalities: { input: ["audio"], output: ["text"] }, open_weights: true, limit: { context: 448, output: 4096 }, cost: { input: 0.0023, output: 0.0023, output_audio: 2.3 } }, "openai/whisper-large-v3-turbo": { id: "openai/whisper-large-v3-turbo", name: "Whisper Large v3 Turbo", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "whisper", attachment: false, reasoning: false, tool_call: false, release_date: "2024-10-01", last_updated: "2024-10-01", modalities: { input: ["audio"], output: ["text"] }, open_weights: true, limit: { context: 448, output: 448 }, cost: { input: 0.0023, output: 0.0023, output_audio: 2.3 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 0.23, output: 0.92 } } } }, abacus: { id: "abacus", env: ["ABACUS_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://routellm.abacus.ai/v1", name: "Abacus", doc: "https://abacus.ai/help/api", models: { "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15 } }, "gpt-4.1-mini": { id: "gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "gpt-4o": { id: "gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "muse-spark-1.1": { id: "muse-spark-1.1", name: "Muse Spark 1.1", description: "Muse Spark is a natively multimodal reasoning model with support for tool-use, visual chain of thought, and multi-agent orchestration.", family: "muse", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-08", last_updated: "2026-07-09", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32000 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "gemini-3.5-flash": { id: "gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "claude-3-7-sonnet-20250219": { id: "claude-3-7-sonnet-20250219", name: "Claude Sonnet 3.7", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-10-31", release_date: "2025-02-19", last_updated: "2025-02-19", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15 } }, "grok-4-0709": { id: "grok-4-0709", name: "Grok 4", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 16384 }, cost: { input: 3, output: 15 } }, "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.6, output: 3 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25 } }, "gpt-4.1-nano": { id: "gpt-4.1-nano", name: "GPT-4.1 nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "grok-4.3": { id: "grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "gemini-3-pro-image-preview": { id: "gemini-3-pro-image-preview", name: "Nano Banana Pro", description: "Nano Banana Pro for higher-fidelity image generation and design-heavy edits", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 32768 }, cost: { input: 2, output: 12, cache_read: 0.2 } }, "gemini-3.1-flash-lite-preview": { id: "gemini-3.1-flash-lite-preview", name: "Gemini 3.1 Flash Lite Preview", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-01", last_updated: "2026-03-01", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, cache_write: 1 } }, "gpt-5.2-chat-latest": { id: "gpt-5.2-chat-latest", name: "GPT-5.2 Chat Latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-09-30", release_date: "2026-01-01", last_updated: "2026-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.75, output: 14 } }, "o3-mini": { id: "o3-mini", name: "o3-mini", description: "Smaller o-series reasoner for economical coding, math, and planning tasks", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "grok-code-fast-1": { id: "grok-code-fast-1", name: "Grok Code Fast 1", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-09-01", last_updated: "2025-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 16384 }, cost: { input: 0.2, output: 1.5 } }, "gpt-5.3-codex-xhigh": { id: "gpt-5.3-codex-xhigh", name: "GPT-5.3 Codex XHigh", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14 } }, "llama-3.3-70b-versatile": { id: "llama-3.3-70b-versatile", name: "Llama 3.3 70B Versatile", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.59, output: 0.79 } }, "mimo-v2-pro": { id: "mimo-v2-pro", name: "MiMo-V2-Pro", description: "Earlier MiMo Pro model for multimodal agents, reasoning, and code tasks", family: "mimo", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, cost: { input: 1, output: 3, cache_read: 0.2 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "gemini-3-flash-preview": { id: "gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05 } }, "o3-pro": { id: "o3-pro", name: "o3-pro", description: "High-effort o3 tier for difficult technical reasoning and careful answers", family: "o-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-06-10", last_updated: "2025-06-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 20, output: 40 } }, "gpt-4o-mini": { id: "gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6 } }, "gpt-5": { id: "gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "gemini-3.1-flash-image-preview": { id: "gemini-3.1-flash-image-preview", name: "Nano Banana 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 1048576, output: 32768 }, cost: { input: 0.5, output: 3 } }, "qwen3-max": { id: "qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-05-28", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 1.2, output: 6 } }, "gpt-5-codex": { id: "gpt-5-codex", name: "GPT-5-Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "grok-4-fast-non-reasoning": { id: "grok-4-fast-non-reasoning", name: "Grok 4 Fast (Non-Reasoning)", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 16384 }, cost: { input: 0.2, output: 0.5 } }, "gpt-4o-2024-11-20": { id: "gpt-4o-2024-11-20", name: "GPT-4o (2024-11-20)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-11-20", last_updated: "2024-11-20", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25 } }, "gpt-5.3-chat-latest": { id: "gpt-5.3-chat-latest", name: "GPT-5.3 Chat Latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-01", last_updated: "2026-03-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.75, output: 14 } }, "kimi-k2-turbo-preview": { id: "kimi-k2-turbo-preview", name: "Kimi K2 Turbo Preview", description: "Fast Kimi model for responsive chat, coding help, and agent loops", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-07-08", last_updated: "2025-07-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 8192 }, cost: { input: 0.15, output: 8 } }, "claude-sonnet-4-5-20250929": { id: "claude-sonnet-4-5-20250929", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15 } }, "gpt-5.2-codex": { id: "gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Code-specialist GPT for repository edits, reviews, and long-running software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "claude-opus-4-5-20251101": { id: "claude-opus-4-5-20251101", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-01", last_updated: "2025-11-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25 } }, "gpt-5.4-nano": { id: "gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "route-llm": { id: "route-llm", name: "RouteLLM", description: "RouteLLM routes prompts to an appropriate Abacus-backed text-generation model", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2024-01-01", last_updated: "2026-07-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, cost: { input: 3, output: 15 } }, "gemini-3.1-flash-lite": { id: "gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 1, output: 6, cache_read: 0.1 } }, "gpt-5.2": { id: "gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gemini-2.5-flash-image": { id: "gemini-2.5-flash-image", name: "Nano Banana", description: "Nano Banana image model for fast generation, edits, and character-consistent assets", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2024-06", release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.3, output: 30 } }, "gpt-5.3-codex": { id: "gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.18 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "grok-4.5": { id: "grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 32768 }, cost: { input: 2, output: 6 } }, "claude-haiku-4-5-20251001": { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5 } }, "qwen-2.5-coder-32b": { id: "qwen-2.5-coder-32b", name: "Qwen 2.5 Coder 32B", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-11-11", last_updated: "2024-11-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.79, output: 0.79 } }, "gemini-3.1-pro-preview": { id: "gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2 } }, "gpt-5.1": { id: "gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "grok-4-1-fast-non-reasoning": { id: "grok-4-1-fast-non-reasoning", name: "Grok 4.1 Fast (Non-Reasoning)", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-11-17", last_updated: "2025-11-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 16384 }, cost: { input: 0.2, output: 0.5 } }, "gpt-5.1-codex": { id: "gpt-5.1-codex", name: "GPT-5.1 Codex", description: "Codex GPT for repository edits, code review, and practical software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "gpt-5-nano": { id: "gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25 } }, "claude-sonnet-4-20250514": { id: "claude-sonnet-4-20250514", name: "Claude Sonnet 4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-05-14", last_updated: "2025-05-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15 } }, o3: { id: "o3", name: "o3", description: "Deliberate o-series reasoner for hard math, coding, and multi-step analysis", family: "o", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15 } }, "gpt-4.1": { id: "gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "o4-mini": { id: "o4-mini", name: "o4-mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4 } }, "claude-opus-4-20250514": { id: "claude-opus-4-20250514", name: "Claude Opus 4", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-05-14", last_updated: "2025-05-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75 } }, "gpt-5.1-codex-max": { id: "gpt-5.1-codex-max", name: "GPT-5.1 Codex Max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10 } }, "gpt-5.1-chat-latest": { id: "gpt-5.1-chat-latest", name: "GPT-5.1 Chat Latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10 } }, "claude-opus-4-1-20250805": { id: "claude-opus-4-1-20250805", name: "Claude Opus 4.1", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75 } }, "google/gemma-4-31b-it": { id: "google/gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.14, output: 0.4 } }, "zai-org/GLM-5": { id: "zai-org/GLM-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 1, output: 3.2 } }, "zai-org/GLM-4.5": { id: "zai-org/GLM-4.5", name: "GLM-4.5", description: "Hybrid-reasoning GLM release that made the 4.5 line broadly useful", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 96000 }, cost: { input: 0.6, output: 2.2 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "zai-org/GLM-5.1": { id: "zai-org/GLM-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "zai-org/GLM-4.6": { id: "zai-org/GLM-4.6", name: "GLM-4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 0.6, output: 2.2 } }, "zai-org/GLM-4.7": { id: "zai-org/GLM-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2 } }, "Qwen/Qwen3-235B-A22B-Instruct-2507": { id: "Qwen/Qwen3-235B-A22B-Instruct-2507", name: "Qwen3 235B A22B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-07-01", last_updated: "2025-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 8192 }, cost: { input: 0.13, output: 0.6 } }, "Qwen/Qwen2.5-72B-Instruct": { id: "Qwen/Qwen2.5-72B-Instruct", name: "Qwen 2.5 72B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-09-19", last_updated: "2024-09-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.11, output: 0.38 } }, "Qwen/Qwen3.6-27B": { id: "Qwen/Qwen3.6-27B", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 8192 }, cost: { input: 0.32, output: 3.2 } }, "Qwen/QwQ-32B": { id: "Qwen/QwQ-32B", name: "QwQ 32B", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2024-11-28", last_updated: "2024-11-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.4, output: 0.4 } }, "Qwen/Qwen3-Coder-480B-A35B-Instruct": { id: "Qwen/Qwen3-Coder-480B-A35B-Instruct", name: "Qwen3-Coder 480B-A35B Instruct", description: "Open Qwen coding heavyweight for repository reasoning and agentic engineering", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.29, output: 1.2 } }, "Qwen/Qwen3-32B": { id: "Qwen/Qwen3-32B", name: "Qwen3 32B", description: "Dense open Qwen model for self-hosted chat, reasoning, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.09, output: 0.29 } }, "MiniMaxAI/MiniMax-M2.7": { id: "MiniMaxAI/MiniMax-M2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "MiniMaxAI/MiniMax-M3": { id: "MiniMaxAI/MiniMax-M3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "deepseek/deepseek-v3.1": { id: "deepseek/deepseek-v3.1", name: "DeepSeek V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-01-20", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.55, output: 1.66 } }, "deepseek-ai/DeepSeek-R1": { id: "deepseek-ai/DeepSeek-R1", name: "DeepSeek R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-01-20", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 3, output: 7 } }, "deepseek-ai/DeepSeek-V3.2": { id: "deepseek-ai/DeepSeek-V3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-06-15", last_updated: "2025-06-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.27, output: 0.4 } }, "deepseek-ai/DeepSeek-V4-Flash": { id: "deepseek-ai/DeepSeek-V4-Flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 32768 }, cost: { input: 0.14, output: 0.28, cache_read: 0.03 } }, "deepseek-ai/DeepSeek-V4-Pro": { id: "deepseek-ai/DeepSeek-V4-Pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 32768 }, cost: { input: 1.74, output: 3.48, cache_read: 0.15 } }, "deepseek-ai/DeepSeek-V3.1-Terminus": { id: "deepseek-ai/DeepSeek-V3.1-Terminus", name: "DeepSeek V3.1 Terminus", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-06-01", last_updated: "2025-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.27, output: 1 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.08, output: 0.44 } }, "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8": { id: "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", name: "Llama 4 Maverick 17B Instruct", description: "Open multimodal Llama for strong reasoning with efficient everyday serving", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 8192 }, cost: { input: 0.14, output: 0.59 } }, "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo": { id: "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo", name: "Llama 3.1 405B Instruct Turbo", description: "Compact Llama instruction model for fast chat and local deployment", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 3.5, output: 3.5 } }, "meta-llama/Meta-Llama-3.1-8B-Instruct": { id: "meta-llama/Meta-Llama-3.1-8B-Instruct", name: "Llama 3.1 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.02, output: 0.05 } }, "meta-llama/Meta-Llama-3.3-70B-Instruct": { id: "meta-llama/Meta-Llama-3.3-70B-Instruct", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.59, output: 0.79 } } } }, inceptron: { id: "inceptron", env: ["INCEPTRON_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.inceptron.io/v1", name: "Inceptron", doc: "https://docs.inceptron.io", models: { "zai-org/GLM-5.1-FP8": { id: "zai-org/GLM-5.1-FP8", name: "GLM 5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26, cache_write: 0 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.2, output: 4.2, cache_read: 0.26, cache_write: 0 } }, "MiniMaxAI/MiniMax-M2.5": { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 196608 }, cost: { input: 0.15, output: 0.9, cache_read: 0.05, cache_write: 0 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.66, output: 3.5, cache_read: 0.2, cache_write: 0 } }, "moonshotai/Kimi-K2.6-Fast": { id: "moonshotai/Kimi-K2.6-Fast", name: "Kimi K2.6 Fast", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "alpha", cost: { input: 1.32, output: 7, cache_read: 0.4, cache_write: 0 } }, "moonshotai/Kimi-K2.7-Code": { id: "moonshotai/Kimi-K2.7-Code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.75, output: 3.5, cache_read: 0.2, cache_write: 0 } } } }, empiriolabs: { id: "empiriolabs", env: ["EMPIRIOLABS_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.empiriolabs.ai/v1", name: "EmpirioLabs AI", doc: "https://docs.empiriolabs.ai", models: { "mimo-v2-5": { id: "mimo-v2-5", name: "MiMo V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 0.7, output: 1.4, cache_read: 0.014 } }, "minimax-m2-7-highspeed": { id: "minimax-m2-7-highspeed", name: "MiniMax M2.7 Highspeed", description: "Low-latency M2.7 variant for interactive coding plans and agent loops", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 32768 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "qwen3-5-397b-a17b": { id: "qwen3-5-397b-a17b", name: "Qwen3.5 397B-A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 80000 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0.172, output: 1.032, cache_read: 0.172, tiers: [{ input: 0.43, output: 2.58, cache_read: 0.43, tier: { type: "context", size: 128000 } }] } }, "glm-4-7-flash": { id: "glm-4-7-flash", name: "GLM 4.7 Flash", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0, output: 0 } }, "qwen3-5-flash": { id: "qwen3-5-flash", name: "Qwen3.5 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.09, output: 0.368, cache_read: 0.09 } }, "qwen3-5-122b-a10b": { id: "qwen3-5-122b-a10b", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 80000 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0.115, output: 0.917, cache_read: 0.115, tiers: [{ input: 0.287, output: 2.294, cache_read: 0.287, tier: { type: "context", size: 128000 } }] } }, "kimi-k2-7-code-highspeed": { id: "kimi-k2-7-code-highspeed", name: "Kimi K2.7 Code Highspeed", description: "Lower-latency Kimi Code variant for interactive edits and coding-agent loops", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 131072 }, cost: { input: 1.9, output: 8, cache_read: 1.9 } }, "qwen3-5-9b": { id: "qwen3-5-9b", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.09, output: 0.13, cache_read: 0.045 } }, "kimi-k2-6": { id: "kimi-k2-6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16000 }, cost: { input: 0.8939, output: 3.7131, cache_read: 0.1788 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 393216 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-06-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 393216 }, cost: { input: 0.14, output: 0.28, cache_read: 0.14 } }, "qwen3-6-plus": { id: "qwen3-6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.5, tiers: [{ input: 2, output: 6, cache_read: 2, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 2 } } }, "qwen3-6-35b-a3b": { id: "qwen3-6-35b-a3b", name: "Qwen3.6 35B A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.07, output: 0.42, cache_read: 0.035 } }, "step-3-7-flash": { id: "step-3-7-flash", name: "Step 3.7 Flash", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 131072 }, cost: { input: 0.2, output: 1.15, cache_read: 0.04 } }, "minimax-m2-7": { id: "minimax-m2-7", name: "MiniMax M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 32768 }, cost: { input: 0.15, output: 0.6, cache_read: 0.03 } }, "qwen3-7-max": { id: "qwen3-7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 64000 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-06-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 2.5 } }, "minimax-m3": { id: "minimax-m3", name: "MiniMax M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 524288 }, cost: { input: 0.225, output: 0.9, cache_read: 0.045, tiers: [{ input: 0.45, output: 1.8, cache_read: 0.09, tier: { type: "context", size: 512000 } }], context_over_200k: { input: 0.45, output: 1.8, cache_read: 0.09 } } }, "kimi-k2-7-code": { id: "kimi-k2-7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 131072 }, cost: { input: 0.95, output: 4, cache_read: 0.95 } }, "glm-4-5-flash": { id: "glm-4-5-flash", name: "GLM 4.5 Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 98304 }, cost: { input: 0, output: 0 } }, "qwen3-max": { id: "qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen3 model for coding agents, complex reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 65536 }, cost: { input: 1.08, output: 5.52, cache_read: 1.08, tiers: [{ input: 2.16, output: 11.04, cache_read: 2.16, tier: { type: "context", size: 32000 } }, { input: 2.7, output: 13.8, cache_read: 2.7, tier: { type: "context", size: 128000 } }] } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 393216 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-06-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 393216 }, cost: { input: 1.65, output: 3.3, cache_read: 1.65 } }, "glm-5-2": { id: "glm-5-2", name: "GLM 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 1.4 } }, "qwen3-8-max": { id: "qwen3-8-max", name: "Qwen3.8 Max", description: "2.4-trillion-parameter MoE flagship for coding, professional work, multimodal understanding, and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 262144 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 2, output: 6, cache_read: 2 } }, "muse-spark-1-1": { id: "muse-spark-1-1", name: "Muse Spark 1.1", description: "Muse Spark is a natively multimodal reasoning model with support for tool-use, visual chain of thought, and multi-agent orchestration.", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-08", last_updated: "2026-07-09", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, cost: { input: 1.25, output: 4.25, cache_read: 1 } }, "deepseek-v4-flash-0731": { id: "deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 393216 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 393216 }, cost: { input: 0.14, output: 0.28, cache_read: 0.14 } }, "qwen3-7-plus": { id: "qwen3-7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 256000 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.4, output: 1.6, cache_read: 0.4, tiers: [{ input: 1.2, output: 4.8, cache_read: 1.2, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 1.2, output: 4.8, cache_read: 1.2 } } }, "qwen3-5-4b": { id: "qwen3-5-4b", name: "Qwen3.5 4B", description: "Qwen3.5 4B is a low-cost multimodal reasoning model with 256K context, image and video input, function tools, and structured output.", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-02", last_updated: "2026-03-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.04, output: 0.07, cache_read: 0.02 } }, "qwen3-6-max-preview": { id: "qwen3-6-max-preview", name: "Qwen3.6 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 393216 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 65536 }, cost: { input: 1.31, output: 7.88, cache_read: 1.31, tiers: [{ input: 1.97, output: 11.82, cache_read: 1.97, tier: { type: "context", size: 128000 } }] } }, "gemma-4-26b-a4b": { id: "gemma-4-26b-a4b", name: "Gemma 4 26B-A4B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.05, output: 0.29, cache_read: 0.025 } }, "qwen3-6-27b": { id: "qwen3-6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 80000 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0.412564, output: 2.475384, cache_read: 0.412564 } }, "qwen3-5-plus": { id: "qwen3-5-plus", name: "Qwen3.5 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.36, output: 2.21, cache_read: 0.36, tiers: [{ input: 1.08, output: 6.62, cache_read: 1.08, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 1.08, output: 6.62, cache_read: 1.08 } } }, "qwen3-6-flash": { id: "qwen3-6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 64000 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.25, tiers: [{ input: 1, output: 4, cache_read: 1, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 1, output: 4, cache_read: 1 } } }, "qwen3-5-35b-a3b": { id: "qwen3-5-35b-a3b", name: "Qwen3.5 35B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 80000 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0.057, output: 0.459, cache_read: 0.057, tiers: [{ input: 0.229, output: 1.835, cache_read: 0.229, tier: { type: "context", size: 128000 } }] } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 3, output: 15, cache_read: 3 } }, "glm-5-1": { id: "glm-5-1", name: "GLM 5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 38912 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-06-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202000, output: 128000 }, cost: { input: 0.825, output: 3.301, cache_read: 0.165, tiers: [{ input: 1.1, output: 3.851, cache_read: 0.22, tier: { type: "context", size: 32000 } }] } }, "step-3-5-flash-2603": { id: "step-3-5-flash-2603", name: "Step 3.5 Flash 2603", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 131072 }, cost: { input: 0.1, output: 0.3, cache_read: 0.02 } }, "qwen3-7-flash": { id: "qwen3-7-flash", name: "Qwen3.7 Flash", description: "Lightweight multimodal Qwen model for high-throughput text, image, and video tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 131072 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 991000, output: 65536 }, cost: { input: 0.03, output: 0.13, cache_read: 0.006, tiers: [{ input: 0.1, output: 0.4, cache_read: 0.02, tier: { type: "context", size: 32000 } }, { input: 0.2, output: 0.8, cache_read: 0.04, tier: { type: "context", size: 256000 } }] } }, "deepseek-v3-2": { id: "deepseek-v3-2", name: "DeepSeek V3.2", description: "Hybrid-reasoning DeepSeek model with thinking and non-thinking modes, sparse attention, and tool-use", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 393216 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.57, output: 1.71, cache_read: 0.57 } }, "mistral-medium-3": { id: "mistral-medium-3", name: "Mistral Medium 3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-05-07", last_updated: "2025-05-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 130000, output: 40000 }, cost: { input: 0, output: 0 } }, "step-3-5-flash": { id: "step-3-5-flash", name: "Step 3.5 Flash", description: "StepFun flash lane for quick multimodal reasoning and coding assistance", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01-29", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 131072 }, cost: { input: 0.1, output: 0.3, cache_read: 0.02 } }, "mistral-small-4": { id: "mistral-small-4", name: "Mistral Small 4", description: "Fast Mistral production model for chat, extraction, and cost-sensitive agents", family: "mistral-small", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-06", release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 65536 }, cost: { input: 0.15, output: 0.6, cache_read: 0.15 } }, "mimo-v2-5-pro": { id: "mimo-v2-5-pro", name: "MiMo V2.5 Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 2.175, output: 4.35, cache_read: 0.018 } }, "qwen3-5-27b": { id: "qwen3-5-27b", name: "Qwen3.5 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 80000 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0.086, output: 0.688, cache_read: 0.086, tiers: [{ input: 0.258, output: 2.064, cache_read: 0.258, tier: { type: "context", size: 128000 } }] } } } }, "alibaba-token-plan": { id: "alibaba-token-plan", env: ["ALIBABA_TOKEN_PLAN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1", name: "Alibaba Token Plan", doc: "https://www.alibabacloud.com/help/en/model-studio/token-plan-overview", models: { "qwen3.7-plus": { id: "qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3.8-max-preview": { id: "qwen3.8-max-preview", name: "Qwen3.8 Max Preview", description: "Preview Qwen flagship for million-token multimodal reasoning and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "xhigh"] }, { type: "budget_tokens", min: 0, max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-07-19", last_updated: "2026-07-19", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, status: "beta", cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5": { id: "glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 16384 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 128000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 98304 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "wan2.7-image-pro": { id: "wan2.7-image-pro", name: "Wan2.7 Image Pro", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 8192, output: 0 }, cost: { input: 0, output: 0 } }, "qwen3.7-max": { id: "qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "wan2.7-image": { id: "wan2.7-image", name: "Wan2.7 Image", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 8192, output: 0 }, cost: { input: 0, output: 0 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "happyhorse-1.1-i2v": { id: "happyhorse-1.1-i2v", name: "HappyHorse 1.1 Image-to-Video", description: "Video model for image-to-video generation", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2026-07-17", last_updated: "2026-07-17", modalities: { input: ["image", "text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 0, output: 0 } }, "qwen3.8-max": { id: "qwen3.8-max", name: "Qwen3.8 Max", description: "2.4-trillion-parameter MoE flagship for coding, professional work, multimodal understanding, and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "xhigh"] }, { type: "budget_tokens", min: 0, max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "deepseek-v4-flash-0731": { id: "deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "deepseek-v3.2": { id: "deepseek-v3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-03", last_updated: "2025-12-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0, output: 0 } }, "happyhorse-1.1-r2v": { id: "happyhorse-1.1-r2v", name: "HappyHorse 1.1 Reference-to-Video", description: "Video model for reference-guided video generation", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2026-07-17", last_updated: "2026-07-17", modalities: { input: ["image", "text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 0, output: 0 } }, "qwen-image-2.0-pro": { id: "qwen-image-2.0-pro", name: "Qwen Image 2.0 Pro", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 8192, output: 0 }, cost: { input: 0, output: 0 } }, "MiniMax-M2.5": { id: "MiniMax-M2.5", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, input: 196601, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3.6-flash": { id: "qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 131072 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "happyhorse-1.1-t2v": { id: "happyhorse-1.1-t2v", name: "HappyHorse 1.1 Text-to-Video", description: "Video model for prompt-driven text-to-video generation", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-07-17", last_updated: "2026-07-17", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 0, output: 0 } }, "qwen-image-2.0": { id: "qwen-image-2.0", name: "Qwen Image 2.0", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 8192, output: 0 }, cost: { input: 0, output: 0 } }, "qwen3.6-plus": { id: "qwen3.6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 131072 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, meta: { id: "meta", env: ["META_MODEL_API_KEY"], npm: "@ai-sdk/openai", api: "https://api.meta.ai/v1", name: "Meta", doc: "https://dev.meta.ai/docs", models: { "muse-spark-1.1": { id: "muse-spark-1.1", name: "Muse Spark 1.1", description: "Muse Spark is a natively multimodal reasoning model with support for tool-use, visual chain of thought, and multi-agent orchestration.", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-08", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32000 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "muse-spark-1.2-contributor": { id: "muse-spark-1.2-contributor", name: "Muse Spark 1.2 Contributor", description: "Muse Spark 1.2 is a coding-focused update to Muse Spark 1.1 with improvements in code generation, complex debugging, codebase understanding, and end-to-end developer workflows.", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-05", last_updated: "2026-08-05", modalities: { input: ["text", "image", "video", "pdf", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, cost: { input: 0.1, output: 0.2, cache_read: 0.002 } }, "muse-spark-1.2": { id: "muse-spark-1.2", name: "Muse Spark 1.2", description: "Muse Spark 1.2 is a coding-focused update to Muse Spark 1.1 with improvements in code generation, complex debugging, codebase understanding, and end-to-end developer workflows.", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-05", last_updated: "2026-08-05", modalities: { input: ["text", "image", "video", "pdf", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } } } }, "azure-cognitive-services": { id: "azure-cognitive-services", env: ["AZURE_COGNITIVE_SERVICES_RESOURCE_NAME", "AZURE_COGNITIVE_SERVICES_API_KEY"], npm: "@ai-sdk/azure", name: "Azure Cognitive Services", doc: "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", models: { "gpt-chat-latest": { id: "gpt-chat-latest", name: "GPT Chat Latest", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-05-05", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 111616, output: 16384 }, status: "beta", cost: { input: 5, output: 30, cache_read: 0.5 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_COGNITIVE_SERVICES_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "gpt-5.4-pro": { id: "gpt-5.4-pro", name: "GPT-5.4 Pro", description: "More exact GPT-5.4 tier for demanding professional reasoning and agent tasks", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, status: "beta", cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-07-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_COGNITIVE_SERVICES_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://${AZURE_COGNITIVE_SERVICES_RESOURCE_NAME}.services.ai.azure.com/models", shape: "completions" }, cost: { input: 0.6, output: 3 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2025-12-31", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_COGNITIVE_SERVICES_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://${AZURE_COGNITIVE_SERVICES_RESOURCE_NAME}.services.ai.azure.com/models", shape: "completions" }, cost: { input: 0.95, output: 4 } }, "claude-opus-4-1": { id: "claude-opus-4-1", name: "Claude Opus 4.1", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_COGNITIVE_SERVICES_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "claude-sonnet-4-5": { id: "claude-sonnet-4-5", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_COGNITIVE_SERVICES_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "gpt-5.4-nano": { id: "gpt-5.4-nano", name: "GPT-5.4 Nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 Mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, status: "beta", cost: { input: 1, output: 6, cache_read: 0.1, cache_write: 1.25, tiers: [{ input: 2, output: 9, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 2, output: 9, cache_read: 0.2, cache_write: 2.5 } } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, status: "beta", cost: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 3.125, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, cache_write: 6.25, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5, cache_write: 6.25 } } }, "claude-opus-4-5": { id: "claude-opus-4-5", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-24", last_updated: "2025-08-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_COGNITIVE_SERVICES_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-opus-5": { id: "claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_COGNITIVE_SERVICES_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "text-embedding-3-small": { id: "text-embedding-3-small", name: "text-embedding-3-small", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8191, output: 1536 }, cost: { input: 0.02, output: 0 } }, "cohere-embed-v3-english": { id: "cohere-embed-v3-english", name: "Embed v3 English", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "cohere-embed", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2023-11-07", last_updated: "2023-11-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512, output: 1024 }, cost: { input: 0.1, output: 0 } }, "llama-4-scout-17b-16e-instruct": { id: "llama-4-scout-17b-16e-instruct", name: "Llama 4 Scout 17B 16E Instruct", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.2, output: 0.78 } }, "text-embedding-3-large": { id: "text-embedding-3-large", name: "text-embedding-3-large", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8191, output: 3072 }, cost: { input: 0.13, output: 0 } }, "cohere-command-a": { id: "cohere-command-a", name: "Command A", description: "Cohere command model for multilingual enterprise agents, tools, and chat", family: "command-a", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-06-01", release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 2.5, output: 10 } }, "o4-mini": { id: "o4-mini", name: "o4-mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 1.1, output: 4.4, cache_read: 0.275 } }, "gpt-4.1": { id: "gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, status: "deprecated", cost: { input: 2, output: 8, cache_read: 0.5 } }, "cohere-embed-v3-multilingual": { id: "cohere-embed-v3-multilingual", name: "Embed v3 Multilingual", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "cohere-embed", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2023-11-07", last_updated: "2023-11-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512, output: 1024 }, cost: { input: 0.1, output: 0 } }, "codestral-2501": { id: "codestral-2501", name: "Codestral 25.01", description: "Mistral coding model for code completion, generation, and developer workflows", family: "codestral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-03", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.3, output: 0.9 } }, "gpt-3.5-turbo-0125": { id: "gpt-3.5-turbo-0125", name: "GPT-3.5 Turbo 0125", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2021-08", release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 16384 }, status: "deprecated", cost: { input: 0.5, output: 1.5 } }, "gpt-3.5-turbo-instruct": { id: "gpt-3.5-turbo-instruct", name: "GPT-3.5 Turbo Instruct", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2021-08", release_date: "2023-09-21", last_updated: "2023-09-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 4096, output: 4096 }, status: "deprecated", cost: { input: 1.5, output: 2 } }, o3: { id: "o3", name: "o3", description: "Deliberate o-series reasoner for hard math, coding, and multi-step analysis", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "gpt-5-nano": { id: "gpt-5-nano", name: "GPT-5 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.01 } }, "gpt-5.1-codex": { id: "gpt-5.1-codex", name: "GPT-5.1 Codex", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text", "image", "audio"], output: ["text", "image", "audio"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "phi-4-mini": { id: "phi-4-mini", name: "Phi-4-mini", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "phi", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-10", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.075, output: 0.3 } }, "gpt-4-turbo": { id: "gpt-4-turbo", name: "GPT-4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, status: "deprecated", cost: { input: 10, output: 30 } }, "gpt-5.1": { id: "gpt-5.1", name: "GPT-5.1", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text", "image", "audio"], output: ["text", "image", "audio"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "GPT-5 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.03 } }, "phi-4-reasoning-plus": { id: "phi-4-reasoning-plus", name: "Phi-4-reasoning-plus", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "phi", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2023-10", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 4096 }, cost: { input: 0.125, output: 0.5 } }, "gpt-5.3-codex": { id: "gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-24", last_updated: "2026-02-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "deepseek-r1": { id: "deepseek-r1", name: "DeepSeek-R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 163840 }, status: "deprecated", cost: { input: 1.35, output: 5.4 } }, "gpt-5.2": { id: "gpt-5.2", name: "GPT-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.125 } }, o1: { id: "o1", name: "o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2023-09", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 15, output: 60, cache_read: 7.5 } }, "mistral-small-2503": { id: "mistral-small-2503", name: "Mistral Small 3.1", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2025-03-01", last_updated: "2025-03-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32768 }, cost: { input: 0.1, output: 0.3 } }, "cohere-embed-v-4-0": { id: "cohere-embed-v-4-0", name: "Embed v4", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "cohere-embed", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 1536 }, cost: { input: 0.12, output: 0 } }, "deepseek-v3.2": { id: "deepseek-v3.2", name: "DeepSeek-V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.58, output: 1.68 } }, "gpt-5-pro": { id: "gpt-5-pro", name: "GPT-5 Pro", description: "Higher-accuracy GPT-5 tier for tough analysis, coding reviews, and planning", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 272000 }, cost: { input: 15, output: 120 } }, "gpt-5.2-codex": { id: "gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-01-14", last_updated: "2026-01-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "phi-4-mini-reasoning": { id: "phi-4-mini-reasoning", name: "Phi-4-mini-reasoning", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "phi", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2023-10", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.075, output: 0.3 } }, "gpt-4-turbo-vision": { id: "gpt-4-turbo-vision", name: "GPT-4 Turbo Vision", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-11", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, status: "deprecated", cost: { input: 10, output: 30 } }, "llama-3.3-70b-instruct": { id: "llama-3.3-70b-instruct", name: "Llama-3.3-70B-Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.71, output: 0.71 } }, "gpt-5-codex": { id: "gpt-5-codex", name: "GPT-5-Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "phi-4-reasoning": { id: "phi-4-reasoning", name: "Phi-4-reasoning", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "phi", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2023-10", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 4096 }, cost: { input: 0.125, output: 0.5 } }, "mistral-medium-2505": { id: "mistral-medium-2505", name: "Mistral Medium 3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-05-07", last_updated: "2025-05-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.4, output: 2 } }, "gpt-5": { id: "gpt-5", name: "GPT-5", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "llama-4-maverick-17b-128e-instruct-fp8": { id: "llama-4-maverick-17b-128e-instruct-fp8", name: "Llama 4 Maverick 17B 128E Instruct FP8", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 16384 }, cost: { input: 0.25, output: 1 } }, "gpt-4o-mini": { id: "gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, status: "deprecated", cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "ministral-3b": { id: "ministral-3b", name: "Ministral 3B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-03", release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.04, output: 0.04 } }, "o3-mini": { id: "o3-mini", name: "o3-mini", description: "Smaller o-series reasoner for economical coding, math, and planning tasks", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "model-router": { id: "model-router", name: "Model Router", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "model-router", attachment: true, reasoning: false, tool_call: true, release_date: "2025-05-19", last_updated: "2025-11-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 16384 }, cost: { input: 0.14, output: 0 } }, "phi-4": { id: "phi-4", name: "Phi-4", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "phi", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2023-10", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.125, output: 0.5 } }, "deepseek-v3.2-speciale": { id: "deepseek-v3.2-speciale", name: "DeepSeek-V3.2-Speciale", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.58, output: 1.68 } }, "gpt-3.5-turbo-1106": { id: "gpt-3.5-turbo-1106", name: "GPT-3.5 Turbo 1106", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2021-08", release_date: "2023-11-06", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 16384 }, status: "deprecated", cost: { input: 1, output: 2 } }, "gpt-4.1-nano": { id: "gpt-4.1-nano", name: "GPT-4.1 nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, status: "deprecated", cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "text-embedding-ada-002": { id: "text-embedding-ada-002", name: "text-embedding-ada-002", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, release_date: "2022-12-15", last_updated: "2022-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 }, cost: { input: 0.1, output: 0 } }, "phi-4-multimodal": { id: "phi-4-multimodal", name: "Phi-4-multimodal", description: "Multimodal model for analyzing text, images, documents, and rich media", family: "phi", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2023-10", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.08, output: 0.32, input_audio: 4 } }, "codex-mini": { id: "codex-mini", name: "Codex Mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-04", release_date: "2025-05-16", last_updated: "2025-05-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 1.5, output: 6, cache_read: 0.375 } }, "gpt-4o": { id: "gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, status: "deprecated", cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "gpt-4.1-mini": { id: "gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, status: "deprecated", cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "gpt-5.1-codex-mini": { id: "gpt-5.1-codex-mini", name: "GPT-5.1 Codex Mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } } } }, "wafer.ai": { id: "wafer.ai", env: ["WAFER_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://pass.wafer.ai/v1", name: "Wafer", doc: "https://docs.wafer.ai/wafer-pass", models: { "Kimi-K2.6": { id: "Kimi-K2.6", name: "Kimi K2.6", description: "Kimi K2.6 sparse MoE model with a 262K context window. Available serverless and not included in standard Wafer Pass. Non-ZDR only: requests with `Wafer-ZDR: required` are rejected.", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 1.14, output: 4.8, cache_read: 0.19, cache_write: 0 } }, "GLM-5.2": { id: "GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1.2, output: 4.1, cache_read: 0.2, cache_write: 0 } }, "GLM-5.1": { id: "GLM-5.1", name: "GLM-5.1", description: "General Language Model 5.1 \u2014 high-quality bilingual (EN/ZH) generation with strong coding and reasoning capabilities.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-07", last_updated: "2026-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.1, cache_write: 0 } }, "glm5.2-fast": { id: "glm5.2-fast", name: "GLM5.2-Fast", description: "The same model served for high TPS.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 10.25, cache_read: 0.5, cache_write: 0 } }, "MiniMax-M3": { id: "MiniMax-M3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 128000 }, cost: { input: 0.33, output: 1.32, cache_read: 0.07, cache_write: 0, tiers: [{ input: 0.66, output: 2.64, cache_read: 0.13, cache_write: 0, tier: { type: "context", size: 512000 } }], context_over_200k: { input: 0.66, output: 2.64, cache_read: 0.13, cache_write: 0 } } } } }, clarifai: { id: "clarifai", env: ["CLARIFAI_PAT"], npm: "@ai-sdk/openai-compatible", api: "https://api.clarifai.com/v2/ext/openai/v1", name: "Clarifai", doc: "https://docs.clarifai.com/compute/inference/", models: { "qwen/qwenCoder/models/Qwen3-Coder-30B-A3B-Instruct": { id: "qwen/qwenCoder/models/Qwen3-Coder-30B-A3B-Instruct", name: "Qwen3 Coder 30B A3B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-31", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.11458, output: 0.74812 } }, "qwen/qwenLM/models/Qwen3-30B-A3B-Thinking-2507": { id: "qwen/qwenLM/models/Qwen3-30B-A3B-Thinking-2507", name: "Qwen3 30B A3B Thinking 2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-31", last_updated: "2026-02-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.36, output: 1.3 } }, "qwen/qwenLM/models/Qwen3-30B-A3B-Instruct-2507": { id: "qwen/qwenLM/models/Qwen3-30B-A3B-Instruct-2507", name: "Qwen3 30B A3B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-30", last_updated: "2026-02-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.3, output: 0.5 } }, "mistralai/completion/models/Ministral-3-3B-Reasoning-2512": { id: "mistralai/completion/models/Ministral-3-3B-Reasoning-2512", name: "Ministral 3 3B Reasoning 2512", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-12", last_updated: "2026-02-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.039, output: 0.54825 } }, "mistralai/completion/models/Ministral-3-14B-Reasoning-2512": { id: "mistralai/completion/models/Ministral-3-14B-Reasoning-2512", name: "Ministral 3 14B Reasoning 2512", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-12", release_date: "2025-12-01", last_updated: "2025-12-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 2.5, output: 1.7 } }, "clarifai/main/models/mm-poly-8b": { id: "clarifai/main/models/mm-poly-8b", name: "MM Poly 8B", description: "Multimodal model for analyzing text, images, documents, and rich media", family: "mm-poly", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-06", last_updated: "2026-02-25", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 4096 }, cost: { input: 0.658, output: 1.11 } }, "deepseek-ai/deepseek-ocr/models/DeepSeek-OCR": { id: "deepseek-ai/deepseek-ocr/models/DeepSeek-OCR", name: "DeepSeek OCR", description: "OCR model for extracting structured text from documents and screenshots", family: "deepseek", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-10-20", last_updated: "2026-02-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0.2, output: 0.7 } }, "arcee_ai/AFM/models/trinity-mini": { id: "arcee_ai/AFM/models/trinity-mini", name: "Trinity Mini", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "trinity-mini", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-12", last_updated: "2026-02-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.045, output: 0.15 } }, "moonshotai/chat-completion/models/Kimi-K2_6": { id: "moonshotai/chat-completion/models/Kimi-K2_6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4 } }, "openai/chat-completion/models/gpt-oss-20b": { id: "openai/chat-completion/models/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-12-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.045, output: 0.18 } }, "openai/chat-completion/models/gpt-oss-120b-high-throughput": { id: "openai/chat-completion/models/gpt-oss-120b-high-throughput", name: "GPT OSS 120B High Throughput", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-08-05", last_updated: "2026-02-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.09, output: 0.36 } }, "minimaxai/chat-completion/models/MiniMax-M2_5-high-throughput": { id: "minimaxai/chat-completion/models/MiniMax-M2_5-high-throughput", name: "MiniMax-M2.5 High Throughput", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2 } } } }, iflowcn: { id: "iflowcn", env: ["IFLOW_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://apis.iflow.cn/v1", name: "iFlow", doc: "https://platform.iflow.cn/en/docs", models: { "qwen3-vl-plus": { id: "qwen3-vl-plus", name: "Qwen3-VL-Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 }, cost: { input: 0, output: 0 } }, "qwen3-32b": { id: "qwen3-32b", name: "Qwen3-32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32000 }, cost: { input: 0, output: 0 } }, "qwen3-235b-a22b-thinking-2507": { id: "qwen3-235b-a22b-thinking-2507", name: "Qwen3-235B-A22B-Thinking", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-01", last_updated: "2025-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0, output: 0 } }, "qwen3-235b": { id: "qwen3-235b", name: "Qwen3-235B-A22B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32000 }, cost: { input: 0, output: 0 } }, "qwen3-max-preview": { id: "qwen3-max-preview", name: "Qwen3-Max-Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 }, cost: { input: 0, output: 0 } }, "qwen3-max": { id: "qwen3-max", name: "Qwen3-Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 }, cost: { input: 0, output: 0 } }, "glm-4.6": { id: "glm-4.6", name: "GLM-4.6", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-01", last_updated: "2025-11-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 0, output: 0 } }, "qwen3-coder-plus": { id: "qwen3-coder-plus", name: "Qwen3-Coder-Plus", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-01", last_updated: "2025-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0, output: 0 } }, "deepseek-v3": { id: "deepseek-v3", name: "DeepSeek-V3", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-26", last_updated: "2024-12-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32000 }, cost: { input: 0, output: 0 } }, "deepseek-v3.2": { id: "deepseek-v3.2", name: "DeepSeek-V3.2-Exp", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 64000 }, cost: { input: 0, output: 0 } }, "deepseek-r1": { id: "deepseek-r1", name: "DeepSeek-R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-20", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32000 }, cost: { input: 0, output: 0 } }, "kimi-k2": { id: "kimi-k2", name: "Kimi-K2", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, cost: { input: 0, output: 0 } }, "qwen3-235b-a22b-instruct": { id: "qwen3-235b-a22b-instruct", name: "Qwen3-235B-A22B-Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-01", last_updated: "2025-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0, output: 0 } }, "kimi-k2-0905": { id: "kimi-k2-0905", name: "Kimi-K2-0905", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 0, output: 0 } } } }, gitlab: { id: "gitlab", env: ["GITLAB_TOKEN"], npm: "gitlab-ai-provider", name: "GitLab Duo", doc: "https://docs.gitlab.com/user/duo_agent_platform/", models: { "duo-chat-gpt-5-5": { id: "duo-chat-gpt-5-5", name: "Agentic Chat (GPT-5.5)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0, output: 0 } }, "duo-chat-gpt-5-codex": { id: "duo-chat-gpt-5-codex", name: "Agentic Chat (GPT-5 Codex)", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2026-01-22", last_updated: "2026-01-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0, output: 0 } }, "duo-chat-haiku-4-5": { id: "duo-chat-haiku-4-5", name: "Agentic Chat (Claude Haiku 4.5)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2026-01-08", last_updated: "2026-01-08", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "duo-chat-opus-4-8": { id: "duo-chat-opus-4-8", name: "Agentic Chat (Claude Opus 4.8)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "duo-chat-gpt-5-1": { id: "duo-chat-gpt-5-1", name: "Agentic Chat (GPT-5.1)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2026-01-22", last_updated: "2026-01-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0, output: 0 } }, "duo-chat-opus-4-6": { id: "duo-chat-opus-4-6", name: "Agentic Chat (Claude Opus 4.6)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "duo-chat-gpt-5-6-terra": { id: "duo-chat-gpt-5-6-terra", name: "Agentic Chat (GPT-5.6 Terra)", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "duo-chat-gpt-5-2-codex": { id: "duo-chat-gpt-5-2-codex", name: "Agentic Chat (GPT-5.2 Codex)", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-01-22", last_updated: "2026-01-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0, output: 0 } }, "duo-chat-gpt-5-6-luna": { id: "duo-chat-gpt-5-6-luna", name: "Agentic Chat (GPT-5.6 Luna)", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "duo-chat-sonnet-4-6": { id: "duo-chat-sonnet-4-6", name: "Agentic Chat (Claude Sonnet 4.6)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-02-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "duo-chat-gpt-5-mini": { id: "duo-chat-gpt-5-mini", name: "Agentic Chat (GPT-5 Mini)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2026-01-22", last_updated: "2026-01-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0, output: 0 } }, "duo-chat-gpt-5-3-codex": { id: "duo-chat-gpt-5-3-codex", name: "Agentic Chat (GPT-5.3 Codex)", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0, output: 0 } }, "duo-chat-gpt-5-4-nano": { id: "duo-chat-gpt-5-4-nano", name: "Agentic Chat (GPT-5.4 Nano)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0, output: 0 } }, "duo-chat-gpt-5-4-mini": { id: "duo-chat-gpt-5-4-mini", name: "Agentic Chat (GPT-5.4 Mini)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0, output: 0 } }, "duo-chat-gpt-5-2": { id: "duo-chat-gpt-5-2", name: "Agentic Chat (GPT-5.2)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-01-23", last_updated: "2026-01-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0, output: 0 } }, "duo-chat-fable-5": { id: "duo-chat-fable-5", name: "Agentic Chat (Claude Fable 5)", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "duo-chat-gpt-5-4": { id: "duo-chat-gpt-5-4", name: "Agentic Chat (GPT-5.4)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0, output: 0 } }, "duo-chat-sonnet-4-5": { id: "duo-chat-sonnet-4-5", name: "Agentic Chat (Claude Sonnet 4.5)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2026-01-08", last_updated: "2026-01-08", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "duo-chat-opus-4-7": { id: "duo-chat-opus-4-7", name: "Agentic Chat (Claude Opus 4.7)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "duo-chat-sonnet-5": { id: "duo-chat-sonnet-5", name: "Agentic Chat (Claude Sonnet 5)", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "duo-chat-opus-4-5": { id: "duo-chat-opus-4-5", name: "Agentic Chat (Claude Opus 4.5)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2026-01-08", last_updated: "2026-01-08", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "duo-chat-gpt-5-6-sol": { id: "duo-chat-gpt-5-6-sol", name: "Agentic Chat (GPT-5.6 Sol)", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "duo-chat-opus-5": { id: "duo-chat-opus-5", name: "Agentic Chat (Claude Opus 5)", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, bailing: { id: "bailing", env: ["BAILING_API_TOKEN"], npm: "@ai-sdk/openai-compatible", api: "https://api.tbox.cn/api/llm/v1/chat/completions", name: "Bailing", doc: "https://alipaytbox.yuque.com/sxs0ba/ling/intro", models: { "Ling-1T": { id: "Ling-1T", name: "Ling-1T", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "ling", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06", release_date: "2025-10", last_updated: "2025-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32000 }, cost: { input: 0.57, output: 2.29 } }, "Ring-1T": { id: "Ring-1T", name: "Ring-1T", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "ring", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2024-06", release_date: "2025-10", last_updated: "2025-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32000 }, cost: { input: 0.57, output: 2.29 } } } }, venice: { id: "venice", env: ["VENICE_API_KEY"], npm: "venice-ai-sdk-provider", name: "Venice AI", doc: "https://docs.venice.ai", models: { "olafangensan-glm-4.7-flash-heretic": { id: "olafangensan-glm-4.7-flash-heretic", name: "GLM 4.7 Flash Heretic", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2026-02-04", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 24000 }, cost: { input: 0.07, output: 0.4, cache_read: 0.035 } }, "qwen3-coder-480b-a35b-instruct-turbo": { id: "qwen3-coder-480b-a35b-instruct-turbo", name: "Qwen 3 Coder 480B Turbo", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-01-27", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 65536 }, cost: { input: 0.35, output: 1.5, cache_read: 0.04 } }, "grok-4-5": { id: "grok-4-5", name: "Grok 4.5", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-07", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 32000 }, cost: { input: 2.27, output: 6.8, cache_read: 0.34, tiers: [{ input: 4.53, output: 13.6, cache_read: 0.68, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4.53, output: 13.6, cache_read: 0.68 } } }, "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3.6, output: 18, cache_read: 0.36, cache_write: 4.5 } }, "grok-build-0-1": { id: "grok-build-0-1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 65536 }, cost: { input: 1, output: 2, cache_read: 0.2, tiers: [{ input: 2, output: 4, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2, output: 4, cache_read: 0.4 } } }, "qwen3-5-397b-a17b": { id: "qwen3-5-397b-a17b", name: "Qwen 3.5 397B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-16", last_updated: "2026-06-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.75, output: 4.5 } }, "openai-gpt-54-pro": { id: "openai-gpt-54-pro", name: "GPT-5.4 Pro", description: "More exact GPT-5.4 tier for demanding professional reasoning and agent tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 922000, output: 128000 }, cost: { input: 37.5, output: 225, tiers: [{ input: 75, output: 337.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 75, output: 337.5 } } }, "qwen-3-8-max": { id: "qwen-3-8-max", name: "Qwen 3.8 Max", description: "Preview Qwen flagship for million-token multimodal reasoning and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-07-22", last_updated: "2026-07-19", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 2.5, output: 7.5, cache_read: 0.3125, cache_write: 3.125 } }, "minimax-m25": { id: "minimax-m25", name: "MiniMax M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 198000, output: 32768 }, cost: { input: 0.27, output: 0.95, cache_read: 0.03 } }, "llama-3.3-70b": { id: "llama-3.3-70b", name: "Llama 3.3 70B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, release_date: "2025-04-06", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.7, output: 2.8 } }, "nvidia-nemotron-3-ultra-550b-a55b": { id: "nvidia-nemotron-3-ultra-550b-a55b", name: "NVIDIA Nemotron 3 Ultra", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 32768 }, cost: { input: 0.625, output: 3.125, cache_read: 0.1875 } }, "mistral-small-3-2-24b-instruct": { id: "mistral-small-3-2-24b-instruct", name: "Mistral Small 3.2 24B Instruct", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-01-15", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 0.09375, output: 0.25 } }, "gemini-3-5-flash": { id: "gemini-3-5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-22", last_updated: "2026-06-11", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 1.55, output: 9.45, cache_read: 0.155, cache_write: 0.086 } }, "minimax-m3-preview": { id: "minimax-m3-preview", name: "MiniMax M3 Preview", description: "MiniMax multimodal coding model for long-context reasoning and agent tasks", family: "minimax-m3", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, release_date: "2026-06-12", last_updated: "2026-06-13", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 65536 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "openai-gpt-55": { id: "openai-gpt-55", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 922000, output: 131072 }, cost: { input: 6.25, output: 37.5, cache_read: 0.625, tiers: [{ input: 12.5, output: 56.25, cache_read: 1.25, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 12.5, output: 56.25, cache_read: 1.25 } } }, "gemma-4-uncensored": { id: "gemma-4-uncensored", name: "Gemma 4 Uncensored", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-04-13", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8192 }, cost: { input: 0.1625, output: 0.5 } }, "aion-labs-aion-3-0": { id: "aion-labs-aion-3-0", name: "Aion 3.0", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32768 }, cost: { input: 3.75, output: 7.5, cache_read: 0.9375 } }, "qwen3-235b-a22b-thinking-2507": { id: "qwen3-235b-a22b-thinking-2507", name: "Qwen 3 235B A22B Thinking 2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, release_date: "2025-04-29", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.45, output: 3.5 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 6, output: 30, cache_read: 0.6, cache_write: 7.5 } }, "qwen3-5-9b": { id: "qwen3-5-9b", name: "Qwen 3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-05", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 32768 }, cost: { input: 0.1, output: 0.15 } }, "kimi-k2-6": { id: "kimi-k2-6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-20", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 65536 }, cost: { input: 0.75, output: 3.5, cache_read: 0.16 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-10", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 12, output: 60, cache_read: 1.2, cache_write: 15 } }, "openai-gpt-54-mini": { id: "openai-gpt-54-mini", name: "GPT-5.4 Mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-27", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.9375, output: 5.625, cache_read: 0.09375 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash 0423", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 32768 }, cost: { input: 0.138, output: 0.275, cache_read: 0.028 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 6, output: 30, cache_read: 0.6, cache_write: 7.5 } }, "zai-org-glm-5": { id: "zai-org-glm-5", name: "GLM 5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-11", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 198000, output: 32000 }, cost: { input: 1, output: 3.2, cache_read: 0.2 } }, "openai-gpt-56-luna-pro": { id: "openai-gpt-56-luna-pro", name: "GPT-5.6 Luna Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 0.26666667, output: 1.6, cache_read: 0.02666667, cache_write: 0.33333334 } }, "venice-uncensored-1-2": { id: "venice-uncensored-1-2", name: "Venice Uncensored 1.2", description: "Multimodal model for analyzing text, images, documents, and rich media", family: "venice", attachment: true, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-04-01", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.2, output: 0.9 } }, "qwen3-vl-235b-a22b": { id: "qwen3-vl-235b-a22b", name: "Qwen3 VL 235B", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-01-16", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.21, output: 1.9, cache_read: 0.1 } }, "gemini-3-5-flash-lite": { id: "gemini-3-5-flash-lite", name: "Gemini 3.5 Flash-Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-09", last_updated: "2026-07-21", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.375, output: 3.125, cache_read: 0.0375 } }, "qwen3-6-35b-a3b": { id: "qwen3-6-35b-a3b", name: "Qwen 3.6 35B A3B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-20", last_updated: "2026-07-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 65536 }, cost: { input: 0.1, output: 1 } }, "google-gemma-3-27b-it": { id: "google-gemma-3-27b-it", name: "Google Gemma 3 27B Instruct", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, release_date: "2025-11-04", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 198000, output: 16384 }, cost: { input: 0.12, output: 0.2 } }, "minimax-m27": { id: "minimax-m27", name: "MiniMax M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 198000, output: 32768 }, cost: { input: 0.375, output: 1.5, cache_read: 0.06875 } }, "zai-org-glm-4.6": { id: "zai-org-glm-4.6", name: "GLM 4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2024-04-01", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 198000, output: 16384 }, cost: { input: 0.43, output: 1.75, cache_read: 0.08 } }, "gemini-3-flash-preview": { id: "gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-19", last_updated: "2026-06-11", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 65536 }, cost: { input: 0.7, output: 3.75, cache_read: 0.07 } }, "openai-gpt-4o-mini-2024-07-18": { id: "openai-gpt-4o-mini-2024-07-18", name: "GPT-4o Mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2026-02-28", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.1875, output: 0.75, cache_read: 0.09375 } }, "openai-gpt-54": { id: "openai-gpt-54", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 922000, output: 131072 }, cost: { input: 3.13, output: 18.8, cache_read: 0.313 } }, "qwen-3-7-max": { id: "qwen-3-7-max", name: "Qwen 3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-05-22", last_updated: "2026-06-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 2.7, output: 8.05, cache_read: 0.27, cache_write: 3.35 } }, "qwen-3-7-plus": { id: "qwen-3-7-plus", name: "Qwen 3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.5, output: 2, cache_read: 0.05, cache_write: 0.625, tiers: [{ input: 1.5, output: 6, cache_read: 0.15, cache_write: 1.875, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 1.5, output: 6, cache_read: 0.15, cache_write: 1.875 } } }, "kimi-k2-7-code": { id: "kimi-k2-7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-13", last_updated: "2026-06-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 65536 }, cost: { input: 0.75, output: 3.5, cache_read: 0.16 } }, "qwen-3-6-plus": { id: "qwen-3-6-plus", name: "Qwen 3.6 Plus Uncensored", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-06", last_updated: "2026-06-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.625, output: 3.75, cache_read: 0.0625, cache_write: 0.78, tiers: [{ input: 2.5, output: 7.5, cache_read: 0.0625, cache_write: 0.78, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2.5, output: 7.5, cache_read: 0.0625, cache_write: 0.78 } } }, "claude-sonnet-4-5": { id: "claude-sonnet-4-5", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-01-15", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 198000, output: 64000 }, cost: { input: 3.75, output: 18.75, cache_read: 0.375, cache_write: 4.69 } }, "openai-gpt-4o-2024-11-20": { id: "openai-gpt-4o-2024-11-20", name: "GPT-4o", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2026-02-28", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 3.125, output: 12.5 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 32768 }, cost: { input: 1.65, output: 3.301, cache_read: 0.33 } }, "openai-gpt-52": { id: "openai-gpt-52", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-13", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 272000, output: 65536 }, cost: { input: 2.19, output: 17.5, cache_read: 0.219 } }, "grok-4-3": { id: "grok-4-3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-18", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32000 }, cost: { input: 1.42, output: 2.83, cache_read: 0.23, tiers: [{ input: 2.83, output: 5.67, cache_read: 0.45, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.83, output: 5.67, cache_read: 0.45 } } }, "kimi-k2-5": { id: "kimi-k2-5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2024-04", release_date: "2026-01-27", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 65536 }, cost: { input: 0.56, output: 3.5, cache_read: 0.22 } }, "nvidia-nemotron-3-nano-30b-a3b": { id: "nvidia-nemotron-3-nano-30b-a3b", name: "NVIDIA Nemotron 3 Nano 30B", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01-27", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.075, output: 0.3 } }, "zai-org-glm-4.7-flash": { id: "zai-org-glm-4.7-flash", name: "GLM 4.7 Flash", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-29", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.06, output: 0.4, cache_read: 0.01 } }, "llama-3.2-3b": { id: "llama-3.2-3b", name: "Llama 3.2 3B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-10-03", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.15, output: 0.6 } }, "openai-gpt-55-pro": { id: "openai-gpt-55-pro", name: "GPT-5.5 Pro", description: "Highest-accuracy GPT-5.5 tier for slower, precision-heavy reasoning and coding", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-24", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 922000, output: 128000 }, cost: { input: 37.5, output: 225 } }, "deepseek-v4-flash-0731": { id: "deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.175, output: 0.35, cache_read: 0.035 } }, "qwen3-235b-a22b-instruct-2507": { id: "qwen3-235b-a22b-instruct-2507", name: "Qwen 3 235B A22B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-29", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.75 } }, "mistral-small-2603": { id: "mistral-small-2603", name: "Mistral Small 4", description: "Fast Mistral production model for chat, extraction, and cost-sensitive agents", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-06", release_date: "2026-03-16", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 65536 }, cost: { input: 0.1875, output: 0.75 } }, "aion-labs-aion-3-0-mini": { id: "aion-labs-aion-3-0-mini", name: "Aion 3.0 Mini", description: "Efficient model for low-latency assistance, extraction, and routine automation", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32768 }, cost: { input: 0.875, output: 1.75, cache_read: 0.225 } }, "claude-opus-5-fast": { id: "claude-opus-5-fast", name: "Claude Opus 5 Fast", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-23", last_updated: "2026-07-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 12, output: 60, cache_read: 1.2, cache_write: 15 } }, "deepseek-v3.2": { id: "deepseek-v3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-04", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 160000, output: 32768 }, cost: { input: 0.33, output: 0.48, cache_read: 0.16 } }, "qwen3-6-27b": { id: "qwen3-6-27b", name: "Qwen 3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-24", last_updated: "2026-06-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 65536 }, cost: { input: 0.325, output: 3.25 } }, "openai-gpt-56-sol-pro": { id: "openai-gpt-56-sol-pro", name: "GPT-5.6 Sol Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 6.25, output: 37.5, cache_read: 0.625, cache_write: 7.8125 } }, "hermes-3-llama-3.1-405b": { id: "hermes-3-llama-3.1-405b", name: "Hermes 3 Llama 3.1 405b", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "hermes", attachment: false, reasoning: false, tool_call: false, release_date: "2025-09-25", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 1.1, output: 3 } }, "z-ai-glm-5-turbo": { id: "z-ai-glm-5-turbo", name: "GLM 5 Turbo", description: "Faster GLM-5 lane for coding agents that need lower latency", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-15", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 32768 }, cost: { input: 1.2, output: 4, cache_read: 0.24 } }, "venice-uncensored-role-play": { id: "venice-uncensored-role-play", name: "Venice Role Play Uncensored", description: "Multimodal model for analyzing text, images, documents, and rich media", family: "venice", attachment: true, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-02-20", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.5, output: 2 } }, "google-gemma-4-26b-a4b-it": { id: "google-gemma-4-26b-a4b-it", name: "Google Gemma 4 26B A4B Instruct", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-06-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8192 }, cost: { input: 0.13, output: 0.4, cache_read: 0.05 } }, "google-gemma-4-31b-it": { id: "google-gemma-4-31b-it", name: "Google Gemma 4 31B Instruct", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-03", last_updated: "2026-06-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8192 }, cost: { input: 0.12, output: 0.36, cache_read: 0.09 } }, "openai-gpt-52-codex": { id: "openai-gpt-52-codex", name: "GPT-5.2 Codex", description: "Code-specialist GPT for repository edits, reviews, and long-running software agents", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08", release_date: "2025-01-15", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 272000, output: 65536 }, cost: { input: 2.19, output: 17.5, cache_read: 0.219 } }, "seed-2-1-turbo": { id: "seed-2-1-turbo", name: "Seed 2.1 Turbo", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-06-28", last_updated: "2026-07-24", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 65536 }, cost: { input: 0.625, output: 3.125, cache_read: 0.125 } }, "xiaomi-mimo-v2-5": { id: "xiaomi-mimo-v2-5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-06-11", last_updated: "2026-06-11", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 65536 }, cost: { input: 0.14, output: 0.28, cache_read: 0.05 } }, "grok-4-20-multi-agent": { id: "grok-4-20-multi-agent", name: "Grok 4.20 Multi-Agent", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, release_date: "2026-03-12", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 128000 }, cost: { input: 1.42, output: 2.83, cache_read: 0.23, tiers: [{ input: 2.83, output: 5.67, cache_read: 0.45, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.83, output: 5.67, cache_read: 0.45 } } }, "qwen3-next-80b": { id: "qwen3-next-80b", name: "Qwen 3 Next 80b", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2025-04-29", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 0.35, output: 1.9 } }, "openai-gpt-56-luna": { id: "openai-gpt-56-luna", name: "GPT-5.6 Luna", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 0.26666667, output: 1.6, cache_read: 0.02666667, cache_write: 0.33333334 } }, "qwen3-5-35b-a3b": { id: "qwen3-5-35b-a3b", name: "Qwen 3.5 35B A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-25", last_updated: "2026-06-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 0.3125, output: 1.25, cache_read: 0.15625 } }, "gemini-3-6-flash": { id: "gemini-3-6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-09", last_updated: "2026-07-21", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 1.875, output: 9.375, cache_read: 0.1875 } }, "zai-org-glm-5-2": { id: "zai-org-glm-5-2", name: "GLM 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-16", last_updated: "2026-06-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 3.75, output: 18.75, cache_read: 0.375 } }, inkling: { id: "inkling", name: "Inkling", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-16", last_updated: "2026-07-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 65536 }, cost: { input: 1.25, output: 5.0625, cache_read: 0.2125 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 6, output: 30, cache_read: 0.6, cache_write: 7.5 } }, "claude-opus-4-5": { id: "claude-opus-4-5", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-12-06", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 198000, output: 32768 }, cost: { input: 6, output: 30, cache_read: 0.6, cache_write: 7.5 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-29", last_updated: "2026-07-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "zai-org-glm-4.7": { id: "zai-org-glm-4.7", name: "GLM 4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-24", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 198000, output: 16384 }, cost: { input: 0.55, output: 2.65, cache_read: 0.11 } }, "grok-4-20": { id: "grok-4-20", name: "Grok 4.20", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-03-12", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 128000 }, cost: { input: 1.42, output: 2.83, cache_read: 0.23, tiers: [{ input: 2.83, output: 5.67, cache_read: 0.45, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.83, output: 5.67, cache_read: 0.45 } } }, "z-ai-glm-5v-turbo": { id: "z-ai-glm-5v-turbo", name: "GLM 5V Turbo", description: "Fast GLM vision model for screenshots, documents, and multimodal agent tasks", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-01", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32768 }, cost: { input: 1.5, output: 5, cache_read: 0.3 } }, "openai-gpt-56-terra-pro": { id: "openai-gpt-56-terra-pro", name: "GPT-5.6 Terra Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3.125, output: 18.75, cache_read: 0.3125, cache_write: 3.90625 } }, "openai-gpt-53-codex": { id: "openai-gpt-53-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-24", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 2.19, output: 17.5, cache_read: 0.219 } }, "openai-gpt-56-sol": { id: "openai-gpt-56-sol", name: "GPT-5.6 Sol", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 6.25, output: 37.5, cache_read: 0.625, cache_write: 7.8125 } }, "mercury-2": { id: "mercury-2", name: "Mercury 2", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "mercury", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2026-02-20", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 50000 }, cost: { input: 0.3125, output: 0.9375, cache_read: 0.03125 } }, "openai-gpt-oss-120b": { id: "openai-gpt-oss-120b", name: "OpenAI GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-11-06", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.07, output: 0.3 } }, "claude-opus-5": { id: "claude-opus-5", name: "Claude Opus 5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-23", last_updated: "2026-07-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 6, output: 30, cache_read: 0.6, cache_write: 7.5 } }, "zai-org-glm-5-1": { id: "zai-org-glm-5-1", name: "GLM 5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 80000 }, cost: { input: 1.54, output: 4.84, cache_read: 0.286 } }, "claude-opus-4-8-fast": { id: "claude-opus-4-8-fast", name: "Claude Opus 4.8 Fast", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 12, output: 60, cache_read: 1.2, cache_write: 15 } }, "openai-gpt-56-terra": { id: "openai-gpt-56-terra", name: "GPT-5.6 Terra", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3.125, output: 18.75, cache_read: 0.3125, cache_write: 3.90625 } }, "gemini-3-1-pro-preview": { id: "gemini-3-1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-06-11", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 2.5, output: 15, cache_read: 0.5, cache_write: 0.5, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, cache_write: 0.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5, cache_write: 0.5 } } }, "kimi-k3-fast-api": { id: "kimi-k3-fast-api", name: "Kimi K3 Fast", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 4.5, output: 22.5, cache_read: 0.45 } } } }, mixlayer: { id: "mixlayer", env: ["MIXLAYER_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://models.mixlayer.ai/v1", name: "Mixlayer", doc: "https://docs.mixlayer.com", models: { "qwen/qwen3.5-27b": { id: "qwen/qwen3.5-27b", name: "Qwen3.5 27B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.3, output: 2.4 } }, "qwen/qwen3.5-9b": { id: "qwen/qwen3.5-9b", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.1, output: 0.4 } }, "qwen/qwen3.5-35b-a3b": { id: "qwen/qwen3.5-35b-a3b", name: "Qwen3.5 35B A3B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.25, output: 1.3 } }, "qwen/qwen3.5-397b-a17b": { id: "qwen/qwen3.5-397b-a17b", name: "Qwen3.5 397B A17B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3.6 } }, "qwen/qwen3.5-122b-a10b": { id: "qwen/qwen3.5-122b-a10b", name: "Qwen3.5 122B A10B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.4, output: 3.2 } } } }, scaleway: { id: "scaleway", env: ["SCALEWAY_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.scaleway.ai/v1", name: "Scaleway", doc: "https://www.scaleway.com/en/docs/generative-apis/", models: { "mistral-medium-3.5-128b": { id: "mistral-medium-3.5-128b", name: "Mistral Medium 3.5 128B", description: "Balanced Mistral model for enterprise assistants, multilingual work, and tools", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 1.5, output: 7.5 } }, "qwen3.6-35b-a3b": { id: "qwen3.6-35b-a3b", name: "Qwen3.6 35B A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-05-01", last_updated: "2026-05-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, status: "beta", cost: { input: 0.25, output: 1.5 } }, "bge-multilingual-gemma2": { id: "bge-multilingual-gemma2", name: "BGE Multilingual Gemma2", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-07-26", last_updated: "2025-06-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8191, output: 3072 }, cost: { input: 0.1, output: 0 } }, "qwen3-coder-30b-a3b-instruct": { id: "qwen3-coder-30b-a3b-instruct", name: "Qwen3-Coder 30B-A3B Instruct", description: "Smaller Qwen coder for efficient local agents and repo-level fixes", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2026-03-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.2, output: 0.8 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 1.8, output: 5.5 } }, "pixtral-12b-2409": { id: "pixtral-12b-2409", name: "Pixtral 12B 2409", description: "Mistral vision-language model for image understanding and multimodal chat", family: "pixtral", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2024-09-25", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.2, output: 0.2 } }, "gemma-4-26b-a4b-it": { id: "gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-01", last_updated: "2026-05-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, status: "beta", cost: { input: 0.25, output: 0.5 } }, "llama-3.3-70b-instruct": { id: "llama-3.3-70b-instruct", name: "Llama-3.3-70B-Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2026-03-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e5, output: 16384 }, cost: { input: 0.9, output: 0.9 } }, "whisper-large-v3": { id: "whisper-large-v3", name: "Whisper Large v3", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "whisper", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2023-09", release_date: "2023-09-01", last_updated: "2026-03-17", modalities: { input: ["audio"], output: ["text"] }, open_weights: true, limit: { context: 0, output: 8192 }, cost: { input: 0.003, output: 0 } }, "qwen3-235b-a22b-instruct-2507": { id: "qwen3-235b-a22b-instruct-2507", name: "Qwen3 235B A22B Instruct 2507", description: "Large open Qwen MoE for multilingual reasoning, coding, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-01", last_updated: "2026-03-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 260000, output: 16384 }, cost: { input: 0.75, output: 2.25, reasoning: 8.4 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT-OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2024-01-01", last_updated: "2026-03-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.15, output: 0.6 } }, "mistral-small-3.2-24b-instruct-2506": { id: "mistral-small-3.2-24b-instruct-2506", name: "Mistral Small 3.2 24B Instruct (2506)", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-06-20", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.15, output: 0.35 } }, "qwen3.5-397b-a17b": { id: "qwen3.5-397b-a17b", name: "Qwen3.5 397B A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 0.6, output: 3.6 } }, "qwen3-embedding-8b": { id: "qwen3-embedding-8b", name: "Qwen3 Embedding 8B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-06-05", last_updated: "2026-03-17", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 4096 }, cost: { input: 0.1, output: 0 } } } }, togetherai: { id: "togetherai", env: ["TOGETHER_API_KEY"], npm: "@ai-sdk/togetherai", name: "Together AI", doc: "https://docs.together.ai/docs/serverless-models", models: { "nvidia/nemotron-3-ultra-550b-a55b": { id: "nvidia/nemotron-3-ultra-550b-a55b", name: "Nemotron 3 Ultra 550B A55B", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512300, output: 512300 }, cost: { input: 0.6, output: 3.6, cache_read: 0.2 } }, "deepcogito/cogito-v2-1-671b": { id: "deepcogito/cogito-v2-1-671b", name: "Cogito v2.1 671B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "cogito", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, temperature: true, release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 163840 }, cost: { input: 1.25, output: 1.25 } }, "google/gemma-3n-E4B-it": { id: "google/gemma-3n-E4B-it", name: "Gemma 3N E4B Instruct", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.06, output: 0.12 } }, "google/gemma-4-31B-it": { id: "google/gemma-4-31B-it", name: "Gemma 4 31B Instruct", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.39, output: 0.97 } }, "thinkingmachines/Inkling": { id: "thinkingmachines/Inkling", name: "Inkling", description: "Multimodal MoE reasoning model (975B total, 41B active) for text, image, and audio", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["max", "xhigh", "high", "medium", "low", "none"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 131072 }, cost: { input: 1, output: 4.05, cache_read: 0.17 } }, "zai-org/GLM-5": { id: "zai-org/GLM-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, status: "deprecated", cost: { input: 1, output: 3.2 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-16", last_updated: "2026-06-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 164000 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "zai-org/GLM-5.1": { id: "zai-org/GLM-5.1", name: "GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-11", release_date: "2026-04-07", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, status: "deprecated", cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "pearl-ai/gemma-4-31b-it": { id: "pearl-ai/gemma-4-31b-it", name: "Pearl AI Gemma 4 31B Instruct", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 }, cost: { input: 0.28, output: 0.86 } }, "essentialai/Rnj-1-Instruct": { id: "essentialai/Rnj-1-Instruct", name: "Rnj-1 Instruct", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "rnj", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-12-05", last_updated: "2025-12-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, status: "deprecated", cost: { input: 0.15, output: 0.15 } }, "Qwen/Qwen3.5-9B": { id: "Qwen/Qwen3.5-9B", name: "Qwen3.5 9B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.17, output: 0.25 } }, "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8": { id: "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", name: "Qwen3 Coder 480B A35B Instruct", description: "Legacy model retained for compatibility with older integrations", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 2, output: 2 } }, "Qwen/Qwen3-Coder-Next-FP8": { id: "Qwen/Qwen3-Coder-Next-FP8", name: "Qwen3 Coder Next FP8", description: "Legacy model retained for compatibility with older integrations", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2026-02-03", release_date: "2026-02-03", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0.5, output: 1.2 } }, "Qwen/Qwen3.7-Max": { id: "Qwen/Qwen3.7-Max", name: "Qwen3.7 Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 500000 }, cost: { input: 1.25, output: 3.75, cache_read: 0.125 } }, "Qwen/Qwen3-235B-A22B-Instruct-2507-tput": { id: "Qwen/Qwen3-235B-A22B-Instruct-2507-tput", name: "Qwen3 235B A22B Instruct 2507 FP8", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0.2, output: 0.6 } }, "Qwen/Qwen3.5-397B-A17B": { id: "Qwen/Qwen3.5-397B-A17B", name: "Qwen3.5 397B A17B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-02-16", last_updated: "2026-06-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 130000 }, status: "deprecated", cost: { input: 0.6, output: 3.6, cache_read: 0.35 } }, "Qwen/Qwen3.6-Plus": { id: "Qwen/Qwen3.6-Plus", name: "Qwen3.6 Plus", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 500000 }, cost: { input: 0.5, output: 3 } }, "Qwen/Qwen2.5-7B-Instruct-Turbo": { id: "Qwen/Qwen2.5-7B-Instruct-Turbo", name: "Qwen 2.5 7B Instruct Turbo", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-09-19", last_updated: "2024-09-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.3, output: 0.3 } }, "LiquidAI/LFM2-24B-A2B": { id: "LiquidAI/LFM2-24B-A2B", name: "LFM2-24B-A2B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "liquid", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-02-25", last_updated: "2026-02-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.03, output: 0.12 } }, "MiniMaxAI/MiniMax-M2.7": { id: "MiniMaxAI/MiniMax-M2.7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "MiniMaxAI/MiniMax-M2.5": { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax-M2.5", description: "Legacy model retained for compatibility with older integrations", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, status: "deprecated", cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "MiniMaxAI/MiniMax-M3": { id: "MiniMaxAI/MiniMax-M3", name: "MiniMax-M3", description: "MiniMax multimodal coding model for long-context reasoning and agent tasks", family: "minimax", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 250000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "deepseek-ai/DeepSeek-V3": { id: "deepseek-ai/DeepSeek-V3", name: "DeepSeek-V3", description: "Legacy model retained for compatibility with older integrations", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-12-26", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, status: "deprecated", cost: { input: 1.25, output: 1.25 } }, "deepseek-ai/DeepSeek-V4-Flash-0731": { id: "deepseek-ai/DeepSeek-V4-Flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.03 } }, "deepseek-ai/DeepSeek-R1": { id: "deepseek-ai/DeepSeek-R1", name: "DeepSeek-R1", description: "Legacy model retained for compatibility with older integrations", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-03-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163839, output: 163839 }, status: "deprecated", cost: { input: 3, output: 7 } }, "deepseek-ai/DeepSeek-V3-1": { id: "deepseek-ai/DeepSeek-V3-1", name: "DeepSeek V3.1", description: "Legacy model retained for compatibility with older integrations", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-08", release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, status: "deprecated", cost: { input: 0.6, output: 1.7 } }, "deepseek-ai/DeepSeek-V4-Pro": { id: "deepseek-ai/DeepSeek-V4-Pro", name: "DeepSeek V4 Pro", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512000, output: 384000 }, cost: { input: 1.74, output: 3.48, cache_read: 0.2 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131000 }, cost: { input: 1.2, output: 4.5, cache_read: 0.2 } }, "moonshotai/Kimi-K2.5": { id: "moonshotai/Kimi-K2.5", name: "Kimi K2.5", description: "Legacy model retained for compatibility with older integrations", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, temperature: true, knowledge: "2026-01", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0.5, output: 2.8 } }, "moonshotai/Kimi-K2.7-Code": { id: "moonshotai/Kimi-K2.7-Code", name: "Kimi K2.7 Code", description: "Kimi coding model for software agents, refactors, and repository reasoning", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-14", last_updated: "2026-06-14", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "moonshotai/Kimi-K3": { id: "moonshotai/Kimi-K3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.05, output: 0.2 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-08", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.15, output: 0.6 } }, "meta-llama/Meta-Llama-3-8B-Instruct-Lite": { id: "meta-llama/Meta-Llama-3-8B-Instruct-Lite", name: "Meta Llama 3 8B Instruct Lite", description: "Compact Llama instruction model for fast chat and local deployment", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-04-18", last_updated: "2024-04-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0.14, output: 0.14 } }, "meta-llama/Llama-3.3-70B-Instruct-Turbo": { id: "meta-llama/Llama-3.3-70B-Instruct-Turbo", name: "Llama 3.3 70B", description: "Compact Llama instruction model for fast chat and local deployment", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 1.04, output: 1.04 } } } }, digitalocean: { id: "digitalocean", env: ["DIGITALOCEAN_ACCESS_TOKEN"], npm: "@ai-sdk/openai-compatible", api: "https://inference.do-ai.run/v1", name: "DigitalOcean", doc: "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", models: { "anthropic-claude-opus-4.8": { id: "anthropic-claude-opus-4.8", name: "Anthropic Claude Opus 4.8", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, release_date: "2026-05-28", last_updated: "2026-05-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "openai-gpt-image-1": { id: "openai-gpt-image-1", name: "GPT Image 1", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-04-24", last_updated: "2025-04-24", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 5, output: 40, cache_read: 1.25 } }, "anthropic-claude-3.5-sonnet": { id: "anthropic-claude-3.5-sonnet", name: "Claude 3.5 Sonnet", description: "Legacy model retained for compatibility with older integrations", family: "claude-sonnet", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-06-20", last_updated: "2024-10-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, status: "deprecated", cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "openai-gpt-5.6-terra": { id: "openai-gpt-5.6-terra", name: "OpenAI GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "glm-5": { id: "glm-5", name: "GLM 5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-11", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 64000, output: 12800 }, cost: { input: 0.75, output: 2.4, cache_read: 0.2 } }, "openai-gpt-4.1": { id: "openai-gpt-4.1", name: "OpenAI GPT-4.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "gte-large-en-v1.5": { id: "gte-large-en-v1.5", name: "GTE Large (v1.5)", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-03-27", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 1024 }, cost: { input: 0.09, output: 0 } }, "anthropic-claude-opus-5": { id: "anthropic-claude-opus-5", name: "Anthropic Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "mistral-3-14B": { id: "mistral-3-14B", name: "Ministral 3 14B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-15", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 128000 }, cost: { input: 0.2, output: 0.2 } }, "openai-gpt-5.4-pro": { id: "openai-gpt-5.4-pro", name: "OpenAI GPT-5.4 Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, cost: { input: 30, output: 180, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "ministral-3-8b-instruct-2512": { id: "ministral-3-8b-instruct-2512", name: "Ministral 3 8B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-12-15", last_updated: "2025-12-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 } }, "openai-gpt-oss-20b": { id: "openai-gpt-oss-20b", name: "OpenAI GPT-oss-20b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06", release_date: "2025-08-05", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.05, output: 0.45 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 32768 }, cost: { input: 0.975, output: 4.3, cache_read: 0.26 } }, "nemotron-nano-12b-v2-vl": { id: "nemotron-nano-12b-v2-vl", name: "Nemotron-nano 12b v2-vl", description: "Nemotron multimodal model for visual reasoning and agentic AI workflows", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, temperature: true, release_date: "2025-10-28", last_updated: "2025-10-28", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.2, output: 0.6 } }, "anthropic-claude-4.5-sonnet": { id: "anthropic-claude-4.5-sonnet", name: "Anthropic Claude 4.5 Sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "nvidia-nemotron-3-super-120b": { id: "nvidia-nemotron-3-super-120b", name: "NVIDIA Nemotron 3 Super 120B (Public Preview)", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 32768 }, cost: { input: 0.165, output: 0.3575, cache_read: 0.06 } }, "anthropic-claude-opus-4.5": { id: "anthropic-claude-opus-4.5", name: "Anthropic Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 52429 }, cost: { input: 0.375, output: 2.025, cache_read: 0.203 } }, "all-mini-lm-l6-v2": { id: "all-mini-lm-l6-v2", name: "All-MiniLM-L6-v2", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2021-08-30", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256, output: 384 }, cost: { input: 0.009, output: 0 } }, "mistral-nemo-instruct-2407": { id: "mistral-nemo-instruct-2407", name: "Mistral Nemo Instruct", description: "Legacy model retained for compatibility with older integrations", family: "mistral", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, status: "deprecated", cost: { input: 0.3, output: 0.3 } }, "openai-gpt-5.3-codex": { id: "openai-gpt-5.3-codex", name: "OpenAI GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 52429 }, cost: { input: 1.4, output: 4.4, cache_read: 0.21 } }, "openai-gpt-4o": { id: "openai-gpt-4o", name: "OpenAI GPT-4o", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "anthropic-claude-haiku-4.5": { id: "anthropic-claude-haiku-4.5", name: "Anthropic Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 52429 }, cost: { input: 0.76, output: 3.2, cache_read: 0.19 } }, "anthropic-claude-fable-5": { id: "anthropic-claude-fable-5", name: "Anthropic Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, release_date: "2026-06-09", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "qwen-2.5-14b-instruct": { id: "qwen-2.5-14b-instruct", name: "Qwen 2.5 14B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2024-09-19", last_updated: "2024-09-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 } }, "deepseek-r1-distill-llama-70b": { id: "deepseek-r1-distill-llama-70b", name: "DeepSeek R1 Distill Llama 70B", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-01-30", last_updated: "2025-01-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32678, output: 8192 }, cost: { input: 0.99, output: 0.99 } }, "anthropic-claude-3-opus": { id: "anthropic-claude-3-opus", name: "Claude 3 Opus", description: "Legacy model retained for compatibility with older integrations", family: "claude-opus", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-08", release_date: "2024-02-29", last_updated: "2024-02-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, status: "deprecated", cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "nemotron-3-nano-omni": { id: "nemotron-3-nano-omni", name: "Nemotron 3 Nano Omni", description: "Open Nemotron omni model combining reasoning with text, vision, and audio", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-28", last_updated: "2026-04-28", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 13107 }, cost: { input: 0.5, output: 0.9 } }, "stable-diffusion-3.5-large": { id: "stable-diffusion-3.5-large", name: "Stable Diffusion 3.5 Large", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "stable-diffusion", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-10-22", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["image"] }, open_weights: true, limit: { context: 256, output: 1 }, cost: { input: 0.08, output: 0 } }, "deepseek-4-flash": { id: "deepseek-4-flash", name: "Deepseek V4 Flash", description: "Fast DeepSeek model for efficient chat, coding help, and agent loops", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-05-27", last_updated: "2026-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 384000 }, cost: { input: 0.084, output: 0.168, cache_read: 0.0168 } }, "openai-gpt-5.4": { id: "openai-gpt-5.4", name: "OpenAI GPT-5.4", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "anthropic-claude-4.1-opus": { id: "anthropic-claude-4.1-opus", name: "Anthropic Claude 4.1 Opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic-claude-3.5-haiku": { id: "anthropic-claude-3.5-haiku", name: "Claude 3.5 Haiku", description: "Legacy model retained for compatibility with older integrations", family: "claude-haiku", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-11-05", last_updated: "2024-11-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, status: "deprecated", cost: { input: 0.8, output: 4, cache_read: 0.08, cache_write: 1 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "Deepseek V4 Pro", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 0.87, output: 1.74, cache_read: 0.174 } }, "anthropic-claude-sonnet-4": { id: "anthropic-claude-sonnet-4", name: "Claude Sonnet 4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.3, cache_write: 3.75, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.3, cache_write: 3.75 } } }, "openai-gpt-5-mini": { id: "openai-gpt-5-mini", name: "OpenAI GPT-5 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai-gpt-5.5": { id: "openai-gpt-5.5", name: "OpenAI GPT-5.5", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "qwen3-coder-flash": { id: "qwen3-coder-flash", name: "Qwen3 Coder Flash", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 52429 }, cost: { input: 0.45, output: 1.7, cache_read: 0.09 } }, "deepseek-v4-flash-0731": { id: "deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 209715 }, cost: { input: 0.08, output: 0.252, cache_read: 0.0252 } }, "deepseek-v3": { id: "deepseek-v3", name: "DeepSeek V3", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-12-26", last_updated: "2025-03-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 131072 } }, "alibaba-qwen3-32b": { id: "alibaba-qwen3-32b", name: "Qwen3 32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-30", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 6554 }, cost: { input: 0.25, output: 0.55 } }, "openai-gpt-image-1.5": { id: "openai-gpt-image-1.5", name: "OpenAI GPT Image 1.5", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-11-25", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["image", "text"] }, open_weights: false, limit: { context: 0, output: 16384 }, cost: { input: 5, output: 10, cache_read: 1 } }, "llama-4-maverick": { id: "llama-4-maverick", name: "Llama 4 Maverick", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.2, output: 0.696 } }, "openai-gpt-5.2-pro": { id: "openai-gpt-5.2-pro", name: "OpenAI GPT-5.2 Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 21, output: 168 } }, "anthropic-claude-4.5-haiku": { id: "anthropic-claude-4.5-haiku", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 1, cache_write: 1.25 } }, "openai-gpt-5.4-mini": { id: "openai-gpt-5.4-mini", name: "OpenAI GPT-5.4 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "minimax-m2.5": { id: "minimax-m2.5", name: "MiniMax M2.5 (Public Preview)", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax-m2.5", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-08", release_date: "2026-02-12", last_updated: "2026-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 13107 }, cost: { input: 0.225, output: 0.9, cache_read: 0.06 } }, "arcee-trinity-large-thinking": { id: "arcee-trinity-large-thinking", name: "Arcee Trinity Large Thinking (Public Preview)", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "trinity", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32000 }, cost: { input: 0.25, output: 0.9, cache_read: 0.06 } }, "openai-gpt-5.1-codex-max": { id: "openai-gpt-5.1-codex-max", name: "GPT-5.1 Codex Max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai-o1": { id: "openai-o1", name: "OpenAI o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2023-09", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 15, output: 60, cache_read: 7.5 } }, "openai-gpt-5-nano": { id: "openai-gpt-5-nano", name: "OpenAI GPT-5 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "anthropic-claude-opus-4.6": { id: "anthropic-claude-opus-4.6", name: "Anthropic Claude Opus 4.6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "anthropic-claude-4.6-sonnet": { id: "anthropic-claude-4.6-sonnet", name: "Anthropic Claude Sonnet 4.6", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "llama3.3-70b-instruct": { id: "llama3.3-70b-instruct", name: "Llama 3.3 Instruct (70B)", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.65, output: 0.65 } }, "openai-gpt-4o-mini": { id: "openai-gpt-4o-mini", name: "OpenAI GPT-4o mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "openai-gpt-image-2": { id: "openai-gpt-image-2", name: "OpenAI GPT Image 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-04-24", last_updated: "2025-04-24", modalities: { input: ["text", "image"], output: ["image", "text"] }, open_weights: false, limit: { context: 0, output: 16384 }, cost: { input: 8, output: 30 } }, "wan2-2-t2v-a14b": { id: "wan2-2-t2v-a14b", name: "Wan2.2-T2V-A14B", description: "Video model for prompt-guided generation, editing, and motion workflows", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-07-28", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["video"] }, open_weights: true, limit: { context: 100, output: 1 }, cost: { input: 0.6, output: 0 } }, "openai-gpt-5.6-sol": { id: "openai-gpt-5.6-sol", name: "OpenAI GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 2.85, output: 14.25, cache_read: 0.285 } }, "mimo-v2.5-pro": { id: "mimo-v2.5-pro", name: "MiMo V2.5 Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 52429 }, cost: { input: 0.4, output: 1.5, cache_read: 0.08 } }, "qwen3.5-397b-a17b": { id: "qwen3.5-397b-a17b", name: "Qwen 3.5 397B A17B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-04-30", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 26214 }, cost: { input: 0.3025, output: 1.925, cache_read: 0.111 } }, "multi-qa-mpnet-base-dot-v1": { id: "multi-qa-mpnet-base-dot-v1", name: "Multi-QA-mpnet-base-dot-v1", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2021-08-30", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512, output: 768 }, cost: { input: 0.009, output: 0 } }, "qwen3-embedding-0.6b": { id: "qwen3-embedding-0.6b", name: "Qwen3 Embedding 0.6B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-06-03", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8000, output: 1024 }, status: "beta", cost: { input: 0.04, output: 0 } }, "openai-gpt-5.6-luna": { id: "openai-gpt-5.6-luna", name: "OpenAI GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, tiers: [{ input: 0.4, output: 1.8, cache_read: 0.04, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 0.4, output: 1.8, cache_read: 0.04 } } }, "anthropic-claude-5-sonnet": { id: "anthropic-claude-5-sonnet", name: "Anthropic Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "nemotron-3-ultra-550b": { id: "nemotron-3-ultra-550b", name: "Nemotron 3 Ultra", description: "Flagship Nemotron model for high-throughput reasoning and complex agents", family: "nemotron", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 26214 }, cost: { input: 0.9, output: 1.7 } }, "openai-o3": { id: "openai-o3", name: "OpenAI o3", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "llama3-8b-instruct": { id: "llama3-8b-instruct", name: "Llama 3.1 Instruct (8B)", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.198, output: 0.198 } }, "bge-reranker-v2-m3": { id: "bge-reranker-v2-m3", name: "BGE Reranker v2 M3", description: "Reranking model for improving retrieval quality in search and recommendation systems", family: "bge", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-03-12", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 1 }, cost: { input: 0.01, output: 0 } }, "nemotron-3-nano-30b": { id: "nemotron-3-nano-30b", name: "Nemotron 3 Nano 30B A3B", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, temperature: true, release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 } }, "anthropic-claude-3.7-sonnet": { id: "anthropic-claude-3.7-sonnet", name: "Claude 3.7 Sonnet", description: "Legacy model retained for compatibility with older integrations", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2025-02-24", last_updated: "2025-02-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, status: "deprecated", cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic-claude-opus-4": { id: "anthropic-claude-opus-4", name: "Claude Opus 4", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "openai-gpt-oss-120b": { id: "openai-gpt-oss-120b", name: "OpenAI GPT-oss-120b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-06", release_date: "2025-08-05", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.055, output: 0.385, cache_read: 0.02 } }, "anthropic-claude-opus-4.7": { id: "anthropic-claude-opus-4.7", name: "Anthropic Claude Opus 4.7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "openai-gpt-5": { id: "openai-gpt-5", name: "OpenAI GPT-5", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "gemma-4-31B-it": { id: "gemma-4-31B-it", name: "Gemma 4", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-30", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8192 }, cost: { input: 0.18, output: 0.5, cache_read: 0.036 } }, "openai-o3-mini": { id: "openai-o3-mini", name: "OpenAI o3 mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "mistral-7b-instruct-v0.3": { id: "mistral-7b-instruct-v0.3", name: "Mistral 7B Instruct v0.3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-05-22", last_updated: "2024-05-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 } }, "qwen3-tts-voicedesign": { id: "qwen3-tts-voicedesign", name: "Qwen3 TTS VoiceDesign", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-21", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 32768, output: 1 } }, "e5-large-v2": { id: "e5-large-v2", name: "E5 Large v2", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2023-05-19", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512, output: 1024 }, cost: { input: 0.02, output: 0 } }, "deepseek-3.2": { id: "deepseek-3.2", name: "Deepseek 3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2025-12-02", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 32768 }, cost: { input: 0.25, output: 0.8, cache_read: 0.075 } }, "bge-m3": { id: "bge-m3", name: "BGE M3", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "bge", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-01-30", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 1024 }, cost: { input: 0.02, output: 0 } }, "openai-gpt-5.2": { id: "openai-gpt-5.2", name: "OpenAI GPT-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai-gpt-5.4-nano": { id: "openai-gpt-5.4-nano", name: "OpenAI GPT-5.4 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "fal-ai/fast-sdxl": { id: "fal-ai/fast-sdxl", name: "Fast SDXL", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "stable-diffusion", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2023-07-26", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["image"] }, open_weights: true, limit: { context: 0, output: 0 } }, "fal-ai/stable-audio-25/text-to-audio": { id: "fal-ai/stable-audio-25/text-to-audio", name: "Stable Audio 2.5 (Text-to-Audio)", description: "Speech generation model for controllable voice, narration, and audio delivery", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-10-08", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "fal-ai/flux/schnell": { id: "fal-ai/flux/schnell", name: "FLUX.1 [schnell]", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-08-01", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["image"] }, open_weights: true, limit: { context: 0, output: 0 } }, "fal-ai/elevenlabs/tts/multilingual-v2": { id: "fal-ai/elevenlabs/tts/multilingual-v2", name: "ElevenLabs Multilingual TTS v2", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "elevenlabs", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2023-08-22", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } } } }, "moonshotai-cn": { id: "moonshotai-cn", env: ["MOONSHOT_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.moonshot.cn/v1", name: "Moonshot AI (China)", doc: "https://platform.moonshot.cn/docs/api/chat", models: { "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "kimi-k2-thinking": { id: "kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Thinking Kimi model for slower research passes, planning, and hard technical questions", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-08", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "kimi-k2-0905-preview": { id: "kimi-k2-0905-preview", name: "Kimi K2 0905", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "kimi-k2-turbo-preview": { id: "kimi-k2-turbo-preview", name: "Kimi K2 Turbo", description: "Fast Kimi model for responsive chat, coding help, and agent loops", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 2.4, output: 10, cache_read: 0.6 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "kimi-k2.7-code-highspeed": { id: "kimi-k2.7-code-highspeed", name: "Kimi K2.7 Code HighSpeed", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.9, output: 8, cache_read: 0.38 } }, "kimi-k2-0711-preview": { id: "kimi-k2-0711-preview", name: "Kimi K2 0711", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-07-14", last_updated: "2025-07-14", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "kimi-k2-thinking-turbo": { id: "kimi-k2-thinking-turbo", name: "Kimi K2 Thinking Turbo", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-08", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.15, output: 8, cache_read: 0.15 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } } } }, "model-oracle-ai": { id: "model-oracle-ai", env: ["MODEL_ORACLE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.modeloracle.com/api/v1", name: "Model Oracle AI", doc: "https://modeloracle.com/setup/", models: { "gpt-4.1-mini": { id: "gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 } }, "gpt-5": { id: "gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 } }, "gpt-5.4-nano": { id: "gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 } }, "claude-haiku-4.5": { id: "claude-haiku-4.5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 } }, auto: { id: "auto", name: "Auto", description: "Model Oracle AI decision engine that selects and routes among configured coding-agent models", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-29", last_updated: "2026-07-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 } }, "claude-opus-4.8": { id: "claude-opus-4.8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 } }, "gpt-4.1": { id: "gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 } }, "o4-mini": { id: "o4-mini", name: "o4-mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 } } } }, drun: { id: "drun", env: ["DRUN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://chat.d.run/v1", name: "D.Run (China)", doc: "https://www.d.run", models: { "public/minimax-m25": { id: "public/minimax-m25", name: "MiniMax M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_details" }, temperature: true, release_date: "2025-03-01", last_updated: "2025-03-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131072 }, cost: { input: 0.29, output: 1.16 } }, "public/deepseek-v3": { id: "public/deepseek-v3", name: "DeepSeek V3", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-12-26", last_updated: "2024-12-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.28, output: 1.1 } }, "public/deepseek-r1": { id: "public/deepseek-r1", name: "DeepSeek R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2025-01-20", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32000 }, cost: { input: 0.55, output: 2.2 } } } }, lmstudio: { id: "lmstudio", env: ["LMSTUDIO_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "http://127.0.0.1:1234/v1", name: "LMStudio", doc: "https://lmstudio.ai/models", models: { "qwen/qwen3-coder-30b": { id: "qwen/qwen3-coder-30b", name: "Qwen3 Coder 30B", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0, output: 0 } }, "qwen/qwen3-30b-a3b-2507": { id: "qwen/qwen3-30b-a3b-2507", name: "Qwen3 30B A3B 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-30", last_updated: "2025-07-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0, output: 0 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0, output: 0 } } } }, ovhcloud: { id: "ovhcloud", env: ["OVHCLOUD_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://oai.endpoints.kepler.ai.cloud.ovh.net/v1", name: "OVHcloud AI Endpoints", doc: "https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog//", models: { "qwen3-32b": { id: "qwen3-32b", name: "Qwen3-32B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-16", last_updated: "2025-07-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.09, output: 0.25 } }, "qwen3-coder-30b-a3b-instruct": { id: "qwen3-coder-30b-a3b-instruct", name: "Qwen3-Coder-30B-A3B-Instruct", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-28", last_updated: "2025-10-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.07, output: 0.26 } }, "gpt-oss-20b": { id: "gpt-oss-20b", name: "gpt-oss-20b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2025-08-28", last_updated: "2025-08-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.05, output: 0.18 } }, "mistral-nemo-instruct-2407": { id: "mistral-nemo-instruct-2407", name: "Mistral-Nemo-Instruct-2407", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-11-20", last_updated: "2024-11-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 0.14, output: 0.14 } }, "meta-llama-3_3-70b-instruct": { id: "meta-llama-3_3-70b-instruct", name: "Meta-Llama-3_3-70B-Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-01", last_updated: "2025-04-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.74, output: 0.74 } }, "qwen3.5-9b": { id: "qwen3.5-9b", name: "Qwen3.5-9B", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.12, output: 0.18 } }, "qwen3.6-27b": { id: "qwen3.6-27b", name: "Qwen3.6-27B", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.47, output: 3.19 } }, "qwen3guard-gen-8b": { id: "qwen3guard-gen-8b", name: "Qwen3Guard-Gen-8B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-22", last_updated: "2026-01-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 16384 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "gpt-oss-120b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2025-08-28", last_updated: "2025-08-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.09, output: 0.47 } }, "mistral-small-3.2-24b-instruct-2506": { id: "mistral-small-3.2-24b-instruct-2506", name: "Mistral-Small-3.2-24B-Instruct-2506", description: "Efficient Mistral model for fast chat, extraction, and production assistants", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-16", last_updated: "2025-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.1, output: 0.31 } }, "qwen3.5-397b-a17b": { id: "qwen3.5-397b-a17b", name: "Qwen3.5-397B-A17B", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-18", last_updated: "2026-05-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.71, output: 4.25 } }, "qwen3guard-gen-0.6b": { id: "qwen3guard-gen-0.6b", name: "Qwen3Guard-Gen-0.6B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-22", last_updated: "2026-01-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 16384 } }, "mistral-7b-instruct-v0.3": { id: "mistral-7b-instruct-v0.3", name: "Mistral-7B-Instruct-v0.3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-01", last_updated: "2025-04-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 0.11, output: 0.11 } }, "qwen2.5-vl-72b-instruct": { id: "qwen2.5-vl-72b-instruct", name: "Qwen2.5-VL-72B-Instruct", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-03-31", last_updated: "2025-03-31", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 1.01, output: 1.01 } } } }, zeldoc: { id: "zeldoc", env: ["ZELDOC_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.zeldoc.ai/v1", name: "Zeldoc", doc: "https://docs.zeldoc.ai", models: { zdev: { id: "zdev", name: "ZDev", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-15", last_updated: "2026-04-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0 } } } }, auriko: { id: "auriko", env: ["AURIKO_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.auriko.ai/v1", name: "Auriko", doc: "https://docs.auriko.ai", models: { "minimax-m2-7-highspeed": { id: "minimax-m2-7-highspeed", name: "MiniMax-M2.7-highspeed", description: "Low-latency M2.7 variant for interactive coding plans and agent loops", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.4, cache_write: 0.375 } }, "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.5, output: 2.8 } }, "grok-4.3": { id: "grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "minimax-m2-7": { id: "minimax-m2-7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_write: 0.375 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "qwen-3.6-plus": { id: "qwen-3.6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.1, tiers: [{ input: 2, output: 6, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.2, cache_write: 2.5 } } }, "gemini-3.1-pro-preview": { id: "gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } } } }, azure: { id: "azure", env: ["AZURE_RESOURCE_NAME", "AZURE_API_KEY"], npm: "@ai-sdk/azure", name: "Azure", doc: "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", models: { "gpt-5.1-codex-mini": { id: "gpt-5.1-codex-mini", name: "GPT-5.1 Codex Mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "gpt-image-2": { id: "gpt-image-2", name: "GPT-Image-2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 5, output: 30, cache_read: 1.25 } }, "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gpt-chat-latest": { id: "gpt-chat-latest", name: "GPT Chat Latest", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-05-05", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 111616, output: 16384 }, status: "beta", cost: { input: 5, output: 30, cache_read: 0.5 } }, "gpt-4.1-mini": { id: "gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, status: "deprecated", cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "gpt-4o": { id: "gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, status: "deprecated", cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "codex-mini": { id: "codex-mini", name: "Codex Mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-04", release_date: "2025-05-16", last_updated: "2025-05-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 1.5, output: 6, cache_read: 0.375 } }, "phi-4-multimodal": { id: "phi-4-multimodal", name: "Phi-4-multimodal", description: "Multimodal model for analyzing text, images, documents, and rich media", family: "phi", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2023-10", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.08, output: 0.32, input_audio: 4 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "gpt-5.4-pro": { id: "gpt-5.4-pro", name: "GPT-5.4 Pro", description: "More exact GPT-5.4 tier for demanding professional reasoning and agent tasks", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, status: "beta", cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "text-embedding-ada-002": { id: "text-embedding-ada-002", name: "text-embedding-ada-002", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, release_date: "2022-12-15", last_updated: "2022-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 }, cost: { input: 0.1, output: 0 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-07-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek-V4-Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/models", shape: "completions" }, cost: { input: 0.19, output: 0.51 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-06", last_updated: "2026-02-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/models", shape: "completions" }, cost: { input: 0.6, output: 3 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2025-12-31", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "gpt-4.1-nano": { id: "gpt-4.1-nano", name: "GPT-4.1 nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, status: "deprecated", cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "gpt-3.5-turbo-1106": { id: "gpt-3.5-turbo-1106", name: "GPT-3.5 Turbo 1106", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2021-08", release_date: "2023-11-06", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 16384 }, status: "deprecated", cost: { input: 1, output: 2 } }, "deepseek-v3.2-speciale": { id: "deepseek-v3.2-speciale", name: "DeepSeek-V3.2-Speciale", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.58, output: 1.68 } }, "phi-4": { id: "phi-4", name: "Phi-4", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "phi", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2023-10", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.125, output: 0.5 } }, "model-router": { id: "model-router", name: "Model Router", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "model-router", attachment: true, reasoning: false, tool_call: true, release_date: "2025-05-19", last_updated: "2025-11-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 16384 }, cost: { input: 0.14, output: 0 } }, "o3-mini": { id: "o3-mini", name: "o3-mini", description: "Smaller o-series reasoner for economical coding, math, and planning tasks", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/models", shape: "completions" }, cost: { input: 0.95, output: 4 } }, "ministral-3b": { id: "ministral-3b", name: "Ministral 3B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-03", release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.04, output: 0.04 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "claude-opus-4-1": { id: "claude-opus-4-1", name: "Claude Opus 4.1", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "gpt-4o-mini": { id: "gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, status: "deprecated", cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "llama-4-maverick-17b-128e-instruct-fp8": { id: "llama-4-maverick-17b-128e-instruct-fp8", name: "Llama 4 Maverick 17B 128E Instruct FP8", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 16384 }, cost: { input: 0.25, output: 1 } }, "gpt-5": { id: "gpt-5", name: "GPT-5", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "mistral-medium-2505": { id: "mistral-medium-2505", name: "Mistral Medium 3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-05-07", last_updated: "2025-05-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.4, output: 2 } }, "phi-4-reasoning": { id: "phi-4-reasoning", name: "Phi-4-reasoning", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "phi", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2023-10", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 4096 }, cost: { input: 0.125, output: 0.5 } }, "gpt-5-codex": { id: "gpt-5-codex", name: "GPT-5-Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "llama-3.3-70b-instruct": { id: "llama-3.3-70b-instruct", name: "Llama-3.3-70B-Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.71, output: 0.71 } }, "claude-sonnet-4-5": { id: "claude-sonnet-4-5", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek-V4-Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/models", shape: "completions" }, cost: { input: 1.74, output: 3.48 } }, "gpt-4-turbo-vision": { id: "gpt-4-turbo-vision", name: "GPT-4 Turbo Vision", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-11", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, status: "deprecated", cost: { input: 10, output: 30 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "grok-4-1-fast-reasoning": { id: "grok-4-1-fast-reasoning", name: "Grok 4.1 Fast (Reasoning)", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-06-27", last_updated: "2025-06-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 8192 }, status: "beta", cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "phi-4-mini-reasoning": { id: "phi-4-mini-reasoning", name: "Phi-4-mini-reasoning", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "phi", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2023-10", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.075, output: 0.3 } }, "gpt-image-1.5": { id: "gpt-image-1.5", name: "GPT-Image-1.5", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-11-25", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 5, output: 32, cache_read: 1.25 } }, "gpt-5.2-codex": { id: "gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-01-14", last_updated: "2026-01-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5.4-nano": { id: "gpt-5.4-nano", name: "GPT-5.4 Nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "gpt-5-pro": { id: "gpt-5-pro", name: "GPT-5 Pro", description: "Higher-accuracy GPT-5 tier for tough analysis, coding reviews, and planning", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 272000 }, cost: { input: 15, output: 120 } }, "deepseek-v3.2": { id: "deepseek-v3.2", name: "DeepSeek-V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.58, output: 1.68 } }, "cohere-embed-v-4-0": { id: "cohere-embed-v-4-0", name: "Embed v4", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "cohere-embed", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 1536 }, cost: { input: 0.12, output: 0 } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 Mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "mistral-small-2503": { id: "mistral-small-2503", name: "Mistral Small 3.1", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2025-03-01", last_updated: "2025-03-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32768 }, cost: { input: 0.1, output: 0.3 } }, o1: { id: "o1", name: "o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2023-09", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 15, output: 60, cache_read: 7.5 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, status: "beta", cost: { input: 1, output: 6, cache_read: 0.1, cache_write: 1.25, tiers: [{ input: 2, output: 9, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 2, output: 9, cache_read: 0.2, cache_write: 2.5 } } }, "gpt-5.2": { id: "gpt-5.2", name: "GPT-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.125 } }, "deepseek-r1": { id: "deepseek-r1", name: "DeepSeek-R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 163840 }, status: "deprecated", cost: { input: 1.35, output: 5.4 } }, "gpt-5.3-codex": { id: "gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-24", last_updated: "2026-02-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "phi-4-reasoning-plus": { id: "phi-4-reasoning-plus", name: "Phi-4-reasoning-plus", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "phi", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2023-10", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 4096 }, cost: { input: 0.125, output: 0.5 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "GPT-5 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.03 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/models", shape: "completions" }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "gpt-5.1": { id: "gpt-5.1", name: "GPT-5.1", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text", "image", "audio"], output: ["text", "image", "audio"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "gpt-4-turbo": { id: "gpt-4-turbo", name: "GPT-4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, status: "deprecated", cost: { input: 10, output: 30 } }, "phi-4-mini": { id: "phi-4-mini", name: "Phi-4-mini", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "phi", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-10", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.075, output: 0.3 } }, "grok-4-1-fast-non-reasoning": { id: "grok-4-1-fast-non-reasoning", name: "Grok 4.1 Fast (Non-Reasoning)", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-06-27", last_updated: "2025-06-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 8192 }, status: "beta", cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "gpt-5.1-codex": { id: "gpt-5.1-codex", name: "GPT-5.1 Codex", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text", "image", "audio"], output: ["text", "image", "audio"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "gpt-5-nano": { id: "gpt-5-nano", name: "GPT-5 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.01 } }, o3: { id: "o3", name: "o3", description: "Deliberate o-series reasoner for hard math, coding, and multi-step analysis", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "gpt-3.5-turbo-instruct": { id: "gpt-3.5-turbo-instruct", name: "GPT-3.5 Turbo Instruct", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2021-08", release_date: "2023-09-21", last_updated: "2023-09-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 4096, output: 4096 }, status: "deprecated", cost: { input: 1.5, output: 2 } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, status: "beta", cost: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 3.125, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, cache_write: 6.25, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5, cache_write: 6.25 } } }, "gpt-image-1": { id: "gpt-image-1", name: "GPT-Image-1", description: "OpenAI image model for production generation, edits, and brand-safe visual workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-04-24", last_updated: "2025-04-24", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 5, output: 40, cache_read: 1.25 } }, "claude-opus-4-5": { id: "claude-opus-4-5", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-24", last_updated: "2025-08-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gpt-3.5-turbo-0125": { id: "gpt-3.5-turbo-0125", name: "GPT-3.5 Turbo 0125", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2021-08", release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 16384 }, status: "deprecated", cost: { input: 0.5, output: 1.5 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, status: "beta", provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "codestral-2501": { id: "codestral-2501", name: "Codestral 25.01", description: "Mistral coding model for code completion, generation, and developer workflows", family: "codestral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-03", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.3, output: 0.9 } }, "cohere-embed-v3-multilingual": { id: "cohere-embed-v3-multilingual", name: "Embed v3 Multilingual", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "cohere-embed", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2023-11-07", last_updated: "2023-11-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512, output: 1024 }, cost: { input: 0.1, output: 0 } }, "gpt-4.1": { id: "gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, status: "deprecated", cost: { input: 2, output: 8, cache_read: 0.5 } }, "o4-mini": { id: "o4-mini", name: "o4-mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 1.1, output: 4.4, cache_read: 0.275 } }, "cohere-command-a": { id: "cohere-command-a", name: "Command A", description: "Cohere command model for multilingual enterprise agents, tools, and chat", family: "command-a", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-06-01", release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 2.5, output: 10 } }, "grok-4-20-reasoning": { id: "grok-4-20-reasoning", name: "Grok 4.20 (Reasoning)", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2026-04-08", last_updated: "2026-04-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 8192 }, status: "beta", cost: { input: 2, output: 6 } }, "claude-opus-5": { id: "claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gpt-5.1-codex-max": { id: "gpt-5.1-codex-max", name: "GPT-5.1 Codex Max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "text-embedding-3-large": { id: "text-embedding-3-large", name: "text-embedding-3-large", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8191, output: 3072 }, cost: { input: 0.13, output: 0 } }, "llama-4-scout-17b-16e-instruct": { id: "llama-4-scout-17b-16e-instruct", name: "Llama 4 Scout 17B 16E Instruct", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.2, output: 0.78 } }, "cohere-embed-v3-english": { id: "cohere-embed-v3-english", name: "Embed v3 English", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "cohere-embed", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2023-11-07", last_updated: "2023-11-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512, output: 1024 }, cost: { input: 0.1, output: 0 } }, "grok-4-20-non-reasoning": { id: "grok-4-20-non-reasoning", name: "Grok 4.20 (Non-Reasoning)", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2026-04-08", last_updated: "2026-04-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 8192 }, status: "beta", cost: { input: 2, output: 6 } }, "text-embedding-3-small": { id: "text-embedding-3-small", name: "text-embedding-3-small", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8191, output: 1536 }, cost: { input: 0.02, output: 0 } } } }, "kuae-cloud-coding-plan": { id: "kuae-cloud-coding-plan", env: ["KUAE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://coding-plan-endpoint.kuaecloud.net/v1", name: "KUAE Cloud Coding Plan", doc: "https://docs.mthreads.com/kuaecloud/kuaecloud-doc-online/coding_plan/", models: { "GLM-4.7": { id: "GLM-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, modal: { id: "modal", env: ["MODAL_PROXY_TOKEN"], npm: "@ai-sdk/openai-compatible", api: "https://inference.us-west.modal.direct/v1", name: "Modal", doc: "https://modal.com/docs/guide/endpoints", models: { "thinkingmachines/Inkling-NVFP4": { id: "thinkingmachines/Inkling-NVFP4", name: "Inkling", description: "Multimodal MoE reasoning model (975B total, 41B active) for text, image, and audio", family: "ling", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 262144 }, cost: { input: 1.2, output: 5, cache_read: 0.27 } }, "moonshotai/Kimi-K3": { id: "moonshotai/Kimi-K3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, reasoning: 15, cache_read: 0.3 } } } }, "qihang-ai": { id: "qihang-ai", env: ["QIHANG_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.qhaigc.net/v1", name: "QiHang", doc: "https://www.qhaigc.net/docs", models: { "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.09, output: 0.71, tiers: [{ input: 0.09, output: 0.71, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 0.09, output: 0.71 } } }, "gemini-3-flash-preview": { id: "gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.07, output: 0.43, tiers: [{ input: 0.07, output: 0.43, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 0.07, output: 0.43 } } }, "claude-sonnet-4-5-20250929": { id: "claude-sonnet-4-5-20250929", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0.43, output: 2.14 } }, "gpt-5.2-codex": { id: "gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.14, output: 1.14 } }, "claude-opus-4-5-20251101": { id: "claude-opus-4-5-20251101", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-11-01", last_updated: "2025-11-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 0.71, output: 3.57 } }, "gpt-5.2": { id: "gpt-5.2", name: "GPT-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "GPT-5-Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-09-30", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0.04, output: 0.29 } }, "claude-haiku-4-5-20251001": { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-10-01", last_updated: "2025-10-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0.14, output: 0.71 } }, "gemini-3-pro-preview": { id: "gemini-3-pro-preview", name: "Gemini 3 Pro Preview", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-11", release_date: "2025-11-19", last_updated: "2025-11-19", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65000 }, cost: { input: 0.57, output: 3.43 } } } }, berget: { id: "berget", env: ["BERGET_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.berget.ai/v1", name: "Berget.AI", doc: "https://api.berget.ai", models: { "google/gemma-4-31B-it": { id: "google/gemma-4-31B-it", name: "Gemma 4 31B Instruct", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-12", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["audio", "image", "text", "video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.275, output: 0.55 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 32768 }, cost: { input: 1.54, output: 4.84 } }, "zai-org/GLM-4.7": { id: "zai-org/GLM-4.7", name: "GLM 4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-12", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.77, output: 2.75 } }, "mistralai/Mistral-Medium-3.5-128B": { id: "mistralai/Mistral-Medium-3.5-128B", name: "Mistral Medium 3.5 128B", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-04", release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 1.65, output: 5.5 } }, "mistralai/Mistral-Small-3.2-24B-Instruct-2506": { id: "mistralai/Mistral-Small-3.2-24B-Instruct-2506", name: "Mistral Small 3.2 24B Instruct 2506", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-09", release_date: "2025-10-01", last_updated: "2025-10-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 8192 }, cost: { input: 0.33, output: 0.33 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.83, output: 3.85, cache_read: 0.16 } }, "moonshotai/Kimi-K3": { id: "moonshotai/Kimi-K3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-27", last_updated: "2026-07-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 327680, output: 32768 }, cost: { input: 3, output: 15 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT-OSS-120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.22, output: 0.83 } }, "meta-llama/Llama-3.3-70B-Instruct": { id: "meta-llama/Llama-3.3-70B-Instruct", name: "Llama 3.3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2025-04-27", last_updated: "2025-04-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.99, output: 0.99 } } } }, "google-vertex-anthropic": { id: "google-vertex-anthropic", env: ["GOOGLE_VERTEX_PROJECT", "GOOGLE_VERTEX_LOCATION", "GOOGLE_APPLICATION_CREDENTIALS"], npm: "@ai-sdk/google-vertex/anthropic", name: "Vertex (Anthropic)", doc: "https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/claude", models: { "claude-sonnet-4-5@20250929": { id: "claude-sonnet-4-5@20250929", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "claude-sonnet-5@default": { id: "claude-sonnet-5@default", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "claude-opus-5@default": { id: "claude-opus-5@default", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-haiku-4-5@20251001": { id: "claude-haiku-4-5@20251001", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "claude-opus-4-7@default": { id: "claude-opus-4-7@default", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "claude-opus-4@20250514": { id: "claude-opus-4@20250514", name: "Claude Opus 4", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, status: "deprecated", cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "claude-opus-4-8@default": { id: "claude-opus-4-8@default", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "claude-opus-4-5@20251101": { id: "claude-opus-4-5@20251101", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-01", last_updated: "2025-11-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-opus-4-6@default": { id: "claude-opus-4-6@default", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "claude-sonnet-4@20250514": { id: "claude-sonnet-4@20250514", name: "Claude Sonnet 4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, status: "deprecated", cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "claude-sonnet-4-6@default": { id: "claude-sonnet-4-6@default", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "claude-opus-4-1@20250805": { id: "claude-opus-4-1@20250805", name: "Claude Opus 4.1", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, status: "deprecated", cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } } } }, moark: { id: "moark", env: ["MOARK_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://moark.com/v1", name: "Moark", doc: "https://moark.com/docs/openapi/v1#tag/%E6%96%87%E6%9C%AC%E7%94%9F%E6%88%90", models: { "MiniMax-M2.1": { id: "MiniMax-M2.1", name: "MiniMax-M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 2.1, output: 8.4, cache_read: 2.1, cache_write: 8.4 } }, "GLM-4.7": { id: "GLM-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 3.5, output: 14 } } } }, nova: { id: "nova", env: ["NOVA_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.nova.amazon.com/v1", name: "Nova", doc: "https://nova.amazon.com/dev/documentation", models: { "nova-2-lite-v1": { id: "nova-2-lite-v1", name: "Nova 2 Lite", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "nova-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0, output: 0, reasoning: 0 } }, "nova-2-pro-v1": { id: "nova-2-pro-v1", name: "Nova 2 Pro", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "nova-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-12-03", last_updated: "2026-01-03", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0, output: 0, reasoning: 0 } } } }, vultr: { id: "vultr", env: ["VULTR_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.vultrinference.com/v1", name: "Vultr", doc: "https://api.vultrinference.com/", models: { "nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning-BF16": { id: "nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning-BF16", name: "NVIDIA Nemotron 3 Nano Omni", description: "Open Nemotron omni model combining reasoning with text, vision, and audio", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-28", last_updated: "2026-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.13, output: 0.38 } }, "nvidia/DeepSeek-V3.2-NVFP4": { id: "nvidia/DeepSeek-V3.2-NVFP4", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.55, output: 1.65 } }, "nvidia/Nemotron-Cascade-2-30B-A3B": { id: "nvidia/Nemotron-Cascade-2-30B-A3B", name: "NVIDIA Nemotron Cascade 2", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.15, output: 0.6 } }, "zai-org/GLM-5.2-FP8": { id: "zai-org/GLM-5.2-FP8", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 393216, output: 131072 }, cost: { input: 0.85, output: 3.1 } }, "Qwen/Qwen3.6-27B": { id: "Qwen/Qwen3.6-27B", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.3, output: 2 } }, "Qwen/Qwen3.5-397B-A17B": { id: "Qwen/Qwen3.5-397B-A17B", name: "Qwen3.5 397B-A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.3, output: 2 } }, "MiniMaxAI/MiniMax-M2.7": { id: "MiniMaxAI/MiniMax-M2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "deepseek-ai/DeepSeek-V4-Flash": { id: "deepseek-ai/DeepSeek-V4-Flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.3, output: 1 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "XiaomiMiMo/MiMo-V2.5-Pro": { id: "XiaomiMiMo/MiMo-V2.5-Pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.55, output: 1.65 } } } }, "io-net": { id: "io-net", env: ["IOINTELLIGENCE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.intelligence.io.solutions/api/v1", name: "IO.NET", doc: "https://io.net/docs/guides/intelligence/io-intelligence", models: { "zai-org/GLM-4.6": { id: "zai-org/GLM-4.6", name: "GLM 4.6", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-11-15", last_updated: "2024-11-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, cost: { input: 0.4, output: 1.75, cache_read: 0.2, cache_write: 0.8 } }, "mistralai/Devstral-Small-2505": { id: "mistralai/Devstral-Small-2505", name: "Devstral Small 2505", description: "Mistral coding agent model for repository tasks and software engineering workflows", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-05-01", last_updated: "2025-05-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 0.05, output: 0.22, cache_read: 0.025, cache_write: 0.1 } }, "mistralai/Mistral-Large-Instruct-2411": { id: "mistralai/Mistral-Large-Instruct-2411", name: "Mistral Large Instruct 2411", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-11-01", last_updated: "2024-11-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 2, output: 6, cache_read: 1, cache_write: 4 } }, "mistralai/Mistral-Nemo-Instruct-2407": { id: "mistralai/Mistral-Nemo-Instruct-2407", name: "Mistral Nemo Instruct 2407", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-05", release_date: "2024-07-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.02, output: 0.04, cache_read: 0.01, cache_write: 0.04 } }, "mistralai/Magistral-Small-2506": { id: "mistralai/Magistral-Small-2506", name: "Magistral Small 2506", description: "Mistral reasoning model for transparent analysis, math, and complex decisions", family: "magistral-small", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-01", last_updated: "2025-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 0.5, output: 1.5, cache_read: 0.25, cache_write: 1 } }, "Qwen/Qwen2.5-VL-32B-Instruct": { id: "Qwen/Qwen2.5-VL-32B-Instruct", name: "Qwen 2.5 VL 32B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2024-11-01", last_updated: "2024-11-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 4096 }, cost: { input: 0.05, output: 0.22, cache_read: 0.025, cache_write: 0.1 } }, "Qwen/Qwen3-Next-80B-A3B-Instruct": { id: "Qwen/Qwen3-Next-80B-A3B-Instruct", name: "Qwen 3 Next 80B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-10", last_updated: "2025-01-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 4096 }, cost: { input: 0.1, output: 0.8, cache_read: 0.05, cache_write: 0.2 } }, "Qwen/Qwen3-235B-A22B-Thinking-2507": { id: "Qwen/Qwen3-235B-A22B-Thinking-2507", name: "Qwen 3 235B Thinking", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-07-01", last_updated: "2025-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 4096 }, cost: { input: 0.11, output: 0.6, cache_read: 0.055, cache_write: 0.22 } }, "Intel/Qwen3-Coder-480B-A35B-Instruct-int4-mixed-ar": { id: "Intel/Qwen3-Coder-480B-A35B-Instruct-int4-mixed-ar", name: "Qwen 3 Coder 480B", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-15", last_updated: "2025-01-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 106000, output: 4096 }, cost: { input: 0.22, output: 0.95, cache_read: 0.11, cache_write: 0.44 } }, "deepseek-ai/DeepSeek-R1-0528": { id: "deepseek-ai/DeepSeek-R1-0528", name: "DeepSeek R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 2, output: 8.75, cache_read: 1, cache_write: 4 } }, "moonshotai/Kimi-K2-Instruct-0905": { id: "moonshotai/Kimi-K2-Instruct-0905", name: "Kimi K2 Instruct", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2024-09-05", last_updated: "2024-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 4096 }, cost: { input: 0.39, output: 1.9, cache_read: 0.195, cache_write: 0.78 } }, "moonshotai/Kimi-K2-Thinking": { id: "moonshotai/Kimi-K2-Thinking", name: "Kimi K2 Thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2024-11-01", last_updated: "2024-11-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 4096 }, cost: { input: 0.55, output: 2.25, cache_read: 0.275, cache_write: 1.1 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT-OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 64000, output: 4096 }, cost: { input: 0.03, output: 0.14, cache_read: 0.015, cache_write: 0.06 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT-OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 4096 }, cost: { input: 0.04, output: 0.4, cache_read: 0.02, cache_write: 0.08 } }, "meta-llama/Llama-3.3-70B-Instruct": { id: "meta-llama/Llama-3.3-70B-Instruct", name: "Llama 3.3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.13, output: 0.38, cache_read: 0.065, cache_write: 0.26 } }, "meta-llama/Llama-3.2-90B-Vision-Instruct": { id: "meta-llama/Llama-3.2-90B-Vision-Instruct", name: "Llama 3.2 90B Vision Instruct", description: "Open Llama multimodal model for image understanding and text reasoning", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 16000, output: 4096 }, cost: { input: 0.35, output: 0.4, cache_read: 0.175, cache_write: 0.7 } }, "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8": { id: "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", name: "Llama 4 Maverick 17B 128E Instruct", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-15", last_updated: "2025-01-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 430000, output: 4096 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075, cache_write: 0.3 } } } }, neuralwatt: { id: "neuralwatt", env: ["NEURALWATT_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.neuralwatt.com/v1", name: "Neuralwatt", doc: "https://portal.neuralwatt.com/docs", models: { "glm-5.2-short-fast": { id: "glm-5.2-short-fast", name: "GLM 5.2 Short Fast", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-06-17", last_updated: "2026-06-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 199984, output: 199984 }, cost: { input: 1.45, output: 4.5, cache_read: 0.3625 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048560, output: 65536 }, cost: { input: 0.104, output: 0.207, cache_read: 0.026 } }, "glm-5.2-short": { id: "glm-5.2-short", name: "GLM 5.2 Short", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }, { type: "budget_tokens" }], tool_call: true, temperature: true, release_date: "2026-06-17", last_updated: "2026-06-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 199984, output: 199984 }, cost: { input: 1.45, output: 4.5, cache_read: 0.3625 } }, "glm-5.2": { id: "glm-5.2", name: "GLM 5.2", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }, { type: "budget_tokens" }], tool_call: true, temperature: true, release_date: "2026-06-17", last_updated: "2026-06-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048560, output: 1048560 }, cost: { input: 1.45, output: 4.5, cache_read: 0.3625 } }, "glm-5.2-short-flex": { id: "glm-5.2-short-flex", name: "GLM 5.2 Short Flex", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }, { type: "budget_tokens" }], tool_call: true, temperature: true, release_date: "2026-06-17", last_updated: "2026-06-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 199984, output: 199984 }, cost: { input: 0.725, output: 2.25, cache_read: 0.18125 } }, "kimi-k2.6-flex": { id: "kimi-k2.6-flex", name: "Kimi K2.6 Flex", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262128, output: 262128 }, cost: { input: 0.345, output: 1.61, cache_read: 0.08625 } }, "kimi-k2.5-fast": { id: "kimi-k2.5-fast", name: "Kimi K2.5 Fast", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262128, output: 262128 }, cost: { input: 0.52, output: 2.59, cache_read: 0.13 } }, "qwen3.6-35b-fast": { id: "qwen3.6-35b-fast", name: "Qwen3.6 35B Fast", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "qwen3.6", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131056, output: 131056 }, cost: { input: 0.29, output: 1.15, cache_read: 0.0725 } }, "qwen3.5-397b-fast": { id: "qwen3.5-397b-fast", name: "Qwen3.5 397B Fast", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-02-01", last_updated: "2026-02-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262128, output: 262128 }, cost: { input: 0.69, output: 4.14, cache_read: 0.1725 } }, "glm-5.2-fast": { id: "glm-5.2-fast", name: "GLM 5.2 Fast", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-06-17", last_updated: "2026-06-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048560, output: 1048560 }, cost: { input: 1.45, output: 4.5, cache_read: 0.3625 } }, "gemma-4-31b": { id: "gemma-4-31b", name: "Gemma 4 31B", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262128, output: 16384 }, cost: { input: 0.144, output: 0.42, cache_read: 0.036 } }, "kimi-k2.7-code-flex": { id: "kimi-k2.7-code-flex", name: "Kimi K2.7 Code Flex", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.475, output: 2, cache_read: 0.11875 } }, "kimi-k2.6-fast": { id: "kimi-k2.6-fast", name: "Kimi K2.6 Fast", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262128, output: 262128 }, cost: { input: 0.69, output: 3.22, cache_read: 0.1725 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048560, output: 1048560 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "glm-5.2-flex": { id: "glm-5.2-flex", name: "GLM 5.2 Flex", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }, { type: "budget_tokens" }], tool_call: true, temperature: true, release_date: "2026-06-17", last_updated: "2026-06-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048560, output: 1048560 }, cost: { input: 0.725, output: 2.25, cache_read: 0.18125 } }, "glm-5.2-short-fast-flex": { id: "glm-5.2-short-fast-flex", name: "GLM 5.2 Short Fast Flex", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-06-17", last_updated: "2026-06-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 199984, output: 199984 }, cost: { input: 0.725, output: 2.25, cache_read: 0.18125 } }, "kimi-k3-fast": { id: "kimi-k3-fast", name: "Kimi K3 Fast", description: "Kimi K3 with thinking disabled for low-latency tool calling, vision, and JSON work", family: "kimi-k3", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048560, output: 1048560 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "Qwen/Qwen3.6-35B-A3B": { id: "Qwen/Qwen3.6-35B-A3B", name: "Qwen3.6 35B A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131056, output: 131056 }, cost: { input: 0.29, output: 1.15, cache_read: 0.0725 } }, "Qwen/Qwen3.5-397B-A17B-FP8": { id: "Qwen/Qwen3.5-397B-A17B-FP8", name: "Qwen3.5 397B A17B FP8", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-01", last_updated: "2026-02-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262128, output: 262128 }, cost: { input: 0.69, output: 4.14, cache_read: 0.1725 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262128, output: 262128 }, cost: { input: 0.69, output: 3.22, cache_read: 0.1725 } }, "moonshotai/Kimi-K2.5": { id: "moonshotai/Kimi-K2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262128, output: 262128 }, cost: { input: 0.52, output: 2.59, cache_read: 0.13 } }, "moonshotai/Kimi-K2.7-Code": { id: "moonshotai/Kimi-K2.7-Code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.2375 } } } }, "aki-io": { id: "aki-io", env: ["AKI_IO_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://aki.io/v1", name: "AKI.IO", doc: "https://aki.io/docs/", models: { "mistral4-119b": { id: "mistral4-119b", name: "Mistral Small 4", description: "Fast Mistral production model for chat, extraction, and cost-sensitive agents", family: "mistral-small", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 81920 }, cost: { input: 0.2, output: 0.6 } }, "minimax-m2.5-230b": { id: "minimax-m2.5-230b", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 65536 }, cost: { input: 0.25, output: 1.2 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.15, output: 0.55 } }, "gemma4-26b": { id: "gemma4-26b", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 32768 }, cost: { input: 0.1, output: 0.5 } }, "kimi-k2.7-code-1100b": { id: "kimi-k2.7-code-1100b", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 81920 }, cost: { input: 0.86, output: 3 } }, "qwen3.6-35b": { id: "qwen3.6-35b", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 32768 }, cost: { input: 0.15, output: 0.5 } } } }, xai: { id: "xai", env: ["XAI_API_KEY"], npm: "@ai-sdk/xai", name: "xAI", doc: "https://docs.x.ai/docs/models", models: { "grok-imagine-video": { id: "grok-imagine-video", name: "Grok Imagine Video", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "grok", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-01-28", last_updated: "2026-01-28", modalities: { input: ["text", "image", "video", "pdf"], output: ["video"] }, open_weights: false, limit: { context: 1024, output: 0 } }, "grok-4.3": { id: "grok-4.3", name: "Grok 4.3", description: "xAI's Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "grok-4.20-0309-non-reasoning": { id: "grok-4.20-0309-non-reasoning", name: "Grok 4.20 (Non-Reasoning)", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "grok-imagine-video-1.5": { id: "grok-imagine-video-1.5", name: "Grok Imagine Video 1.5", description: "Video model for image-to-video generation, editing, and extension workflows", family: "grok", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-05-30", last_updated: "2026-05-30", modalities: { input: ["text", "image", "audio", "pdf"], output: ["video"] }, open_weights: false, limit: { context: 1024, output: 0 } }, "grok-4.20-multi-agent-0309": { id: "grok-4.20-multi-agent-0309", name: "Grok 4.20 Multi-Agent", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: false, structured_output: true, temperature: true, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "grok-imagine-image-quality": { id: "grok-imagine-image-quality", name: "Grok Imagine Image Quality", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "grok", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-03", last_updated: "2026-04-03", modalities: { input: ["text", "image", "pdf"], output: ["image", "pdf"] }, open_weights: false, limit: { context: 8000, output: 0 } }, "grok-4.5": { id: "grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.3, tiers: [{ input: 4, output: 12, cache_read: 0.6, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 12, cache_read: 0.6 } } }, "grok-build-0.1": { id: "grok-build-0.1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1, output: 2, cache_read: 0.2, tiers: [{ input: 2, output: 4, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2, output: 4, cache_read: 0.4 } } }, "grok-4.20-0309-reasoning": { id: "grok-4.20-0309-reasoning", name: "Grok 4.20 (Reasoning)", description: "Reasoning Grok for document-heavy analysis and long-horizon tool use", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "grok-imagine-image": { id: "grok-imagine-image", name: "Grok Imagine Image", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "grok", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-01-28", last_updated: "2026-01-28", modalities: { input: ["text", "image", "pdf"], output: ["image", "pdf"] }, open_weights: false, limit: { context: 8000, output: 0 } } } }, hetzner: { id: "hetzner", env: ["HETZNER_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://inference.hetzner.com/api/v1", name: "Hetzner", doc: "https://experiments.hetzner.com/docs/inference", models: { "Qwen/Qwen3.6-35B-A3B-FP8": { id: "Qwen/Qwen3.6-35B-A3B-FP8", name: "Qwen3.6 35B A3B FP8", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "beta", cost: { input: 0, output: 0, cache_read: 0 } } } }, zenifra: { id: "zenifra", env: ["ZENIFRA_AI_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://ai.zenifra.com/v1", name: "Zenifra", doc: "https://docs.zenifra.com", models: { "alibaba/qwen3.6-35b-a3b": { id: "alibaba/qwen3.6-35b-a3b", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, provider: { shape: "completions" }, cost: { input: 0.19, output: 0.48 } } } }, aihubmix: { id: "aihubmix", env: ["AIHUBMIX_API_KEY"], npm: "@aihubmix/ai-sdk-provider", name: "AIHubMix", doc: "https://docs.aihubmix.com", models: { "gpt-5.1-codex-mini": { id: "gpt-5.1-codex-mini", name: "GPT-5.1 Codex mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "xiaomi-mimo-v2.5-free": { id: "xiaomi-mimo-v2.5-free", name: "Xiaomi MiMo-V2.5 (free)", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo-v2.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-05-13", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0 } }, "qwen3.7-plus": { id: "qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 991000, output: 64000 }, cost: { input: 0.282, output: 1.128, cache_read: 0.0564, cache_write: 0.3525 } }, "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, interleaved: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "deep-deepseek-v4-pro": { id: "deep-deepseek-v4-pro", name: "DeepSeek V4 Pro (DeepSeek)", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.478, output: 0.956, cache_read: 0.004302 } }, "gemini-3.5-flash": { id: "gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 1.5, output: 9, cache_read: 1.5 } }, "deep-deepseek-v4-flash": { id: "deep-deepseek-v4-flash", name: "DeepSeek V4 Flash (DeepSeek)", description: "Fast DeepSeek model for efficient chat, coding help, and agent loops", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.154, output: 0.308, cache_read: 0.0308 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-03-20", last_updated: "2025-06-05", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, input_audio: 1 } }, "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "xiaomi-mimo-v2.5": { id: "xiaomi-mimo-v2.5", name: "Xiaomi MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo-v2.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-05-13", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.44, output: 2.2, cache_read: 0.088, tiers: [{ input: 0.88, output: 4.4, cache_read: 0.176, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.88, output: 4.4, cache_read: 0.176 } } }, "claude-opus-4-7-think": { id: "claude-opus-4-7-think", name: "Claude Opus 4.7 Thinking", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "zai-glm-5.1": { id: "zai-glm-5.1", name: "GLM-5.1 (Z.ai)", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-27", last_updated: "2026-03-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.845, output: 3.38, cache_read: 0.183112 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, interleaved: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 11, output: 55, cache_read: 1.1, cache_write: 13.75 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "minimax-m2.7": { id: "minimax-m2.7", name: "MiniMax M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 128000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06, cache_write: 0.375 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "grok-4.3": { id: "grok-4.3", name: "Grok 4.3", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-01", last_updated: "2026-05-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 1.1268, output: 3.9438, cache_read: 0.2817 } }, "qwen3.7-max": { id: "qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 991000, output: 64000 }, cost: { input: 1.69, output: 5.07, cache_read: 0.169, cache_write: 2.1125 } }, "kimi-k2.7-code-highspeed": { id: "kimi-k2.7-code-highspeed", name: "Kimi K2.7 Code Highspeed", description: "Lower-latency Kimi Code variant for interactive edits and coding-agent loops", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 1.9, output: 7.999, cache_read: 0.32167 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "alicloud-deepseek-v4-pro": { id: "alicloud-deepseek-v4-pro", name: "DeepSeek V4 Pro (Alibaba Cloud)", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 1.69, output: 3.38, cache_read: 0.13 } }, "xiaomi-mimo-v2.5-pro-free": { id: "xiaomi-mimo-v2.5-pro-free", name: "Xiaomi MiMo-V2.5-Pro (free)", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo-v2.5-pro", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-05-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0 } }, "doubao-seed-2-0-code-preview": { id: "doubao-seed-2-0-code-preview", name: "Doubao Seed 2.0 Code Preview", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 0.48, output: 2.41, cache_read: 0.09644, tiers: [{ input: 0.72, output: 3.62, cache_read: 0.144656, tier: { type: "context", size: 32000 } }, { input: 1.45, output: 7.23, cache_read: 0.28932, tier: { type: "context", size: 128000 } }] } }, "claude-opus-4-6-think": { id: "claude-opus-4-6-think", name: "Claude Opus 4.6 Thinking", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "coding-xiaomi-mimo-v2.5-pro": { id: "coding-xiaomi-mimo-v2.5-pro", name: "Coding Xiaomi MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo-v2.5-pro", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-05-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.2, output: 0.6, cache_read: 0.04, tiers: [{ input: 0.4, output: 1.2, cache_read: 0.08, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.4, output: 1.2, cache_read: 0.08 } } }, "coding-minimax-m2.7-highspeed": { id: "coding-minimax-m2.7-highspeed", name: "Coding MiniMax M2.7 Highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 128100 }, cost: { input: 0.2, output: 0.2 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 12.5, output: 75, cache_read: 1.25 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "gemini-3-flash-preview": { id: "gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, tiers: [{ input: 0.5, output: 3, cache_read: 0.05, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 0.5, output: 3, cache_read: 0.05 } } }, "gemini-3.1-pro-preview-customtools": { id: "gemini-3.1-pro-preview-customtools", name: "Gemini 3.1 Pro Preview Custom Tools", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "coding-xiaomi-mimo-v2.5": { id: "coding-xiaomi-mimo-v2.5", name: "Coding Xiaomi MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo-v2.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-05-13", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.08, output: 0.4, cache_read: 0.016, tiers: [{ input: 0.16, output: 0.8, cache_read: 0.032, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.16, output: 0.8, cache_read: 0.032 } } }, "alicloud-deepseek-v4-flash": { id: "alicloud-deepseek-v4-flash", name: "DeepSeek V4 Flash (Alibaba Cloud)", description: "Fast DeepSeek model for efficient chat, coding help, and agent loops", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 5, output: 30, cache_read: 0.5 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "gpt-5.2-codex": { id: "gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "hy3-preview": { id: "hy3-preview", name: "Hy3 Preview", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 128000 }, cost: { input: 0.17, output: 0.566661, cache_read: 0.051 } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 1.5, output: 9, cache_read: 0.15 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "gemini-3.1-flash-lite": { id: "gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, cache_write: 1 } }, "xiaomi-mimo-v2.5-pro": { id: "xiaomi-mimo-v2.5-pro", name: "Xiaomi MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo-v2.5-pro", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-05-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1.1, output: 3.3, cache_read: 0.22, tiers: [{ input: 2.2, output: 6.6, cache_read: 0.44, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2.2, output: 6.6, cache_read: 0.44 } } }, "coding-minimax-m2.7": { id: "coding-minimax-m2.7", name: "Coding MiniMax M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 128100 }, cost: { input: 0.2, output: 0.2 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 1, output: 6, cache_read: 0.1, cache_write: 1.25 } }, "gpt-5.2": { id: "gpt-5.2", name: "GPT-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "coding-minimax-m2.7-free": { id: "coding-minimax-m2.7-free", name: "Coding MiniMax M2.7 (Free)", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax-free", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 128100 }, cost: { input: 0, output: 0 } }, "gpt-5.3-codex": { id: "gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "doubao-seed-2-0-mini-260428": { id: "doubao-seed-2-0-mini-260428", name: "Doubao Seed 2.0 Mini 260428", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-28", last_updated: "2026-04-28", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 0.03, output: 0.28, cache_read: 0.00564, input_audio: 0.423, tiers: [{ input: 0.06, output: 0.56, cache_read: 0.01128, input_audio: 0.846, tier: { type: "context", size: 32000 } }, { input: 0.11, output: 1.13, cache_read: 0.02256, input_audio: 1.692, tier: { type: "context", size: 128000 } }] } }, "grok-4.5": { id: "grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 2, output: 6, cache_read: 0.5 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.95, output: 3.9995, cache_read: 0.160835 } }, "gemini-3.1-pro-preview": { id: "gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "doubao-seed-2-0-lite-260428": { id: "doubao-seed-2-0-lite-260428", name: "Doubao Seed 2.0 Lite 260428", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-28", last_updated: "2026-04-28", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 0.08, output: 0.51, cache_read: 0.01692, input_audio: 1.269, tiers: [{ input: 0.13, output: 0.76, cache_read: 0.02536, input_audio: 1.902, tier: { type: "context", size: 32000 } }, { input: 0.25, output: 1.52, cache_read: 0.05072, input_audio: 3.804, tier: { type: "context", size: 128000 } }] } }, "claude-sonnet-4-6-think": { id: "claude-sonnet-4-6-think", name: "Claude Sonnet 4.6 Thinking", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "qwen3.6-flash": { id: "qwen3.6-flash", name: "Qwen3.6 Flash", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 991000, output: 64000 }, cost: { input: 0.17, output: 1.01, cache_read: 0.0169, cache_write: 0.21125, tiers: [{ input: 0.68, output: 4.06, cache_read: 0.0676, cache_write: 0.845, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.68, output: 4.06, cache_read: 0.0676, cache_write: 0.845 } } }, "gpt-5.1": { id: "gpt-5.1", name: "GPT-5.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "grok-build-0.1": { id: "grok-build-0.1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1, output: 2, cache_read: 0.2 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-03-20", last_updated: "2025-06-05", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "gpt-5.1-codex": { id: "gpt-5.1-codex", name: "GPT-5.1 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "coding-glm-5.1-free": { id: "coding-glm-5.1-free", name: "Coding GLM 5.1 (free)", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm-free", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-11", last_updated: "2026-04-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0, output: 0 } }, "glm-5v-turbo": { id: "glm-5v-turbo", name: "GLM 5 Vision Turbo", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glmv", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-05-09", last_updated: "2026-05-09", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 0.7042, output: 3.09848, cache_read: 0.169008 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 3.125 } }, "claude-opus-4-8-think": { id: "claude-opus-4-8-think", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "alicloud-glm-5.1": { id: "alicloud-glm-5.1", name: "GLM-5.1 (Alibaba Cloud)", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-27", last_updated: "2026-03-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.84, output: 3.38, cache_read: 0.169, cache_write: 1.05625 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "qwen3.6-max-preview": { id: "qwen3.6-max-preview", name: "Qwen3.6 Max Preview", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "qwen3.6", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-05-09", last_updated: "2026-05-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 240000, output: 64000 }, cost: { input: 1.27, output: 7.61, cache_read: 0.1268, cache_write: 1.585, tiers: [{ input: 2.11, output: 12.67, cache_read: 0.2112, cache_write: 2.64, tier: { type: "context", size: 128000 } }] } }, "doubao-seed-2-0-pro": { id: "doubao-seed-2-0-pro", name: "Doubao Seed 2.0 Pro", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 0.48, output: 2.41, cache_read: 0.09644, tiers: [{ input: 0.72, output: 3.62, cache_read: 0.144656, tier: { type: "context", size: 32000 } }, { input: 1.45, output: 7.23, cache_read: 0.28932, tier: { type: "context", size: 128000 } }] } }, "coding-glm-5.1": { id: "coding-glm-5.1", name: "Coding GLM 5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-11", last_updated: "2026-04-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.06, output: 0.22, cache_read: 0.013 } }, "qwen3.6-plus": { id: "qwen3.6-plus", name: "Qwen3.6 Plus", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-05-09", last_updated: "2026-05-09", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 991000, output: 64000 }, cost: { input: 0.28, output: 1.69, cache_read: 0.0282, cache_write: 0.3525, tiers: [{ input: 1.13, output: 6.77, cache_read: 0.1128, cache_write: 1.41, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 1.13, output: 6.77, cache_read: 0.1128, cache_write: 1.41 } } } } }, morph: { id: "morph", env: ["MORPH_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.morphllm.com/v1", name: "Morph", doc: "https://docs.morphllm.com/api-reference/introduction", models: { "morph-v3-large": { id: "morph-v3-large", name: "Morph v3 Large", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "morph", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-08-15", last_updated: "2024-08-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 }, cost: { input: 0.9, output: 1.9 } }, auto: { id: "auto", name: "Auto", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-06-01", last_updated: "2024-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 }, cost: { input: 0.85, output: 1.55 } }, "morph-v3-fast": { id: "morph-v3-fast", name: "Morph v3 Fast", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "morph", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-08-15", last_updated: "2024-08-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16000, output: 16000 }, cost: { input: 0.8, output: 1.2 } } } }, "umans-ai-coding-plan": { id: "umans-ai-coding-plan", env: ["UMANS_AI_CODING_PLAN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.code.umans.ai/v1", name: "Umans AI Coding Plan", doc: "https://app.umans.ai/offers/code/docs", models: { "umans-flash": { id: "umans-flash", name: "Umans Flash", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "umans-deepseek-v4-flash-0731": { id: "umans-deepseek-v4-flash-0731", name: "DeepSeek V4 Flash", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 393215 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "umans-kimi-k3": { id: "umans-kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "umans-coder": { id: "umans-coder", name: "Umans Coder", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "umans-glm-5.2": { id: "umans-glm-5.2", name: "GLM 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 405504, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "umans-kimi-k2.7": { id: "umans-kimi-k2.7", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "umans-qwen3.6-35b-a3b": { id: "umans-qwen3.6-35b-a3b", name: "Qwen3.6 35B A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "umans-glm-5.1": { id: "umans-glm-5.1", name: "GLM 5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, mistral: { id: "mistral", env: ["MISTRAL_API_KEY"], npm: "@ai-sdk/mistral", name: "Mistral", doc: "https://docs.mistral.ai/getting-started/models/", models: { "mistral-small-2506": { id: "mistral-small-2506", name: "Mistral Small 3.2", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-06-20", last_updated: "2025-06-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.1, output: 0.3 } }, "pixtral-large-latest": { id: "pixtral-large-latest", name: "Pixtral Large (latest)", description: "Mistral's larger vision model for document-heavy image understanding and chat", family: "pixtral", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2024-11-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 2, output: 6 } }, "pixtral-12b": { id: "pixtral-12b", name: "Pixtral 12B", description: "Mistral vision-language model for image understanding and multimodal chat", family: "pixtral", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2024-09-01", last_updated: "2024-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.15, output: 0.15 } }, "open-mixtral-8x7b": { id: "open-mixtral-8x7b", name: "Mixtral 8x7B", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mixtral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-01", release_date: "2023-12-11", last_updated: "2023-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 32000 }, cost: { input: 0.7, output: 0.7 } }, "labs-devstral-small-2512": { id: "labs-devstral-small-2512", name: "Devstral Small 2", description: "Legacy model retained for compatibility with older integrations", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-12", release_date: "2025-12-09", last_updated: "2025-12-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, status: "deprecated", cost: { input: 0, output: 0 } }, "magistral-medium-latest": { id: "magistral-medium-latest", name: "Magistral Medium (latest)", description: "Mistral reasoning model for transparent analysis, math, and complex decisions", family: "magistral-medium", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-03-17", last_updated: "2025-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 2, output: 5 } }, "mistral-medium-2508": { id: "mistral-medium-2508", name: "Mistral Medium 3.1", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-08-12", last_updated: "2025-08-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.4, output: 2 } }, "mistral-large-2411": { id: "mistral-large-2411", name: "Mistral Large 2.1", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-18", last_updated: "2024-11-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 2, output: 6 } }, "voxtral-mini-tts-latest": { id: "voxtral-mini-tts-latest", name: "Voxtral Mini TTS (latest)", description: "Multilingual text-to-speech model with zero-shot voice cloning", family: "voxtral", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-03-01", last_updated: "2026-03-01", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "mistral-medium-latest": { id: "mistral-medium-latest", name: "Mistral Medium (latest)", description: "Balanced Mistral model for enterprise assistants, multilingual work, and tools", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.5, output: 7.5 } }, "devstral-small-2507": { id: "devstral-small-2507", name: "Devstral Small", description: "Legacy model retained for compatibility with older integrations", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-07-10", last_updated: "2025-07-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, status: "deprecated", cost: { input: 0.1, output: 0.3 } }, "open-mistral-7b": { id: "open-mistral-7b", name: "Mistral 7B", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2023-09-27", last_updated: "2023-09-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8000, output: 8000 }, cost: { input: 0.25, output: 0.25 } }, "mistral-medium-2505": { id: "mistral-medium-2505", name: "Mistral Medium 3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-05-07", last_updated: "2025-05-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.4, output: 2 } }, "ministral-3b-latest": { id: "ministral-3b-latest", name: "Ministral 3B (latest)", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-10-01", last_updated: "2024-10-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.04, output: 0.04 } }, "mistral-small-latest": { id: "mistral-small-latest", name: "Mistral Small (latest)", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.15, output: 0.6 } }, "open-mixtral-8x22b": { id: "open-mixtral-8x22b", name: "Mixtral 8x22B", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mixtral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-04-17", last_updated: "2024-04-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 64000, output: 64000 }, cost: { input: 2, output: 6 } }, "mistral-nemo": { id: "mistral-nemo", name: "Mistral Nemo", description: "Efficient Mistral-NVIDIA open model for multilingual chat and local deployment", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-07-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.15, output: 0.15 } }, "mistral-small-2603": { id: "mistral-small-2603", name: "Mistral Small 4", description: "Fast Mistral production model for chat, extraction, and cost-sensitive agents", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.15, output: 0.6 } }, "mistral-medium-2604": { id: "mistral-medium-2604", name: "Mistral Medium 3.5", description: "Balanced Mistral model for enterprise assistants, multilingual work, and tools", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.5, output: 7.5 } }, "voxtral-mini-latest": { id: "voxtral-mini-latest", name: "Voxtral Mini (latest)", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "voxtral", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-02-01", last_updated: "2026-02-01", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 } }, "voxtral-small-latest": { id: "voxtral-small-latest", name: "Voxtral Small (latest)", description: "Instruct model with native audio input for speech understanding and tool use", family: "voxtral", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-07-15", last_updated: "2025-07-15", modalities: { input: ["text", "audio"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 32000 }, cost: { input: 0.1, output: 0.3 } }, "devstral-latest": { id: "devstral-latest", name: "Devstral 2", description: "Legacy model retained for compatibility with older integrations", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-12", release_date: "2025-12-09", last_updated: "2025-12-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0.4, output: 2 } }, "ministral-8b-latest": { id: "ministral-8b-latest", name: "Ministral 8B (latest)", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-10-01", last_updated: "2024-10-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.1, output: 0.1 } }, "mistral-embed": { id: "mistral-embed", name: "Mistral Embed", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "mistral-embed", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2023-12-11", last_updated: "2023-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8000, output: 3072 }, cost: { input: 0.1, output: 0 } }, "codestral-latest": { id: "codestral-latest", name: "Codestral (latest)", description: "Mistral code model for completions, refactors, and developer IDE workflows", family: "codestral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-05-29", last_updated: "2025-01-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 4096 }, cost: { input: 0.3, output: 0.9 } }, "devstral-medium-latest": { id: "devstral-medium-latest", name: "Devstral 2 (latest)", description: "Legacy model retained for compatibility with older integrations", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-12", release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0.4, output: 2 } }, "devstral-2512": { id: "devstral-2512", name: "Devstral 2", description: "Mistral's coding-agent model for repository work, terminal tasks, and software fixes", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-12", release_date: "2025-12-09", last_updated: "2025-12-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0.4, output: 2 } }, "mistral-large-latest": { id: "mistral-large-latest", name: "Mistral Large (latest)", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.5, output: 1.5 } }, "devstral-medium-2507": { id: "devstral-medium-2507", name: "Devstral Medium", description: "Legacy model retained for compatibility with older integrations", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-07-10", last_updated: "2025-07-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, status: "deprecated", cost: { input: 0.4, output: 2 } }, "devstral-small-2505": { id: "devstral-small-2505", name: "Devstral Small 2505", description: "Legacy model retained for compatibility with older integrations", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-05-07", last_updated: "2025-05-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, status: "deprecated", cost: { input: 0.1, output: 0.3 } }, "magistral-small": { id: "magistral-small", name: "Magistral Small", description: "Mistral reasoning model for transparent analysis, math, and complex decisions", family: "magistral-small", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-03-17", last_updated: "2025-03-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.5, output: 1.5 } }, "open-mistral-nemo": { id: "open-mistral-nemo", name: "Open Mistral Nemo", description: "Legacy model retained for compatibility with older integrations", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-07-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, status: "deprecated", cost: { input: 0.15, output: 0.15 } }, "mistral-large-2512": { id: "mistral-large-2512", name: "Mistral Large 3", description: "Mistral's largest general model for enterprise agents, coding, and multilingual reasoning", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.5, output: 1.5 } } } }, "umans-ai": { id: "umans-ai", env: ["UMANS_AI_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.code.umans.ai/v1", name: "Umans AI", doc: "https://app.umans.ai/offers/code/docs/orgs", models: { "umans-flash": { id: "umans-flash", name: "Umans Flash", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.15, output: 1, cache_read: 0.05 } }, "umans-deepseek-v4-flash-0731": { id: "umans-deepseek-v4-flash-0731", name: "DeepSeek V4 Flash", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 393215 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "umans-kimi-k3": { id: "umans-kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "umans-coder": { id: "umans-coder", name: "Umans Coder", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "umans-glm-5.2": { id: "umans-glm-5.2", name: "GLM 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 405504, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "umans-kimi-k2.7": { id: "umans-kimi-k2.7", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "umans-glm-5.1": { id: "umans-glm-5.1", name: "GLM 5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.29 } } } }, ofox: { id: "ofox", env: ["OFOX_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.ofox.ai/v1", name: "Ofox", doc: "https://ofox.ai/docs", models: { "google/gemini-3.5-flash": { id: "google/gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, cache_write: 0.83, input_audio: 3 } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, cache_write: 1, input_audio: 1 } }, "google/gemini-3-flash-preview": { id: "google/gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 1 } }, "google/gemini-3.6-flash": { id: "google/gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15, cache_write: 0.083 } }, "google/gemini-3.1-flash-lite": { id: "google/gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, cache_write: 1, input_audio: 0.5 } }, "google/gemini-3.1-pro-preview": { id: "google/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 4.5 } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, cache_write: 4.5 } }, "google/gemini-2.5-flash-lite": { id: "google/gemini-2.5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 512, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.025, cache_write: 1, input_audio: 0.3 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.45, output: 0.88, cache_read: 0.0037 } }, "deepseek/deepseek-v3.2": { id: "deepseek/deepseek-v3.2", name: "DeepSeek V3.2", description: "Hybrid-reasoning DeepSeek model with thinking and non-thinking modes, sparse attention, and tool-use", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32000 }, cost: { input: 0.29, output: 0.43, cache_read: 0.06 } }, "x-ai/grok-4.1-fast": { id: "x-ai/grok-4.1-fast", name: "Grok 4.1 Fast", description: "xAI's fast agentic tool-calling model with a 2M context window; non-reasoning variant for low-latency responses", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-11-19", last_updated: "2025-11-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "x-ai/grok-4.3": { id: "x-ai/grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "x-ai/grok-4.20": { id: "x-ai/grok-4.20", name: "Grok 4.20 (Reasoning)", description: "Reasoning Grok for document-heavy analysis and long-horizon tool use", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 128000 }, cost: { input: 4, output: 12, cache_read: 0.4 } }, "anthropic/claude-sonnet-4.6": { id: "anthropic/claude-sonnet-4.6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://api.ofox.ai/anthropic/v1" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-fable-5": { id: "anthropic/claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://api.ofox.ai/anthropic/v1" }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4.5": { id: "anthropic/claude-opus-4.5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://api.ofox.ai/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4.7": { id: "anthropic/claude-opus-4.7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://api.ofox.ai/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-haiku-4.5": { id: "anthropic/claude-haiku-4.5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://api.ofox.ai/anthropic/v1" }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "anthropic/claude-opus-4.8": { id: "anthropic/claude-opus-4.8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://api.ofox.ai/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-5": { id: "anthropic/claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://api.ofox.ai/anthropic/v1" }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "anthropic/claude-opus-5": { id: "anthropic/claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://api.ofox.ai/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4.6": { id: "anthropic/claude-opus-4.6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://api.ofox.ai/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "z-ai/glm-5": { id: "z-ai/glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.2 } }, "z-ai/glm-5.1": { id: "z-ai/glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "z-ai/glm-5.2": { id: "z-ai/glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "z-ai/glm-4.7-flashx": { id: "z-ai/glm-4.7-flashx", name: "GLM-4.7-FlashX", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.072, output: 0.43, cache_read: 0.015 } }, "z-ai/glm-4.6": { id: "z-ai/glm-4.6", name: "GLM-4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.4, output: 1.9, cache_read: 0.11 } }, "z-ai/glm-4.7": { id: "z-ai/glm-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.4, output: 2, cache_read: 0.08 } }, "z-ai/glm-5-turbo": { id: "z-ai/glm-5-turbo", name: "GLM-5-Turbo", description: "Faster GLM-5 lane for coding agents that need lower latency", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24 } }, "moonshotai/kimi-k2.5": { id: "moonshotai/kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "moonshotai/kimi-k2.7-code-highspeed": { id: "moonshotai/kimi-k2.7-code-highspeed", name: "Kimi K2.7 Code Highspeed", description: "Lower-latency Kimi Code variant for interactive edits and coding-agent loops", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.9, output: 8, cache_read: 0.38 } }, "moonshotai/kimi-k2.6": { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "moonshotai/kimi-k3": { id: "moonshotai/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "openai/gpt-5.1-codex-mini": { id: "openai/gpt-5.1-codex-mini", name: "GPT-5.1 Codex mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 65536 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 0.25, output: 2, cache_read: 0.03 } }, "openai/gpt-4.1-mini": { id: "openai/gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "openai/gpt-4o": { id: "openai/gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.6-sol": { id: "openai/gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "openai/gpt-4o-mini": { id: "openai/gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "openai/gpt-5.2-codex": { id: "openai/gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Code-specialist GPT for repository edits, reviews, and long-running software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 1.75, output: 14, cache_read: 0.18 } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "openai/gpt-5.6-luna": { id: "openai/gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, cache_write: 0.25 } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 1.75, output: 14, cache_read: 0.18 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32768 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 0.25, output: 2, cache_read: 0.03 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "openai/gpt-5.6-terra": { id: "openai/gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 2.5 } }, "openai/gpt-4.1": { id: "openai/gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/gpt-5.1-codex-max": { id: "openai/gpt-5.1-codex-max", name: "GPT-5.1 Codex Max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "bailian/qwen3.7-plus": { id: "bailian/qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.4, output: 1.6, cache_read: 0.08, cache_write: 0.5 } }, "bailian/qwen-max": { id: "bailian/qwen-max", name: "Qwen Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-04-03", last_updated: "2025-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 8192 }, cost: { input: 0.35, output: 1.38, cache_read: 0.069 } }, "bailian/qwen3.5-plus": { id: "bailian/qwen3.5-plus", name: "Qwen3.5 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.4, output: 2.4, cache_read: 0.04, cache_write: 0.4 } }, "bailian/qwen-vl-max": { id: "bailian/qwen-vl-max", name: "Qwen-VL Max", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-04-08", last_updated: "2025-08-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.23, output: 0.58, cache_read: 0.046 } }, "bailian/qwen3.5-27b": { id: "bailian/qwen3.5-27b", name: "Qwen3.5 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.29, output: 2.05, cache_read: 0.29 } }, "bailian/qwen3.7-max": { id: "bailian/qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5, cache_write: 3.125 } }, "bailian/qwen3.6-27b": { id: "bailian/qwen3.6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0.6, output: 3.6 } }, "bailian/qwen3.5-flash": { id: "bailian/qwen3.5-flash", name: "Qwen3.5 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01, cache_write: 0.125 } }, "bailian/qwen3-max": { id: "bailian/qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen3 model for coding agents, complex reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.36, output: 1.43, cache_read: 0.072 } }, "bailian/qwen3-coder-plus": { id: "bailian/qwen3-coder-plus", name: "Qwen3 Coder Plus", description: "Hosted Qwen coder for software agents, repo edits, and long-context code", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.8, output: 9, cache_read: 0.2, cache_write: 1 } }, "bailian/qwen3.8-max": { id: "bailian/qwen3.8-max", name: "Qwen3.8 Max", description: "2.4-trillion-parameter MoE flagship for coding, professional work, multimodal understanding, and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "xhigh"] }, { type: "budget_tokens", min: 0, max: 262144 }], tool_call: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 2, output: 6, cache_read: 0.25, cache_write: 2.5 } }, "bailian/qwen3-coder-flash": { id: "bailian/qwen3-coder-flash", name: "Qwen3 Coder Flash", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.5, output: 2.5, cache_read: 0.06, cache_write: 0.27 } }, "bailian/qwen-flash": { id: "bailian/qwen-flash", name: "Qwen Flash", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.022, output: 0.22, cache_read: 0.0043, cache_write: 0.027 } }, "bailian/qwen-turbo": { id: "bailian/qwen-turbo", name: "Qwen Turbo", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-11-01", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.05, output: 0.09, cache_read: 0.0086 } }, "bailian/qwen3.6-flash": { id: "bailian/qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, cache_write: 0.31 } }, "bailian/qwen3.5-397b-a17b": { id: "bailian/qwen3.5-397b-a17b", name: "Qwen3.5 397B-A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0.55, output: 3.5, cache_read: 0.55 } }, "bailian/qwen3.6-max-preview": { id: "bailian/qwen3.6-max-preview", name: "Qwen3.6 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 2 } }, "bailian/qwen3-coder-next": { id: "bailian/qwen3-coder-next", name: "Qwen3 Coder Next", description: "Open-weight Qwen coding model for agents, repository edits, and multi-turn tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-09", release_date: "2026-02-03", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.2, output: 1.5 } }, "bailian/qwen3.6-plus": { id: "bailian/qwen3.6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 0.625 } }, "bailian/qwen3.5-122b-a10b": { id: "bailian/qwen3.5-122b-a10b", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0.29, output: 2.29, cache_read: 0.29 } } } }, orcarouter: { id: "orcarouter", env: ["ORCAROUTER_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.orcarouter.ai/v1", name: "OrcaRouter", doc: "https://docs.orcarouter.ai", models: { "google/gemini-flash-latest": { id: "google/gemini-flash-latest", name: "Gemini Flash Latest", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, input_audio: 1.5 } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, input_audio: 1 } }, "google/gemini-3.1-flash-lite-preview": { id: "google/gemini-3.1-flash-lite-preview", name: "Gemini 3.1 Flash Lite Preview", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "google/gemini-3-flash-preview": { id: "google/gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, input_audio: 1 } }, "google/gemini-3.1-pro-preview-customtools": { id: "google/gemini-3.1-pro-preview-customtools", name: "Gemini 3.1 Pro Preview Custom Tools", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 4, output: 18, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "google/gemma-4-26b-a4b-it": { id: "google/gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.06, output: 0.33 } }, "google/gemma-4-31b-it": { id: "google/gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.13, output: 0.38 } }, "google/gemini-3.1-pro-preview": { id: "google/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 4, output: 18, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "google/gemini-flash-lite-latest": { id: "google/gemini-flash-lite-latest", name: "Gemini Flash-Lite Latest", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2.5, output: 15, cache_read: 0.125, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "google/gemini-3-pro-preview": { id: "google/gemini-3-pro-preview", name: "Gemini 3 Pro Preview", description: "Preview Gemini flagship for complex reasoning, coding, and rich multimodal prompts", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 4, output: 18, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "google/gemini-2.5-flash-lite": { id: "google/gemini-2.5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01, input_audio: 0.3 } }, "qwen/qwen3.6-35b-a3b": { id: "qwen/qwen3.6-35b-a3b", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.248, output: 1.485 } }, "qwen/qwen3.5-plus": { id: "qwen/qwen3.5-plus", name: "Qwen3.5 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.115, output: 0.688, reasoning: 2.4 } }, "qwen/qwen3.5-27b": { id: "qwen/qwen3.5-27b", name: "Qwen3.5 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.086, output: 0.688 } }, "qwen/qwen3.5-35b-a3b": { id: "qwen/qwen3.5-35b-a3b", name: "Qwen3.5 35B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.057, output: 0.459 } }, "qwen/qwen3-max": { id: "qwen/qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen3 model for coding agents, complex reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.359, output: 1.434 } }, "qwen/qwen3.5-397b-a17b": { id: "qwen/qwen3.5-397b-a17b", name: "Qwen3.5 397B-A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.172, output: 1.032 } }, "qwen/qwen3.6-plus": { id: "qwen/qwen3.6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 0.625, tiers: [{ input: 2, output: 6, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.2, cache_write: 2.5 } } }, "qwen/qwen3.5-122b-a10b": { id: "qwen/qwen3.5-122b-a10b", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.115, output: 0.917 } }, "orcarouter/auto": { id: "orcarouter/auto", name: "OrcaRouter Auto", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-01-01", last_updated: "2026-05-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "grok/grok-4.3": { id: "grok/grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "minimax/minimax-m2.7-highspeed": { id: "minimax/minimax-m2.7-highspeed", name: "MiniMax-M2.7-highspeed", description: "Low-latency M2.7 variant for interactive coding plans and agent loops", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.4, cache_read: 0.06, cache_write: 0.375 } }, "minimax/minimax-m2.7": { id: "minimax/minimax-m2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06, cache_write: 0.375 } }, "minimax/minimax-m2.5-highspeed": { id: "minimax/minimax-m2.5-highspeed", name: "MiniMax-M2.5-highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-13", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.4, cache_read: 0.06, cache_write: 0.375 } }, "minimax/minimax-m2.5": { id: "minimax/minimax-m2.5", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.19, output: 0.37, cache_read: 0.0028 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.56, output: 1.12, cache_read: 0.003625 } }, "deepseek/deepseek-chat": { id: "deepseek/deepseek-chat", name: "DeepSeek Chat", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-12-01", last_updated: "2026-02-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "deepseek/deepseek-reasoner": { id: "deepseek/deepseek-reasoner", name: "DeepSeek Reasoner", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-09", release_date: "2025-12-01", last_updated: "2026-02-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.435, output: 0.87, cache_read: 0.028 } }, "anthropic/claude-sonnet-4.6": { id: "anthropic/claude-sonnet-4.6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-opus-4.1": { id: "anthropic/claude-opus-4.1", name: "Claude Opus 4.1 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-opus-4.5": { id: "anthropic/claude-opus-4.5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4.7": { id: "anthropic/claude-opus-4.7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-4.5": { id: "anthropic/claude-sonnet-4.5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-sonnet-4": { id: "anthropic/claude-sonnet-4", name: "Claude Sonnet 4 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-haiku-4.5": { id: "anthropic/claude-haiku-4.5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "anthropic/claude-opus-4": { id: "anthropic/claude-opus-4", name: "Claude Opus 4 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-opus-4.6": { id: "anthropic/claude-opus-4.6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "z-ai/glm-5": { id: "z-ai/glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.2, cache_write: 0 } }, "z-ai/glm-4.5-air": { id: "z-ai/glm-4.5-air", name: "GLM-4.5-Air", description: "Lighter GLM-4.5 variant for fast coding assistance and cheaper agents", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.2, output: 1.1, cache_read: 0.03, cache_write: 0 } }, "z-ai/glm-5.1": { id: "z-ai/glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26, cache_write: 0 } }, "z-ai/glm-4.6": { id: "z-ai/glm-4.6", name: "GLM-4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "z-ai/glm-4.5": { id: "z-ai/glm-4.5", name: "GLM-4.5", description: "Hybrid-reasoning GLM release that made the 4.5 line broadly useful", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "z-ai/glm-4.7": { id: "z-ai/glm-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "openai/gpt-5.1-codex-mini": { id: "openai/gpt-5.1-codex-mini", name: "GPT-5.1 Codex mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/gpt-5.2-pro": { id: "openai/gpt-5.2-pro", name: "GPT-5.2 Pro", description: "Higher-accuracy GPT-5.2 variant for tougher reasoning and review workflows", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 21, output: 168 } }, "openai/gpt-5.5-pro": { id: "openai/gpt-5.5-pro", name: "GPT-5.5 Pro", description: "Highest-accuracy GPT-5.5 tier for slower, precision-heavy reasoning and coding", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "openai/gpt-4.1-mini": { id: "openai/gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "openai/gpt-4o": { id: "openai/gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.4-pro": { id: "openai/gpt-5.4-pro", name: "GPT-5.4 Pro", description: "More exact GPT-5.4 tier for demanding professional reasoning and agent tasks", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 60, output: 270, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "openai/gpt-4.1-nano": { id: "openai/gpt-4.1-nano", name: "GPT-4.1 nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "openai/gpt-5.2-chat-latest": { id: "openai/gpt-5.2-chat-latest", name: "GPT-5.2 Chat", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 12.5, output: 75, cache_read: 1.25 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "openai/gpt-4o-mini": { id: "openai/gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-5-codex": { id: "openai/gpt-5-codex", name: "GPT-5-Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-3.5-turbo": { id: "openai/gpt-3.5-turbo", name: "GPT-3.5-turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2021-09-01", release_date: "2023-03-01", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16385, output: 4096 }, cost: { input: 0.5, output: 1.5, cache_read: 0 } }, "openai/gpt-4o-2024-05-13": { id: "openai/gpt-4o-2024-05-13", name: "GPT-4o (2024-05-13)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-05-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 5, output: 15 } }, "openai/gpt-5-chat-latest": { id: "openai/gpt-5-chat-latest", name: "GPT-5 Chat (latest)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4o-2024-11-20": { id: "openai/gpt-4o-2024-11-20", name: "GPT-4o (2024-11-20)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-11-20", last_updated: "2024-11-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 5, output: 30, cache_read: 0.5 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 5, output: 22.5, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "openai/gpt-5.3-chat-latest": { id: "openai/gpt-5.3-chat-latest", name: "GPT-5.3 Chat (latest)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.2-codex": { id: "openai/gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Code-specialist GPT for repository edits, reviews, and long-running software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "openai/gpt-5-pro": { id: "openai/gpt-5-pro", name: "GPT-5 Pro", description: "Higher-accuracy GPT-5 tier for tough analysis, coding reviews, and planning", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 272000 }, cost: { input: 15, output: 120 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 1.5, output: 9, cache_read: 0.15 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.3-codex": { id: "openai/gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4-turbo": { id: "openai/gpt-4-turbo", name: "GPT-4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-12", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 10, output: 30 } }, "openai/gpt-4o-2024-08-06": { id: "openai/gpt-4o-2024-08-06", name: "GPT-4o (2024-08-06)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-08-06", last_updated: "2024-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.1-codex": { id: "openai/gpt-5.1-codex", name: "GPT-5.1 Codex", description: "Codex GPT for repository edits, code review, and practical software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-5-nano": { id: "openai/gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "openai/gpt-4.1": { id: "openai/gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/gpt-5.1-codex-max": { id: "openai/gpt-5.1-codex-max", name: "GPT-5.1 Codex Max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4": { id: "openai/gpt-4", name: "GPT-4", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-11", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 8192 }, cost: { input: 30, output: 60 } }, "openai/gpt-5.1-chat-latest": { id: "openai/gpt-5.1-chat-latest", name: "GPT-5.1 Chat", description: "Chat-tuned GPT-5.1 for polished assistants, writing, and product conversations", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "kimi/kimi-k2.5": { id: "kimi/kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "kimi/kimi-k2.6": { id: "kimi/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } } } }, "xiaomi-token-plan-cn": { id: "xiaomi-token-plan-cn", env: ["XIAOMI_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://token-plan-cn.xiaomimimo.com/v1", name: "Xiaomi Token Plan (China)", doc: "https://platform.xiaomimimo.com/#/docs", models: { "mimo-v2.5-tts": { id: "mimo-v2.5-tts", name: "MiMo-V2.5-TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "mimo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } }, "mimo-v2-tts": { id: "mimo-v2-tts", name: "MiMo-V2-TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "mimo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } }, "mimo-v2-pro": { id: "mimo-v2-pro", name: "MiMo-V2-Pro", description: "Earlier MiMo Pro model for multimodal agents, reasoning, and code tasks", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "mimo-v2.5-tts-voicedesign": { id: "mimo-v2.5-tts-voicedesign", name: "MiMo-V2.5-TTS-VoiceDesign", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "mimo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } }, "mimo-v2.5": { id: "mimo-v2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0 } }, "mimo-v2.5-tts-voiceclone": { id: "mimo-v2.5-tts-voiceclone", name: "MiMo-V2.5-TTS-VoiceClone", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "mimo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } }, "mimo-v2.5-pro": { id: "mimo-v2.5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0 } } } }, v0: { id: "v0", env: ["V0_API_KEY"], npm: "@ai-sdk/vercel", name: "v0", doc: "https://sdk.vercel.ai/providers/ai-sdk-providers/vercel", models: { "v0-1.0-md": { id: "v0-1.0-md", name: "v0-1.0-md", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "v0", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 }, cost: { input: 3, output: 15 } }, "v0-1.5-lg": { id: "v0-1.5-lg", name: "v0-1.5-lg", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "v0", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-06-09", last_updated: "2025-06-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 512000, output: 32000 }, cost: { input: 15, output: 75 } }, "v0-1.5-md": { id: "v0-1.5-md", name: "v0-1.5-md", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "v0", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-06-09", last_updated: "2025-06-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 }, cost: { input: 3, output: 15 } } } }, poolside: { id: "poolside", env: ["POOLSIDE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://inference.poolside.ai/v1", name: "Poolside", doc: "https://platform.poolside.ai", models: { "poolside/laguna-xs-2.1": { id: "poolside/laguna-xs-2.1", name: "Laguna XS 2.1", description: "Agentic coding model from Poolside in the XS size class for local deployment", family: "laguna", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, release_date: "2026-07-02", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "poolside/laguna-s-2.1": { id: "poolside/laguna-s-2.1", name: "Laguna S 2.1", description: "Agentic coding model from Poolside in the XS size class for local deployment", family: "laguna", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "poolside/laguna-m.1": { id: "poolside/laguna-m.1", name: "Laguna M.1", description: "Poolside's open-weight model for agentic coding and long-horizon work", family: "laguna", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, release_date: "2026-04-28", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, "routing-run": { id: "routing-run", env: ["ROUTING_RUN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.routing.run/v1", name: "routing.run", doc: "https://docs.routing.run/api-reference/models", models: { "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15 } }, "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 64000 }, cost: { input: 0.112, output: 0.224 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32000 }, cost: { input: 5, output: 25 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 32000 }, cost: { input: 0.8, output: 2.4 } }, "qwen3.5-9b": { id: "qwen3.5-9b", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32000 }, cost: { input: 0.16, output: 0.48 } }, "nemotron-3-ultra": { id: "nemotron-3-ultra", name: "Nemotron 3 Ultra 550B A55B", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32000 }, cost: { input: 0.1, output: 0.1 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 32000 }, cost: { input: 0.275, output: 1.1 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 64000 }, cost: { input: 0.348, output: 0.696 } }, "glm-5.2-nitro": { id: "glm-5.2-nitro", name: "GLM 5.2 Nitro", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 32000 }, cost: { input: 0.8, output: 2.4 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 922000, output: 128000 }, cost: { input: 0.7, output: 4.2 } }, "kimi-k2.6-nitro": { id: "kimi-k2.6-nitro", name: "Kimi K2.6 Nitro", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 32000 }, cost: { input: 0.275, output: 1.1 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 32000 }, cost: { input: 0.275, output: 1.1 } }, "kimi-k2.7-code-nitro": { id: "kimi-k2.7-code-nitro", name: "Kimi K2.7 Code Nitro", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 32000 }, cost: { input: 0.275, output: 1.1 } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 922000, output: 128000 }, cost: { input: 1.5, output: 9 } } } }, "google-vertex": { id: "google-vertex", env: ["GOOGLE_VERTEX_PROJECT", "GOOGLE_VERTEX_LOCATION", "GOOGLE_APPLICATION_CREDENTIALS"], npm: "@ai-sdk/google-vertex", name: "Vertex", doc: "https://cloud.google.com/vertex-ai/generative-ai/docs/models", models: { "gemini-flash-latest": { id: "gemini-flash-latest", name: "Gemini Flash Latest", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, input_audio: 1.5 } }, "claude-sonnet-4-5@20250929": { id: "claude-sonnet-4-5@20250929", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/google-vertex/anthropic" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gemini-3.5-flash": { id: "gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, input_audio: 1.5 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.075, cache_write: 0.383 } }, "gemini-3.5-flash-lite": { id: "gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "gemini-2.5-pro-tts": { id: "gemini-2.5-pro-tts", name: "Gemini 2.5 Pro TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gemini-pro", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2025-01", release_date: "2025-09-30", last_updated: "2025-12-10", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 32768, output: 16384 }, cost: { input: 1, output: 20 } }, "claude-sonnet-5@default": { id: "claude-sonnet-5@default", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/google-vertex/anthropic" }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "gemini-3.1-flash-lite-preview": { id: "gemini-3.1-flash-lite-preview", name: "Gemini 3.1 Flash Lite Preview", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, status: "deprecated", cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "gemini-2.5-flash-tts": { id: "gemini-2.5-flash-tts", name: "Gemini 2.5 Flash TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gemini-flash", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2025-01", release_date: "2025-09-30", last_updated: "2025-12-10", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 32768, output: 16384 }, cost: { input: 0.5, output: 10 } }, "claude-opus-5@default": { id: "claude-opus-5@default", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/google-vertex/anthropic" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gemini-3-flash-preview": { id: "gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, input_audio: 1 } }, "gemini-3.1-pro-preview-customtools": { id: "gemini-3.1-pro-preview-customtools", name: "Gemini 3.1 Pro Preview Custom Tools", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "claude-haiku-4-5@20251001": { id: "claude-haiku-4-5@20251001", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/google-vertex/anthropic" }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "claude-opus-4-7@default": { id: "claude-opus-4-7@default", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/google-vertex/anthropic" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "claude-opus-4@20250514": { id: "claude-opus-4@20250514", name: "Claude Opus 4", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, status: "deprecated", provider: { npm: "@ai-sdk/google-vertex/anthropic" }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "claude-opus-4-8@default": { id: "claude-opus-4-8@default", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/google-vertex/anthropic" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "gemini-embedding-001": { id: "gemini-embedding-001", name: "Gemini Embedding 001", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "gemini", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2025-05", release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 2048, output: 1 }, cost: { input: 0.15, output: 0 } }, "gemini-3.6-flash": { id: "gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15, input_audio: 1.5 } }, "claude-opus-4-5@20251101": { id: "claude-opus-4-5@20251101", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-01", last_updated: "2025-11-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/google-vertex/anthropic" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gemini-3.1-flash-lite": { id: "gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "gemini-3.1-flash-image": { id: "gemini-3.1-flash-image", name: "Nano Banana 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "high"] }], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "video", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.5, output: 60 } }, "gemini-2.5-flash-image": { id: "gemini-2.5-flash-image", name: "Nano Banana", description: "Nano Banana image model for fast generation, edits, and character-consistent assets", family: "gemini-flash", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-06", release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.3, output: 30 } }, "claude-opus-4-6@default": { id: "claude-opus-4-6@default", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/google-vertex/anthropic" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "gemini-3-pro-image": { id: "gemini-3-pro-image", name: "Nano Banana Pro", description: "Nano Banana Pro for higher-fidelity image generation and design-heavy edits", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 32768 }, cost: { input: 2, output: 120 } }, "gemini-3.1-pro-preview": { id: "gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "gemini-flash-lite-latest": { id: "gemini-flash-lite-latest", name: "Gemini Flash-Lite Latest", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "claude-sonnet-4@20250514": { id: "claude-sonnet-4@20250514", name: "Claude Sonnet 4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, status: "deprecated", provider: { npm: "@ai-sdk/google-vertex/anthropic" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gemini-2.5-flash-lite": { id: "gemini-2.5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 512, max: 24576 }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01, input_audio: 0.3 } }, "claude-sonnet-4-6@default": { id: "claude-sonnet-4-6@default", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/google-vertex/anthropic" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "claude-opus-4-1@20250805": { id: "claude-opus-4-1@20250805", name: "Claude Opus 4.1", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, status: "deprecated", provider: { npm: "@ai-sdk/google-vertex/anthropic" }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "zai-org/glm-5-maas": { id: "zai-org/glm-5-maas", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, status: "deprecated", provider: { npm: "@ai-sdk/openai-compatible", api: "https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}/endpoints/openapi" }, cost: { input: 1, output: 3.2, cache_read: 0.1 } }, "zai-org/glm-4.7-maas": { id: "zai-org/glm-4.7-maas", name: "GLM-4.7", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-06", last_updated: "2026-01-06", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, status: "deprecated", provider: { npm: "@ai-sdk/openai-compatible", api: "https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}/endpoints/openapi" }, cost: { input: 0.6, output: 2.2 } }, "qwen/qwen3-235b-a22b-instruct-2507-maas": { id: "qwen/qwen3-235b-a22b-instruct-2507-maas", name: "Qwen3 235B A22B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-13", last_updated: "2025-08-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, status: "deprecated", provider: { npm: "@ai-sdk/openai-compatible", api: "https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}/endpoints/openapi" }, cost: { input: 0.22, output: 0.88 } }, "meta/llama-4-maverick-17b-128e-instruct-maas": { id: "meta/llama-4-maverick-17b-128e-instruct-maas", name: "Llama 4 Maverick 17B 128E Instruct", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-29", last_updated: "2025-04-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 8192 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}/endpoints/openapi" }, cost: { input: 0.35, output: 1.15 } }, "meta/llama-3.3-70b-instruct-maas": { id: "meta/llama-3.3-70b-instruct-maas", name: "Llama 3.3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2025-04-29", last_updated: "2025-04-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, status: "deprecated", provider: { npm: "@ai-sdk/openai-compatible", api: "https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}/endpoints/openapi" }, cost: { input: 0.72, output: 0.72 } }, "deepseek-ai/deepseek-v3.1-maas": { id: "deepseek-ai/deepseek-v3.1-maas", name: "DeepSeek V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-28", last_updated: "2025-08-28", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 32768 }, status: "deprecated", provider: { npm: "@ai-sdk/openai-compatible", api: "https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}/endpoints/openapi" }, cost: { input: 0.6, output: 1.7 } }, "deepseek-ai/deepseek-v3.2-maas": { id: "deepseek-ai/deepseek-v3.2-maas", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-17", last_updated: "2026-04-04", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 65536 }, status: "deprecated", provider: { npm: "@ai-sdk/openai-compatible", api: "https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}/endpoints/openapi" }, cost: { input: 0.56, output: 1.68, cache_read: 0.056 } }, "moonshotai/kimi-k2-thinking-maas": { id: "moonshotai/kimi-k2-thinking-maas", name: "Kimi K2 Thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-08", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", provider: { npm: "@ai-sdk/openai-compatible", api: "https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}/endpoints/openapi" }, cost: { input: 0.6, output: 2.5 } }, "openai/gpt-oss-20b-maas": { id: "openai/gpt-oss-20b-maas", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, status: "deprecated", cost: { input: 0.07, output: 0.25 } }, "openai/gpt-oss-120b-maas": { id: "openai/gpt-oss-120b-maas", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.09, output: 0.36 } } } }, "tencent-token-plan": { id: "tencent-token-plan", env: ["TENCENT_TOKEN_PLAN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.lkeap.cloud.tencent.com/plan/v3", name: "Tencent Token Plan", doc: "https://cloud.tencent.com/document/product/1823/130060", models: { hy3: { id: "hy3", name: "Hy3", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, synthetic: { id: "synthetic", env: ["SYNTHETIC_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.synthetic.new/openai/v1", name: "Synthetic", doc: "https://synthetic.new/pricing", models: { "hf:Qwen/Qwen3.6-27B": { id: "hf:Qwen/Qwen3.6-27B", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.45, output: 3.6, cache_read: 0.45 } }, "hf:nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4": { id: "hf:nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4", name: "Nemotron 3 Super 120B A12B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.3, output: 1, cache_read: 0.3 } }, "hf:moonshotai/Kimi-K2.7-Code": { id: "hf:moonshotai/Kimi-K2.7-Code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.95, output: 4, cache_read: 0.95 } }, "hf:moonshotai/Kimi-K3": { id: "hf:moonshotai/Kimi-K3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-07-16", last_updated: "2026-07-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 65536 }, cost: { input: 3, output: 15, cache_read: 0.45 } }, "hf:openai/gpt-oss-120b": { id: "hf:openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.1, output: 0.1, cache_read: 0.1 } }, "hf:zai-org/GLM-4.7-Flash": { id: "hf:zai-org/GLM-4.7-Flash", name: "GLM-4.7-Flash", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 65536 }, cost: { input: 0.1, output: 0.5, cache_read: 0.1 } }, "hf:zai-org/GLM-5.2": { id: "hf:zai-org/GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 524288, input: 365178, output: 65536 }, cost: { input: 1.4, output: 4.4, cache_read: 1.4 } }, "hf:MiniMaxAI/MiniMax-M3": { id: "hf:MiniMaxAI/MiniMax-M3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 65536 }, cost: { input: 0.6, output: 1.2, cache_read: 0.6 } } } }, "zai-coding-plan": { id: "zai-coding-plan", env: ["ZHIPU_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.z.ai/api/coding/paas/v4", name: "Z.AI Coding Plan", doc: "https://docs.z.ai/devpack/overview", models: { "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5.2-highspeed": { id: "glm-5.2-highspeed", name: "GLM-5.2 Highspeed", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-4.7": { id: "glm-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5-turbo": { id: "glm-5-turbo", name: "GLM-5-Turbo", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, gmicloud: { id: "gmicloud", env: ["GMICLOUD_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.gmi-serving.com/v1", name: "GMI Cloud", doc: "https://docs.gmicloud.ai/inference-engine/api-reference/llm-api-reference", models: { "zai-org/GLM-5.1-FP8": { id: "zai-org/GLM-5.1-FP8", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 0.98, output: 3.08, cache_read: 0.182 } }, "zai-org/GLM-5-FP8": { id: "zai-org/GLM-5-FP8", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 0.6, output: 1.92, cache_read: 0.12 } }, "zai-org/GLM-5.2-FP8": { id: "zai-org/GLM-5.2-FP8", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0.979, output: 3.08, cache_read: 0.182 } }, "Qwen/Qwen3.7-Max": { id: "Qwen/Qwen3.7-Max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 0.25, cache_write: 3.125 } }, "deepseek-ai/DeepSeek-V4-Flash": { id: "deepseek-ai/DeepSeek-V4-Flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048575, output: 384000 }, cost: { input: 0.112, output: 0.224, cache_read: 0.022 } }, "deepseek-ai/DeepSeek-V4-Pro": { id: "deepseek-ai/DeepSeek-V4-Pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 1.392, output: 2.784, cache_read: 0.116 } }, "anthropic/claude-sonnet-4.6": { id: "anthropic/claude-sonnet-4.6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 409600, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "anthropic/claude-opus-4.7": { id: "anthropic/claude-opus-4.7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 409600, output: 128000 }, experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 4.5, output: 22.5, cache_read: 0.45 } }, "anthropic/claude-opus-4.8": { id: "anthropic/claude-opus-4.8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "anthropic/claude-opus-4.6": { id: "anthropic/claude-opus-4.6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 127999 }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 409600, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "moonshotai/kimi-k2.7-code-highspeed": { id: "moonshotai/kimi-k2.7-code-highspeed", name: "Kimi K2.7 Code Highspeed", description: "Lower-latency Kimi Code variant for interactive edits and coding-agent loops", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.9, output: 8, cache_read: 0.38 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 0.855, output: 3.6, cache_read: 0.144 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } } } }, freemodel: { id: "freemodel", env: ["FREEMODEL_API_KEY"], npm: "@ai-sdk/anthropic", api: "https://cc.freemodel.dev/v1", name: "FreeModel", doc: "https://freemodel.dev", models: { "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://api.freemodel.dev/v1" }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 5 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://api.freemodel.dev/v1" }, cost: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 2.5 } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://api.freemodel.dev/v1" }, cost: { input: 0.75, output: 4.5, cache_read: 0.075, cache_write: 0.75 } }, "gpt-5.3-codex": { id: "gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://api.freemodel.dev/v1" }, cost: { input: 1.75, output: 14, cache_read: 0.175, cache_write: 1.75 } }, "claude-haiku-4-5-20251001": { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } } } }, "amazon-bedrock": { id: "amazon-bedrock", env: ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_REGION", "AWS_BEARER_TOKEN_BEDROCK"], npm: "@ai-sdk/amazon-bedrock", name: "Amazon Bedrock", doc: "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", models: { "zai.glm-4.7-flash": { id: "zai.glm-4.7-flash", name: "GLM-4.7-Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0.07, output: 0.4 } }, "us.deepseek.r1-v1:0": { id: "us.deepseek.r1-v1:0", name: "DeepSeek-R1 (US)", description: "Classic open reasoning model for transparent math, coding, and deliberate problem solving", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 1.35, output: 5.4 } }, "qwen.qwen3-next-80b-a3b": { id: "qwen.qwen3-next-80b-a3b", name: "Qwen/Qwen3-Next-80B-A3B-Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-18", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.14, output: 1.4 } }, "global.anthropic.claude-opus-4-8": { id: "global.anthropic.claude-opus-4-8", name: "Claude Opus 4.8 (Global)", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "nvidia.nemotron-super-3-120b": { id: "nvidia.nemotron-super-3-120b", name: "NVIDIA Nemotron 3 Super 120B A12B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.15, output: 0.65 } }, "eu.anthropic.claude-opus-4-5-20251101-v1:0": { id: "eu.anthropic.claude-opus-4-5-20251101-v1:0", name: "Claude Opus 4.5 (EU)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-24", last_updated: "2025-08-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5.5, output: 27.5, cache_read: 0.55, cache_write: 6.875 } }, "mistral.mistral-large-3-675b-instruct": { id: "mistral.mistral-large-3-675b-instruct", name: "Mistral Large 3", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8192 }, cost: { input: 0.5, output: 1.5 } }, "moonshot.kimi-k2-thinking": { id: "moonshot.kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: true, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262143, output: 16000 }, cost: { input: 0.6, output: 2.5 } }, "mistral.devstral-2-123b": { id: "mistral.devstral-2-123b", name: "Devstral 2 123B", description: "Mistral coding agent model for repository tasks and software engineering workflows", family: "devstral", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-17", last_updated: "2026-02-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8192 }, cost: { input: 0.4, output: 2 } }, "minimax.minimax-m2": { id: "minimax.minimax-m2", name: "MiniMax M2", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204608, output: 128000 }, cost: { input: 0.3, output: 1.2 } }, "jp.anthropic.claude-opus-4-8": { id: "jp.anthropic.claude-opus-4-8", name: "Claude Opus 4.8 (JP)", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "mistral.voxtral-small-24b-2507": { id: "mistral.voxtral-small-24b-2507", name: "Voxtral Small 24B 2507", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-01", last_updated: "2025-07-01", modalities: { input: ["text", "audio"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 8192 }, cost: { input: 0.15, output: 0.35 } }, "openai.gpt-5.6-sol": { id: "openai.gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 272000, output: 128000 }, provider: { npm: "@ai-sdk/amazon-bedrock/mantle", api: "https://bedrock-mantle.${AWS_REGION}.api.aws/openai/v1", shape: "responses" }, cost: { input: 5.5, output: 33, cache_read: 0.55, cache_write: 6.88 } }, "au.anthropic.claude-haiku-4-5-20251001-v1:0": { id: "au.anthropic.claude-haiku-4-5-20251001-v1:0", name: "Claude Haiku 4.5 (AU)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "mistral.magistral-small-2509": { id: "mistral.magistral-small-2509", name: "Magistral Small 1.2", description: "Mistral reasoning model for transparent analysis, math, and complex decisions", family: "magistral", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 40000 }, cost: { input: 0.5, output: 1.5 } }, "eu.anthropic.claude-haiku-4-5-20251001-v1:0": { id: "eu.anthropic.claude-haiku-4-5-20251001-v1:0", name: "Claude Haiku 4.5 (EU)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1.1, output: 5.5, cache_read: 0.11, cache_write: 1.375 } }, "anthropic.claude-opus-4-6-v1": { id: "anthropic.claude-opus-4-6-v1", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic.claude-fable-5": { id: "anthropic.claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "us.anthropic.claude-sonnet-5": { id: "us.anthropic.claude-sonnet-5", name: "Claude Sonnet 5 (US)", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "meta.llama3-3-70b-instruct-v1:0": { id: "meta.llama3-3-70b-instruct-v1:0", name: "Llama 3.3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.72, output: 0.72 } }, "mistral.ministral-3-8b-instruct": { id: "mistral.ministral-3-8b-instruct", name: "Ministral 3 8B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 0.15, output: 0.15 } }, "au.anthropic.claude-sonnet-4-5-20250929-v1:0": { id: "au.anthropic.claude-sonnet-4-5-20250929-v1:0", name: "Claude Sonnet 4.5 (AU)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "openai.gpt-5.6-terra": { id: "openai.gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 272000, output: 128000 }, provider: { npm: "@ai-sdk/amazon-bedrock/mantle", api: "https://bedrock-mantle.${AWS_REGION}.api.aws/openai/v1", shape: "responses" }, cost: { input: 2.2, output: 13.2, cache_read: 0.22, cache_write: 2.75 } }, "openai.gpt-oss-20b": { id: "openai.gpt-oss-20b", name: "gpt-oss-20b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, provider: { npm: "@ai-sdk/amazon-bedrock/mantle", api: "https://bedrock-mantle.${AWS_REGION}.api.aws/v1", shape: "responses" }, cost: { input: 0.07, output: 0.3 } }, "writer.palmyra-x4-v1:0": { id: "writer.palmyra-x4-v1:0", name: "Palmyra X4", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "palmyra", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-04-28", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 122880, output: 8192 }, cost: { input: 2.5, output: 10 } }, "zai.glm-4.7": { id: "zai.glm-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2 } }, "anthropic.claude-sonnet-5": { id: "anthropic.claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "us.anthropic.claude-sonnet-4-6": { id: "us.anthropic.claude-sonnet-4-6", name: "Claude Sonnet 4.6 (US)", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "au.anthropic.claude-sonnet-4-6": { id: "au.anthropic.claude-sonnet-4-6", name: "AU Anthropic Claude Sonnet 4.6", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08", release_date: "2026-02-17", last_updated: "2026-02-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3.3, output: 16.5, cache_read: 0.33, cache_write: 4.125 } }, "openai.gpt-oss-safeguard-120b": { id: "openai.gpt-oss-safeguard-120b", name: "GPT OSS Safeguard 120B", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "gpt-oss", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-29", last_updated: "2025-10-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6 } }, "global.anthropic.claude-sonnet-5": { id: "global.anthropic.claude-sonnet-5", name: "Claude Sonnet 5 (Global)", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "meta.llama3-1-8b-instruct-v1:0": { id: "meta.llama3-1-8b-instruct-v1:0", name: "Llama 3.1 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.22, output: 0.22 } }, "jp.anthropic.claude-sonnet-5": { id: "jp.anthropic.claude-sonnet-5", name: "Claude Sonnet 5 (JP)", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "nvidia.nemotron-nano-12b-v2": { id: "nvidia.nemotron-nano-12b-v2", name: "NVIDIA Nemotron Nano 12B v2 VL BF16", description: "Nemotron multimodal model for visual reasoning and agentic AI workflows", family: "nemotron", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 0.2, output: 0.6 } }, "us.anthropic.claude-opus-4-6-v1": { id: "us.anthropic.claude-opus-4-6-v1", name: "Claude Opus 4.6 (US)", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "eu.anthropic.claude-opus-4-8": { id: "eu.anthropic.claude-opus-4-8", name: "Claude Opus 4.8 (EU)", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5.5, output: 27.5, cache_read: 0.55, cache_write: 6.875 } }, "openai.gpt-5.6-luna": { id: "openai.gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 272000, output: 128000 }, provider: { npm: "@ai-sdk/amazon-bedrock/mantle", api: "https://bedrock-mantle.${AWS_REGION}.api.aws/openai/v1", shape: "responses" }, cost: { input: 0.22, output: 1.32, cache_read: 0.022, cache_write: 0.275 } }, "nvidia.nemotron-nano-9b-v2": { id: "nvidia.nemotron-nano-9b-v2", name: "NVIDIA Nemotron Nano 9B v2", description: "Compact Nemotron model for efficient reasoning and deployable AI agents", family: "nemotron", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 0.06, output: 0.23 } }, "meta.llama3-1-70b-instruct-v1:0": { id: "meta.llama3-1-70b-instruct-v1:0", name: "Llama 3.1 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.72, output: 0.72 } }, "jp.anthropic.claude-sonnet-4-6": { id: "jp.anthropic.claude-sonnet-4-6", name: "Claude Sonnet 4.6 (JP)", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "us.meta.llama4-scout-17b-instruct-v1:0": { id: "us.meta.llama4-scout-17b-instruct-v1:0", name: "Llama 4 Scout 17B Instruct (US)", description: "Open Llama with long-context vision for efficient multimodal agents", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 3500000, output: 16384 }, cost: { input: 0.17, output: 0.66 } }, "anthropic.claude-sonnet-4-5-20250929-v1:0": { id: "anthropic.claude-sonnet-4-5-20250929-v1:0", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "jp.anthropic.claude-opus-5": { id: "jp.anthropic.claude-opus-5", name: "Claude Opus 5 (JP)", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "global.anthropic.claude-haiku-4-5-20251001-v1:0": { id: "global.anthropic.claude-haiku-4-5-20251001-v1:0", name: "Claude Haiku 4.5 (Global)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "jp.anthropic.claude-sonnet-4-5-20250929-v1:0": { id: "jp.anthropic.claude-sonnet-4-5-20250929-v1:0", name: "Claude Sonnet 4.5 (JP)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "openai.gpt-oss-120b-1:0": { id: "openai.gpt-oss-120b-1:0", name: "gpt-oss-120b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6 } }, "us.anthropic.claude-sonnet-4-5-20250929-v1:0": { id: "us.anthropic.claude-sonnet-4-5-20250929-v1:0", name: "Claude Sonnet 4.5 (US)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "mistral.voxtral-mini-3b-2507": { id: "mistral.voxtral-mini-3b-2507", name: "Voxtral Mini 3B 2507", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["audio", "text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 0.04, output: 0.04 } }, "openai.gpt-oss-20b-1:0": { id: "openai.gpt-oss-20b-1:0", name: "gpt-oss-20b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.07, output: 0.3 } }, "eu.anthropic.claude-opus-4-6-v1": { id: "eu.anthropic.claude-opus-4-6-v1", name: "Claude Opus 4.6 (EU)", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5.5, output: 27.5, cache_read: 0.55, cache_write: 6.875 } }, "us.meta.llama4-maverick-17b-instruct-v1:0": { id: "us.meta.llama4-maverick-17b-instruct-v1:0", name: "Llama 4 Maverick 17B Instruct (US)", description: "Open multimodal Llama for strong reasoning with efficient everyday serving", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 16384 }, cost: { input: 0.24, output: 0.97 } }, "us.anthropic.claude-haiku-4-5-20251001-v1:0": { id: "us.anthropic.claude-haiku-4-5-20251001-v1:0", name: "Claude Haiku 4.5 (US)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "global.anthropic.claude-fable-5": { id: "global.anthropic.claude-fable-5", name: "Claude Fable 5 (Global)", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "meta.llama4-scout-17b-instruct-v1:0": { id: "meta.llama4-scout-17b-instruct-v1:0", name: "Llama 4 Scout 17B Instruct", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 3500000, output: 16384 }, cost: { input: 0.17, output: 0.66 } }, "jp.anthropic.claude-haiku-4-5-20251001-v1:0": { id: "jp.anthropic.claude-haiku-4-5-20251001-v1:0", name: "Claude Haiku 4.5 (JP)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "qwen.qwen3-32b-v1:0": { id: "qwen.qwen3-32b-v1:0", name: "Qwen3 32B (dense)", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-09-18", last_updated: "2025-09-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, output: 16384 }, cost: { input: 0.15, output: 0.6 } }, "global.anthropic.claude-sonnet-4-5-20250929-v1:0": { id: "global.anthropic.claude-sonnet-4-5-20250929-v1:0", name: "Claude Sonnet 4.5 (Global)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "google.gemma-3-4b-it": { id: "google.gemma-3-4b-it", name: "Gemma 3 4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 0.04, output: 0.08 } }, "qwen.qwen3-coder-30b-a3b-v1:0": { id: "qwen.qwen3-coder-30b-a3b-v1:0", name: "Qwen3 Coder 30B A3B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-09-18", last_updated: "2025-09-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 131072 }, cost: { input: 0.15, output: 0.6 } }, "amazon.nova-pro-v1:0": { id: "amazon.nova-pro-v1:0", name: "Nova Pro", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "nova-pro", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-03", last_updated: "2024-12-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 8192 }, cost: { input: 0.8, output: 3.2, cache_read: 0.2 } }, "us.anthropic.claude-opus-4-7": { id: "us.anthropic.claude-opus-4-7", name: "Claude Opus 4.7 (US)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "moonshotai.kimi-k2.5": { id: "moonshotai.kimi-k2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: true, structured_output: true, temperature: true, release_date: "2026-02-06", last_updated: "2026-02-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262143, output: 16000 }, cost: { input: 0.6, output: 3 } }, "zai.glm-5": { id: "zai.glm-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 101376 }, cost: { input: 1, output: 3.2 } }, "amazon.nova-micro-v1:0": { id: "amazon.nova-micro-v1:0", name: "Nova Micro", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova-micro", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-03", last_updated: "2024-12-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.035, output: 0.14, cache_read: 0.00875 } }, "deepseek.r1-v1:0": { id: "deepseek.r1-v1:0", name: "DeepSeek-R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32768 }, cost: { input: 1.35, output: 5.4 } }, "au.anthropic.claude-sonnet-5": { id: "au.anthropic.claude-sonnet-5", name: "Claude Sonnet 5 (AU)", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "deepseek.v3.2": { id: "deepseek.v3.2", name: "DeepSeek-V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2026-02-06", last_updated: "2026-02-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 81920 }, cost: { input: 0.62, output: 1.85 } }, "qwen.qwen3-coder-480b-a35b-v1:0": { id: "qwen.qwen3-coder-480b-a35b-v1:0", name: "Qwen3 Coder 480B A35B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-09-18", last_updated: "2025-09-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0.22, output: 1.8 } }, "au.anthropic.claude-opus-4-8": { id: "au.anthropic.claude-opus-4-8", name: "Claude Opus 4.8 (AU)", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic.claude-sonnet-4-6": { id: "anthropic.claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic.claude-haiku-4-5-20251001-v1:0": { id: "anthropic.claude-haiku-4-5-20251001-v1:0", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "openai.gpt-5.4": { id: "openai.gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-06-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 272000, output: 128000 }, provider: { npm: "@ai-sdk/amazon-bedrock/mantle", api: "https://bedrock-mantle.${AWS_REGION}.api.aws/openai/v1", shape: "responses" }, cost: { input: 2.75, output: 16.5, cache_read: 0.275 } }, "global.anthropic.claude-sonnet-4-6": { id: "global.anthropic.claude-sonnet-4-6", name: "Claude Sonnet 4.6 (Global)", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "eu.anthropic.claude-opus-4-7": { id: "eu.anthropic.claude-opus-4-7", name: "Claude Opus 4.7 (EU)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5.5, output: 27.5, cache_read: 0.55, cache_write: 6.875 } }, "eu.anthropic.claude-sonnet-4-5-20250929-v1:0": { id: "eu.anthropic.claude-sonnet-4-5-20250929-v1:0", name: "Claude Sonnet 4.5 (EU)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3.3, output: 16.5, cache_read: 0.33, cache_write: 4.125 } }, "mistral.ministral-3-14b-instruct": { id: "mistral.ministral-3-14b-instruct", name: "Ministral 14B 3.0", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 0.2, output: 0.2 } }, "us.anthropic.claude-opus-5": { id: "us.anthropic.claude-opus-5", name: "Claude Opus 5 (US)", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic.claude-opus-4-5-20251101-v1:0": { id: "anthropic.claude-opus-4-5-20251101-v1:0", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-24", last_updated: "2025-08-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "global.anthropic.claude-opus-4-6-v1": { id: "global.anthropic.claude-opus-4-6-v1", name: "Claude Opus 4.6 (Global)", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "google.gemma-3-12b-it": { id: "google.gemma-3-12b-it", name: "Google Gemma 3 12B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.049999999999999996, output: 0.09999999999999999 } }, "eu.anthropic.claude-sonnet-5": { id: "eu.anthropic.claude-sonnet-5", name: "Claude Sonnet 5 (EU)", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2.2, output: 11, cache_read: 0.22, cache_write: 2.75 } }, "global.anthropic.claude-opus-5": { id: "global.anthropic.claude-opus-5", name: "Claude Opus 5 (Global)", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "minimax.minimax-m2.5": { id: "minimax.minimax-m2.5", name: "MiniMax M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 98304 }, cost: { input: 0.3, output: 1.2 } }, "mistral.ministral-3-3b-instruct": { id: "mistral.ministral-3-3b-instruct", name: "Ministral 3 3B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8192 }, cost: { input: 0.1, output: 0.1 } }, "anthropic.claude-opus-4-8": { id: "anthropic.claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "eu.anthropic.claude-opus-5": { id: "eu.anthropic.claude-opus-5", name: "Claude Opus 5 (EU)", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5.5, output: 27.5, cache_read: 0.55, cache_write: 6.875 } }, "global.anthropic.claude-opus-4-5-20251101-v1:0": { id: "global.anthropic.claude-opus-4-5-20251101-v1:0", name: "Claude Opus 4.5 (Global)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-24", last_updated: "2025-08-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic.claude-opus-4-7": { id: "anthropic.claude-opus-4-7", name: "Claude Opus 4.7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "google.gemma-3-27b-it": { id: "google.gemma-3-27b-it", name: "Google Gemma 3 27B Instruct", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-27", last_updated: "2025-07-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 8192 }, cost: { input: 0.12, output: 0.2 } }, "anthropic.claude-opus-5": { id: "anthropic.claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "xai.grok-4.3": { id: "xai.grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-06-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, provider: { npm: "@ai-sdk/amazon-bedrock/mantle", api: "https://bedrock-mantle.${AWS_REGION}.api.aws/openai/v1", shape: "responses" }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "us.anthropic.claude-opus-4-8": { id: "us.anthropic.claude-opus-4-8", name: "Claude Opus 4.8 (US)", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "deepseek.v3-v1:0": { id: "deepseek.v3-v1:0", name: "DeepSeek-V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-09-18", last_updated: "2025-09-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 81920 }, cost: { input: 0.58, output: 1.68 } }, "qwen.qwen3-235b-a22b-2507-v1:0": { id: "qwen.qwen3-235b-a22b-2507-v1:0", name: "Qwen3 235B A22B 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-09-18", last_updated: "2025-09-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.22, output: 0.88 } }, "us.anthropic.claude-fable-5": { id: "us.anthropic.claude-fable-5", name: "Claude Fable 5 (US)", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "us.anthropic.claude-opus-4-5-20251101-v1:0": { id: "us.anthropic.claude-opus-4-5-20251101-v1:0", name: "Claude Opus 4.5 (US)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-24", last_updated: "2025-08-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "nvidia.nemotron-nano-3-30b": { id: "nvidia.nemotron-nano-3-30b", name: "NVIDIA Nemotron Nano 3 30B", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.06, output: 0.24 } }, "global.anthropic.claude-opus-4-7": { id: "global.anthropic.claude-opus-4-7", name: "Claude Opus 4.7 (Global)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "au.anthropic.claude-opus-4-6-v1": { id: "au.anthropic.claude-opus-4-6-v1", name: "AU Anthropic Claude Opus 4.6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 16.5, output: 82.5, cache_read: 1.65, cache_write: 20.625 } }, "eu.anthropic.claude-fable-5": { id: "eu.anthropic.claude-fable-5", name: "Claude Fable 5 (EU)", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 11, output: 55, cache_read: 1.1, cache_write: 13.75 } }, "qwen.qwen3-coder-next": { id: "qwen.qwen3-coder-next", name: "Qwen3 Coder Next", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-06", last_updated: "2026-02-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0.22, output: 1.8 } }, "openai.gpt-oss-safeguard-20b": { id: "openai.gpt-oss-safeguard-20b", name: "GPT OSS Safeguard 20B", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "gpt-oss", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-29", last_updated: "2025-10-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.07, output: 0.2 } }, "qwen.qwen3-vl-235b-a22b": { id: "qwen.qwen3-vl-235b-a22b", name: "Qwen/Qwen3-VL-235B-A22B-Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-04", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.3, output: 1.5 } }, "writer.palmyra-x5-v1:0": { id: "writer.palmyra-x5-v1:0", name: "Palmyra X5", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "palmyra", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-04-28", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1040000, output: 8192 }, cost: { input: 0.6, output: 6 } }, "amazon.nova-lite-v1:0": { id: "amazon.nova-lite-v1:0", name: "Nova Lite", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova-lite", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-03", last_updated: "2024-12-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 8192 }, cost: { input: 0.06, output: 0.24, cache_read: 0.015 } }, "anthropic.claude-opus-4-1-20250805-v1:0": { id: "anthropic.claude-opus-4-1-20250805-v1:0", name: "Claude Opus 4.1", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, status: "deprecated", cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "minimax.minimax-m2.1": { id: "minimax.minimax-m2.1", name: "MiniMax M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "openai.gpt-5.5": { id: "openai.gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-06-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 272000, output: 128000 }, provider: { npm: "@ai-sdk/amazon-bedrock/mantle", api: "https://bedrock-mantle.${AWS_REGION}.api.aws/openai/v1", shape: "responses" }, cost: { input: 5.5, output: 33, cache_read: 0.55 } }, "meta.llama4-maverick-17b-instruct-v1:0": { id: "meta.llama4-maverick-17b-instruct-v1:0", name: "Llama 4 Maverick 17B Instruct", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 16384 }, cost: { input: 0.24, output: 0.97 } }, "au.anthropic.claude-opus-5": { id: "au.anthropic.claude-opus-5", name: "Claude Opus 5 (AU)", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "amazon.nova-2-lite-v1:0": { id: "amazon.nova-2-lite-v1:0", name: "Nova 2 Lite", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "nova", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 0.33, output: 2.75 } }, "us.anthropic.claude-opus-4-1-20250805-v1:0": { id: "us.anthropic.claude-opus-4-1-20250805-v1:0", name: "Claude Opus 4.1 (US)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, status: "deprecated", cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "jp.anthropic.claude-opus-4-7": { id: "jp.anthropic.claude-opus-4-7", name: "Claude Opus 4.7 (JP)", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "eu.anthropic.claude-sonnet-4-6": { id: "eu.anthropic.claude-sonnet-4-6", name: "Claude Sonnet 4.6 (EU)", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3.3, output: 16.5, cache_read: 0.33, cache_write: 4.125 } }, "mistral.pixtral-large-2502-v1:0": { id: "mistral.pixtral-large-2502-v1:0", name: "Pixtral Large (25.02)", description: "Mistral vision-language model for image understanding and multimodal chat", family: "mistral", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-04-08", last_updated: "2025-04-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 2, output: 6 } }, "openai.gpt-oss-120b": { id: "openai.gpt-oss-120b", name: "gpt-oss-120b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, provider: { npm: "@ai-sdk/amazon-bedrock/mantle", api: "https://bedrock-mantle.${AWS_REGION}.api.aws/v1", shape: "responses" }, cost: { input: 0.15, output: 0.6 } } } }, "xiaomi-token-plan-ams": { id: "xiaomi-token-plan-ams", env: ["XIAOMI_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://token-plan-ams.xiaomimimo.com/v1", name: "Xiaomi Token Plan (Europe)", doc: "https://platform.xiaomimimo.com/#/docs", models: { "mimo-v2.5-pro": { id: "mimo-v2.5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0 } }, "mimo-v2.5-tts-voiceclone": { id: "mimo-v2.5-tts-voiceclone", name: "MiMo-V2.5-TTS-VoiceClone", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "mimo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } }, "mimo-v2.5": { id: "mimo-v2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0 } }, "mimo-v2.5-tts-voicedesign": { id: "mimo-v2.5-tts-voicedesign", name: "MiMo-V2.5-TTS-VoiceDesign", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "mimo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } }, "mimo-v2-pro": { id: "mimo-v2-pro", name: "MiMo-V2-Pro", description: "Earlier MiMo Pro model for multimodal agents, reasoning, and code tasks", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "mimo-v2-tts": { id: "mimo-v2-tts", name: "MiMo-V2-TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "mimo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } }, "mimo-v2.5-tts": { id: "mimo-v2.5-tts", name: "MiMo-V2.5-TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "mimo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } } } }, minimax: { id: "minimax", env: ["MINIMAX_API_KEY"], npm: "@ai-sdk/anthropic", api: "https://api.minimax.io/anthropic/v1", name: "MiniMax (minimax.io)", doc: "https://platform.minimax.io/docs/guides/quickstart", models: { "MiniMax-M2": { id: "MiniMax-M2", name: "MiniMax-M2", description: "Efficient open MiniMax model built for coding agents and tool-heavy workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 128000 }, cost: { input: 0.3, output: 1.2 } }, "MiniMax-M2.7": { id: "MiniMax-M2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06, cache_write: 0.375 } }, "MiniMax-M2.1": { id: "MiniMax-M2.1", name: "MiniMax-M2.1", description: "Earlier MiniMax agent model for practical coding and productivity tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "MiniMax-M2.5": { id: "MiniMax-M2.5", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "MiniMax-M2.5-highspeed": { id: "MiniMax-M2.5-highspeed", name: "MiniMax-M2.5-highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-13", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.4, cache_read: 0.06, cache_write: 0.375 } }, "MiniMax-M2.7-highspeed": { id: "MiniMax-M2.7-highspeed", name: "MiniMax-M2.7-highspeed", description: "Low-latency M2.7 variant for interactive coding plans and agent loops", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.4, cache_read: 0.06, cache_write: 0.375 } }, "MiniMax-M3": { id: "MiniMax-M3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-25", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06, tiers: [{ input: 0.6, output: 2.4, cache_read: 0.12, tier: { type: "context", size: 512000 } }], context_over_200k: { input: 0.6, output: 2.4, cache_read: 0.12 } } } } }, groq: { id: "groq", env: ["GROQ_API_KEY"], npm: "@ai-sdk/groq", name: "Groq", doc: "https://console.groq.com/docs/models", models: { "llama-3.3-70b-versatile": { id: "llama-3.3-70b-versatile", name: "Llama 3.3 70B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.59, output: 0.79 } }, "llama-3.1-8b-instant": { id: "llama-3.1-8b-instant", name: "Llama 3.1 8B", description: "Compact Llama instruction model for fast chat and local deployment", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.05, output: 0.08 } }, "whisper-large-v3": { id: "whisper-large-v3", name: "Whisper", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "whisper", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2023-09-01", last_updated: "2025-09-05", modalities: { input: ["audio"], output: ["text"] }, open_weights: true, limit: { context: 0, output: 0 } }, "allam-2-7b": { id: "allam-2-7b", name: "ALLaM-2-7b", description: "ALLaM-2-7b instruction tuned model by SDAIA", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-01-23", last_updated: "2025-01-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 4096, output: 4096 }, cost: { input: 0, output: 0 } }, "whisper-large-v3-turbo": { id: "whisper-large-v3-turbo", name: "Whisper Large V3 Turbo", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "whisper", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-10-01", last_updated: "2024-10-01", modalities: { input: ["audio"], output: ["text"] }, open_weights: true, limit: { context: 0, output: 0 } }, "qwen/qwen3.6-27b": { id: "qwen/qwen3.6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "default"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.6, output: 3, cache_read: 0.3 } }, "canopylabs/orpheus-arabic-saudi": { id: "canopylabs/orpheus-arabic-saudi", name: "Canopy Labs Orpheus Arabic Saudi", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "canopylabs", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 4000, output: 50000 }, status: "beta" }, "canopylabs/orpheus-v1-english": { id: "canopylabs/orpheus-v1-english", name: "Canopy Labs Orpheus V1 English", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "canopylabs", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-12-19", last_updated: "2025-12-19", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 4000, output: 50000 }, status: "beta" }, "groq/compound-mini": { id: "groq/compound-mini", name: "Compound Mini", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "groq", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-09-04", last_updated: "2025-09-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 } }, "groq/compound": { id: "groq/compound", name: "Compound", description: "General-purpose chat model for instruction following, writing, and analysis", family: "groq", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-09-04", last_updated: "2025-09-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0.075, output: 0.3, cache_read: 0.0375 } }, "openai/gpt-oss-safeguard-20b": { id: "openai/gpt-oss-safeguard-20b", name: "Safety GPT OSS 20B", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-29", last_updated: "2026-06-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, status: "beta", cost: { input: 0.075, output: 0.3 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-10-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "meta-llama/llama-prompt-guard-2-22m": { id: "meta-llama/llama-prompt-guard-2-22m", name: "Llama Prompt Guard 2 22M", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-05-29", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512, output: 512 }, status: "beta", cost: { input: 0.03, output: 0.03 } }, "meta-llama/llama-prompt-guard-2-86m": { id: "meta-llama/llama-prompt-guard-2-86m", name: "Prompt Guard 2 86M", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-05-29", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512, output: 512 }, status: "beta", cost: { input: 0.04, output: 0.04 } } } }, deepseek: { id: "deepseek", env: ["DEEPSEEK_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.deepseek.com", name: "DeepSeek", doc: "https://api-docs.deepseek.com/quick_start/pricing", models: { "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, reasoning: 0.28, cache_read: 0.0028 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.435, output: 0.87, reasoning: 0.87, cache_read: 0.003625 } }, "deepseek-chat": { id: "deepseek-chat", name: "DeepSeek Chat", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-12-01", last_updated: "2026-02-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "deepseek-reasoner": { id: "deepseek-reasoner", name: "DeepSeek Reasoner", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-09", release_date: "2025-12-01", last_updated: "2026-02-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, reasoning: 0.28, cache_read: 0.0028 } } } }, "kimi-for-coding": { id: "kimi-for-coding", env: ["KIMI_API_KEY"], npm: "@ai-sdk/anthropic", api: "https://api.kimi.com/coding/v1", name: "Kimi For Coding", doc: "https://www.kimi.com/code/docs/en/third-party-tools/other-coding-agents.html", models: { k3: { id: "k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "kimi-for-coding": { id: "kimi-for-coding", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "kimi-for-coding-highspeed": { id: "kimi-for-coding-highspeed", name: "Kimi For Coding HighSpeed", description: "Lower-latency Kimi Code variant for interactive edits and coding-agent loops", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "k3-256k": { id: "k3-256k", name: "Kimi K3-256K", description: "256K-context version of Kimi K3, reducing token consumption for shorter coding sessions", family: "kimi-k3", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, requesty: { id: "requesty", env: ["REQUESTY_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://router.requesty.ai/v1", name: "Requesty", doc: "https://requesty.ai/solution/llm-routing/models", models: { "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "claude-opus-5@eu": { id: "claude-opus-5@eu", name: "Claude Opus 5 (EU)", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5.5, output: 27.5, cache_read: 0.55, cache_write: 6.875 } }, "deepseek-v4-flash-0731@eu": { id: "deepseek-v4-flash-0731@eu", name: "DeepSeek V4 Flash 0731 (EU)", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.07 } }, "gemini-3.5-flash@eu": { id: "gemini-3.5-flash@eu", name: "Gemini 3.5 Flash (EU)", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 1.5, output: 9, cache_read: 0.15, cache_write: 1.583 } }, "claude-sonnet-4-6@eu": { id: "claude-sonnet-4-6@eu", name: "Claude Sonnet 4.6 (EU)", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3.3, output: 16.5, cache_read: 0.3, cache_write: 4.125 } }, "gpt-4.1-mini@eu": { id: "gpt-4.1-mini@eu", name: "GPT-4.1 mini (EU)", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.44, output: 1.76, cache_read: 0.11 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "claude-opus-4-7@eu": { id: "claude-opus-4-7@eu", name: "Claude Opus 4.7 (EU)", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5.5, output: 27.5, cache_read: 0.55, cache_write: 6.875 } }, "gemini-3.5-flash-lite": { id: "gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "claude-sonnet-4-5@eu": { id: "claude-sonnet-4-5@eu", name: "Claude Sonnet 4.5 (latest) (EU)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3.3, output: 16.5, cache_read: 0.3, cache_write: 4.125, tiers: [{ input: 6.6, output: 24.75, cache_read: 0.6, cache_write: 8.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6.6, output: 24.75, cache_read: 0.6, cache_write: 8.25 } } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "kimi-k3@eu": { id: "kimi-k3@eu", name: "Kimi K3 (EU)", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 262144 }, cost: { input: 2.25, output: 11.25, cache_read: 0.225 } }, "glm-5.2@eu": { id: "glm-5.2@eu", name: "GLM-5.2 (EU)", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1.2, output: 4.2, cache_read: 0.26 } }, "claude-sonnet-4@eu": { id: "claude-sonnet-4@eu", name: "Claude Sonnet 4 (latest) (EU)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1.2, output: 4.2, cache_read: 0.26 } }, "claude-opus-4-6@eu": { id: "claude-opus-4-6@eu", name: "Claude Opus 4.6 (EU)", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5.5, output: 27.5, cache_read: 0.55, cache_write: 6.88 } }, "gpt-5.5@eu": { id: "gpt-5.5@eu", name: "GPT-5.5 (EU)", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "gpt-5.6-sol@eu": { id: "gpt-5.6-sol@eu", name: "GPT-5.6 Sol (EU)", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5.5, output: 33, cache_read: 0.55 } }, "claude-opus-4-1": { id: "claude-opus-4-1", name: "Claude Opus 4.1 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "gpt-5.1@eu": { id: "gpt-5.1@eu", name: "GPT-5.1 (EU)", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.375, output: 11, cache_read: 0.1375 } }, "gpt-5@eu": { id: "gpt-5@eu", name: "GPT-5 (EU)", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.375, output: 11, cache_read: 0.1375 } }, "gpt-5.4@eu": { id: "gpt-5.4@eu", name: "GPT-5.4 (EU)", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "gpt-5-nano@eu": { id: "gpt-5-nano@eu", name: "GPT-5 Nano (EU)", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 0.055, output: 0.44, cache_read: 0.0055 } }, "gpt-4.1-nano@eu": { id: "gpt-4.1-nano@eu", name: "GPT-4.1 nano (EU)", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.11, output: 0.44, cache_read: 0.0275 } }, "claude-sonnet-4-5": { id: "claude-sonnet-4-5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "gemini-2.5-flash@eu": { id: "gemini-2.5-flash@eu", name: "Gemini 2.5 Flash (EU)", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.3, output: 2.5, cache_read: 0.075, cache_write: 0.55 } }, "gpt-5-mini@eu": { id: "gpt-5-mini@eu", name: "GPT-5 Mini (EU)", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 0.275, output: 2.2, cache_read: 0.0275 } }, "claude-opus-4-8@eu": { id: "claude-opus-4-8@eu", name: "Claude Opus 4.8 (EU)", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5.5, output: 27.5, cache_read: 0.55, cache_write: 6.875 } }, "gpt-4o-mini@eu": { id: "gpt-4o-mini@eu", name: "GPT-4o mini (EU)", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16000 }, cost: { input: 0.165, output: 0.66, cache_read: 0.0825 } }, "deepseek-v4-flash-0731": { id: "deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.07 } }, "gemini-3.6-flash": { id: "gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 1.5, output: 7, cache_read: 0.15 } }, "grok-4.5": { id: "grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.5, cache_write: 2, tiers: [{ input: 4, output: 12, cache_read: 1, cache_write: 4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 12, cache_read: 1, cache_write: 4 } } }, "gpt-5.6-luna@eu": { id: "gpt-5.6-luna@eu", name: "GPT-5.6 Luna (EU)", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 1.1, output: 6.6, cache_read: 0.11 } }, "o4-mini@eu": { id: "o4-mini@eu", name: "o4-mini (EU)", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.21, output: 4.84, cache_read: 0.3025 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 262144 }, cost: { input: 2.25, output: 11.25, cache_read: 0.225 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-sonnet-5@eu": { id: "claude-sonnet-5@eu", name: "Claude Sonnet 5 (EU)", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2.2, output: 11, cache_read: 0.22, cache_write: 2.75 } }, "claude-opus-4-5@eu": { id: "claude-opus-4-5@eu", name: "Claude Opus 4.5 (latest) (EU)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5.5, output: 27.5, cache_read: 0.55, cache_write: 6.875 } }, "claude-opus-4-5": { id: "claude-opus-4-5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "gemini-3.1-flash-lite@eu": { id: "gemini-3.1-flash-lite@eu", name: "Gemini 3.1 Flash Lite (EU)", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, cache_write: 0.08333, tiers: [{ input: 0.5, output: 2.25, cache_read: 0.025, cache_write: 0.08333, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 0.5, output: 2.25, cache_read: 0.025, cache_write: 0.08333 } } }, "claude-haiku-4-5@eu": { id: "claude-haiku-4-5@eu", name: "Claude Haiku 4.5 (latest) (EU)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1.1, output: 5.5, cache_read: 0.11, cache_write: 1.375 } }, "gpt-4.1@eu": { id: "gpt-4.1@eu", name: "GPT-4.1 (EU)", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2.2, output: 8.8, cache_read: 0.55 } }, "claude-opus-5": { id: "claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gpt-5.6-terra@eu": { id: "gpt-5.6-terra@eu", name: "GPT-5.6 Terra (EU)", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.75, output: 16.5, cache_read: 0.275 } } } }, tensorx: { id: "tensorx", env: ["TENSORX_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.tensorx.ai/v1", name: "TensorX", doc: "https://docs.tensorx.ai/", models: { "nvidia/nemotron-3-super-120b-a12b": { id: "nvidia/nemotron-3-super-120b-a12b", name: "Nemotron 3 Super 120B A12B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.3, output: 0.9, cache_read: 0.075, cache_write: 0.375 } }, "qwen/qwen3-coder-30b-a3b-instruct": { id: "qwen/qwen3-coder-30b-a3b-instruct", name: "Qwen3-Coder 30B-A3B Instruct", description: "Smaller Qwen coder for efficient local agents and repo-level fixes", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 65536 }, cost: { input: 0.06, output: 0.25, cache_read: 0.015, cache_write: 0.075 } }, "qwen/qwen3.5-9b": { id: "qwen/qwen3.5-9b", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.15, output: 0.2, cache_read: 0.0375, cache_write: 0.1875 } }, "qwen/qwen3-vl-235b-a22b-instruct": { id: "qwen/qwen3-vl-235b-a22b-instruct", name: "Qwen3 VL 235B-A22B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 131072 }, cost: { input: 0.21, output: 1.9, cache_read: 0.0525, cache_write: 0.2625 } }, "qwen/qwen3-235b-a22b-2507": { id: "qwen/qwen3-235b-a22b-2507", name: "Qwen3 235B-A22B-2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-06-30", release_date: "2025-07-21", last_updated: "2025-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 262144 }, cost: { input: 0.072, output: 0.464, cache_read: 0.018, cache_write: 0.09 } }, "qwen/qwen3.5-122b-a10b": { id: "qwen/qwen3.5-122b-a10b", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.5, output: 3.5, cache_read: 0.125, cache_write: 0.625 } }, "minimax/minimax-m3": { id: "minimax/minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.4, output: 2, cache_read: 0.1 } }, "minimax/minimax-m2.5": { id: "minimax/minimax-m2.5", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 65536 }, cost: { input: 0.3, output: 1.2, cache_read: 0.075, cache_write: 0.375 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 0.15, output: 0.3, cache_read: 0.0375, cache_write: 0.1875 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 1.75, output: 3.5, cache_read: 0.4375, cache_write: 2.185 } }, "deepseek/deepseek-r1-0528": { id: "deepseek/deepseek-r1-0528", name: "DeepSeek R1-0528", description: "Classic open reasoning model for transparent math, coding, and deliberate problem solving", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-05-28", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 164000, output: 8192 }, cost: { input: 0.66, output: 2.6, cache_read: 0.165, cache_write: 0.825 } }, "deepseek/deepseek-v4-flash-0731": { id: "deepseek/deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 0.25, output: 0.3, cache_read: 0.06 } }, "deepseek/deepseek-v3.2": { id: "deepseek/deepseek-v3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 163840 }, cost: { input: 0.3, output: 0.5, cache_read: 0.075, cache_write: 0.375 } }, "deepseek/deepseek-chat-v3.1": { id: "deepseek/deepseek-chat-v3.1", name: "DeepSeek Chat V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 164000, output: 163840 }, cost: { input: 0.2, output: 0.8, cache_read: 0.05, cache_write: 0.25 } }, "z-ai/glm-5": { id: "z-ai/glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, cost: { input: 1, output: 3.2, cache_read: 0.25, cache_write: 1.25 } }, "z-ai/glm-5.1": { id: "z-ai/glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, cost: { input: 1.4, output: 4.4, cache_read: 0.35, cache_write: 1.75 } }, "z-ai/glm-5.2": { id: "z-ai/glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1.5, output: 4.5, cache_read: 0.375 } }, "z-ai/glm-4.7": { id: "z-ai/glm-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 200000 }, cost: { input: 0.6, output: 2.2, cache_read: 0.15, cache_write: 0.75 } }, "z-ai/glm-5-turbo": { id: "z-ai/glm-5-turbo", name: "GLM-5-Turbo", description: "Faster GLM-5 lane for coding agents that need lower latency", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.3, cache_write: 1.5 } }, "z-ai/glm-5v-turbo": { id: "z-ai/glm-5v-turbo", name: "GLM-5V-Turbo", description: "Fast GLM vision model for screenshots, documents, and multimodal agent tasks", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.3, cache_write: 1.5 } }, "moonshotai/kimi-k2.5": { id: "moonshotai/kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.5, output: 2.8, cache_read: 0.125, cache_write: 0.625 } }, "moonshotai/kimi-k2.6": { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1, output: 4, cache_read: 0.25, cache_write: 1.25 } }, "moonshotai/kimi-k2.7-code": { id: "moonshotai/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.25, output: 4.5, cache_read: 0.3125 } }, "moonshotai/kimi-k3": { id: "moonshotai/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.75 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.04, output: 0.2, cache_read: 0.01, cache_write: 0.05 } } } }, llama: { id: "llama", env: ["LLAMA_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.llama.com/compat/v1/", name: "Llama", doc: "https://llama.developer.meta.com/docs/models", models: { "cerebras-llama-4-maverick-17b-128e-instruct": { id: "cerebras-llama-4-maverick-17b-128e-instruct", name: "Cerebras-Llama-4-Maverick-17B-128E-Instruct", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "cerebras-llama-4-scout-17b-16e-instruct": { id: "cerebras-llama-4-scout-17b-16e-instruct", name: "Cerebras-Llama-4-Scout-17B-16E-Instruct", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "llama-4-scout-17b-16e-instruct-fp8": { id: "llama-4-scout-17b-16e-instruct-fp8", name: "Llama-4-Scout-17B-16E-Instruct-FP8", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "llama-4-maverick-17b-128e-instruct-fp8": { id: "llama-4-maverick-17b-128e-instruct-fp8", name: "Llama-4-Maverick-17B-128E-Instruct-FP8", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "llama-3.3-70b-instruct": { id: "llama-3.3-70b-instruct", name: "Llama-3.3-70B-Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "llama-3.3-8b-instruct": { id: "llama-3.3-8b-instruct", name: "Llama-3.3-8B-Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "groq-llama-4-maverick-17b-128e-instruct": { id: "groq-llama-4-maverick-17b-128e-instruct", name: "Groq-Llama-4-Maverick-17B-128E-Instruct", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } } } }, kilo: { id: "kilo", env: ["KILO_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.kilo.ai/api/gateway", name: "Kilo Gateway", doc: "https://kilo.ai", models: { "~openai/gpt-latest": { id: "~openai/gpt-latest", name: "OpenAI GPT Latest", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "~openai/gpt-mini-latest": { id: "~openai/gpt-mini-latest", name: "OpenAI GPT Mini Latest", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "microsoft/phi-4": { id: "microsoft/phi-4", name: "Microsoft: Phi 4", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "phi", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-01-10", last_updated: "2025-01-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 16384 }, cost: { input: 0.07, output: 0.14 } }, "microsoft/wizardlm-2-8x22b": { id: "microsoft/wizardlm-2-8x22b", name: "WizardLM-2 8x22B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2024-04-16", last_updated: "2024-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 65535, output: 8000 }, cost: { input: 0.62, output: 0.62 } }, "cohere/command-r-08-2024": { id: "cohere/command-r-08-2024", name: "Command R", description: "Cohere retrieval model for long-context chat and enterprise RAG workflows", family: "command-r", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-08-30", last_updated: "2024-08-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 0.15, output: 0.6 } }, "cohere/command-a": { id: "cohere/command-a", name: "Cohere: Command A", description: "Cohere command model for multilingual enterprise agents, tools, and chat", family: "command-a", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 8192 }, cost: { input: 2.5, output: 10 } }, "cohere/command-r-plus-08-2024": { id: "cohere/command-r-plus-08-2024", name: "Command R+", description: "Cohere retrieval model for long-context chat and enterprise RAG workflows", family: "command-r", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-08-30", last_updated: "2024-08-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 2.5, output: 10 } }, "cohere/command-r7b-12-2024": { id: "cohere/command-r7b-12-2024", name: "Command R7B", description: "Cohere command model for multilingual enterprise agents, tools, and chat", family: "command-r", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-12-02", last_updated: "2024-12-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 0.0375, output: 0.15 } }, "cohere/north-mini-code:free": { id: "cohere/north-mini-code:free", name: "Cohere: North Mini Code (free)", description: "North Mini Code is Cohere's first agentic coding model and the debut of its North family. A sparse mixture-of-experts model with 30B total parameters and 3B active, it is optimized...", family: "north", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-06-17", last_updated: "2026-06-17", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-ultra-550b-a55b:free": { id: "nvidia/nemotron-3-ultra-550b-a55b:free", name: "NVIDIA: Nemotron 3 Ultra (free)", description: "NVIDIA Nemotron 3 Ultra is an open frontier-reasoning and orchestration model from NVIDIA, with 55B active parameters out of 550B total (MoE). Built on a hybrid Transformer-Mamba mixture-of-experts architecture, it... **Terms of service** For NVIDIA free endpoints (Super/Ultra/etc): Trial use only - do not submit personal or confidential data. Your use is logged for security purposes and to improve NVIDIA products and services. The logged session data for improvement purposes is not linked to your identity or any persistent identifier. For more information about our data processing practices, see our [Privacy Policy](https://www.nvidia.com/en-us/about-nvidia/privacy-policy/). By interacting with this endpoint, you consent to our collection, recording, and use of such information and the [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "medium", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-nano-30b-a3b": { id: "nvidia/nemotron-3-nano-30b-a3b", name: "Nemotron 3 Nano 30B A3B", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-15", last_updated: "2025-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.05, output: 0.2, cache_read: 0.03 } }, "nvidia/nemotron-3-super-120b-a12b": { id: "nvidia/nemotron-3-super-120b-a12b", name: "Nemotron 3 Super 120B A12B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.085, output: 0.4 } }, "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free": { id: "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free", name: "NVIDIA: Nemotron 3 Nano Omni (free)", description: "Open Nemotron omni model combining reasoning with text, vision, and audio", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-28", last_updated: "2026-04-28", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 65536 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3.5-content-safety:free": { id: "nvidia/nemotron-3.5-content-safety:free", name: "NVIDIA: Nemotron 3.5 Content Safety (free)", description: "NVIDIA Nemotron 3.5 Content Safety is a compact 4B-parameter multimodal guardrail model from NVIDIA, fine-tuned from Google Gemma-3-4B. It moderates both inputs to and responses from LLMs and VLMs, accepting... **Terms of service** For NVIDIA free endpoints (Super/Ultra/etc): Trial use only - do not submit personal or confidential data. Your use is logged for security purposes and to improve NVIDIA products and services. The logged session data for improvement purposes is not linked to your identity or any persistent identifier. For more information about our data processing practices, see our [Privacy Policy](https://www.nvidia.com/en-us/about-nvidia/privacy-policy/). By interacting with this endpoint, you consent to our collection, recording, and use of such information and the [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-ultra-550b-a55b": { id: "nvidia/nemotron-3-ultra-550b-a55b", name: "Nemotron 3 Ultra 550B A55B", description: "NVIDIA Nemotron 3 Ultra is an open frontier-reasoning and orchestration model from NVIDIA, with 55B active parameters out of 550B total (MoE). Built on a hybrid Transformer-Mamba mixture-of-experts architecture, it...", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512288, output: 512288 }, cost: { input: 0.5, output: 2.2, cache_read: 0.1 } }, "nvidia/nemotron-3-super-120b-a12b:free": { id: "nvidia/nemotron-3-super-120b-a12b:free", name: "NVIDIA: Nemotron 3 Super (free)", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0 } }, "deepcogito/cogito-v2.1-671b": { id: "deepcogito/cogito-v2.1-671b", name: "Deep Cogito: Cogito v2.1 671B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "cogito", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: true, temperature: true, release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32768 }, cost: { input: 1.25, output: 1.25 } }, "google/lyria-3-pro-preview": { id: "google/lyria-3-pro-preview", name: "Lyria 3 Pro Preview", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "lyria", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-03-25", last_updated: "2026-03-25", modalities: { input: ["text", "image"], output: ["text", "audio"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0, output: 0 } }, "google/gemini-3.5-flash": { id: "google/gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, reasoning: 9, cache_read: 0.15, cache_write: 0.083333 } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.3, output: 2.5, reasoning: 2.5, cache_read: 0.03, cache_write: 0.083333 } }, "google/gemma-3-4b-it": { id: "google/gemma-3-4b-it", name: "Google: Gemma 3 4B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0.05, output: 0.1 } }, "google/gemini-3.5-flash-lite": { id: "google/gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Gemini 3.5 Flash Lite is a high-efficiency model from Google with upgraded agentic capabilities. It is suited for subagents that execute focused tasks within complex, multi-agent workflows.", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, reasoning: 2.5, cache_read: 0.03, cache_write: 0.083333 } }, "google/gemini-2.5-pro-preview": { id: "google/gemini-2.5-pro-preview", name: "Google: Gemini 2.5 Pro Preview 06-05", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-06-05", last_updated: "2025-06-05", modalities: { input: ["pdf", "image", "text", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, reasoning: 10, cache_read: 0.125, cache_write: 0.375 } }, "google/lyria-3-clip-preview": { id: "google/lyria-3-clip-preview", name: "Lyria 3 Clip Preview", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "lyria", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-03-25", last_updated: "2026-03-25", modalities: { input: ["text", "image"], output: ["text", "audio"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0, output: 0 } }, "google/gemini-3-pro-image-preview": { id: "google/gemini-3-pro-image-preview", name: "Nano Banana Pro", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: false, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["image", "text", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 32768 }, cost: { input: 2, output: 12, reasoning: 12, cache_read: 0.2, cache_write: 0.375 } }, "google/gemini-3.1-flash-lite-preview": { id: "google/gemini-3.1-flash-lite-preview", name: "Gemini 3.1 Flash Lite Preview", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, reasoning: 1.5, cache_read: 0.025, cache_write: 0.083333 } }, "google/gemini-3-flash-preview": { id: "google/gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, reasoning: 3, cache_read: 0.05, cache_write: 0.083333 } }, "google/gemini-3.1-pro-preview-customtools": { id: "google/gemini-3.1-pro-preview-customtools", name: "Gemini 3.1 Pro Preview Custom Tools", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, reasoning: 12, cache_read: 0.2, cache_write: 0.375 } }, "google/gemini-3.1-flash-lite-image": { id: "google/gemini-3.1-flash-lite-image", name: "Nano Banana 2 Lite", description: "Nano Banana 2 Lite (Gemini 3.1 Flash Lite Image) is Google's fastest, most cost-efficient Gemini image model, built for high-velocity developer pipelines and rapid-fire visual exploration. It delivers text-to-image generation...", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "high"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["image", "text", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 65536 }, cost: { input: 0.25, output: 1.5 } }, "google/gemini-3.1-flash-image-preview": { id: "google/gemini-3.1-flash-image-preview", name: "Nano Banana 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "high"] }], tool_call: false, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 65536 }, cost: { input: 0.5, output: 3 } }, "google/gemma-4-26b-a4b-it": { id: "google/gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.07, output: 0.34 } }, "google/gemma-2-27b-it": { id: "google/gemma-2-27b-it", name: "Google: Gemma 2 27B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-07-13", last_updated: "2024-07-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 2048 }, cost: { input: 0.65, output: 0.65 } }, "google/gemma-3-27b-it": { id: "google/gemma-3-27b-it", name: "Google: Gemma 3 27B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-03-12", last_updated: "2025-03-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.08, output: 0.16 } }, "google/gemini-3.6-flash": { id: "google/gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Gemini 3.6 Flash is a high-efficiency model from Google for coding, agentic workflows, and web and app development. It is designed to produce polished outputs with fewer unnecessary edits and...", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, reasoning: 7.5, cache_read: 0.15, cache_write: 0.083333 } }, "google/gemini-3.1-flash-lite": { id: "google/gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, reasoning: 1.5, cache_read: 0.025, cache_write: 0.083333 } }, "google/gemini-2.5-pro-preview-05-06": { id: "google/gemini-2.5-pro-preview-05-06", name: "Google: Gemini 2.5 Pro Preview 05-06", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-05-07", last_updated: "2025-05-07", modalities: { input: ["text", "image", "pdf", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 1.25, output: 10, reasoning: 10, cache_read: 0.125, cache_write: 0.375 } }, "google/gemma-3-12b-it": { id: "google/gemma-3-12b-it", name: "Google: Gemma 3 12B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0.05, output: 0.15 } }, "google/gemma-4-31b-it": { id: "google/gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.08, output: 0.35, cache_read: 0.01 } }, "google/gemini-3.1-flash-image": { id: "google/gemini-3.1-flash-image", name: "Nano Banana 2", description: 'Gemini 3.1 Flash Image, a.k.a. "Nano Banana 2," is Google\u2019s latest state of the art image generation and editing model, delivering Pro-level visual quality at Flash speed. It combines advanced...', family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "high"] }], tool_call: false, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["image", "text", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.5, output: 3 } }, "google/gemini-2.5-flash-image": { id: "google/gemini-2.5-flash-image", name: "Nano Banana", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-flash", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-06", release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["image", "text", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 32768, output: 8192 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, cache_write: 0.083333 } }, "google/gemma-3n-e4b-it": { id: "google/gemma-3n-e4b-it", name: "Google: Gemma 3n 4B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 6554 }, cost: { input: 0.06, output: 0.12 } }, "google/gemini-3-pro-image": { id: "google/gemini-3-pro-image", name: "Nano Banana Pro", description: "Nano Banana Pro is Google\u2019s most advanced image-generation and editing model, built on Gemini 3 Pro. It extends the original Nano Banana with significantly improved multimodal reasoning, real-world grounding, and...", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["image", "text", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 32768 }, cost: { input: 2, output: 12, reasoning: 12, cache_read: 0.2, cache_write: 0.375 } }, "google/gemini-3.1-pro-preview": { id: "google/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, reasoning: 12, cache_read: 0.2, cache_write: 0.375 } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, reasoning: 10, cache_read: 0.125, cache_write: 0.375 } }, "google/gemini-2.5-flash-lite": { id: "google/gemini-2.5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.1, output: 0.4, reasoning: 0.4, cache_read: 0.01, cache_write: 0.083333 } }, "thinkingmachines/inkling-small": { id: "thinkingmachines/inkling-small", name: "Inkling Small", description: "Inkling Small is an open-weight multimodal mixture-of-experts model from Thinking Machines Lab, with 12B active parameters out of 276B total. It is positioned as the smaller, more efficient member of...", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-30", last_updated: "2026-07-30", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 262144 }, cost: { input: 0.45, output: 1.2, cache_read: 0.1 } }, "thinkingmachines/inkling": { id: "thinkingmachines/inkling", name: "Inkling", description: "Inkling is an open-weight multimodal mixture-of-experts model from Thinking Machines Lab, with 41B active parameters out of 975B total. It is designed for general-purpose reasoning, coding, agentic and tool-use systems,...", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "max"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 262144 }, cost: { input: 0.95, output: 4.05, cache_read: 0.16 } }, "relace/relace-apply-3": { id: "relace/relace-apply-3", name: "Relace: Relace Apply 3", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, release_date: "2025-09-26", last_updated: "2025-09-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 0.85, output: 1.25 } }, "relace/relace-search": { id: "relace/relace-search", name: "Relace: Relace Search", description: "Tool-capable chat model for instruction following and agentic application workflows", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 1, output: 3 } }, "~deepseek/deepseek-v4-flash-latest": { id: "~deepseek/deepseek-v4-flash-latest", name: "DeepSeek V4 Flash Latest", description: "This model always redirects to the latest model in the DeepSeek V4 Flash family.", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-01", last_updated: "2026-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, cost: { input: 0.079996, output: 0.252, cache_read: 0.0252 } }, "perceptron/perceptron-mk1": { id: "perceptron/perceptron-mk1", name: "Perceptron: Perceptron Mk1", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: true, temperature: true, release_date: "2026-05-12", last_updated: "2026-05-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 8192 }, cost: { input: 0.15, output: 1.5 } }, "sakana/fugu-ultra": { id: "sakana/fugu-ultra", name: "Fugu Ultra", description: "Fugu Ultra is the higher-performance model in Sakana AI's Fugu family. Rather than a single monolithic model, Fugu is a learned multi-agent orchestration system: a language model trained to route...", family: "fugu", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-06-15", last_updated: "2026-06-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "~google/gemini-flash-latest": { id: "~google/gemini-flash-latest", name: "Google Gemini Flash Latest", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video", "pdf", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, reasoning: 7.5, cache_read: 0.15, cache_write: 0.083333 } }, "~google/gemini-pro-latest": { id: "~google/gemini-pro-latest", name: "Google Gemini Pro Latest", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["audio", "pdf", "image", "text", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, reasoning: 12, cache_read: 0.2, cache_write: 0.375 } }, "qwen/qwen3.5-flash-02-23": { id: "qwen/qwen3.5-flash-02-23", name: "Qwen: Qwen3.5-Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-25", last_updated: "2026-02-25", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.065, output: 0.26 } }, "qwen/qwen3.7-flash": { id: "qwen/qwen3.7-flash", name: "Qwen3.7 Flash", description: "Qwen3.7 Flash is a vision-language reasoning model from Alibaba. It is suited for multimodal agents, visual coding, search, and computer interaction, with strengths in object recognition, spatial understanding, and real-world...", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 991000, output: 65536 }, cost: { input: 0.03, output: 0.13, cache_read: 0.006, cache_write: 0.038 } }, "qwen/qwen3.7-plus": { id: "qwen/qwen3.7-plus", name: "Qwen3.7 Plus", description: "Qwen3.7-Plus is a cost-effective model in Alibaba's Qwen3.7 series. It supports text and image input with text output, building on the series' text capabilities with a comprehensive upgrade to its...", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 0.32, output: 1.28, cache_read: 0.032, cache_write: 0.4 } }, "qwen/qwen3-32b": { id: "qwen/qwen3-32b", name: "Qwen3 32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 16384 }, cost: { input: 0.104, output: 0.416 } }, "qwen/qwen3.6-35b-a3b": { id: "qwen/qwen3.6-35b-a3b", name: "Qwen3.6 35B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.15, output: 1, cache_read: 0.05 } }, "qwen/qwen3-30b-a3b": { id: "qwen/qwen3-30b-a3b", name: "Qwen: Qwen3 30B A3B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-04-28", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 40960, output: 16384 }, cost: { input: 0.13, output: 0.52 } }, "qwen/qwen3-235b-a22b-thinking-2507": { id: "qwen/qwen3-235b-a22b-thinking-2507", name: "Qwen: Qwen3 235B A22B Thinking 2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 262144 }, cost: { input: 0.23, output: 2.3 } }, "qwen/qwen3-vl-30b-a3b-thinking": { id: "qwen/qwen3-vl-30b-a3b-thinking", name: "Qwen: Qwen3 VL 30B A3B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.2, output: 2.4 } }, "qwen/qwen3-coder-30b-a3b-instruct": { id: "qwen/qwen3-coder-30b-a3b-instruct", name: "Qwen3-Coder 30B-A3B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 160000, output: 32768 }, cost: { input: 0.2925, output: 1.4625 } }, "qwen/qwen3.5-plus-02-15": { id: "qwen/qwen3.5-plus-02-15", name: "Qwen: Qwen3.5 Plus 2026-02-15", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.26, output: 1.56 } }, "qwen/qwen3.5-27b": { id: "qwen/qwen3.5-27b", name: "Qwen3.5 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.195, output: 1.56 } }, "qwen/qwen3.7-max": { id: "qwen/qwen3.7-max", name: "Qwen3.7 Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 1.25, output: 3.75, cache_read: 0.125, cache_write: 1.5625 } }, "qwen/qwen3-next-80b-a3b-thinking": { id: "qwen/qwen3-next-80b-a3b-thinking", name: "Qwen3-Next 80B-A3B (Thinking)", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.15, output: 1.2 } }, "qwen/qwen3.5-9b": { id: "qwen/qwen3.5-9b", name: "Qwen3.5 9B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.1, output: 0.15 } }, "qwen/qwen3.6-27b": { id: "qwen/qwen3.6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.45, output: 2.7 } }, "qwen/qwen3.5-35b-a3b": { id: "qwen/qwen3.5-35b-a3b", name: "Qwen3.5 35B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.1625, output: 1.3 } }, "qwen/qwen-2.5-7b-instruct": { id: "qwen/qwen-2.5-7b-instruct", name: "Qwen: Qwen2.5 7B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-10-16", last_updated: "2024-10-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.1, output: 0.2 } }, "qwen/qwen3-14b": { id: "qwen/qwen3-14b", name: "Qwen: Qwen3 14B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-28", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.2275, output: 0.91 } }, "qwen/qwen3-235b-a22b": { id: "qwen/qwen3-235b-a22b", name: "Qwen3 235B-A22B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.455, output: 1.82 } }, "qwen/qwen3-max": { id: "qwen/qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.78, output: 3.9, cache_read: 0.156, cache_write: 0.975 } }, "qwen/qwen3-vl-8b-instruct": { id: "qwen/qwen3-vl-8b-instruct", name: "Qwen: Qwen3 VL 8B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-14", last_updated: "2025-10-14", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.117, output: 0.455 } }, "qwen/qwen3-8b": { id: "qwen/qwen3-8b", name: "Qwen: Qwen3 8B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-04-28", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.117, output: 0.455 } }, "qwen/qwen3-coder-plus": { id: "qwen/qwen3-coder-plus", name: "Qwen3 Coder Plus", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.65, output: 3.25, cache_read: 0.13, cache_write: 0.8125 } }, "qwen/qwen3.8-max": { id: "qwen/qwen3.8-max", name: "Qwen3.8 Max", description: "Qwen3.8 Max is the flagship model in Alibaba's Qwen3.8 series, the general-availability successor to the Qwen3.8 Max Preview. It is a multimodal reasoning model intended for complex reasoning, visual understanding,...", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 2, output: 6, cache_read: 0.25, cache_write: 2.5 } }, "qwen/qwen3-coder-flash": { id: "qwen/qwen3-coder-flash", name: "Qwen3 Coder Flash", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.195, output: 0.975, cache_read: 0.039, cache_write: 0.24375 } }, "qwen/qwen3-vl-235b-a22b-instruct": { id: "qwen/qwen3-vl-235b-a22b-instruct", name: "Qwen: Qwen3 VL 235B A22B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.26, output: 1.04 } }, "qwen/qwen3-vl-32b-instruct": { id: "qwen/qwen3-vl-32b-instruct", name: "Qwen: Qwen3 VL 32B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-23", last_updated: "2025-10-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.104, output: 0.416 } }, "qwen/qwen-2.5-72b-instruct": { id: "qwen/qwen-2.5-72b-instruct", name: "Qwen2.5 72B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-09-19", last_updated: "2024-09-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 16384 }, cost: { input: 0.36, output: 0.4 } }, "qwen/qwen-plus-2025-07-28:thinking": { id: "qwen/qwen-plus-2025-07-28:thinking", name: "Qwen: Qwen Plus 0728 (thinking)", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-08", last_updated: "2025-09-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.4, output: 1.2, cache_write: 0.5 } }, "qwen/qwen-plus": { id: "qwen/qwen-plus", name: "Qwen Plus", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2024-01-25", last_updated: "2025-09-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.26, output: 0.78, cache_read: 0.052, cache_write: 0.325 } }, "qwen/qwen3-30b-a3b-thinking-2507": { id: "qwen/qwen3-30b-a3b-thinking-2507", name: "Qwen: Qwen3 30B A3B Thinking 2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-28", last_updated: "2025-08-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 81920, output: 32768 }, cost: { input: 0.2, output: 2.4 } }, "qwen/qwen3-vl-8b-thinking": { id: "qwen/qwen3-vl-8b-thinking", name: "Qwen: Qwen3 VL 8B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-14", last_updated: "2025-10-14", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.18, output: 2.1 } }, "qwen/qwen3-235b-a22b-2507": { id: "qwen/qwen3-235b-a22b-2507", name: "Qwen: Qwen3 235B A22B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-21", last_updated: "2025-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 16384 }, cost: { input: 0.1495, output: 0.598 } }, "qwen/qwen3.6-flash": { id: "qwen/qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.1875, output: 1.125, cache_write: 0.234375 } }, "qwen/qwen3-30b-a3b-instruct-2507": { id: "qwen/qwen3-30b-a3b-instruct-2507", name: "Qwen: Qwen3 30B A3B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-29", last_updated: "2025-07-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 }, cost: { input: 0.13, output: 0.52 } }, "qwen/qwen3-vl-30b-a3b-instruct": { id: "qwen/qwen3-vl-30b-a3b-instruct", name: "Qwen: Qwen3 VL 30B A3B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 16384 }, cost: { input: 0.13, output: 0.52 } }, "qwen/qwen3.5-397b-a17b": { id: "qwen/qwen3.5-397b-a17b", name: "Qwen3.5 397B-A17B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.39, output: 2.34 } }, "qwen/qwen-2.5-coder-32b-instruct": { id: "qwen/qwen-2.5-coder-32b-instruct", name: "Qwen2.5 Coder 32B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2024-11-11", last_updated: "2024-11-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.66, output: 1 } }, "qwen/qwen3-vl-235b-a22b-thinking": { id: "qwen/qwen3-vl-235b-a22b-thinking", name: "Qwen: Qwen3 VL 235B A22B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.4, output: 4 } }, "qwen/qwen3.6-max-preview": { id: "qwen/qwen3.6-max-preview", name: "Qwen3.6 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 1.027, output: 6.162, cache_write: 1.28375 } }, "qwen/qwen3-max-thinking": { id: "qwen/qwen3-max-thinking", name: "Qwen: Qwen3 Max Thinking", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-09", last_updated: "2026-02-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.78, output: 3.9 } }, "qwen/qwen3-coder": { id: "qwen/qwen3-coder", name: "Qwen: Qwen3 Coder 480B A35B", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.975, output: 4.875 } }, "qwen/qwen3-coder-next": { id: "qwen/qwen3-coder-next", name: "Qwen3 Coder Next", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-09", release_date: "2026-02-03", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.3, output: 1.5 } }, "qwen/qwen3.6-plus": { id: "qwen/qwen3.6-plus", name: "Qwen3.6 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.325, output: 1.95, cache_write: 0.40625 } }, "qwen/qwen3.5-122b-a10b": { id: "qwen/qwen3.5-122b-a10b", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 81920 }, cost: { input: 0.26, output: 2.08 } }, "qwen/qwen3.5-plus-20260420": { id: "qwen/qwen3.5-plus-20260420", name: "Qwen: Qwen3.5 Plus 2026-04-20", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.3, output: 1.8, cache_write: 0.375 } }, "qwen/qwen-plus-2025-07-28": { id: "qwen/qwen-plus-2025-07-28", name: "Qwen: Qwen Plus 0728", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-08", last_updated: "2025-09-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.26, output: 0.78 } }, "qwen/qwen3-next-80b-a3b-instruct": { id: "qwen/qwen3-next-80b-a3b-instruct", name: "Qwen3-Next 80B-A3B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.0975, output: 0.78 } }, "qwen/qwen2.5-vl-72b-instruct": { id: "qwen/qwen2.5-vl-72b-instruct", name: "Qwen: Qwen2.5 VL 72B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-02-01", last_updated: "2025-02-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 128000 }, cost: { input: 0.25, output: 0.75 } }, "stealth/claude-sonnet-4.6": { id: "stealth/claude-sonnet-4.6", name: "Stealth: Claude Sonnet 4.6 (20% off)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 2.4, output: 12, reasoning: 0, cache_read: 0.24, cache_write: 3 } }, "stealth/gpt-5.6-sol": { id: "stealth/gpt-5.6-sol", name: "Stealth: GPT-5.6 Sol (20% off)", description: "Your prompts and completions may be retained and used to train or improve the provider's services. This third-party-served variant of GPT-5.6 Sol is offered at 20% lower cost than standard GPT-5.6 Sol pricing and is not served by OpenAI or Kilo Code.", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, cost: { input: 4, output: 24, reasoning: 0, cache_read: 0.4, cache_write: 5 } }, "stealth/claude-opus-4.7": { id: "stealth/claude-opus-4.7", name: "Stealth: Claude Opus 4.7 (20% off)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 4, output: 20, reasoning: 0, cache_read: 0.4, cache_write: 5 } }, "stealth/claude-opus-4.8": { id: "stealth/claude-opus-4.8", name: "Stealth: Claude Opus 4.8 (20% off)", description: "Your prompts and completions may be retained and used to train or improve the provider's services. This third-party-served variant of Claude Opus 4.8 is offered at 20% lower cost than standard Claude Opus 4.8 pricing and is not served by Anthropic or Kilo Code.", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 4, output: 20, reasoning: 0, cache_read: 0.4, cache_write: 5 } }, "stealth/qwen3.6-plus": { id: "stealth/qwen3.6-plus", name: "Stealth: Qwen3.6 Plus (50% off)", description: "Your prompts and completions may be retained and used to train or improve the provider's services. This third-party-served variant of Qwen3.6 Plus is offered at 50% lower cost than standard Qwen3.6 Plus pricing and is not served by Alibaba or Kilo Code. Note: a surcharge applies to long-context workloads exceeding 256K input tokens.", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.25, output: 1.5, reasoning: 0, cache_read: 0.025, cache_write: 0.3125 } }, "stealth/claude-opus-4.6": { id: "stealth/claude-opus-4.6", name: "Stealth: Claude Opus 4.6 (20% off)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 4, output: 20, reasoning: 0, cache_read: 0.4, cache_write: 5 } }, "inception/mercury-2": { id: "inception/mercury-2", name: "Inception: Mercury 2", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "mercury", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-04", last_updated: "2026-03-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 50000 }, cost: { input: 0.25, output: 0.75, cache_read: 0.025 } }, "rekaai/reka-edge": { id: "rekaai/reka-edge", name: "Reka Edge", description: "Multimodal model for analyzing text, images, documents, and rich media", family: "reka", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 16384 }, cost: { input: 0.1, output: 0.1 } }, "rekaai/reka-flash-3": { id: "rekaai/reka-flash-3", name: "Reka Flash 3", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "reka", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: false, structured_output: true, temperature: true, release_date: "2025-03-12", last_updated: "2025-03-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 65536, output: 65536 }, cost: { input: 0.1, output: 0.2 } }, "tencent/hunyuan-a13b-instruct": { id: "tencent/hunyuan-a13b-instruct", name: "Tencent: Hunyuan A13B Instruct", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "hunyuan", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: true, temperature: true, release_date: "2025-07-08", last_updated: "2025-07-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.14, output: 0.57 } }, "tencent/hy3": { id: "tencent/hy3", name: "Hy3", description: "Hy3 is a 295B-parameter Mixture-of-Experts model from Tencent (21B active, 192 experts with top-8 routing) built for reasoning, agentic workflows, and real-world production use. It supports a configurable reasoning effort:...", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 128000 }, cost: { input: 0.14, output: 0.58, cache_read: 0.035 } }, "tencent/hy3-preview": { id: "tencent/hy3-preview", name: "Hy3 preview", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.18, output: 0.6, cache_read: 0.06 } }, "tencent/hy3:free": { id: "tencent/hy3:free", name: "Tencent: Hy3 (free)", description: "Hy3 is a 295B-parameter Mixture-of-Experts model from Tencent, activating 21B parameters per token. It supports configurable reasoning effort, agentic workflows, reliable tool calling, and long-context tasks across coding, document processing, financial analysis, and frontend development.", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 128000 }, cost: { input: 0, output: 0, reasoning: 0, cache_read: 0 } }, "upstage/solar-pro-3": { id: "upstage/solar-pro-3", name: "Upstage: Solar Pro 3", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "solar-pro", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015 } }, "~x-ai/grok-latest": { id: "~x-ai/grok-latest", name: "xAI: Grok Latest", description: "This model always redirects to the latest Grok model from xAI.", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.3 } }, "mistralai/mistral-large": { id: "mistralai/mistral-large", name: "Mistral Large", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-02-26", last_updated: "2024-02-26", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 25600 }, cost: { input: 2, output: 6, cache_read: 0.2 } }, "mistralai/ministral-8b-2512": { id: "mistralai/ministral-8b-2512", name: "Mistral: Ministral 3 8B 2512", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.15, output: 0.15, cache_read: 0.015 } }, "mistralai/ministral-14b-2512": { id: "mistralai/ministral-14b-2512", name: "Mistral: Ministral 3 14B 2512", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 52429 }, cost: { input: 0.2, output: 0.2, cache_read: 0.02 } }, "mistralai/ministral-3b-2512": { id: "mistralai/ministral-3b-2512", name: "Mistral: Ministral 3 3B 2512", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.1, output: 0.1, cache_read: 0.01 } }, "mistralai/mistral-small-24b-instruct-2501": { id: "mistralai/mistral-small-24b-instruct-2501", name: "Mistral: Mistral Small 3", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-01-30", last_updated: "2025-01-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 16384 }, cost: { input: 0.05, output: 0.08 } }, "mistralai/mistral-large-2407": { id: "mistralai/mistral-large-2407", name: "Mistral Large 2407", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-11-19", last_updated: "2024-11-19", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 2, output: 6, cache_read: 0.2 } }, "mistralai/mistral-medium-3.1": { id: "mistralai/mistral-medium-3.1", name: "Mistral: Mistral Medium 3.1", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-13", last_updated: "2025-08-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 26215 }, cost: { input: 0.4, output: 2, cache_read: 0.04 } }, "mistralai/mistral-nemo": { id: "mistralai/mistral-nemo", name: "Mistral Nemo", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2024-07-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.019, output: 0.03 } }, "mistralai/mistral-saba": { id: "mistralai/mistral-saba", name: "Mistral: Saba", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-02-17", last_updated: "2025-02-17", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.2, output: 0.6, cache_read: 0.02 } }, "mistralai/mistral-small-2603": { id: "mistralai/mistral-small-2603", name: "Mistral Small 4", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-06", release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015 } }, "mistralai/codestral-2508": { id: "mistralai/codestral-2508", name: "Mistral: Codestral 2508", description: "Mistral coding model for code completion, generation, and developer workflows", family: "codestral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-01", last_updated: "2025-08-01", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 51200 }, cost: { input: 0.3, output: 0.9, cache_read: 0.03 } }, "mistralai/mixtral-8x22b-instruct": { id: "mistralai/mixtral-8x22b-instruct", name: "Mistral: Mixtral 8x22B Instruct", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-04-17", last_updated: "2024-04-17", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 65536, output: 13108 }, cost: { input: 2, output: 6, cache_read: 0.2 } }, "mistralai/voxtral-small-24b-2507": { id: "mistralai/voxtral-small-24b-2507", name: "Mistral: Voxtral Small 24B 2507", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-30", last_updated: "2025-10-30", modalities: { input: ["text", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 6400 }, cost: { input: 0.1, output: 0.3, cache_read: 0.01 } }, "mistralai/mistral-small-3.2-24b-instruct": { id: "mistralai/mistral-small-3.2-24b-instruct", name: "Mistral: Mistral Small 3.2 24B", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-06-20", last_updated: "2025-06-20", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 16384 }, cost: { input: 0.09375, output: 0.25 } }, "mistralai/mistral-medium-3-5": { id: "mistralai/mistral-medium-3-5", name: "Mistral: Mistral Medium 3.5", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 1.5, output: 7.5 } }, "mistralai/mistral-small-3.1-24b-instruct": { id: "mistralai/mistral-small-3.1-24b-instruct", name: "Mistral: Mistral Small 3.1 24B", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-03-17", last_updated: "2025-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.351, output: 0.555 } }, "mistralai/mistral-medium-3": { id: "mistralai/mistral-medium-3", name: "Mistral: Mistral Medium 3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-05-07", last_updated: "2025-05-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 26215 }, cost: { input: 0.4, output: 2, cache_read: 0.04 } }, "mistralai/mistral-large-2512": { id: "mistralai/mistral-large-2512", name: "Mistral Large 3", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2025-12-02", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 52429 }, cost: { input: 0.5, output: 1.5, cache_read: 0.05 } }, "bytedance/ui-tars-1.5-7b": { id: "bytedance/ui-tars-1.5-7b", name: "ByteDance: UI-TARS 7B ", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-07-22", last_updated: "2025-07-22", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 2048 }, cost: { input: 0.1, output: 0.2, cache_read: 0.1 } }, "nex-agi/nex-n2-mini": { id: "nex-agi/nex-n2-mini", name: "Nex AGI: Nex-N2-Mini", description: "Nex-N2-Mini is an open-source agentic mixture-of-experts model from Nex AGI, the smaller sibling in the Nex-N2 series. It accepts text and image input and is built for coding, tool use,...", family: "agi", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-24", last_updated: "2026-06-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.025, output: 0.1, cache_read: 0.0025 } }, "nex-agi/nex-n2-pro": { id: "nex-agi/nex-n2-pro", name: "Nex AGI: Nex-N2-Pro", description: "Nex-N2-Pro is an agentic mixture-of-experts model from Nex AGI, with 17B active parameters out of 397B total. Built on the Qwen3.5 architecture, it accepts text and image input and produces...", family: "agi", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-06-08", last_updated: "2026-06-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.25, output: 1, cache_read: 0.025 } }, "thedrummer/rocinante-12b": { id: "thedrummer/rocinante-12b", name: "TheDrummer: Rocinante 12B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-09-30", last_updated: "2024-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 65536, output: 65536 }, cost: { input: 0.25, output: 0.5 } }, "thedrummer/unslopnemo-12b": { id: "thedrummer/unslopnemo-12b", name: "TheDrummer: UnslopNemo 12B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-11-08", last_updated: "2024-11-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1024000, output: 1024000 }, cost: { input: 0.4, output: 0.4 } }, "thedrummer/cydonia-24b-v4.1": { id: "thedrummer/cydonia-24b-v4.1", name: "TheDrummer: Cydonia 24B V4.1", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-09-27", last_updated: "2025-09-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.3, output: 0.5, cache_read: 0.15 } }, "thedrummer/skyfall-36b-v2": { id: "thedrummer/skyfall-36b-v2", name: "TheDrummer: Skyfall 36B V2", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-03-10", last_updated: "2025-03-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.55, output: 0.8, cache_read: 0.25 } }, "undi95/remm-slerp-l2-13b": { id: "undi95/remm-slerp-l2-13b", name: "ReMM SLERP 13B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2023-07-22", last_updated: "2023-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 6144, output: 6144 }, cost: { input: 0.45, output: 0.65 } }, "meta/muse-spark-1.1": { id: "meta/muse-spark-1.1", name: "Muse Spark 1.1", description: "Muse Spark 1.1 is a multimodal reasoning model from Meta, built for agentic tasks. It accepts text, images, video, audio, and PDF documents and returns text, with a 1M-token context...", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-08", last_updated: "2026-07-09", modalities: { input: ["text", "image", "video", "pdf", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "meta/muse-spark-1.2": { id: "meta/muse-spark-1.2", name: "Muse Spark 1.2", description: "Muse Spark 1.2 is a reasoning model from Meta, designed for complex agentic tasks. It accepts text, images, video, audio, and PDF documents, returns text, and offers a 1M-token context...", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-05", last_updated: "2026-08-05", modalities: { input: ["text", "image", "video", "pdf", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "gryphe/mythomax-l2-13b": { id: "gryphe/mythomax-l2-13b", name: "MythoMax 13B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2023-07-02", last_updated: "2023-07-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 4096, output: 4096 }, cost: { input: 0.06, output: 0.06 } }, "inclusionai/ling-3.0-tiny:free": { id: "inclusionai/ling-3.0-tiny:free", name: "inclusionAI: Ling 3.0 Tiny (free)", description: "Ling 3.0 Tiny is a mixture-of-experts model from InclusionAI, with 1.3B active parameters out of 7.9B total. It is designed for responsive agents, instruction following, and multi-turn conversations, with switchable...", family: "ling", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-08-06", last_updated: "2026-08-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "inclusionai/ling-3.0-flash": { id: "inclusionai/ling-3.0-flash", name: "Ling-3.0-flash", description: "*Ling-3.0-flash* is a *124B-parameter Mixture-of-Experts (MoE) model*, with approximately *5.1B parameters activated per token*. The model is designed with *token efficiency and production-scale agentic inference* as key priorities, enabling developers...", family: "ling", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-23", last_updated: "2026-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.06, output: 0.18, cache_read: 0.012 } }, "inclusionai/ring-2.6-1t": { id: "inclusionai/ring-2.6-1t", name: "inclusionAI: Ring-2.6-1T", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "ring", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-05-08", last_updated: "2026-05-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.06 } }, "inclusionai/ling-2.6-1t": { id: "inclusionai/ling-2.6-1t", name: "inclusionAI: Ling-2.6-1T", description: "Tool-capable chat model for instruction following and agentic application workflows", family: "ling", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.3, output: 2.5, cache_read: 0.06 } }, "inclusionai/ling-2.6-flash": { id: "inclusionai/ling-2.6-flash", name: "inclusionAI: Ling-2.6-flash", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "ling", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.1, output: 0.3, cache_read: 0.02 } }, "cognitivecomputations/dolphin-mistral-24b-venice-edition": { id: "cognitivecomputations/dolphin-mistral-24b-venice-edition", name: "Venice: Uncensored", description: "Venice Uncensored Dolphin Mistral 24B Venice Edition is a fine-tuned variant of Mistral-Small-24B-Instruct-2501, developed by dphn.ai in collaboration with Venice.ai. This model is designed as an \u201Cuncensored\u201D instruct-tuned LLM, preserving...", family: "mistral", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.2, output: 0.9 } }, "allenai/olmo-3-32b-think": { id: "allenai/olmo-3-32b-think", name: "AllenAI: Olmo 3 32B Think", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "allenai", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: false, structured_output: true, temperature: true, release_date: "2025-11-21", last_updated: "2025-11-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 65536, output: 65536 }, cost: { input: 0.15, output: 0.5 } }, "meituan/longcat-2.0": { id: "meituan/longcat-2.0", name: "Meituan: LongCat 2.0", description: "LongCat 2.0 is a sparse mixture-of-experts language model from Meituan, with 48B active parameters out of 1.6T total. It is suited for coding, repository-level changes, long-horizon problem solving, and agentic...", family: "longcat", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-20", last_updated: "2026-07-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048756, output: 262144 }, cost: { input: 0.75, output: 3, cache_read: 0.015 } }, "ai21/jamba-large-1.7": { id: "ai21/jamba-large-1.7", name: "AI21: Jamba Large 1.7", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "jamba", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-08", last_updated: "2025-08-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 4096 }, cost: { input: 2, output: 8 } }, "mancer/weaver": { id: "mancer/weaver", name: "Mancer: Weaver (alpha)", description: "General-purpose chat model for instruction following, writing, and analysis", family: "alpha", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2023-08-02", last_updated: "2023-08-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8000, output: 6000 }, cost: { input: 0.5, output: 0.75 } }, "morph/morph-v3-large": { id: "morph/morph-v3-large", name: "Morph: Morph V3 Large", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "morph", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-07-07", last_updated: "2025-07-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 131072 }, cost: { input: 0.9, output: 1.9 } }, "morph/morph-v3-fast": { id: "morph/morph-v3-fast", name: "Morph: Morph V3 Fast", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "morph", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-07-07", last_updated: "2025-07-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 81920, output: 38000 }, cost: { input: 0.8, output: 1.2 } }, "nousresearch/hermes-3-llama-3.1-70b": { id: "nousresearch/hermes-3-llama-3.1-70b", name: "Nous: Hermes 3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "nousresearch", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-08-18", last_updated: "2024-08-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0.7, output: 0.7 } }, "nousresearch/hermes-3-llama-3.1-405b": { id: "nousresearch/hermes-3-llama-3.1-405b", name: "Nous: Hermes 3 405B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "nousresearch", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-08-16", last_updated: "2024-08-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 1, output: 1 } }, "nousresearch/hermes-4-405b": { id: "nousresearch/hermes-4-405b", name: "Nous: Hermes 4 405B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "nousresearch", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 26215 }, cost: { input: 1, output: 3 } }, "nousresearch/hermes-4-70b": { id: "nousresearch/hermes-4-70b", name: "Nous: Hermes 4 70B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "nousresearch", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.13, output: 0.4 } }, "poolside/laguna-xs-2.1": { id: "poolside/laguna-xs-2.1", name: "Poolside: Laguna XS 2.1", description: "Laguna XS 2.1 is the latest coding agent model in the 33B-A3B category from [Poolside](https://poolside.ai/) and a step forward from their Laguna XS.2 model (released in April 2026). It combines...", family: "laguna", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-02", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.1, output: 0.2, cache_read: 0.05 } }, "poolside/laguna-s-2.1": { id: "poolside/laguna-s-2.1", name: "Poolside: Laguna S 2.1", description: "Laguna S 2.1 is the latest coding agent model from [Poolside](). Laguna S 2.1 is a 118B total parameter model with 8B active parameters, scoring 70.2% on Terminal-Bench 2.1 and...", family: "laguna-s", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, cost: { input: 0.1, output: 0.2, cache_read: 0.01 } }, "poolside/laguna-s-2.1:free": { id: "poolside/laguna-s-2.1:free", name: "Poolside: Laguna S 2.1 (free)", description: "Laguna S 2.1 is the latest coding agent model from [Poolside](). Laguna S 2.1 is a 118B total parameter model with 8B active parameters, scoring 70.2% on Terminal-Bench 2.1 and...", family: "laguna-s", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "poolside/laguna-xs-2.1:free": { id: "poolside/laguna-xs-2.1:free", name: "Poolside: Laguna XS 2.1 (free)", description: "Laguna XS 2.1 is the latest coding agent model in the 33B-A3B category from [Poolside](https://poolside.ai/) and a step forward from their Laguna XS.2 model (released in April 2026). It combines...", family: "laguna", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-02", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "minimax/minimax-m2-her": { id: "minimax/minimax-m2-her", name: "MiniMax: MiniMax M2-her", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-01-23", last_updated: "2026-01-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 65536, output: 2048 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "minimax/minimax-m2.7": { id: "minimax/minimax-m2.7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "minimax/minimax-m3": { id: "minimax/minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 512000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "minimax/minimax-m1": { id: "minimax/minimax-m1", name: "MiniMax: MiniMax M1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 40000 }, cost: { input: 0.4, output: 2.2 } }, "minimax/minimax-m2.5": { id: "minimax/minimax-m2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 196608 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "minimax/minimax-m2": { id: "minimax/minimax-m2", name: "MiniMax-M2", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "minimax/minimax-01": { id: "minimax/minimax-01", name: "MiniMax: MiniMax-01", description: "MiniMax multimodal coding model for long-context reasoning and agent tasks", family: "minimax", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-01-15", last_updated: "2025-01-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1000192, output: 1000192 }, cost: { input: 0.2, output: 1.1 } }, "minimax/minimax-m2.1": { id: "minimax/minimax-m2.1", name: "MiniMax-M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "deepseek/deepseek-v3.2-exp": { id: "deepseek/deepseek-v3.2-exp", name: "DeepSeek: DeepSeek V3.2 Exp", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 65536 }, cost: { input: 0.27, output: 0.41 } }, "deepseek/deepseek-v4-pro:discounted": { id: "deepseek/deepseek-v4-pro:discounted", name: "DeepSeek: DeepSeek V4 Pro (lowest price)", description: "This DeepSeek V4 Pro endpoint provides the lowest cost for multi-turn conversations for this model. This is accomplished with an exceptionally low cache read price. By using this endpoint you agree prompts and completions may be retained by DeepSeek and used to train future models.", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 384000 }, cost: { input: 0.435, output: 0.87, reasoning: 0, cache_read: 0.003625 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek model for efficient chat, coding help, and agent loops", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 393216 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "deepseek/deepseek-chat-v3-0324": { id: "deepseek/deepseek-chat-v3-0324", name: "DeepSeek: DeepSeek V3 0324", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-03-24", last_updated: "2025-03-24", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 65536 }, cost: { input: 0.27, output: 1.12, cache_read: 0.135 } }, "deepseek/deepseek-r1-distill-llama-70b": { id: "deepseek/deepseek-r1-distill-llama-70b", name: "DeepSeek: R1 Distill Llama 70B", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: false, temperature: true, release_date: "2025-01-23", last_updated: "2025-01-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 8192 }, cost: { input: 0.8, output: 0.8 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 1.6, output: 3.2, cache_read: 0.135 } }, "deepseek/deepseek-r1-0528": { id: "deepseek/deepseek-r1-0528", name: "DeepSeek: R1 0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-05-28", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 32768 }, cost: { input: 0.7, output: 2.5, cache_read: 0.35 } }, "deepseek/deepseek-v4-flash-0731": { id: "deepseek/deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "DeepSeek V4 Flash 0731 is a sparse mixture-of-experts model from DeepSeek, with 13B active parameters out of 284B total. This re-post-trained revision is suited for coding, reasoning, and agent workflows.", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "deepseek/deepseek-v3.2": { id: "deepseek/deepseek-v3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 65536 }, cost: { input: 0.269, output: 0.4, cache_read: 0.1345 } }, "deepseek/deepseek-r1": { id: "deepseek/deepseek-r1", name: "DeepSeek-R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 64000, output: 16000 }, cost: { input: 0.7, output: 2.5 } }, "deepseek/deepseek-chat": { id: "deepseek/deepseek-chat", name: "DeepSeek Chat", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-09", release_date: "2025-12-01", last_updated: "2026-02-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16000 }, cost: { input: 0.4, output: 1.3 } }, "deepseek/deepseek-v3.1-terminus": { id: "deepseek/deepseek-v3.1-terminus", name: "DeepSeek: DeepSeek V3.1 Terminus", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-22", last_updated: "2025-09-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.27, output: 1, cache_read: 0.135 } }, "deepseek/deepseek-v4-flash:discounted": { id: "deepseek/deepseek-v4-flash:discounted", name: "DeepSeek: DeepSeek V4 Flash (lowest price)", description: "This DeepSeek V4 Flash endpoint provides the lowest cost for multi-turn conversations for this model. This is accomplished with an exceptionally low cache read price. By using this endpoint you agree prompts and completions may be retained by DeepSeek and used to train future models.", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 384000 }, cost: { input: 0.14, output: 0.28, reasoning: 0, cache_read: 0.0028 } }, "deepseek/deepseek-chat-v3.1": { id: "deepseek/deepseek-chat-v3.1", name: "DeepSeek: DeepSeek V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 32768 }, cost: { input: 0.27, output: 1, cache_read: 0.135 } }, "amazon/nova-premier-v1": { id: "amazon/nova-premier-v1", name: "Amazon: Nova Premier 1.0", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "nova", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-10-31", last_updated: "2025-10-31", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32000 }, cost: { input: 2.5, output: 12.5, cache_read: 0.625 } }, "amazon/nova-2-lite-v1": { id: "amazon/nova-2-lite-v1", name: "Amazon: Nova 2 Lite", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "nova", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65535 }, cost: { input: 0.3, output: 2.5 } }, "amazon/nova-pro-v1": { id: "amazon/nova-pro-v1", name: "Amazon: Nova Pro 1.0", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "nova-pro", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 5120 }, cost: { input: 0.8, output: 3.2 } }, "amazon/nova-micro-v1": { id: "amazon/nova-micro-v1", name: "Amazon: Nova Micro 1.0", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova-micro", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 5120 }, cost: { input: 0.035, output: 0.14 } }, "amazon/nova-lite-v1": { id: "amazon/nova-lite-v1", name: "Amazon: Nova Lite 1.0", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova-lite", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 5120 }, cost: { input: 0.06, output: 0.24 } }, "~moonshotai/kimi-latest": { id: "~moonshotai/kimi-latest", name: "MoonshotAI Kimi Latest", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 2.8, output: 14, cache_read: 0.29 } }, "ibm-granite/granite-4.0-h-micro": { id: "ibm-granite/granite-4.0-h-micro", name: "IBM: Granite 4.0 Micro", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "granite", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-10-20", last_updated: "2025-10-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.017, output: 0.112 } }, "ibm-granite/granite-4.1-8b": { id: "ibm-granite/granite-4.1-8b", name: "IBM: Granite 4.1 8B", description: "Tool-capable chat model for instruction following and agentic application workflows", family: "granite", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.05, output: 0.1, cache_read: 0.05 } }, "x-ai/grok-4.20-multi-agent": { id: "x-ai/grok-4.20-multi-agent", name: "SpaceXAI: Grok 4.20 Multi-Agent", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: false, structured_output: true, temperature: true, release_date: "2026-03-31", last_updated: "2026-03-31", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "x-ai/grok-4.3": { id: "x-ai/grok-4.3", name: "Grok 4.3", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 4096 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "x-ai/grok-4.5": { id: "x-ai/grok-4.5", name: "Grok 4.5", description: "Grok 4.5 is SpaceXAI's smartest model with frontier performance on coding, knowledge work, and STEM.", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.3 } }, "x-ai/grok-build-0.1": { id: "x-ai/grok-build-0.1", name: "Grok Build 0.1", description: "Grok coding model for agentic engineering, edits, and codebase workflows", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1, output: 2, cache_read: 0.2 } }, "x-ai/grok-4.20": { id: "x-ai/grok-4.20", name: "SpaceXAI: Grok 4.20", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-31", last_updated: "2026-03-31", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "kwaipilot/kat-coder-pro-v2": { id: "kwaipilot/kat-coder-pro-v2", name: "Kwaipilot: KAT-Coder-Pro V2", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "kat-coder", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-27", last_updated: "2026-03-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 80000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "kwaipilot/kat-coder-pro-v2.5": { id: "kwaipilot/kat-coder-pro-v2.5", name: "Kwaipilot: KAT-Coder-Pro V2.5", description: "KAT-Coder-Pro V2.5 is a flagship-level Agentic Coding model that can directly hand over an entire issue or an entire business workflow to it, allowing it to autonomously locate and make...", family: "kat-coder", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-10", last_updated: "2026-07-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 80000 }, cost: { input: 0.74, output: 2.96, cache_read: 0.15 } }, "kwaipilot/kat-coder-air-v2.5": { id: "kwaipilot/kat-coder-air-v2.5", name: "Kwaipilot: KAT-Coder-Air V2.5", description: "KAT-Coder-Air V2.5 is a flagship-level Agentic Coding model that can directly hand over an entire issue or an entire business workflow to it, allowing it to autonomously locate and make...", family: "kat-coder", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-10", last_updated: "2026-07-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 80000 }, cost: { input: 0.15, output: 0.6, cache_read: 0.03 } }, "sao10k/l3.1-euryale-70b": { id: "sao10k/l3.1-euryale-70b", name: "Sao10K: Llama 3.1 Euryale 70B v2.2", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-08-28", last_updated: "2024-08-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0.85, output: 0.85 } }, "sao10k/l3.3-euryale-70b": { id: "sao10k/l3.3-euryale-70b", name: "Sao10K: Llama 3.3 Euryale 70B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-12-18", last_updated: "2024-12-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0.65, output: 0.75 } }, "sao10k/l3-lunaris-8b": { id: "sao10k/l3-lunaris-8b", name: "Sao10K: Llama 3 8B Lunaris", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-08-13", last_updated: "2024-08-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 16384 }, cost: { input: 0.04, output: 0.05 } }, "openrouter/pareto-code": { id: "openrouter/pareto-code", name: "Pareto Code Router", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-21", last_updated: "2026-05-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 65536 }, cost: { input: 0, output: 0 } }, "openrouter/bodybuilder": { id: "openrouter/bodybuilder", name: "Body Builder (beta)", description: "Preview model for early access evaluation, prototyping, and compatibility testing", attachment: false, reasoning: false, tool_call: false, release_date: "2026-03-15", last_updated: "2026-03-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32768 }, status: "beta", cost: { input: 0, output: 0 } }, "openrouter/free": { id: "openrouter/free", name: "OpenRouter Free Models Router", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-01", last_updated: "2026-02-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32768 }, cost: { input: 0, output: 0 } }, "openrouter/auto": { id: "openrouter/auto", name: "Auto Router", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-15", last_updated: "2026-03-15", modalities: { input: ["audio", "image", "pdf", "text", "video"], output: ["image", "text"] }, open_weights: false, limit: { context: 2000000, output: 32768 }, cost: { input: 0, output: 0 } }, "aion-labs/aion-2.0": { id: "aion-labs/aion-2.0", name: "AionLabs: Aion-2.0", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.8, output: 1.6, cache_read: 0.2 } }, "aion-labs/aion-3.0-mini": { id: "aion-labs/aion-3.0-mini", name: "AionLabs: Aion-3.0-Mini", description: "Aion-3.0 Mini is a multi-model roleplaying and storytelling system from AionLabs, built on the DeepSeek family of models. It uses a collaborative generation process in which multiple specialized models each...", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-07", last_updated: "2026-07-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.7, output: 1.4, cache_read: 0.18 } }, "aion-labs/aion-rp-llama-3.1-8b": { id: "aion-labs/aion-rp-llama-3.1-8b", name: "AionLabs: Aion-RP 1.0 (8B)", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-02-04", last_updated: "2025-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.8, output: 1.6 } }, "aion-labs/aion-3.0": { id: "aion-labs/aion-3.0", name: "AionLabs: Aion-3.0", description: "Aion-3.0 is a multi-model roleplaying and storytelling system from AionLabs, built on the GLM family of models. It uses a collaborative generation process in which multiple specialized models each contribute...", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-07", last_updated: "2026-07-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 3, output: 6, cache_read: 0.75 } }, "xiaomi/mimo-v2.5": { id: "xiaomi/mimo-v2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028, tiers: [{ input: 0.8, output: 4, cache_read: 0.16, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.8, output: 4, cache_read: 0.16 } } }, "xiaomi/mimo-v2.5-pro": { id: "xiaomi/mimo-v2.5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.4, output: 1.5, cache_read: 0.08, tiers: [{ input: 2, output: 6, cache_read: 0.4, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.4 } } }, "writer/palmyra-x5": { id: "writer/palmyra-x5", name: "Writer: Palmyra X5", description: "General-purpose chat model for instruction following, writing, and analysis", family: "palmyra", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-01-21", last_updated: "2026-01-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1040000, output: 8192 }, cost: { input: 0.6, output: 6 } }, "anthropic/claude-sonnet-4.6": { id: "anthropic/claude-sonnet-4.6", name: "Claude Sonnet 4.6", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-fable-5": { id: "anthropic/claude-fable-5", name: "Claude Fable 5", description: "Claude Fable 5 is a Mythos-class model from Anthropic, built for autonomous knowledge work and coding. It supports text, image, and file inputs with text output, with reasoning support and...", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4.8-fast": { id: "anthropic/claude-opus-4.8-fast", name: "Claude Opus 4.8", description: "Fast-mode variant of [Opus 4.8](/anthropic/claude-opus-4.8) - identical capabilities with higher output speed at 2x pricing relative to regular Opus 4.8. Learn more in Anthropic's docs: https://platform.claude.com/docs/en/build-with-claude/fast-mode", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4.1": { id: "anthropic/claude-opus-4.1", name: "Claude Opus 4.1 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-opus-4.5": { id: "anthropic/claude-opus-4.5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4.7": { id: "anthropic/claude-opus-4.7", name: "Claude Opus 4.7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-4.5": { id: "anthropic/claude-sonnet-4.5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-3-haiku": { id: "anthropic/claude-3-haiku", name: "Anthropic: Claude 3 Haiku", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2024-03-13", last_updated: "2024-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, cost: { input: 0.25, output: 1.25, cache_read: 0.03, cache_write: 0.3 } }, "anthropic/claude-opus-5-fast": { id: "anthropic/claude-opus-5-fast", name: "Claude Opus 5", description: "Fast-mode variant of [Opus 5](/anthropic/claude-opus-5) - identical capabilities with higher output speed at 2x pricing relative to regular Opus 5. Learn more in Anthropic's docs: https://platform.claude.com/docs/en/build-with-claude/fast-mode", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-sonnet-4": { id: "anthropic/claude-sonnet-4", name: "Anthropic: Claude Sonnet 4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-haiku-4.5": { id: "anthropic/claude-haiku-4.5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "anthropic/claude-opus-4": { id: "anthropic/claude-opus-4", name: "Anthropic: Claude Opus 4 ($$$$)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-opus-4.8": { id: "anthropic/claude-opus-4.8", name: "Claude Opus 4.8", description: "Claude Opus 4.8 is Anthropic's most capable generally available model in the Opus family. It supports text, image, and file inputs with text output, with reasoning support and a 1M-token...", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-5": { id: "anthropic/claude-sonnet-5", name: "Claude Sonnet 5", description: "Sonnet 5 is Anthropic's most capable Sonnet-class model, with frontier performance across coding, agents, and professional work. It supports adaptive thinking with selectable reasoning effort levels (low, medium, high, max,...", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "anthropic/claude-opus-5": { id: "anthropic/claude-opus-5", name: "Claude Opus 5", description: "Claude Opus 5 is Anthropic\u2019s flagship model for demanding reasoning, coding, and long-horizon agentic work. It is particularly strong at end-to-end software tasks, code review and bug finding, visual analysis...", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4.6": { id: "anthropic/claude-opus-4.6", name: "Claude Opus 4.6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4.7-fast": { id: "anthropic/claude-opus-4.7-fast", name: "Claude Opus 4.7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 } }, "~anthropic/claude-sonnet-latest": { id: "~anthropic/claude-sonnet-latest", name: "Anthropic Claude Sonnet Latest", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "~anthropic/claude-opus-latest": { id: "~anthropic/claude-opus-latest", name: "Anthropic: Claude Opus Latest", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "~anthropic/claude-haiku-latest": { id: "~anthropic/claude-haiku-latest", name: "Anthropic Claude Haiku Latest", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "~anthropic/claude-fable-latest": { id: "~anthropic/claude-fable-latest", name: "Anthropic: Claude Fable Latest ($$$$)", description: "This model always redirects to the latest model in the Claude Fable family.", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "z-ai/glm-4.6v": { id: "z-ai/glm-4.6v", name: "GLM-4.6V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.3, output: 0.9, cache_read: 0.055 } }, "z-ai/glm-5": { id: "z-ai/glm-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.2 } }, "z-ai/glm-4.5-air": { id: "z-ai/glm-4.5-air", name: "GLM-4.5-Air", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.13, output: 0.85, cache_read: 0.025 } }, "z-ai/glm-5.1": { id: "z-ai/glm-5.1", name: "GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 1.38, output: 4.4, cache_read: 0.26 } }, "z-ai/glm-4.7-flash": { id: "z-ai/glm-4.7-flash", name: "GLM-4.7-Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 16384 }, cost: { input: 0.07, output: 0.4, cache_read: 0.01 } }, "z-ai/glm-5.2": { id: "z-ai/glm-5.2", name: "GLM-5.2", description: "GLM 5.2 is a large-scale reasoning model from Z.ai. It supports text input and output with a 1M-token context window, and is suited for long-horizon agent workflows, project-level software engineering,...", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1024000, output: 128000 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "z-ai/glm-4.6": { id: "z-ai/glm-4.6", name: "GLM-4.6", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 0.55, output: 2.2, cache_read: 0.11 } }, "z-ai/glm-4.5": { id: "z-ai/glm-4.5", name: "GLM-4.5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "z-ai/glm-4.5v": { id: "z-ai/glm-4.5v", name: "GLM-4.5V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 16384 }, cost: { input: 0.6, output: 1.8, cache_read: 0.11 } }, "z-ai/glm-4.7": { id: "z-ai/glm-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "z-ai/glm-5-turbo": { id: "z-ai/glm-5-turbo", name: "GLM-5-Turbo", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24 } }, "z-ai/glm-5v-turbo": { id: "z-ai/glm-5v-turbo", name: "GLM-5V-Turbo", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24 } }, "perplexity/sonar-pro-search": { id: "perplexity/sonar-pro-search", name: "Perplexity: Sonar Pro Search", description: "Advanced Sonar search model for deeper research and cited synthesis", family: "sonar-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: false, structured_output: true, temperature: true, release_date: "2025-10-30", last_updated: "2025-10-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8000 }, cost: { input: 3, output: 15 } }, "perplexity/sonar-deep-research": { id: "perplexity/sonar-deep-research", name: "Perplexity: Sonar Deep Research", description: "Sonar search model for current answers, retrieval, and citation-backed chat", family: "sonar-deep-research", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: false, temperature: true, release_date: "2025-03-07", last_updated: "2025-03-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 25600 }, cost: { input: 2, output: 8, reasoning: 3 } }, "perplexity/sonar": { id: "perplexity/sonar", name: "Perplexity: Sonar", description: "Sonar search model for current answers, retrieval, and citation-backed chat", family: "sonar", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-01-27", last_updated: "2025-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 127072, output: 25415 }, cost: { input: 1, output: 1 } }, "perplexity/sonar-pro": { id: "perplexity/sonar-pro", name: "Perplexity: Sonar Pro", description: "Advanced Sonar search model for deeper research and cited synthesis", family: "sonar-pro", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-03-07", last_updated: "2025-03-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8000 }, cost: { input: 3, output: 15 } }, "perplexity/sonar-reasoning-pro": { id: "perplexity/sonar-reasoning-pro", name: "Perplexity: Sonar Reasoning Pro", description: "Web-grounded reasoning model for multi-step research and cited answers", family: "sonar-reasoning", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: false, temperature: true, release_date: "2025-03-07", last_updated: "2025-03-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 25600 }, cost: { input: 2, output: 8 } }, "moonshotai/kimi-k2.5": { id: "moonshotai/kimi-k2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "moonshotai/kimi-k2.6": { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.8, output: 3.4, cache_read: 0.16 } }, "moonshotai/kimi-k2.7-code": { id: "moonshotai/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "MoonshotAI: Kimi K2.7 Code is a coding-focused model in Moonshot AI's Kimi K2 family, built to complete end-to-end programming tasks reliably over long contexts. It uses a native multimodal mixture-of-experts...", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "moonshotai/kimi-k2": { id: "moonshotai/kimi-k2", name: "MoonshotAI: Kimi K2 0711", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-07-11", last_updated: "2025-07-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 100352 }, cost: { input: 0.57, output: 2.3 } }, "moonshotai/kimi-k2-thinking": { id: "moonshotai/kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-08", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 100352 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "moonshotai/kimi-k3": { id: "moonshotai/kimi-k3", name: "Kimi K3", description: "Kimi K3 is a 2.8T parameter open-weight multimodal reasoning model from Moonshot AI. It is suited for complex coding, knowledge work, and long-horizon agentic workflows, and is particularly strong at...", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "moonshotai/kimi-k2-0905": { id: "moonshotai/kimi-k2-0905", name: "MoonshotAI: Kimi K2 0905", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-04", last_updated: "2025-09-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 100352 }, cost: { input: 0.6, output: 2.5 } }, "openai/gpt-5.1-codex-mini": { id: "openai/gpt-5.1-codex-mini", name: "GPT-5.1 Codex mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.03 } }, "openai/gpt-chat-latest": { id: "openai/gpt-chat-latest", name: "OpenAI: GPT Chat Latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2026-05-05", last_updated: "2026-05-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "openai/gpt-5.2-pro": { id: "openai/gpt-5.2-pro", name: "GPT-5.2 Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 21, output: 168 } }, "openai/gpt-5.5-pro": { id: "openai/gpt-5.5-pro", name: "GPT-5.5 Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180 } }, "openai/gpt-4.1-mini": { id: "openai/gpt-4.1-mini", name: "GPT-4.1 mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "openai/gpt-4o": { id: "openai/gpt-4o", name: "GPT-4o", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.4-pro": { id: "openai/gpt-5.4-pro", name: "GPT-5.4 Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180 } }, "openai/gpt-audio-mini": { id: "openai/gpt-audio-mini", name: "OpenAI: GPT Audio Mini", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text", "audio", "pdf"], output: ["text", "audio"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.6, output: 2.4 } }, "openai/gpt-5.6-sol": { id: "openai/gpt-5.6-sol", name: "GPT-5.6 Sol", description: "GPT-5.6 Sol is the flagship model in OpenAI's GPT-5.6 series. It is suited for complex reasoning, coding, and agentic workflows, and is particularly strong at command-line and multi-step coding tasks...", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "openai/o3-mini-high": { id: "openai/o3-mini-high", name: "OpenAI: o3 Mini High", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2025-02-12", last_updated: "2025-02-12", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-4o-mini-2024-07-18": { id: "openai/gpt-4o-mini-2024-07-18", name: "OpenAI: GPT-4o-mini (2024-07-18)", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "openai/gpt-4.1-nano": { id: "openai/gpt-4.1-nano", name: "GPT-4.1 nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.03, output: 0.13, cache_read: 0.03 } }, "openai/gpt-oss-safeguard-20b": { id: "openai/gpt-oss-safeguard-20b", name: "OpenAI: gpt-oss-safeguard-20b", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-29", last_updated: "2025-10-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 65536 }, cost: { input: 0.075, output: 0.3, cache_read: 0.0375 } }, "openai/o3-mini": { id: "openai/o3-mini", name: "o3-mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-5.6-sol-pro": { id: "openai/gpt-5.6-sol-pro", name: "GPT-5.6 Sol", description: "GPT-5.6 Sol Pro is the same underlying model as [GPT-5.6 Sol](https://openrouter.ai/openai/gpt-5.6-sol), served with `reasoning.mode` set to `pro` for higher-quality responses on complex tasks. Learn more in OpenAI's docs: https://developers.openai.com/api/docs/guides/reasoning#reasoning-mode", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "openai/gpt-3.5-turbo-0613": { id: "openai/gpt-3.5-turbo-0613", name: "OpenAI: GPT-3.5 Turbo (older v0613)", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 4095, output: 4096 }, cost: { input: 1, output: 2 } }, "openai/o3-pro": { id: "openai/o3-pro", name: "o3-pro", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-06-10", last_updated: "2025-06-10", modalities: { input: ["text", "pdf", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 20, output: 80 } }, "openai/gpt-4o-mini": { id: "openai/gpt-4o-mini", name: "GPT-4o mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT-5", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-audio": { id: "openai/gpt-audio", name: "OpenAI: GPT Audio", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text", "audio", "pdf"], output: ["text", "audio"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10 } }, "openai/o4-mini-high": { id: "openai/o4-mini-high", name: "OpenAI: o4 Mini High", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.275 } }, "openai/gpt-3.5-turbo": { id: "openai/gpt-3.5-turbo", name: "GPT-3.5-turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2021-09-01", release_date: "2023-03-01", last_updated: "2023-11-06", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 16385, output: 4096 }, cost: { input: 0.5, output: 1.5 } }, "openai/gpt-4o-2024-05-13": { id: "openai/gpt-4o-2024-05-13", name: "GPT-4o (2024-05-13)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-05-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 5, output: 15 } }, "openai/gpt-4o-2024-11-20": { id: "openai/gpt-4o-2024-11-20", name: "GPT-4o (2024-11-20)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-11-20", last_updated: "2024-11-20", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT-5.4", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25 } }, "openai/gpt-5.6-luna-pro": { id: "openai/gpt-5.6-luna-pro", name: "GPT-5.6 Luna", description: "GPT-5.6 Luna Pro is the same underlying model as [GPT-5.6 Luna](https://openrouter.ai/openai/gpt-5.6-luna), served with `reasoning.mode` set to `pro` for higher-quality responses on complex tasks. Learn more in OpenAI's docs: https://developers.openai.com/api/docs/guides/reasoning#reasoning-mode", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, cache_write: 0.25 } }, "openai/gpt-5.2-chat": { id: "openai/gpt-5.2-chat", name: "OpenAI: GPT-5.2 Chat (retires Aug 10)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2025-12-10", last_updated: "2025-12-10", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.2-codex": { id: "openai/gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT-5.4 nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "openai/gpt-5-pro": { id: "openai/gpt-5-pro", name: "GPT-5 Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 15, output: 120 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT-5.4 mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.03, output: 0.17, cache_read: 0.03 } }, "openai/gpt-3.5-turbo-16k": { id: "openai/gpt-3.5-turbo-16k", name: "OpenAI: GPT-3.5 Turbo 16k", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2023-08-28", last_updated: "2023-08-28", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 16385, output: 4096 }, cost: { input: 3, output: 4 } }, "openai/o1": { id: "openai/o1", name: "o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2023-09", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 15, output: 60, cache_read: 7.5 } }, "openai/gpt-5.6-luna": { id: "openai/gpt-5.6-luna", name: "GPT-5.6 Luna", description: "GPT-5.6 Luna is a fast, cost-efficient model in OpenAI's GPT-5.6 series. It is suited for high-volume, latency-sensitive tasks such as chat, classification, and lightweight agentic workflows, providing capable reasoning for...", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, cache_write: 0.25 } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.3-codex": { id: "openai/gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT-5 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/gpt-5.3-chat": { id: "openai/gpt-5.3-chat", name: "OpenAI: GPT-5.3 Chat (retires Aug 10)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/o1-pro": { id: "openai/o1-pro", name: "o1-pro", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: true, temperature: false, knowledge: "2023-09", release_date: "2025-03-19", last_updated: "2025-03-19", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 150, output: 600 } }, "openai/gpt-5-image": { id: "openai/gpt-5-image", name: "OpenAI: GPT-5 Image ($$$$)", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: false, structured_output: true, temperature: true, release_date: "2025-10-14", last_updated: "2025-10-14", modalities: { input: ["image", "text", "pdf"], output: ["image", "text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 10, output: 10, cache_read: 1.25 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT-5.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4-turbo-preview": { id: "openai/gpt-4-turbo-preview", name: "OpenAI: GPT-4 Turbo Preview ($$$$)", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 10, output: 30 } }, "openai/gpt-4-turbo": { id: "openai/gpt-4-turbo", name: "GPT-4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 10, output: 30 } }, "openai/gpt-4o-2024-08-06": { id: "openai/gpt-4o-2024-08-06", name: "GPT-4o (2024-08-06)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-08-06", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.4-image-2": { id: "openai/gpt-5.4-image-2", name: "OpenAI: GPT-5.4 Image 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: false, structured_output: true, temperature: false, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["image", "text", "pdf"], output: ["image", "text"] }, open_weights: false, limit: { context: 272000, output: 128000 }, cost: { input: 8, output: 15, cache_read: 2 } }, "openai/gpt-5.1-codex": { id: "openai/gpt-5.1-codex", name: "GPT-5.1 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "openai/gpt-5-nano": { id: "openai/gpt-5-nano", name: "GPT-5 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "openai/o3": { id: "openai/o3", name: "o3", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/gpt-3.5-turbo-instruct": { id: "openai/gpt-3.5-turbo-instruct", name: "OpenAI: GPT-3.5 Turbo Instruct", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2023-09-28", last_updated: "2023-09-28", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 4095, output: 4096 }, cost: { input: 1.5, output: 2 } }, "openai/gpt-5.6-terra": { id: "openai/gpt-5.6-terra", name: "GPT-5.6 Terra", description: "GPT-5.6 Terra is a balanced model in OpenAI's GPT-5.6 series, positioned between the flagship Sol tier and the cost-efficient Luna tier. It is suited for everyday coding, reasoning, and agentic...", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 2.5 } }, "openai/gpt-5-image-mini": { id: "openai/gpt-5-image-mini", name: "OpenAI: GPT-5 Image Mini", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: false, structured_output: true, temperature: true, release_date: "2025-10-16", last_updated: "2025-10-16", modalities: { input: ["pdf", "image", "text"], output: ["image", "text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 2.5, output: 2, cache_read: 0.25 } }, "openai/gpt-5.6-terra-pro": { id: "openai/gpt-5.6-terra-pro", name: "GPT-5.6 Terra", description: "GPT-5.6 Terra Pro is the same underlying model as [GPT-5.6 Terra](https://openrouter.ai/openai/gpt-5.6-terra), served with `reasoning.mode` set to `pro` for higher-quality responses on complex tasks. Learn more in OpenAI's docs: https://developers.openai.com/api/docs/guides/reasoning#reasoning-mode", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 2.5 } }, "openai/gpt-4.1": { id: "openai/gpt-4.1", name: "GPT-4.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/o4-mini": { id: "openai/o4-mini", name: "o4-mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.275 } }, "openai/gpt-5.1-codex-max": { id: "openai/gpt-5.1-codex-max", name: "GPT-5.1 Codex Max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4": { id: "openai/gpt-4", name: "GPT-4", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-11", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 8191, output: 4096 }, cost: { input: 30, output: 60 } }, "baidu/ernie-4.5-vl-424b-a47b": { id: "baidu/ernie-4.5-vl-424b-a47b", name: "Baidu: ERNIE 4.5 VL 424B A47B ", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "ernie", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: false, temperature: true, release_date: "2025-06-30", last_updated: "2025-06-30", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: false, limit: { context: 123000, output: 16000 }, cost: { input: 0.42, output: 1.25 } }, "meta-llama/llama-3.1-70b-instruct": { id: "meta-llama/llama-3.1-70b-instruct", name: "Meta: Llama 3.1 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0.4, output: 0.4 } }, "meta-llama/llama-guard-4-12b": { id: "meta-llama/llama-guard-4-12b", name: "Meta: Llama Guard 4 12B", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "llama", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-04-30", last_updated: "2025-04-30", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 16384 }, cost: { input: 0.18, output: 0.18 } }, "meta-llama/llama-3.2-1b-instruct": { id: "meta-llama/llama-3.2-1b-instruct", name: "Meta: Llama 3.2 1B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 60000, output: 60000 }, cost: { input: 0.027, output: 0.201 } }, "meta-llama/llama-3.3-70b-instruct": { id: "meta-llama/llama-3.3-70b-instruct", name: "Llama-3.3-70B-Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.1, output: 0.32 } }, "meta-llama/llama-4-maverick": { id: "meta-llama/llama-4-maverick", name: "Meta: Llama 4 Maverick", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 16384 }, cost: { input: 0.2, output: 0.696 } }, "meta-llama/llama-4-scout": { id: "meta-llama/llama-4-scout", name: "Meta: Llama 4 Scout", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 327680, output: 16384 }, cost: { input: 0.1, output: 0.3 } }, "meta-llama/llama-3.2-3b-instruct": { id: "meta-llama/llama-3.2-3b-instruct", name: "Meta: Llama 3.2 3B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.05, output: 0.33 } }, "meta-llama/llama-3.1-8b-instruct": { id: "meta-llama/llama-3.1-8b-instruct", name: "Meta: Llama 3.1 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.02, output: 0.04 } }, "arcee-ai/virtuoso-large": { id: "arcee-ai/virtuoso-large", name: "Arcee AI: Virtuoso Large", description: "Flagship model for demanding analysis, coding, and production agent workflows", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-05-05", last_updated: "2025-05-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 64000 }, cost: { input: 0.75, output: 1.2 } }, "arcee-ai/trinity-large-thinking": { id: "arcee-ai/trinity-large-thinking", name: "Arcee AI: Trinity Large Thinking", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "trinity", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.22, output: 0.85, cache_read: 0.06 } }, "bytedance-seed/seed-1.6": { id: "bytedance-seed/seed-1.6", name: "ByteDance Seed: Seed 1.6", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.25, output: 2 } }, "bytedance-seed/seed-2.0-mini": { id: "bytedance-seed/seed-2.0-mini", name: "ByteDance Seed: Seed-2.0-Mini", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 131072 }, cost: { input: 0.1, output: 0.4 } }, "bytedance-seed/seed-1.6-flash": { id: "bytedance-seed/seed-1.6-flash", name: "ByteDance Seed: Seed 1.6 Flash", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.075, output: 0.3 } }, "bytedance-seed/seed-2.0-lite": { id: "bytedance-seed/seed-2.0-lite", name: "ByteDance Seed: Seed-2.0-Lite", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-10", last_updated: "2026-03-10", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 131072 }, cost: { input: 0.25, output: 2 } }, "kilo-auto/balanced": { id: "kilo-auto/balanced", name: "Auto Balanced", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "1970-01-01", last_updated: "1970-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.325, output: 1.95, reasoning: 0, cache_read: 0.0325, cache_write: 0.40625 } }, "kilo-auto/small": { id: "kilo-auto/small", name: "Auto Small", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "1970-01-01", last_updated: "1970-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.05, output: 0.4, reasoning: 0, cache_read: 0.005 } }, "kilo-auto/free": { id: "kilo-auto/free", name: "Auto Free", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "1970-01-01", last_updated: "1970-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 1e4 }, cost: { input: 0, output: 0, reasoning: 0, cache_read: 0, cache_write: 0 } }, "kilo-auto/frontier": { id: "kilo-auto/frontier", name: "Auto Frontier", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "1970-01-01", last_updated: "1970-01-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, reasoning: 0, cache_read: 0.5, cache_write: 6.25 } }, "kilo-auto/efficient": { id: "kilo-auto/efficient", name: "Auto Efficient", description: "Routes each request to the cheapest model that gets the job done, based on continuously benchmarked accuracy and cost.", family: "auto", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "1970-01-01", last_updated: "1970-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.325, output: 1.95, reasoning: 0, cache_read: 0.0325, cache_write: 0.40625 } }, "stepfun/step-3.7-flash:free": { id: "stepfun/step-3.7-flash:free", name: "StepFun: Step 3.7 Flash (free)", description: "Step 3.7 Flash is StepFun's latest high-efficiency multimodal Mixture-of-Experts model. It pairs a 196B-parameter language backbone with a vision encoder for native image and video understanding, activating roughly 11B parameters per token. The model supports a 256K context window and exposes selectable reasoning levels (high/medium/low), letting callers trade off speed, cost, and depth of reasoning. Designed for coding, agentic workflows, structured outputs, and long-context productivity tasks.", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0, reasoning: 0, cache_read: 0 } }, "stepfun/step-3.5-flash": { id: "stepfun/step-3.5-flash", name: "Step 3.5 Flash", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-01-29", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.1, output: 0.3 } }, "stepfun/step-3.7-flash": { id: "stepfun/step-3.7-flash", name: "Step 3.7 Flash", description: "Step 3.7 Flash is StepFun's latest high-efficiency multimodal Mixture-of-Experts model. It pairs a 196B-parameter language backbone with a vision encoder for native image and video understanding, activating roughly 11B parameters...", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0.2, output: 1.15, cache_read: 0.04 } }, "anthracite-org/magnum-v4-72b": { id: "anthracite-org/magnum-v4-72b", name: "Magnum v4 72B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 2048 }, cost: { input: 3, output: 5 } } } }, "merge-gateway": { id: "merge-gateway", env: ["MERGE_GATEWAY_API_KEY"], npm: "merge-gateway-ai-sdk-provider", name: "Merge Gateway", doc: "https://docs.merge.dev/merge-gateway", models: { "cohere/command-r-08-2024": { id: "cohere/command-r-08-2024", name: "Command R 08-2024", description: "Cohere retrieval model for long-context chat and enterprise RAG workflows", family: "command-r", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-08-30", last_updated: "2024-08-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 0.15, output: 0.6 } }, "cohere/command-a-03-2025": { id: "cohere/command-a-03-2025", name: "Command A 03-2025", description: "Cohere command model for multilingual enterprise agents, tools, and chat", family: "command-a", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06-01", release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8000 }, cost: { input: 2.5, output: 10 } }, "cohere/command-r-plus-08-2024": { id: "cohere/command-r-plus-08-2024", name: "Command R+ 08-2024", description: "Cohere's RAG workhorse for long-context enterprise search and tool use", family: "command-r", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-08-30", last_updated: "2024-08-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 2.5, output: 10 } }, "cohere/command-r7b-12-2024": { id: "cohere/command-r7b-12-2024", name: "Command R7B 12-2024", description: "Cohere retrieval model for long-context chat and enterprise RAG workflows", family: "command-r", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-12-02", last_updated: "2024-12-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 0.0375, output: 0.15 } }, "nvidia/nemotron-nano-9b-v2": { id: "nvidia/nemotron-nano-9b-v2", name: "Nemotron Nano 9B", description: "Compact Nemotron model for efficient reasoning and deployable AI agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-18", last_updated: "2025-08-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.06, output: 0.23 } }, "google/gemini-2.5-computer-use-preview-10-2025": { id: "google/gemini-2.5-computer-use-preview-10-2025", name: "Gemini 2.5 Computer Use Preview (10-2025)", description: "Specialized Gemini 2.5 model for browser-control agents that automate UI tasks", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2025-10-07", last_updated: "2025-10-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, cost: { input: 1.25, output: 10 } }, "google/gemini-flash-latest": { id: "google/gemini-flash-latest", name: "Gemini Flash Latest", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, input_audio: 1.5 } }, "google/gemini-3.5-flash": { id: "google/gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, input_audio: 1.5 } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, input_audio: 1 } }, "google/gemini-3.5-flash-lite": { id: "google/gemini-3.5-flash-lite", name: "Gemini 3.5 Flash-Lite", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "google/gemini-3.1-flash-lite-preview": { id: "google/gemini-3.1-flash-lite-preview", name: "Gemini 3.1 Flash Lite Preview", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "google/gemini-3-flash-preview": { id: "google/gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, input_audio: 1 } }, "google/gemini-3.1-pro-preview-customtools": { id: "google/gemini-3.1-pro-preview-customtools", name: "Gemini 3.1 Pro Preview Custom Tools", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "google/gemma-4-26b-a4b-it": { id: "google/gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.13, output: 0.4 } }, "google/gemini-embedding-001": { id: "google/gemini-embedding-001", name: "Gemini Embedding 001", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "gemini", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, knowledge: "2025-05", release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 2048, output: 4096 }, cost: { input: 0.15, output: 0 } }, "google/gemini-3.6-flash": { id: "google/gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15 } }, "google/gemini-3.1-flash-lite": { id: "google/gemini-3.1-flash-lite", name: "Gemini 3.1 Flash-Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "google/gemma-4-31b-it": { id: "google/gemma-4-31b-it", name: "Gemma 4 31B It", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.14, output: 0.4 } }, "google/gemini-3.1-flash-image": { id: "google/gemini-3.1-flash-image", name: "Gemini 3.1 Flash Image", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.5, output: 3 } }, "google/gemini-2.5-flash-image": { id: "google/gemini-2.5-flash-image", name: "Gemini 2.5 Flash Image", description: "Nano Banana image model for fast generation, edits, and character-consistent assets", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2024-06", release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.3, output: 2.5 } }, "google/gemini-3-pro-image": { id: "google/gemini-3-pro-image", name: "Gemini 3 Pro Image", description: "Nano Banana Pro for higher-fidelity image generation and design-heavy edits", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 65536 }, cost: { input: 2, output: 12 } }, "google/gemini-3.1-pro-preview": { id: "google/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "google/gemini-flash-lite-latest": { id: "google/gemini-flash-lite-latest", name: "Gemini Flash-Lite Latest", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "google/gemini-3-pro-preview": { id: "google/gemini-3-pro-preview", name: "Gemini 3 Pro Preview", description: "Preview Gemini flagship for complex reasoning, coding, and rich multimodal prompts", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "google/gemini-2.5-flash-lite": { id: "google/gemini-2.5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 512, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01, input_audio: 0.3 } }, "thinkingmachines/inkling": { id: "thinkingmachines/inkling", name: "Inkling", description: "Multimodal MoE reasoning model (975B total, 41B active) for text, image, and audio", family: "ling", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048000, output: 32000 }, cost: { input: 1, output: 4.05, cache_read: 0.17 } }, "sakana/fugu-ultra": { id: "sakana/fugu-ultra", name: "Fugu Ultra", description: "Quality-first multi-agent model for hard research, analysis, and competitions", family: "fugu", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: false, release_date: "2026-06-15", last_updated: "2026-06-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 250000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "qwen/qwen3-coder-480b-a35b-instruct": { id: "qwen/qwen3-coder-480b-a35b-instruct", name: "Qwen3-Coder 480B-A35B Instruct", description: "Open Qwen coding heavyweight for repository reasoning and agentic engineering", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.22, output: 1.8 } }, "qwen/qwen3.7-plus": { id: "qwen/qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.4, output: 1.6 } }, "qwen/qwen3-vl-plus": { id: "qwen/qwen3-vl-plus", name: "Qwen3-VL Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.143, output: 1.434, cache_read: 0.0286 } }, "qwen/qwen3-32b": { id: "qwen/qwen3-32b", name: "Qwen3 32B", description: "Dense open Qwen model for self-hosted chat, reasoning, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 0.6 } }, "qwen/qwen3.6-35b-a3b": { id: "qwen/qwen3.6-35b-a3b", name: "Qwen3.6 35B A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.248, output: 1.485, cache_read: 0.0496 } }, "qwen/qwen3.5-plus": { id: "qwen/qwen3.5-plus", name: "Qwen3.5 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 250000 }, cost: { input: 0.115, output: 0.688, cache_read: 0.023 } }, "qwen/qwen3.5-27b": { id: "qwen/qwen3.5-27b", name: "Qwen3.5 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.086, output: 0.688, cache_read: 0.0172 } }, "qwen/qwen3.7-max": { id: "qwen/qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 250000 }, cost: { input: 0.825, output: 2.4755, cache_read: 0.165 } }, "qwen/qwen3-next-80b-a3b-thinking": { id: "qwen/qwen3-next-80b-a3b-thinking", name: "Qwen3-Next 80B-A3B (Thinking)", description: "Efficient Qwen thinking model for local reasoning, math, and coding agents", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 1.2 } }, "qwen/qwen3.5-9b": { id: "qwen/qwen3.5-9b", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.09, output: 0.13 } }, "qwen/qwen3.6-27b": { id: "qwen/qwen3.6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.289, output: 2.4 } }, "qwen/qwen3.5-35b-a3b": { id: "qwen/qwen3.5-35b-a3b", name: "Qwen3.5 35B A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0.057, output: 0.459, cache_read: 0.020357 } }, "qwen/qwen3-235b-a22b": { id: "qwen/qwen3-235b-a22b", name: "Qwen3 235B A22B", description: "Large open Qwen MoE for multilingual reasoning, coding, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.287, output: 1.147, cache_read: 0.0574 } }, "qwen/qwen3-max": { id: "qwen/qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen3 model for coding agents, complex reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.359, output: 1.434, cache_read: 0.0718 } }, "qwen/qwen3-coder-plus": { id: "qwen/qwen3-coder-plus", name: "Qwen3 Coder Plus", description: "Hosted Qwen coder for software agents, repo edits, and long-context code", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 250000 }, cost: { input: 0.574, output: 2.294, cache_read: 0.1148 } }, "qwen/qwen3.8-max": { id: "qwen/qwen3.8-max", name: "Qwen3.8 Max", description: "2.4-trillion-parameter MoE flagship for coding, professional work, multimodal understanding, and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 2, output: 6, cache_read: 0.25 } }, "qwen/qwen3-coder-flash": { id: "qwen/qwen3-coder-flash", name: "Qwen3 Coder Flash", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 250000 }, cost: { input: 0.144, output: 0.574, cache_read: 0.0288 } }, "qwen/qwen-flash": { id: "qwen/qwen-flash", name: "Qwen Flash", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2024-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 250000 }, cost: { input: 0.022, output: 0.216, cache_read: 0.0044 } }, "qwen/qwen-plus": { id: "qwen/qwen-plus", name: "Qwen Plus", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2024-04", release_date: "2024-01-25", last_updated: "2025-09-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 250000 }, cost: { input: 0.115, output: 0.287, cache_read: 0.023 } }, "qwen/qwen3.6-flash": { id: "qwen/qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 250000 }, cost: { input: 0.165, output: 0.99, cache_read: 0.033 } }, "qwen/qwen3.5-397b-a17b": { id: "qwen/qwen3.5-397b-a17b", name: "Qwen3.5 397B A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.172, output: 1.032, cache_read: 0.0344 } }, "qwen/qwen3.6-max-preview": { id: "qwen/qwen3.6-max-preview", name: "Qwen3.6 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 65536 }, cost: { input: 1.31, output: 7.88 } }, "qwen/qwen3.6-plus": { id: "qwen/qwen3.6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 250000 }, cost: { input: 0.276, output: 1.651, cache_read: 0.0552 } }, "qwen/qwen3.5-122b-a10b": { id: "qwen/qwen3.5-122b-a10b", name: "Qwen3.5 122B A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.115, output: 0.917, cache_read: 0.023 } }, "qwen/qwen3-next-80b-a3b-instruct": { id: "qwen/qwen3-next-80b-a3b-instruct", name: "Qwen3-Next 80B-A3B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.144, output: 0.574, cache_read: 0.0288 } }, "bytedance/dola-seed-2.0-lite": { id: "bytedance/dola-seed-2.0-lite", name: "Seed 2.0 Lite", description: "Efficient Seed model for general chat, analysis, and lightweight production tasks", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-28", last_updated: "2026-02-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.25, output: 2 } }, "bytedance/dola-seed-2.0-code": { id: "bytedance/dola-seed-2.0-code", name: "Seed 2.0 Code", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "seed", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 0.4, output: 2.4 } }, "bytedance/dola-seed-2.0-pro": { id: "bytedance/dola-seed-2.0-pro", name: "Seed 2.0 Pro", description: "Higher-capability Seed model for complex chat, analysis, and production tasks", family: "seed", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2026-03-28", last_updated: "2026-03-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.5, output: 3 } }, "bytedance/dola-seed-2.0-mini": { id: "bytedance/dola-seed-2.0-mini", name: "Seed 2.0 Mini", description: "Low-cost Seed model for general chat, extraction, and lightweight production tasks", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.1, output: 0.4 } }, "bytedance/dola-seed-2.0-code-preview": { id: "bytedance/dola-seed-2.0-code-preview", name: "Dola Seed 2.0 Code (preview)", description: "Preview coding model for repository understanding, refactors, and engineering tasks", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-03-28", last_updated: "2026-03-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.5, output: 3 } }, "moonshot/kimi-k2.5": { id: "moonshot/kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "moonshot/kimi-k2.7-code-highspeed": { id: "moonshot/kimi-k2.7-code-highspeed", name: "Kimi K2.7 Code Highspeed", description: "Lower-latency Kimi Code variant for interactive edits and coding-agent loops", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 32768 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 1.9, output: 8, cache_read: 0.38 } }, "moonshot/kimi-k2.6": { id: "moonshot/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "moonshot/kimi-k2.7-code": { id: "moonshot/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 32768 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "moonshot/kimi-k3": { id: "moonshot/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "meta/muse-spark-1.1": { id: "meta/muse-spark-1.1", name: "Muse Spark 1.1", description: "Muse Spark is a natively multimodal reasoning model with support for tool-use, visual chain of thought, and multi-agent orchestration.", family: "muse", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-08", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 262144 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "meta/llama-3.3-70b-instruct": { id: "meta/llama-3.3-70b-instruct", name: "Llama 3.3 70B Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.22, output: 0.5, cache_read: 0.11 } }, "xai/grok-4.3": { id: "xai/grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "xai/grok-4.20-0309-non-reasoning": { id: "xai/grok-4.20-0309-non-reasoning", name: "Grok 4.20 Non-Reasoning", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "xai/grok-4.5": { id: "xai/grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.5 } }, "xai/grok-build-0.1": { id: "xai/grok-build-0.1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1, output: 2, cache_read: 0.2 } }, "xai/grok-4.20-0309-reasoning": { id: "xai/grok-4.20-0309-reasoning", name: "Grok 4.20", description: "Reasoning Grok for document-heavy analysis and long-horizon tool use", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "mistral/pixtral-large-latest": { id: "mistral/pixtral-large-latest", name: "Pixtral Large (latest)", description: "Mistral's larger vision model for document-heavy image understanding and chat", family: "pixtral", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2024-11-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 2, output: 6 } }, "mistral/magistral-medium-latest": { id: "mistral/magistral-medium-latest", name: "Magistral Medium (latest)", description: "Mistral reasoning model for transparent analysis, math, and complex decisions", family: "magistral-medium", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-03-17", last_updated: "2025-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2, output: 5 } }, "mistral/mistral-large-2411": { id: "mistral/mistral-large-2411", name: "Mistral Large 2.1", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-18", last_updated: "2024-11-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 2, output: 6 } }, "mistral/mistral-medium-latest": { id: "mistral/mistral-medium-latest", name: "Mistral Medium (latest)", description: "Balanced Mistral model for enterprise assistants, multilingual work, and tools", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.4, output: 2 } }, "mistral/devstral-small-2507": { id: "mistral/devstral-small-2507", name: "Devstral Small", description: "Mistral coding agent model for repository tasks and software engineering workflows", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-07-10", last_updated: "2025-07-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, status: "deprecated", cost: { input: 0.1, output: 0.3 } }, "mistral/mistral-medium-2505": { id: "mistral/mistral-medium-2505", name: "Mistral Medium 3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-05-07", last_updated: "2025-05-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.4, output: 2, cache_read: 0.04 } }, "mistral/mistral-small-latest": { id: "mistral/mistral-small-latest", name: "Mistral Small (latest)", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.15, output: 0.6 } }, "mistral/codestral-latest": { id: "mistral/codestral-latest", name: "Codestral (latest)", description: "Mistral code model for completions, refactors, and developer IDE workflows", family: "codestral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-05-29", last_updated: "2025-01-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 4096 }, cost: { input: 0.3, output: 0.9 } }, "mistral/devstral-medium-latest": { id: "mistral/devstral-medium-latest", name: "Devstral 2 (latest)", description: "Mistral coding agent model for repository tasks and software engineering workflows", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-12", release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0.4, output: 2 } }, "mistral/devstral-2512": { id: "mistral/devstral-2512", name: "Devstral 2", description: "Mistral's coding-agent model for repository work, terminal tasks, and software fixes", family: "devstral", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-12", release_date: "2025-12-09", last_updated: "2025-12-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.4, output: 2, cache_read: 0.04 } }, "mistral/mistral-large-latest": { id: "mistral/mistral-large-latest", name: "Mistral Large (latest)", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.5, output: 1.5 } }, "mistral/devstral-medium-2507": { id: "mistral/devstral-medium-2507", name: "Devstral Medium", description: "Mistral coding agent model for repository tasks and software engineering workflows", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-07-10", last_updated: "2025-07-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, status: "deprecated", cost: { input: 0.4, output: 2 } }, "mistral/mistral-large-2512": { id: "mistral/mistral-large-2512", name: "Mistral Large 3", description: "Mistral's largest general model for enterprise agents, coding, and multilingual reasoning", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.5, output: 1.5, cache_read: 0.05 } }, "minimax/minimax-m2.7-highspeed": { id: "minimax/minimax-m2.7-highspeed", name: "MiniMax M2.7 Highspeed", description: "Low-latency M2.7 variant for interactive coding plans and agent loops", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 8192 }, cost: { input: 0.6, output: 2.4, cache_read: 0.06, cache_write: 0.375 } }, "minimax/minimax-m2.7": { id: "minimax/minimax-m2.7", name: "MiniMax M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 8192 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06, cache_write: 0.375 } }, "minimax/minimax-m3": { id: "minimax/minimax-m3", name: "MiniMax M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 128000 }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "minimax/minimax-m2.5-highspeed": { id: "minimax/minimax-m2.5-highspeed", name: "MiniMax M2.5 Highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-13", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 8192 }, cost: { input: 0.6, output: 2.4, cache_read: 0.06, cache_write: 0.375 } }, "minimax/minimax-m2.5": { id: "minimax/minimax-m2.5", name: "MiniMax M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 8192 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "minimax/minimax-m2": { id: "minimax/minimax-m2", name: "MiniMax M2", description: "Efficient open MiniMax model built for coding agents and tool-heavy workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 8192 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "minimax/minimax-m2.1": { id: "minimax/minimax-m2.1", name: "MiniMax M2.1", description: "Earlier MiniMax agent model for practical coding and productivity tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 8192 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "deepseek/deepseek-r1": { id: "deepseek/deepseek-r1", name: "DeepSeek R1", description: "Classic open reasoning model for transparent math, coding, and deliberate problem solving", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 40960 }, cost: { input: 1.35, output: 5.4 } }, "writer/palmyra-x4": { id: "writer/palmyra-x4", name: "Palmyra X4", description: "Enterprise language model for writing, analysis, and tool-assisted workflows", family: "palmyra", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2024-10-09", last_updated: "2024-10-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 }, cost: { input: 2.5, output: 10 } }, "writer/palmyra-x5": { id: "writer/palmyra-x5", name: "Palmyra X5", description: "Enterprise multimodal model for writing, analysis, and tool-assisted workflows", family: "palmyra", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-04-28", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 250000 }, cost: { input: 0.6, output: 6 } }, "anthropic/claude-sonnet-4-6": { id: "anthropic/claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-3-7-sonnet-20250219": { id: "anthropic/claude-3-7-sonnet-20250219", name: "Claude 3.7 Sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10-31", release_date: "2025-02-19", last_updated: "2025-02-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-opus-4-6": { id: "anthropic/claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024, max: 127999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-fable-5": { id: "anthropic/claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4-8": { id: "anthropic/claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 128000 }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-4-5-20250929": { id: "anthropic/claude-sonnet-4-5-20250929", name: "Claude Sonnet 4.5 (20250929)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-opus-4-5-20251101": { id: "anthropic/claude-opus-4-5-20251101", name: "Claude Opus 4.5 (20251101)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-01", last_updated: "2025-11-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-haiku-4-5-20251001": { id: "anthropic/claude-haiku-4-5-20251001", name: "Claude Haiku 4.5 (20251001)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "anthropic/claude-opus-4-7": { id: "anthropic/claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-4-20250514": { id: "anthropic/claude-sonnet-4-20250514", name: "Claude Sonnet 4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-sonnet-5": { id: "anthropic/claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "anthropic/claude-opus-4-20250514": { id: "anthropic/claude-opus-4-20250514", name: "Claude Opus 4 (20250514)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 31999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-opus-5": { id: "anthropic/claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4-1-20250805": { id: "anthropic/claude-opus-4-1-20250805", name: "Claude Opus 4.1 (20250805)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 31999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "moonshotai/kimi-k2-thinking": { id: "moonshotai/kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Thinking Kimi model for slower research passes, planning, and hard technical questions", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 32768 }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-08", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0.6, output: 2.5 } }, "openai/gpt-4.1-mini": { id: "openai/gpt-4.1-mini", name: "GPT-4.1 Mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "openai/gpt-4o": { id: "openai/gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.6-sol": { id: "openai/gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "openai/gpt-oss-safeguard-120b": { id: "openai/gpt-oss-safeguard-120b", name: "GPT OSS Safeguard 120B", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-10-29", last_updated: "2025-10-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 4096, output: 4096 }, cost: { input: 0.15, output: 0.6 } }, "openai/gpt-4.1-nano": { id: "openai/gpt-4.1-nano", name: "GPT-4.1 Nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT-OSS 20B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.04, output: 0.2, cache_read: 0.02 } }, "openai/gpt-5.2-chat-latest": { id: "openai/gpt-5.2-chat-latest", name: "GPT-5.2 Chat Latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-codex", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/o3-mini": { id: "openai/o3-mini", name: "o3 Mini", description: "Smaller o-series reasoner for economical coding, math, and planning tasks", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 12.5, output: 75, cache_read: 1.25 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "openai/gpt-4o-mini": { id: "openai/gpt-4o-mini", name: "GPT-4o Mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-3.5-turbo": { id: "openai/gpt-3.5-turbo", name: "GPT-3.5 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2021-09-01", release_date: "2023-03-01", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16385, output: 4096 }, cost: { input: 0.5, output: 1.5 } }, "openai/gpt-4o-2024-05-13": { id: "openai/gpt-4o-2024-05-13", name: "GPT-4o (2024-05-13)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-05-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 5, output: 15 } }, "openai/gpt-5-chat-latest": { id: "openai/gpt-5-chat-latest", name: "GPT-5 Chat Latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-codex", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4o-2024-11-20": { id: "openai/gpt-4o-2024-11-20", name: "GPT-4o (2024-11-20)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-11-20", last_updated: "2024-11-20", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 5, output: 30, cache_read: 0.5 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "openai/gpt-5.3-chat-latest": { id: "openai/gpt-5.3-chat-latest", name: "GPT-5.3 Chat Latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT-5.4 Nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT-5.4 Mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 1.5, output: 9, cache_read: 0.15 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT-OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.09, output: 0.36 } }, "openai/o1": { id: "openai/o1", name: "o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2023-09", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 15, output: 60, cache_read: 7.5 } }, "openai/gpt-5.6-luna": { id: "openai/gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0.2, output: 1.2, cache_read: 0.02 } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4-turbo": { id: "openai/gpt-4-turbo", name: "GPT-4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-12", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 10, output: 30 } }, "openai/gpt-4o-2024-08-06": { id: "openai/gpt-4o-2024-08-06", name: "GPT-4o (2024-08-06)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-08-06", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5-nano": { id: "openai/gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "openai/o3": { id: "openai/o3", name: "o3", description: "Deliberate o-series reasoner for hard math, coding, and multi-step analysis", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/gpt-5.6-terra": { id: "openai/gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2, output: 12, cache_read: 0.2 } }, "openai/gpt-4.1": { id: "openai/gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/o4-mini": { id: "openai/o4-mini", name: "o4 Mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.275 } }, "openai/gpt-4": { id: "openai/gpt-4", name: "GPT-4", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-11", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 8192 }, cost: { input: 30, output: 60 } }, "openai/gpt-5.1-chat-latest": { id: "openai/gpt-5.1-chat-latest", name: "GPT-5.1 Chat Latest", description: "Chat-tuned GPT-5.1 for polished assistants, writing, and product conversations", family: "gpt-codex", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "zai/glm-5": { id: "zai/glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.2, cache_write: 0 } }, "zai/glm-4.5-air": { id: "zai/glm-4.5-air", name: "GLM-4.5 Air", description: "Lighter GLM-4.5 variant for fast coding assistance and cheaper agents", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 98304 }, cost: { input: 0.2, output: 1.1, cache_read: 0.03, cache_write: 0 } }, "zai/glm-5.1": { id: "zai/glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26, cache_write: 0 } }, "zai/glm-4.7-flash": { id: "zai/glm-4.7-flash", name: "GLM 4.7 Flash", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.07, output: 0.4 } }, "zai/glm-5.2": { id: "zai/glm-5.2", name: "GLM 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 50000 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.05, output: 3.3, cache_read: 0.195 } }, "zai/glm-4.7-flashx": { id: "zai/glm-4.7-flashx", name: "GLM-4.7 FlashX", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0.07, output: 0.4, cache_read: 0.01, cache_write: 0 } }, "zai/glm-4.6": { id: "zai/glm-4.6", name: "GLM-4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "zai/glm-4.5": { id: "zai/glm-4.5", name: "GLM-4.5", description: "Hybrid-reasoning GLM release that made the 4.5 line broadly useful", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 98304 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "zai/glm-4.5v": { id: "zai/glm-4.5v", name: "Glm 4.5V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32000 }, cost: { input: 0.6, output: 1.8, cache_read: 0.11, cache_write: 0 } }, "zai/glm-4.7": { id: "zai/glm-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "zai/glm-5-turbo": { id: "zai/glm-5-turbo", name: "GLM-5 Turbo", description: "Faster GLM-5 lane for coding agents that need lower latency", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24, cache_write: 0 } } } }, scx: { id: "scx", env: ["SCX_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.scx.ai/v1", name: "SCX.ai", doc: "https://platform.scx.ai/docs", models: { "MiniMax-M2.7": { id: "MiniMax-M2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 192000, output: 64000 }, cost: { input: 0.48, output: 1.79, cache_read: 0.05 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.17, output: 0.55 } } } }, "cloudferro-sherlock": { id: "cloudferro-sherlock", env: ["CLOUDFERRO_SHERLOCK_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api-sherlock.cloudferro.com/openai/v1/", name: "CloudFerro Sherlock", doc: "https://docs.sherlock.cloudferro.com/", models: { "MiniMaxAI/MiniMax-M2.5": { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-01", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196000, input: 180000, output: 16000 }, cost: { input: 0.3, output: 1.2 } }, "speakleash/Bielik-11B-v3.0-Instruct": { id: "speakleash/Bielik-11B-v3.0-Instruct", name: "Bielik 11B v3.0 Instruct", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03", release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 32000 }, cost: { input: 0.67, output: 0.67 } }, "speakleash/Bielik-11B-v2.6-Instruct": { id: "speakleash/Bielik-11B-v2.6-Instruct", name: "Bielik 11B v2.6 Instruct", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03", release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 32000 }, cost: { input: 0.67, output: 0.67 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "OpenAI GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-28", last_updated: "2025-08-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 131000 }, cost: { input: 2.92, output: 2.92 } }, "meta-llama/Llama-3.3-70B-Instruct": { id: "meta-llama/Llama-3.3-70B-Instruct", name: "Llama 3.3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10-09", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 70000, output: 70000 }, cost: { input: 2.92, output: 2.92 } } } }, modelis: { id: "modelis", env: ["MODELIS_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://modelishub.com/v1", name: "Modelis", doc: "https://modelishub.com/pricing", models: { "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "max"] }, { type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.0983, output: 0.1966 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }, { type: "toggle" }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.435, output: 0.87 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10 } }, "qwen/qwen3.7-plus": { id: "qwen/qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.768, output: 3.072 } }, "qwen/qwen3.7-max": { id: "qwen/qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 3, output: 9 } } } }, subconscious: { id: "subconscious", env: ["SUBCONSCIOUS_API_KEY"], npm: "@ai-sdk/anthropic", api: "https://api.subconscious.dev/v1", name: "Subconscious", doc: "https://docs.subconscious.dev", models: { "subconscious/glm-5.2": { id: "subconscious/glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "subconscious/tim-qwen3.6-27b": { id: "subconscious/tim-qwen3.6-27b", name: "TIM-Qwen3.6 27B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-11", last_updated: "2026-05-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, input: 8192, output: 5000 }, cost: { input: 0.3, output: 3, cache_read: 0.15 } } } }, "tencent-coding-plan": { id: "tencent-coding-plan", env: ["TENCENT_CODING_PLAN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.lkeap.cloud.tencent.com/coding/v3", name: "Tencent Coding Plan (China)", doc: "https://cloud.tencent.com/document/product/1772/128947", models: { "glm-5": { id: "glm-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 16384 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi-K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "hunyuan-2.0-instruct": { id: "hunyuan-2.0-instruct", name: "Tencent HY 2.0 Instruct", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "hunyuan", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-08", last_updated: "2026-03-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "hunyuan-2.0-thinking": { id: "hunyuan-2.0-thinking", name: "Tencent HY 2.0 Think", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "hunyuan", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-03-08", last_updated: "2026-03-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "hunyuan-turbos": { id: "hunyuan-turbos", name: "Hunyuan-TurboS", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "hunyuan", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-08", last_updated: "2026-03-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "minimax-m2.5": { id: "minimax-m2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "hunyuan-t1": { id: "hunyuan-t1", name: "Hunyuan-T1", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "hunyuan", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-03-08", last_updated: "2026-03-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "tc-code-latest": { id: "tc-code-latest", name: "Auto", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-08", last_updated: "2026-03-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, hyper: { id: "hyper", env: ["HYPER_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://hyper.charm.land/v1", name: "Charm Hyper", doc: "https://hyper.charm.land", models: { "qwen3.7-flash": { id: "qwen3.7-flash", name: "Qwen3.7 Flash", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-27", last_updated: "2026-07-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 991000, output: 64000 }, cost: { input: 0.2, output: 0.8, cache_read: 0.04 } }, "qwen3.7-plus": { id: "qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-15", last_updated: "2026-07-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 1.2, output: 4.8, cache_read: 0.24 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202800, output: 3276 }, cost: { input: 1.52432, output: 4.79072, cache_read: 0.283088 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-06", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.2, output: 0.4, cache_read: 0.04 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-04-13", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 26214 }, cost: { input: 0.55, output: 2.89, cache_write: 0.275 } }, "minimax-m2.7": { id: "minimax-m2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-06-05", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262100, output: 6553 }, cost: { input: 0.436, output: 1.72, cache_write: 0.218 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-30", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 32768 }, cost: { input: 1.4, output: 4.4, cache_read: 0.28 } }, "qwen3.7-max": { id: "qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-05-28", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5 } }, "qwen3.6-max": { id: "qwen3.6-max", name: "Qwen3.6 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-05-20", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 2.5 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-07-03", last_updated: "2026-07-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 26214 }, cost: { input: 0.95, output: 4, cache_write: 0.16 } }, "llama-4-maverick-17b-128e-instruct-fp8": { id: "llama-4-maverick-17b-128e-instruct-fp8", name: "Llama 4 Maverick 17B Instruct", description: "Open multimodal Llama for strong reasoning with efficient everyday serving", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2026-04-30", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 430000, output: 43000 }, cost: { input: 0.274, output: 0.8992, cache_write: 0.137 } }, "minimax-m3": { id: "minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2026-07-30", last_updated: "2026-07-31", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 512000, output: 512000 }, cost: { input: 0.32664, output: 1.30656, cache_read: 0.064239 } }, "gemma-4-26b-a4b-it": { id: "gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-30", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 25600 }, cost: { input: 0.124, output: 0.42, cache_write: 0.062 } }, "llama-3.3-70b-instruct": { id: "llama-3.3-70b-instruct", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2026-04-30", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 12800 }, cost: { input: 0.6066, output: 1.0386, cache_write: 0.3033 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-06", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 2.4, output: 4.8, cache_read: 0.2 } }, "qwen3.8-max": { id: "qwen3.8-max", name: "Qwen3.8 Max Preview", description: "Preview Qwen flagship for million-token multimodal reasoning and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-07-19", last_updated: "2026-07-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 2, output: 6, cache_read: 0.25 } }, "deepseek-v4-flash-0731": { id: "deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-08-02", last_updated: "2026-08-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 0.152432, output: 0.304864, cache_read: 0.032664 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-13", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 13107 }, cost: { input: 0.178, output: 0.71, cache_write: 0.089 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-07-03", last_updated: "2026-07-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16000 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "qwen3.6-flash": { id: "qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-20", last_updated: "2026-07-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 1, output: 4, cache_read: 0.1, cache_write: 1.25 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-27", last_updated: "2026-07-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3.2664, output: 16.332, cache_read: 0.32664 } }, "qwen3-coder-480b-a35b-instruct-int4-mixed-ar": { id: "qwen3-coder-480b-a35b-instruct-int4-mixed-ar", name: "Qwen3-Coder 480B-A35B Instruct", description: "Open Qwen coding heavyweight for repository reasoning and agentic engineering", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-30", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 106000, output: 10600 }, cost: { input: 0.569, output: 2.135, cache_write: 0.2845 } }, "qwen3.6-plus": { id: "qwen3.6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-05-20", last_updated: "2026-07-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 2, output: 6, cache_read: 0.2, cache_write: 2.5 } }, "qwen3-next-80b-a3b-instruct": { id: "qwen3-next-80b-a3b-instruct", name: "Qwen3-Next 80B-A3B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-30", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 26214 }, cost: { input: 0.1175, output: 1.136, cache_write: 0.05875 } } } }, alibaba: { id: "alibaba", env: ["DASHSCOPE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", name: "Alibaba", doc: "https://www.alibabacloud.com/help/en/model-studio/models", models: { "qwen3-coder-480b-a35b-instruct": { id: "qwen3-coder-480b-a35b-instruct", name: "Qwen3-Coder 480B-A35B Instruct", description: "Open Qwen coding heavyweight for repository reasoning and agentic engineering", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 1.5, output: 7.5 } }, "qwen3.7-plus": { id: "qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-04", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 0.625, tiers: [{ input: 2, output: 6, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.2, cache_write: 2.5 } } }, "qwen3-vl-plus": { id: "qwen3-vl-plus", name: "Qwen3-VL Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.2, output: 1.6, reasoning: 4.8 } }, "qwen3-32b": { id: "qwen3-32b", name: "Qwen3 32B", description: "Dense open Qwen model for self-hosted chat, reasoning, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.7, output: 2.8, reasoning: 8.4 } }, "qwen3.6-35b-a3b": { id: "qwen3.6-35b-a3b", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.248, output: 1.485 } }, "qwen-mt-plus": { id: "qwen-mt-plus", name: "Qwen-MT Plus", description: "Translation model for multilingual conversion, localization, and cross-language workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-04", release_date: "2025-01", last_updated: "2025-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 8192 }, cost: { input: 2.46, output: 7.37 } }, "qwen2-5-vl-72b-instruct": { id: "qwen2-5-vl-72b-instruct", name: "Qwen2.5-VL 72B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 2.8, output: 8.4 } }, "qwen-max": { id: "qwen-max", name: "Qwen Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-04-03", last_updated: "2025-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 8192 }, cost: { input: 1.6, output: 6.4 } }, "qwen3.5-plus": { id: "qwen3.5-plus", name: "Qwen3.5 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.4, output: 2.4, reasoning: 2.4 } }, "qwen-omni-turbo": { id: "qwen-omni-turbo", name: "Qwen-Omni Turbo", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-01-19", last_updated: "2025-03-26", modalities: { input: ["text", "image", "audio", "video"], output: ["text", "audio"] }, open_weights: false, limit: { context: 32768, output: 2048 }, cost: { input: 0.07, output: 0.27, input_audio: 4.44, output_audio: 8.89 } }, "qwen-vl-max": { id: "qwen-vl-max", name: "Qwen-VL Max", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-04-08", last_updated: "2025-08-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.8, output: 3.2 } }, "qwen3-coder-30b-a3b-instruct": { id: "qwen3-coder-30b-a3b-instruct", name: "Qwen3-Coder 30B-A3B Instruct", description: "Smaller Qwen coder for efficient local agents and repo-level fixes", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.45, output: 2.25 } }, "qwen3.5-27b": { id: "qwen3.5-27b", name: "Qwen3.5 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.3, output: 2.4 } }, "qwen3-vl-235b-a22b": { id: "qwen3-vl-235b-a22b", name: "Qwen3-VL 235B-A22B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.7, output: 2.8, reasoning: 8.4 } }, "qwen2-5-72b-instruct": { id: "qwen2-5-72b-instruct", name: "Qwen2.5 72B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 1.4, output: 5.6 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.28, cache_write: 0 } }, "qwen3.7-max": { id: "qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5, cache_write: 3.125 } }, "qwen3-next-80b-a3b-thinking": { id: "qwen3-next-80b-a3b-thinking", name: "Qwen3-Next 80B-A3B (Thinking)", description: "Efficient Qwen thinking model for local reasoning, math, and coding agents", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.5, output: 6 } }, "qwen-mt-turbo": { id: "qwen-mt-turbo", name: "Qwen-MT Turbo", description: "Translation model for multilingual conversion, localization, and cross-language workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-04", release_date: "2025-01", last_updated: "2025-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 8192 }, cost: { input: 0.16, output: 0.49 } }, "qvq-max": { id: "qvq-max", name: "QVQ Max", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qvq", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-03-25", last_updated: "2025-03-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 1.2, output: 4.8 } }, "qwen2-5-vl-7b-instruct": { id: "qwen2-5-vl-7b-instruct", name: "Qwen2.5-VL 7B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.35, output: 1.05 } }, "qwen3.6-27b": { id: "qwen3.6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.6, output: 3.6 } }, "qwen3.5-35b-a3b": { id: "qwen3.5-35b-a3b", name: "Qwen3.5 35B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.25, output: 2 } }, "qwen3-vl-30b-a3b": { id: "qwen3-vl-30b-a3b", name: "Qwen3-VL 30B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.2, output: 0.8, reasoning: 2.4 } }, "qwen3-14b": { id: "qwen3-14b", name: "Qwen3 14B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.35, output: 1.4, reasoning: 4.2 } }, "qwen2-5-32b-instruct": { id: "qwen2-5-32b-instruct", name: "Qwen2.5 32B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.7, output: 2.8 } }, "qwen3-omni-flash-realtime": { id: "qwen3-omni-flash-realtime", name: "Qwen3-Omni Flash Realtime", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image", "audio", "video"], output: ["text", "audio"] }, open_weights: false, limit: { context: 65536, output: 16384 }, cost: { input: 0.52, output: 1.99, input_audio: 4.57, output_audio: 18.13 } }, "qwen3-235b-a22b": { id: "qwen3-235b-a22b", name: "Qwen3 235B-A22B", description: "Large open Qwen MoE for multilingual reasoning, coding, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.7, output: 2.8, reasoning: 8.4 } }, "qwen3-max": { id: "qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen3 model for coding agents, complex reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 1.2, output: 6 } }, "qwen3-8b": { id: "qwen3-8b", name: "Qwen3 8B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.18, output: 0.7, reasoning: 2.1 } }, "qwen2-5-14b-instruct": { id: "qwen2-5-14b-instruct", name: "Qwen2.5 14B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.35, output: 1.4 } }, "qwen3-coder-plus": { id: "qwen3-coder-plus", name: "Qwen3 Coder Plus", description: "Hosted Qwen coder for software agents, repo edits, and long-context code", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 65536 }, cost: { input: 1, output: 5 } }, "qwen2-5-7b-instruct": { id: "qwen2-5-7b-instruct", name: "Qwen2.5 7B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.175, output: 0.7 } }, "qwen3.8-max": { id: "qwen3.8-max", name: "Qwen3.8 Max", description: "2.4-trillion-parameter MoE flagship for coding, professional work, multimodal understanding, and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "xhigh"] }, { type: "budget_tokens", min: 0, max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 2, output: 6, cache_read: 0.25, cache_write: 2.5 } }, "qwen3-coder-flash": { id: "qwen3-coder-flash", name: "Qwen3 Coder Flash", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.3, output: 1.5 } }, "deepseek-v4-flash-0731": { id: "deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.2, output: 0.4, cache_read: 0.04 } }, "qwen-flash": { id: "qwen-flash", name: "Qwen Flash", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.05, output: 0.4 } }, "qwen-plus": { id: "qwen-plus", name: "Qwen Plus", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-01-25", last_updated: "2025-09-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.4, output: 1.2, reasoning: 4 } }, "qwen-omni-turbo-realtime": { id: "qwen-omni-turbo-realtime", name: "Qwen-Omni Turbo Realtime", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-05-08", last_updated: "2025-05-08", modalities: { input: ["text", "image", "audio"], output: ["text", "audio"] }, open_weights: false, limit: { context: 32768, output: 2048 }, cost: { input: 0.27, output: 1.07, input_audio: 4.44, output_audio: 8.89 } }, "qwen-turbo": { id: "qwen-turbo", name: "Qwen Turbo", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-11-01", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 16384 }, cost: { input: 0.05, output: 0.2, reasoning: 0.5 } }, "qwen2-5-omni-7b": { id: "qwen2-5-omni-7b", name: "Qwen2.5-Omni 7B", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-12", last_updated: "2024-12", modalities: { input: ["text", "image", "audio", "video"], output: ["text", "audio"] }, open_weights: true, limit: { context: 32768, output: 2048 }, cost: { input: 0.1, output: 0.4, input_audio: 6.76 } }, "qwen3-asr-flash": { id: "qwen3-asr-flash", name: "Qwen3-ASR Flash", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2024-04", release_date: "2025-09-08", last_updated: "2025-09-08", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 53248, output: 4096 }, cost: { input: 0.035, output: 0.035 } }, "qwq-plus": { id: "qwq-plus", name: "QwQ Plus", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-03-05", last_updated: "2025-03-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.8, output: 2.4 } }, "qwen3.6-flash": { id: "qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.1875, output: 1.125, cache_write: 0.234375 } }, "qwen3.5-397b-a17b": { id: "qwen3.5-397b-a17b", name: "Qwen3.5 397B-A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.6, output: 3.6 } }, "qwen3.6-max-preview": { id: "qwen3.6-max-preview", name: "Qwen3.6 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 1.3, output: 7.8, cache_read: 0.13, cache_write: 1.625 } }, "qwen-vl-ocr": { id: "qwen-vl-ocr", name: "Qwen-VL OCR", description: "OCR model for extracting structured text from documents and screenshots", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-04", release_date: "2024-10-28", last_updated: "2025-04-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 34096, output: 4096 }, cost: { input: 0.72, output: 0.72 } }, "qwen3-livetranslate-flash-realtime": { id: "qwen3-livetranslate-flash-realtime", name: "Qwen3-LiveTranslate Flash Realtime", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-04", release_date: "2025-09-22", last_updated: "2025-09-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text", "audio"] }, open_weights: false, limit: { context: 53248, output: 4096 }, cost: { input: 10, output: 10, input_audio: 10, output_audio: 38 } }, "qwen-plus-character-ja": { id: "qwen-plus-character-ja", name: "Qwen Plus Character (Japanese)", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-01", last_updated: "2024-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 512 }, cost: { input: 0.5, output: 1.4 } }, "qwen3-omni-flash": { id: "qwen3-omni-flash", name: "Qwen3-Omni Flash", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image", "audio", "video"], output: ["text", "audio"] }, open_weights: false, limit: { context: 65536, output: 16384 }, cost: { input: 0.43, output: 1.66, input_audio: 3.81, output_audio: 15.11 } }, "qwen3.6-plus": { id: "qwen3.6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 0.625, tiers: [{ input: 2, output: 6, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.2, cache_write: 2.5 } } }, "qwen3.5-122b-a10b": { id: "qwen3.5-122b-a10b", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.4, output: 3.2 } }, "qwen3-next-80b-a3b-instruct": { id: "qwen3-next-80b-a3b-instruct", name: "Qwen3-Next 80B-A3B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.5, output: 2 } }, "qwen-vl-plus": { id: "qwen-vl-plus", name: "Qwen-VL Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-01-25", last_updated: "2025-08-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.21, output: 0.63 } } } }, vercel: { id: "vercel", env: ["AI_GATEWAY_API_KEY"], npm: "@ai-sdk/gateway", name: "Vercel AI Gateway", doc: "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", models: { "prodia/flux-fast-schnell": { id: "prodia/flux-fast-schnell", name: "Flux Schnell", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-08-02", last_updated: "2026-06-08", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 512, output: 0 } }, "cohere/rerank-v4-pro": { id: "cohere/rerank-v4-pro", name: "Cohere Rerank 4 Pro", description: "Reranking model for improving retrieval quality in search and recommendation systems", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 } }, "cohere/embed-v4.0": { id: "cohere/embed-v4.0", name: "Embed v4.0", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "cohere-embed", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 1536 } }, "cohere/command-a": { id: "cohere/command-a", name: "Command A", description: "Cohere command model for multilingual enterprise agents, tools, and chat", family: "command", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 8000 }, cost: { input: 2.5, output: 10 } }, "cohere/rerank-v4-fast": { id: "cohere/rerank-v4-fast", name: "Cohere Rerank 4 Fast", description: "Reranking model for improving retrieval quality in search and recommendation systems", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 } }, "cohere/rerank-v3.5": { id: "cohere/rerank-v3.5", name: "Cohere Rerank 3.5", description: "Reranking model for improving retrieval quality in search and recommendation systems", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-12-02", last_updated: "2024-12-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 4096, output: 4096 } }, "nvidia/nemotron-nano-12b-v2-vl": { id: "nvidia/nemotron-nano-12b-v2-vl", name: "Nvidia Nemotron Nano 12B V2 VL", description: "Nemotron multimodal model for visual reasoning and agentic AI workflows", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-10-28", last_updated: "2025-10-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.2, output: 0.6 } }, "nvidia/nemotron-3-nano-30b-a3b": { id: "nvidia/nemotron-3-nano-30b-a3b", name: "Nemotron 3 Nano 30B A3B", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, temperature: true, knowledge: "2024-10", release_date: "2025-12-15", last_updated: "2025-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.05, output: 0.24 } }, "nvidia/nemotron-3-super-120b-a12b": { id: "nvidia/nemotron-3-super-120b-a12b", name: "NVIDIA Nemotron 3 Super 120B A12B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 }, cost: { input: 0.15, output: 0.65 } }, "nvidia/nemotron-3-ultra-550b-a55b": { id: "nvidia/nemotron-3-ultra-550b-a55b", name: "Nemotron 3 Ultra", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65000 }, cost: { input: 0.6, output: 2.4, cache_read: 0.12 } }, "nvidia/nemotron-nano-9b-v2": { id: "nvidia/nemotron-nano-9b-v2", name: "Nvidia Nemotron Nano 9B V2", description: "Compact Nemotron model for efficient reasoning and deployable AI agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-08-18", last_updated: "2025-08-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.06, output: 0.23 } }, "google/imagen-4.0-ultra-generate-001": { id: "google/imagen-4.0-ultra-generate-001", name: "Imagen 4 Ultra", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "imagen", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-05-24", last_updated: "2025-05-24", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/gemini-embedding-2": { id: "google/gemini-embedding-2", name: "Gemini Embedding 2", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "gemini-embedding", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-11", release_date: "2026-03-10", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 } }, "google/gemini-3.5-flash": { id: "google/gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 1.5, output: 9, cache_read: 0.15 } }, "google/veo-3.1-generate-001": { id: "google/veo-3.1-generate-001", name: "Veo 3.1", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-10-15", last_updated: "2026-06-08", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "google/imagen-4.0-fast-generate-001": { id: "google/imagen-4.0-fast-generate-001", name: "Imagen 4 Fast", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "imagen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-06-01", last_updated: "2025-06", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/gemini-3.5-flash-lite": { id: "google/gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65000 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "google/veo-3.0-fast-generate-001": { id: "google/veo-3.0-fast-generate-001", name: "Veo 3.0 Fast Generate", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-07-31", last_updated: "2026-06-08", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "google/gemini-omni-flash-preview": { id: "google/gemini-omni-flash-preview", name: "Gemini Omni Flash Preview", description: "Omni-modal model for text, vision, audio, and multimodal agent tasks", family: "gemini", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 57920 }, cost: { input: 1.5, output: 9 } }, "google/gemini-3-flash": { id: "google/gemini-3-flash", name: "Gemini 3 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65000 }, cost: { input: 0.5, output: 3, cache_read: 0.05 } }, "google/text-multilingual-embedding-002": { id: "google/text-multilingual-embedding-002", name: "Text Multilingual Embedding 002", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-03-01", last_updated: "2024-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "google/text-embedding-005": { id: "google/text-embedding-005", name: "Text Embedding 005", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-08-01", last_updated: "2024-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "google/gemini-3.1-flash-lite-image": { id: "google/gemini-3.1-flash-lite-image", name: "Gemini 3.1 Flash Lite Image (Nano Banana 2 Lite)", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 4096 }, cost: { input: 0.25, output: 1.5, cache_read: 0.03 } }, "google/gemini-3.1-flash-image-preview": { id: "google/gemini-3.1-flash-image-preview", name: "Gemini 3.1 Flash Image Preview (Nano Banana 2)", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "high"] }], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.5, output: 3, cache_read: 0.05 } }, "google/gemma-4-26b-a4b-it": { id: "google/gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 131072 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015 } }, "google/veo-3.0-generate-001": { id: "google/veo-3.0-generate-001", name: "Veo 3.0", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-05-20", last_updated: "2026-06-08", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "google/gemini-embedding-001": { id: "google/gemini-embedding-001", name: "Gemini Embedding 001", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "gemini-embedding", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-05", release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "google/veo-3.1-fast-generate-001": { id: "google/veo-3.1-fast-generate-001", name: "Veo 3.1 Fast Generate", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-10-15", last_updated: "2026-06-08", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "google/gemini-3.6-flash": { id: "google/gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15 } }, "google/gemini-3.1-flash-lite": { id: "google/gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65000 }, cost: { input: 0.25, output: 1.5, cache_read: 0.03 } }, "google/gemma-4-31b-it": { id: "google/gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 131072 }, cost: { input: 0.14, output: 0.4 } }, "google/gemini-3.1-flash-image": { id: "google/gemini-3.1-flash-image", name: "Nano Banana 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "high"] }], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.5, output: 3, cache_read: 0.05 } }, "google/gemini-2.5-flash-image": { id: "google/gemini-2.5-flash-image", name: "Nano Banana (Gemini 2.5 Flash Image)", description: "Nano Banana image model for fast generation, edits, and character-consistent assets", family: "gemini-flash", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 32768, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "google/imagen-4.0-generate-001": { id: "google/imagen-4.0-generate-001", name: "Imagen 4", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "imagen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-05-20", last_updated: "2025-05-22", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/gemini-3-pro-image": { id: "google/gemini-3-pro-image", name: "Nano Banana Pro", description: "Nano Banana Pro for higher-fidelity image generation and design-heavy edits", family: "gemini-pro", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-09-01", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 32768 }, cost: { input: 2, output: 12, cache_read: 0.2 } }, "google/gemini-3.1-pro-preview": { id: "google/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 2, output: 12, cache_read: 0.2 } }, "google/veo-3.1-lite-generate-001": { id: "google/veo-3.1-lite-generate-001", name: "Veo 3.1 Lite Generate", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "google/gemini-2.5-flash-lite": { id: "google/gemini-2.5-flash-lite", name: "Gemini 2.5 Flash Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 512, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01 } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, input_audio: 1 } }, "thinkingmachines/inkling-small": { id: "thinkingmachines/inkling-small", name: "Inkling Small", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, release_date: "2026-07-30", last_updated: "2026-07-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 0.5, output: 1.2, cache_read: 0.1 } }, "thinkingmachines/inkling": { id: "thinkingmachines/inkling", name: "Inkling", description: "Multimodal MoE reasoning model (975B total, 41B active) for text, image, and audio", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 1, output: 4.05, cache_read: 0.17 } }, "sakana/fugu-ultra": { id: "sakana/fugu-ultra", name: "Fugu Ultra", description: "Quality-first multi-agent model for hard research, analysis, and competitions", family: "aura", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-21", last_updated: "2026-06-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "inception/mercury-coder-small": { id: "inception/mercury-coder-small", name: "Mercury Coder Small Beta", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "mercury", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-02-26", last_updated: "2025-02-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 16384 }, cost: { input: 0.25, output: 1 } }, "inception/mercury-2": { id: "inception/mercury-2", name: "Mercury 2", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "mercury", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2026-02-24", last_updated: "2026-03-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.25, output: 0.75, cache_read: 0.024999999999999998 } }, "interfaze/interfaze-beta": { id: "interfaze/interfaze-beta", name: "Interfaze Beta", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, temperature: true, release_date: "2025-10-07", last_updated: "2026-04-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32000 }, cost: { input: 1.5, output: 3.5 } }, "voyage/rerank-2.5-lite": { id: "voyage/rerank-2.5-lite", name: "Voyage Rerank 2.5 Lite", description: "Reranking model for improving retrieval quality in search and recommendation systems", family: "voyage", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 } }, "voyage/voyage-3.5-lite": { id: "voyage/voyage-3.5-lite", name: "voyage-3.5-lite", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "voyage", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "voyage/voyage-4": { id: "voyage/voyage-4", name: "voyage-4", description: "General-purpose chat model for instruction following, writing, and analysis", family: "voyage", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-15", last_updated: "2026-03-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 0 } }, "voyage/rerank-2.5": { id: "voyage/rerank-2.5", name: "Voyage Rerank 2.5", description: "Reranking model for improving retrieval quality in search and recommendation systems", family: "voyage", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 } }, "voyage/voyage-code-3": { id: "voyage/voyage-code-3", name: "voyage-code-3", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "voyage", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-12-04", last_updated: "2024-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "voyage/voyage-code-2": { id: "voyage/voyage-code-2", name: "voyage-code-2", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "voyage", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-01-01", last_updated: "2024-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "voyage/voyage-3.5": { id: "voyage/voyage-3.5", name: "voyage-3.5", description: "General-purpose chat model for instruction following, writing, and analysis", family: "voyage", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "voyage/voyage-4-lite": { id: "voyage/voyage-4-lite", name: "voyage-4-lite", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "voyage", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-15", last_updated: "2026-03-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 0 } }, "voyage/voyage-3-large": { id: "voyage/voyage-3-large", name: "voyage-3-large", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "voyage", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-01-07", last_updated: "2024-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "voyage/voyage-finance-2": { id: "voyage/voyage-finance-2", name: "voyage-finance-2", description: "General-purpose chat model for instruction following, writing, and analysis", family: "voyage", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-06-03", last_updated: "2024-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "voyage/voyage-law-2": { id: "voyage/voyage-law-2", name: "voyage-law-2", description: "General-purpose chat model for instruction following, writing, and analysis", family: "voyage", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-04-15", last_updated: "2024-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "voyage/voyage-4-large": { id: "voyage/voyage-4-large", name: "voyage-4-large", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "voyage", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-15", last_updated: "2026-03-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 0 } }, "fish-audio/s1": { id: "fish-audio/s1", name: "S1", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "o", attachment: false, reasoning: false, tool_call: false, release_date: "2025-10-20", last_updated: "2025-10-20", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "fish-audio/s2-pro": { id: "fish-audio/s2-pro", name: "S2 Pro", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "o", attachment: false, reasoning: false, tool_call: false, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "fish-audio/s2.1-pro": { id: "fish-audio/s2.1-pro", name: "S2.1 Pro", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "o", attachment: false, reasoning: false, tool_call: false, release_date: "2026-07-28", last_updated: "2026-07-28", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "fish-audio/transcribe-1": { id: "fish-audio/transcribe-1", name: "Transcribe-1", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "o", attachment: false, reasoning: false, tool_call: false, release_date: "2026-03-01", last_updated: "2026-03-01", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 } }, "tencent/hy3": { id: "tencent/hy3", name: "Hy3", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "hy3", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, temperature: true, release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.14, output: 0.58, cache_read: 0.035 } }, "klingai/kling-v2.5-turbo-i2v": { id: "klingai/kling-v2.5-turbo-i2v", name: "Kling v2.5 Turbo Image-to-Video", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "ling", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "klingai/kling-v2.6-i2v": { id: "klingai/kling-v2.6-i2v", name: "Kling v2.6 Image-to-Video", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "ling", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-03", last_updated: "2025-12-21", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "klingai/kling-v2.6-t2v": { id: "klingai/kling-v2.6-t2v", name: "Kling v2.6 Text-to-Video", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "ling", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-03", last_updated: "2025-12-21", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "klingai/kling-v3.0-i2v": { id: "klingai/kling-v3.0-i2v", name: "Kling v3.0 Image-to-Video", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "ling", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "klingai/kling-v2.5-turbo-t2v": { id: "klingai/kling-v2.5-turbo-t2v", name: "Kling v2.5 Turbo Text-to-Video", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "ling", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "klingai/kling-v3.0-motion-control": { id: "klingai/kling-v3.0-motion-control", name: "Kling v3.0 Motion Control", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "ling", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-03-04", last_updated: "2026-03-04", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "klingai/kling-v3.0-t2v": { id: "klingai/kling-v3.0-t2v", name: "Kling v3.0 Text-to-Video", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "ling", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "klingai/kling-v2.6-motion-control": { id: "klingai/kling-v2.6-motion-control", name: "Kling v2.6 Motion Control", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "ling", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-18", last_updated: "2025-12-21", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bytedance/seed-1.6": { id: "bytedance/seed-1.6", name: "Seed 1.6", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-09-01", last_updated: "2025-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 }, cost: { input: 0.25, output: 2, cache_read: 0.05 } }, "bytedance/seedance-v1.5-pro": { id: "bytedance/seedance-v1.5-pro", name: "Seedance v1.5 Pro", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "seed", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bytedance/seedance-2.5": { id: "bytedance/seedance-2.5", name: "Seedance 2.5", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "seed", attachment: false, reasoning: false, tool_call: false, release_date: "2026-08-07", last_updated: "2026-08-07", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bytedance/seedream-4.0": { id: "bytedance/seedream-4.0", name: "Seedream 4.0", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "seed", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-09-09", last_updated: "2025-08-28", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bytedance/seedream-4.5": { id: "bytedance/seedream-4.5", name: "Seedream 4.5", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "seed", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-03", last_updated: "2025-11-28", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bytedance/seedream-5.0-pro": { id: "bytedance/seedream-5.0-pro", name: "Seedream 5.0 Pro", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "seed", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-07-11", last_updated: "2026-07-11", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bytedance/seedance-v1.0-pro": { id: "bytedance/seedance-v1.0-pro", name: "Seedance v1.0 Pro", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "seed", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-06-11", last_updated: "2025-06-11", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bytedance/seedream-5.0-lite": { id: "bytedance/seedream-5.0-lite", name: "Seedream 5.0 Lite", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "seed", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-02-13", last_updated: "2026-01-28", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bytedance/seedance-v1.0-pro-fast": { id: "bytedance/seedance-v1.0-pro-fast", name: "Seedance v1.0 Pro Fast", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "seed", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-10-24", last_updated: "2025-10-31", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bytedance/seed-1.8": { id: "bytedance/seed-1.8", name: "Seed 1.8", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-09-01", last_updated: "2025-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 0.25, output: 2, cache_read: 0.05 } }, "bytedance/seedance-2.0": { id: "bytedance/seedance-2.0", name: "Seedance 2.0", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "seed", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-14", last_updated: "2026-04-14", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bytedance/seedance-2.0-fast": { id: "bytedance/seedance-2.0-fast", name: "Seedance 2.0 Fast", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "seed", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-14", last_updated: "2026-04-14", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bfl/flux-pro-1.1": { id: "bfl/flux-pro-1.1", name: "FLUX1.1 [pro]", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-10-02", last_updated: "2024-10", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 512, output: 0 } }, "bfl/flux-2-pro": { id: "bfl/flux-2-pro", name: "FLUX.2 [pro]", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-11-25", last_updated: "2026-06-08", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 67300, output: 67300 } }, "bfl/flux-pro-1.0-fill": { id: "bfl/flux-pro-1.0-fill", name: "FLUX.1 Fill [pro]", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-10-01", last_updated: "2024-10", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 512, output: 0 } }, "bfl/flux-2-max": { id: "bfl/flux-2-max", name: "FLUX.2 [max]", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-16", last_updated: "2026-06-08", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 67300, output: 67300 } }, "bfl/flux-kontext-pro": { id: "bfl/flux-kontext-pro", name: "FLUX.1 Kontext Pro", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-05-29", last_updated: "2025-06", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 512, output: 0 } }, "bfl/flux-3-video": { id: "bfl/flux-3-video", name: "Flux 3", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, release_date: "2026-08-04", last_updated: "2026-08-04", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bfl/flux-2-klein-4b": { id: "bfl/flux-2-klein-4b", name: "FLUX.2 [klein] 4B", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-15", last_updated: "2026-06-08", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bfl/flux-2-flex": { id: "bfl/flux-2-flex", name: "FLUX.2 [flex]", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-11-25", last_updated: "2026-06-08", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bfl/flux-2-klein-9b": { id: "bfl/flux-2-klein-9b", name: "FLUX.2 [klein] 9B", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-15", last_updated: "2026-06-08", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bfl/flux-pro-1.1-ultra": { id: "bfl/flux-pro-1.1-ultra", name: "FLUX1.1 [pro] Ultra", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-11-01", last_updated: "2024-11", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 512, output: 0 } }, "bfl/flux-kontext-max": { id: "bfl/flux-kontext-max", name: "FLUX.1 Kontext Max", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-05-29", last_updated: "2025-06", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 512, output: 0 } }, "recraft/recraft-v3": { id: "recraft/recraft-v3", name: "Recraft V3", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "recraft", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-10-30", last_updated: "2024-10", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 512, output: 0 } }, "recraft/recraft-v4.1-utility-pro": { id: "recraft/recraft-v4.1-utility-pro", name: "Recraft V4.1 Utility Pro", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "recraft", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-05-14", last_updated: "2026-05-14", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "recraft/recraft-v4-pro": { id: "recraft/recraft-v4-pro", name: "Recraft V4 Pro", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "recraft", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-02-17", last_updated: "2026-02-17", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "recraft/recraft-v4.1-utility": { id: "recraft/recraft-v4.1-utility", name: "Recraft V4.1 Utility", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "recraft", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-05-14", last_updated: "2026-05-14", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "recraft/recraft-v4": { id: "recraft/recraft-v4", name: "Recraft V4", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "recraft", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-02-17", last_updated: "2026-02-17", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "recraft/recraft-v4.1": { id: "recraft/recraft-v4.1", name: "Recraft V4.1", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "recraft", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-05-14", last_updated: "2026-05-14", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "recraft/recraft-v4.1-pro": { id: "recraft/recraft-v4.1-pro", name: "Recraft V4.1 Pro", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "recraft", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-05-14", last_updated: "2026-05-14", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "recraft/recraft-v2": { id: "recraft/recraft-v2", name: "Recraft V2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "recraft", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-03-13", last_updated: "2024-03", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 512, output: 0 } }, "meta/muse-spark-1.1": { id: "meta/muse-spark-1.1", name: "Muse Spark 1.1", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "muse", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "meta/muse-spark-1.2-contributor": { id: "meta/muse-spark-1.2-contributor", name: "Muse Spark 1.2 Contributor", description: "Open Llama multimodal model for image understanding and text reasoning", family: "muse", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, release_date: "2026-08-05", last_updated: "2026-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 0.1, output: 0.2, cache_read: 0.002 } }, "meta/muse-spark-1.2": { id: "meta/muse-spark-1.2", name: "Muse Spark 1.2", description: "Open Llama multimodal model for image understanding and text reasoning", family: "muse", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-05", last_updated: "2026-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "meta/llama-3.1-70b": { id: "meta/llama-3.1-70b", name: "Llama 3.1 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.72, output: 0.72 } }, "meta/llama-3.1-8b": { id: "meta/llama-3.1-8b", name: "Llama 3.1 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.22, output: 0.22 } }, "meta/llama-4-scout": { id: "meta/llama-4-scout", name: "Llama-4-Scout-17B-16E-Instruct-FP8", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "meta/llama-4-maverick": { id: "meta/llama-4-maverick", name: "Llama-4-Maverick-17B-128E-Instruct-FP8", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "meta/llama-3.3-70b": { id: "meta/llama-3.3-70b", name: "Llama-3.3-70B-Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "inclusionai/ling-3.0-flash": { id: "inclusionai/ling-3.0-flash", name: "Ling 3.0 Flash", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "ling", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, release_date: "2026-08-06", last_updated: "2026-08-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 }, cost: { input: 0.06, output: 0.18, cache_read: 0.012 } }, "inclusionai/ling-3.0-tiny-free": { id: "inclusionai/ling-3.0-tiny-free", name: "Ling 3.0 Tiny (Free)", description: "Free provider route for experiments, demos, and cost-sensitive chat workloads", family: "ling", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, release_date: "2026-08-06", last_updated: "2026-08-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 } }, "xai/grok-4.20-multi-agent-beta": { id: "xai/grok-4.20-multi-agent-beta", name: "Grok 4.20 Multi Agent Beta", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "xai/grok-4.1-fast-reasoning": { id: "xai/grok-4.1-fast-reasoning", name: "Grok 4.1 Fast Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-11-19", last_updated: "2025-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "xai/grok-4.20-multi-agent": { id: "xai/grok-4.20-multi-agent", name: "Grok 4.20 Multi-Agent", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, temperature: true, release_date: "2026-03-10", last_updated: "2026-03-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "xai/grok-imagine-video": { id: "xai/grok-imagine-video", name: "Grok Imagine", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "grok", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-28", last_updated: "2026-01-28", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "xai/grok-4.20-non-reasoning": { id: "xai/grok-4.20-non-reasoning", name: "Grok 4.20 Non-Reasoning", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-10", last_updated: "2026-03-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "xai/grok-4.3": { id: "xai/grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-30", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "xai/grok-imagine-image-2.0-preview": { id: "xai/grok-imagine-image-2.0-preview", name: "Grok Imagine Image 2.0 Preview", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "grok", attachment: false, reasoning: false, tool_call: false, release_date: "2026-08-08", last_updated: "2026-08-08", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "xai/grok-4.20-reasoning": { id: "xai/grok-4.20-reasoning", name: "Grok 4.20 Reasoning", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-10", last_updated: "2026-03-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "xai/grok-voice-think-fast-2.0": { id: "xai/grok-voice-think-fast-2.0", name: "Grok Voice Think Fast 2.0", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "grok", attachment: false, reasoning: false, tool_call: false, release_date: "2026-07-29", last_updated: "2026-07-29", modalities: { input: ["text", "audio"], output: ["text", "audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "xai/grok-imagine-video-1.5": { id: "xai/grok-imagine-video-1.5", name: "Grok Imagine Video 1.5", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "grok", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-06-22", last_updated: "2026-05-30", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "xai/grok-voice-think-fast-1.0": { id: "xai/grok-voice-think-fast-1.0", name: "Grok Voice Think Fast 1.0", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "grok", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "audio"], output: ["text", "audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "xai/grok-4.5": { id: "xai/grok-4.5", name: "Grok 4.5", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.3 } }, "xai/grok-imagine-video-1.5-preview": { id: "xai/grok-imagine-video-1.5-preview", name: "Grok Imagine Video 1.5 Preview", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "grok", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-05-30", last_updated: "2026-05-30", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "xai/grok-build-0.1": { id: "xai/grok-build-0.1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-20", last_updated: "2026-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1, output: 2, cache_read: 0.2 } }, "xai/grok-stt": { id: "xai/grok-stt", name: "Grok STT", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "grok", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 } }, "xai/grok-4.1-fast-non-reasoning": { id: "xai/grok-4.1-fast-non-reasoning", name: "Grok 4.1 Fast Non-Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-11-19", last_updated: "2025-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "xai/grok-tts": { id: "xai/grok-tts", name: "Grok TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "grok", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "xai/grok-4.20-reasoning-beta": { id: "xai/grok-4.20-reasoning-beta", name: "Grok 4.20 Beta Reasoning", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "xai/grok-imagine-image": { id: "xai/grok-imagine-image", name: "Grok Imagine Image", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "grok", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-28", last_updated: "2026-02-19", modalities: { input: ["text"], output: ["text", "image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "xai/grok-4.20-non-reasoning-beta": { id: "xai/grok-4.20-non-reasoning-beta", name: "Grok 4.20 Beta Non-Reasoning", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.4 } }, "morph/morph-v3-fast": { id: "morph/morph-v3-fast", name: "Morph v3 Fast", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "morph", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-08-15", last_updated: "2024-08-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16000, output: 16000 }, cost: { input: 0.8, output: 1.2 } }, "morph/morph-v3-large": { id: "morph/morph-v3-large", name: "Morph v3 Large", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "morph", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-08-15", last_updated: "2024-08-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 }, cost: { input: 0.9, output: 1.9 } }, "mistral/mistral-medium-3.5": { id: "mistral/mistral-medium-3.5", name: "Mistral Medium Latest", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, temperature: true, release_date: "2026-04-29", last_updated: "2026-05-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1.5, output: 7.5 } }, "mistral/codestral-embed": { id: "mistral/codestral-embed", name: "Codestral Embed", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "codestral-embed", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-05-28", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "mistral/mistral-large-3": { id: "mistral/mistral-large-3", name: "Mistral Large 3", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-10", release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.5, output: 1.5 } }, "mistral/mistral-nemo": { id: "mistral/mistral-nemo", name: "Mistral Nemo", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-07-18", last_updated: "2024-07-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.15, output: 0.15 } }, "mistral/mistral-small": { id: "mistral/mistral-small", name: "Mistral Small (latest)", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2024-09-17", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 4000 }, cost: { input: 0.1, output: 0.3 } }, "mistral/mistral-embed": { id: "mistral/mistral-embed", name: "Mistral Embed", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "mistral-embed", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2023-12-11", last_updated: "2023-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "mistral/mistral-medium": { id: "mistral/mistral-medium", name: "Mistral Medium 3.1", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-05-07", last_updated: "2025-05-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, cost: { input: 0.4, output: 2 } }, "mistral/ministral-14b": { id: "mistral/ministral-14b", name: "Ministral 14B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-10", release_date: "2025-12-02", last_updated: "2025-12-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.2, output: 0.2 } }, "mistral/devstral-2": { id: "mistral/devstral-2", name: "Devstral 2", description: "Mistral coding agent model for repository tasks and software engineering workflows", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-12-09", last_updated: "2025-12-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.4, output: 2 } }, "mistral/devstral-small-2": { id: "mistral/devstral-small-2", name: "Devstral Small 2", description: "Mistral coding agent model for repository tasks and software engineering workflows", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-12-09", last_updated: "2025-05-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.1, output: 0.3 } }, "mistral/magistral-small": { id: "mistral/magistral-small", name: "Magistral Small", description: "Mistral reasoning model for transparent analysis, math, and complex decisions", family: "magistral-small", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-03-17", last_updated: "2025-03-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.5, output: 1.5 } }, "mistral/magistral-medium": { id: "mistral/magistral-medium", name: "Magistral Medium (latest)", description: "Mistral reasoning model for transparent analysis, math, and complex decisions", family: "magistral-medium", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-03-17", last_updated: "2025-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 2, output: 5 } }, "mistral/ministral-8b": { id: "mistral/ministral-8b", name: "Ministral 8B (latest)", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-10-01", last_updated: "2024-10-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.1, output: 0.1 } }, "mistral/codestral": { id: "mistral/codestral", name: "Codestral (latest)", description: "Mistral code model for completions, refactors, and developer IDE workflows", family: "codestral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-05-29", last_updated: "2025-01-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 4096 }, cost: { input: 0.3, output: 0.9 } }, "mistral/ministral-3b": { id: "mistral/ministral-3b", name: "Ministral 3B (latest)", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-10-01", last_updated: "2024-10-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.04, output: 0.04 } }, "mistral/pixtral-12b": { id: "mistral/pixtral-12b", name: "Pixtral 12B", description: "Mistral vision-language model for image understanding and multimodal chat", family: "pixtral", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2024-09-01", last_updated: "2024-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.15, output: 0.15 } }, "poolside/laguna-s-2.1-free": { id: "poolside/laguna-s-2.1-free", name: "Laguna S 2.1 Free", description: "Free provider route for experiments, demos, and cost-sensitive chat workloads", family: "laguna-s", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 32768 }, cost: { input: 0, output: 0 } }, "poolside/laguna-s-2.1": { id: "poolside/laguna-s-2.1", name: "Laguna S 2.1", description: "Agentic coding model from Poolside in the XS size class for local deployment", family: "laguna-s", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-20", last_updated: "2026-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0.1, output: 0.2, cache_read: 0.01 } }, "minimax/minimax-m2.7-highspeed": { id: "minimax/minimax-m2.7-highspeed", name: "MiniMax M2.7 High Speed", description: "Low-latency M2.7 variant for interactive coding plans and agent loops", family: "minimax", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131100 }, cost: { input: 0.6, output: 2.4, cache_read: 0.06, cache_write: 0.375 } }, "minimax/minimax-m2.7": { id: "minimax/minimax-m2.7", name: "Minimax M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06, cache_write: 0.375 } }, "minimax/minimax-m2.1-lightning": { id: "minimax/minimax-m2.1-lightning", name: "MiniMax M2.1 Lightning", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-12-23", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 2.4, cache_read: 0.03, cache_write: 0.375 } }, "minimax/minimax-h3": { id: "minimax/minimax-h3", name: "MiniMax H3", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "minimax", attachment: true, reasoning: false, tool_call: false, release_date: "2026-07-30", last_updated: "2026-07-30", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "minimax/minimax-m3": { id: "minimax/minimax-m3", name: "MiniMax M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax-m3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-05-31", last_updated: "2026-06-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 1e6 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "minimax/minimax-m2.5-highspeed": { id: "minimax/minimax-m2.5-highspeed", name: "MiniMax M2.5 High Speed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131000 }, cost: { input: 0.6, output: 2.4, cache_read: 0.03, cache_write: 0.375 } }, "minimax/minimax-m2.5": { id: "minimax/minimax-m2.5", name: "MiniMax M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "minimax/minimax-m2": { id: "minimax/minimax-m2", name: "MiniMax M2", description: "Efficient open MiniMax model built for coding agents and tool-heavy workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: true, temperature: true, knowledge: "2024-10", release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 205000, output: 205000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "minimax/minimax-m2.1": { id: "minimax/minimax-m2.1", name: "MiniMax M2.1", description: "Earlier MiniMax agent model for practical coding and productivity tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: true, temperature: true, knowledge: "2024-10", release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "deepseek/deepseek-v3.1": { id: "deepseek/deepseek-v3.1", name: "DeepSeek-V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 128000 }, cost: { input: 0.25, output: 0.95, cache_read: 0.13 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-23", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.2, output: 0.4, cache_read: 0.04 } }, "deepseek/deepseek-v3.2-thinking": { id: "deepseek/deepseek-v3.2-thinking", name: "DeepSeek V3.2 Thinking", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8000 }, cost: { input: 0.62, output: 1.85 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-23", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048600, output: 1048600 }, cost: { input: 1.74, output: 3.48, cache_read: 0.14 } }, "deepseek/deepseek-v4-flash-0731": { id: "deepseek/deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-23", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.2, output: 0.4, cache_read: 0.04 } }, "deepseek/deepseek-v3": { id: "deepseek/deepseek-v3", name: "DeepSeek V3 0324", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-12-26", last_updated: "2024-12-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 163840 }, cost: { input: 0.27, output: 1.12, cache_read: 0.135 } }, "deepseek/deepseek-v3.2": { id: "deepseek/deepseek-v3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8000 }, cost: { input: 0.28, output: 0.42, cache_read: 0.028 } }, "deepseek/deepseek-v3.1-terminus": { id: "deepseek/deepseek-v3.1-terminus", name: "DeepSeek V3.1 Terminus", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-07", release_date: "2025-09-22", last_updated: "2025-09-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0.27, output: 1, cache_read: 0.135 } }, "deepseek/deepseek-r1": { id: "deepseek/deepseek-r1", name: "DeepSeek-R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32768 }, cost: { input: 1.35, output: 5.4 } }, "amazon/nova-2-lite": { id: "amazon/nova-2-lite", name: "Nova 2 Lite", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "nova", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: false, temperature: true, knowledge: "2024-10", release_date: "2025-12-02", last_updated: "2024-12-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 0.3, output: 2.5, cache_read: 0.075 } }, "amazon/titan-embed-text-v2": { id: "amazon/titan-embed-text-v2", name: "Titan Text Embeddings V2", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "titan-embed", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-04-30", last_updated: "2024-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "amazon/nova-micro": { id: "amazon/nova-micro", name: "Nova Micro", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova-micro", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-03", last_updated: "2024-12-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.035, output: 0.14, cache_read: 0.00875 } }, "amazon/nova-pro": { id: "amazon/nova-pro", name: "Nova Pro", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "nova-pro", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-03", last_updated: "2024-12-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 8192 }, cost: { input: 0.8, output: 3.2, cache_read: 0.2 } }, "amazon/nova-lite": { id: "amazon/nova-lite", name: "Nova Lite", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova-lite", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-03", last_updated: "2024-12-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 8192 }, cost: { input: 0.06, output: 0.24, cache_read: 0.015 } }, "alibaba/qwen3.7-flash": { id: "alibaba/qwen3.7-flash", name: "Qwen 3.7 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-28", last_updated: "2026-07-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 991000, output: 64000 }, cost: { input: 0.03, output: 0.13, cache_read: 0.006, cache_write: 0.038 } }, "alibaba/qwen3.7-plus": { id: "alibaba/qwen3.7-plus", name: "Qwen 3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen3.7-plus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 262144 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.4, output: 1.6, cache_read: 0.08, cache_write: 0.5 } }, "alibaba/wan-v2.6-t2v": { id: "alibaba/wan-v2.6-t2v", name: "Wan v2.6 Text-to-Video", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "alibaba/qwen3.5-plus": { id: "alibaba/qwen3.5-plus", name: "Qwen 3.5 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.4, output: 2.4, cache_read: 0.04, cache_write: 0.5 } }, "alibaba/qwen-3-14b": { id: "alibaba/qwen-3-14b", name: "Qwen3-14B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04-28", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 40960, output: 16384 }, cost: { input: 0.12, output: 0.24 } }, "alibaba/qwen3.7-max": { id: "alibaba/qwen3.7-max", name: "Qwen 3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 262144 }], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 991000, output: 64000 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5, cache_write: 3.125 } }, "alibaba/qwen3-next-80b-a3b-thinking": { id: "alibaba/qwen3-next-80b-a3b-thinking", name: "Qwen3 Next 80B A3B Thinking", description: "Efficient Qwen thinking model for local reasoning, math, and coding agents", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1 }], tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-09-11", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 1.2 } }, "alibaba/qwen3.6-27b": { id: "alibaba/qwen3.6-27b", name: "Qwen 3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 131072 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.6, output: 3.6 } }, "alibaba/qwen-3-30b": { id: "alibaba/qwen-3-30b", name: "Qwen3-30B-A3B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04-28", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 40960, output: 16384 }, cost: { input: 0.12, output: 0.5 } }, "alibaba/wan-v2.6-r2v-flash": { id: "alibaba/wan-v2.6-r2v-flash", name: "Wan v2.6 Reference-to-Video Flash", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "alibaba/qwen3-max-preview": { id: "alibaba/qwen3-max-preview", name: "Qwen3 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-05", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 1.2, output: 6, cache_read: 0.24 } }, "alibaba/qwen-3-235b": { id: "alibaba/qwen-3-235b", name: "Qwen3 235B A22B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04-28", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 16384 }, cost: { input: 0.22, output: 0.88 } }, "alibaba/qwen3.5-flash": { id: "alibaba/qwen3.5-flash", name: "Qwen 3.5 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-24", last_updated: "2026-02-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.1, output: 0.4, cache_read: 0.001, cache_write: 0.125 } }, "alibaba/qwen3-max": { id: "alibaba/qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen3 model for coding agents, complex reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 1.2, output: 6, cache_read: 0.24 } }, "alibaba/qwen3-coder-plus": { id: "alibaba/qwen3-coder-plus", name: "Qwen3 Coder Plus", description: "Hosted Qwen coder for software agents, repo edits, and long-context code", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 65536 }, cost: { input: 1, output: 5, cache_read: 0.2 } }, "alibaba/wan-v2.7-r2v": { id: "alibaba/wan-v2.7-r2v", name: "Wan v2.7 Reference-to-Video", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "alibaba/qwen3.8-max": { id: "alibaba/qwen3.8-max", name: "Qwen 3.8 Max", description: "Preview Qwen flagship for million-token multimodal reasoning and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "xhigh"] }, { type: "budget_tokens", min: 0, max: 262144 }], tool_call: true, temperature: true, release_date: "2026-08-02", last_updated: "2026-07-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 6, cache_read: 0.25, cache_write: 2.5 } }, "alibaba/qwen3-vl-235b-a22b-instruct": { id: "alibaba/qwen3-vl-235b-a22b-instruct", name: "Qwen3 VL 235B A22B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-09-23", last_updated: "2026-05-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 129024 }, cost: { input: 0.4, output: 1.6 } }, "alibaba/qwen3-vl-thinking": { id: "alibaba/qwen3-vl-thinking", name: "Qwen3 VL Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-09-23", last_updated: "2025-09-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.4, output: 4 } }, "alibaba/wan-v2.5-t2v-preview": { id: "alibaba/wan-v2.5-t2v-preview", name: "Wan v2.5 Text-to-Video Preview", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-09-24", last_updated: "2025-09-24", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "alibaba/wan-v2.7-t2v": { id: "alibaba/wan-v2.7-t2v", name: "Wan v2.7 Text-to-Video", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "alibaba/wan-v2.6-i2v-flash": { id: "alibaba/wan-v2.6-i2v-flash", name: "Wan v2.6 Image-to-Video Flash", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "alibaba/wan-v2.6-i2v": { id: "alibaba/wan-v2.6-i2v", name: "Wan v2.6 Image-to-Video", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "alibaba/qwen3-coder-30b-a3b": { id: "alibaba/qwen3-coder-30b-a3b", name: "Qwen 3 Coder 30B A3B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-31", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 8192 }, cost: { input: 0.15, output: 0.6 } }, "alibaba/qwen-3.6-max-preview": { id: "alibaba/qwen-3.6-max-preview", name: "Qwen 3.6 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 131072 }], tool_call: true, temperature: true, release_date: "2026-04-20", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 240000, output: 64000 }, cost: { input: 1.3, output: 7.8, cache_read: 0.26, cache_write: 1.625 } }, "alibaba/qwen3-embedding-4b": { id: "alibaba/qwen3-embedding-4b", name: "Qwen3 Embedding 4B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-06-05", last_updated: "2025-06-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 } }, "alibaba/qwen3-embedding-0.6b": { id: "alibaba/qwen3-embedding-0.6b", name: "Qwen3 Embedding 0.6B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 } }, "alibaba/wan-v2.6-r2v": { id: "alibaba/wan-v2.6-r2v", name: "Wan v2.6 Reference-to-Video", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "alibaba/qwen-3-32b": { id: "alibaba/qwen-3-32b", name: "Qwen 3.32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 38912 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04-28", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.16, output: 0.64 } }, "alibaba/qwen3-max-thinking": { id: "alibaba/qwen3-max-thinking", name: "Qwen 3 Max Thinking", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-01-23", last_updated: "2025-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 65536 }, cost: { input: 1.2, output: 6, cache_read: 0.24 } }, "alibaba/qwen3-vl-instruct": { id: "alibaba/qwen3-vl-instruct", name: "Qwen3 VL Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 129024 }, cost: { input: 0.4, output: 1.6 } }, "alibaba/qwen3-coder": { id: "alibaba/qwen3-coder", name: "Qwen3 Coder 480B A35B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-22", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 1.5, output: 7.5, cache_read: 0.3 } }, "alibaba/qwen3-coder-next": { id: "alibaba/qwen3-coder-next", name: "Qwen3 Coder Next", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-09", release_date: "2025-07-22", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.5, output: 1.2 } }, "alibaba/qwen3.6-plus": { id: "alibaba/qwen3.6-plus", name: "Qwen 3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 131072 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.5, output: 3, cache_read: 0.1, cache_write: 0.625 } }, "alibaba/qwen3-embedding-8b": { id: "alibaba/qwen3-embedding-8b", name: "Qwen3 Embedding 8B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-06-05", last_updated: "2025-06-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 } }, "alibaba/qwen3-next-80b-a3b-instruct": { id: "alibaba/qwen3-next-80b-a3b-instruct", name: "Qwen3 Next 80B A3B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-11", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 1.2 } }, "alibaba/qwen3-235b-a22b-thinking": { id: "alibaba/qwen3-235b-a22b-thinking", name: "Qwen3 235B A22B Thinking 2507", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-04", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.4, output: 4 } }, "kwaipilot/kat-coder-pro-v1": { id: "kwaipilot/kat-coder-pro-v1", name: "KAT-Coder-Pro V1", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "kat-coder", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2024-10", release_date: "2025-11-09", last_updated: "2025-10-24", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "kwaipilot/kat-coder-pro-v2": { id: "kwaipilot/kat-coder-pro-v2", name: "Kat Coder Pro V2", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "kat-coder", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-27", last_updated: "2026-03-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "kwaipilot/kat-coder-pro-v2.5": { id: "kwaipilot/kat-coder-pro-v2.5", name: "Kat Coder Pro V2.5", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "kat-coder", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-07-10", last_updated: "2026-07-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 80000 }, cost: { input: 0.74, output: 2.96, cache_read: 0.15 } }, "kwaipilot/kat-coder-air-v2.5": { id: "kwaipilot/kat-coder-air-v2.5", name: "Kat Coder Air V2.5", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "kat-coder", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-07-10", last_updated: "2026-07-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 80000 }, cost: { input: 0.15, output: 0.6, cache_read: 0.03 } }, "xiaomi/mimo-v2.5": { id: "xiaomi/mimo-v2.5", name: "MiMo M2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo-v2.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 131100 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "xiaomi/mimo-v2.5-pro": { id: "xiaomi/mimo-v2.5-pro", name: "MiMo V2.5 Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo-v2.5-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 131000 }, cost: { input: 0.435, output: 0.87, cache_read: 0.0036 } }, "anthropic/claude-sonnet-4.6": { id: "anthropic/claude-sonnet-4.6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, interleaved: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "anthropic/claude-fable-5": { id: "anthropic/claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-07-01", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4.8-fast": { id: "anthropic/claude-opus-4.8-fast", name: "Claude Opus 4.8 (Fast)", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, temperature: true, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4.5": { id: "anthropic/claude-opus-4.5", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024 }], tool_call: true, interleaved: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4.7": { id: "anthropic/claude-opus-4.7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, temperature: true, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-3-haiku": { id: "anthropic/claude-3-haiku", name: "Claude Haiku 3", description: "Legacy model retained for compatibility with older integrations", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-08-31", release_date: "2024-03-13", last_updated: "2024-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, cost: { input: 0.25, output: 1.25, cache_read: 0.03, cache_write: 0.3 } }, "anthropic/claude-sonnet-4": { id: "anthropic/claude-sonnet-4", name: "Claude Sonnet 4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 8192 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-haiku-4.5": { id: "anthropic/claude-haiku-4.5", name: "Claude Haiku 4.5", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024 }], tool_call: true, interleaved: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "anthropic/claude-opus-4": { id: "anthropic/claude-opus-4", name: "Claude Opus 4", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-opus-4.8": { id: "anthropic/claude-opus-4.8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, temperature: true, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-5": { id: "anthropic/claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-29", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "anthropic/claude-opus-5": { id: "anthropic/claude-opus-5", name: "Claude Opus 5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4.6": { id: "anthropic/claude-opus-4.6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, interleaved: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-4.5": { id: "anthropic/claude-sonnet-4.5", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "perplexity/pplx-embed-v1-0.6b": { id: "perplexity/pplx-embed-v1-0.6b", name: "Embed v1 0.6b", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "v0", attachment: false, reasoning: false, tool_call: false, release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 0 } }, "perplexity/sonar": { id: "perplexity/sonar", name: "Sonar", description: "Sonar search model for current answers, retrieval, and citation-backed chat", family: "sonar", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-02", release_date: "2025-02-19", last_updated: "2025-02-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 127000, output: 8000 } }, "perplexity/sonar-pro": { id: "perplexity/sonar-pro", name: "Sonar Pro", description: "Advanced Sonar search model for deeper research and cited synthesis", family: "sonar-pro", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-02-19", last_updated: "2025-02-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8000 } }, "perplexity/pplx-embed-v1-4b": { id: "perplexity/pplx-embed-v1-4b", name: "Embed v1 4b", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", attachment: false, reasoning: false, tool_call: false, release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 0 } }, "perplexity/sonar-reasoning-pro": { id: "perplexity/sonar-reasoning-pro", name: "Sonar Reasoning Pro", description: "Web-grounded reasoning model for multi-step research and cited answers", family: "sonar-reasoning", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: false, temperature: true, knowledge: "2025-09", release_date: "2025-02-19", last_updated: "2025-02-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 127000, output: 8000 } }, "moonshotai/kimi-k2.5": { id: "moonshotai/kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01-26", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262114, output: 262114 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "moonshotai/kimi-k2.7-code-highspeed": { id: "moonshotai/kimi-k2.7-code-highspeed", name: "Kimi K2.7 Code High Speed", description: "Lower-latency Kimi Code variant for interactive edits and coding-agent loops", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-06-15", last_updated: "2026-06-12", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 1.9, output: 8, cache_read: 0.38 } }, "moonshotai/kimi-k2.6": { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-20", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "moonshotai/kimi-k2.7-code": { id: "moonshotai/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32768 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "moonshotai/kimi-k2": { id: "moonshotai/kimi-k2", name: "Kimi K2 Instruct", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-07-11", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.57, output: 2.3 } }, "moonshotai/kimi-k2-thinking": { id: "moonshotai/kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Thinking Kimi model for slower research passes, planning, and hard technical questions", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: true, temperature: true, knowledge: "2024-08", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 216144, output: 216144 }, cost: { input: 0.47, output: 2, cache_read: 0.141 } }, "moonshotai/kimi-k3": { id: "moonshotai/kimi-k3", name: "Kimi K3", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "moonshotai/kimi-k3-fast": { id: "moonshotai/kimi-k3-fast", name: "Kimi K3 Fast", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-27", last_updated: "2026-07-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 4.5, output: 22.5, cache_read: 0.45 } }, "openai/gpt-5.1-codex-mini": { id: "openai/gpt-5.1-codex-mini", name: "GPT-5.1 Codex mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10", release_date: "2025-11-12", last_updated: "2025-11-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.03 } }, "openai/gpt-image-2": { id: "openai/gpt-image-2", name: "GPT Image 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 5, output: 30, cache_read: 1.25 } }, "openai/whisper-1": { id: "openai/whisper-1", name: "Whisper", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "whisper", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2022-09-21", last_updated: "2022-09-21", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 } }, "openai/gpt-5.2-pro": { id: "openai/gpt-5.2-pro", name: "GPT 5.2 ", description: "Higher-accuracy GPT-5.2 variant for tougher reasoning and review workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: true, knowledge: "2024-10", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 21, output: 168 } }, "openai/gpt-5.5-pro": { id: "openai/gpt-5.5-pro", name: "GPT 5.5 Pro", description: "Highest-accuracy GPT-5.5 tier for slower, precision-heavy reasoning and coding", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-12-01", release_date: "2026-04-24", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 872000, output: 128000 }, cost: { input: 30, output: 180 } }, "openai/gpt-5.4-pro": { id: "openai/gpt-5.4-pro", name: "GPT 5.4 Pro", description: "More exact GPT-5.4 tier for demanding professional reasoning and agent tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180 } }, "openai/gpt-5.6-sol": { id: "openai/gpt-5.6-sol", name: "GPT 5.6 Sol", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "openai/gpt-4o-mini-transcribe": { id: "openai/gpt-4o-mini-transcribe", name: "GPT-4o mini Transcribe", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "o-mini", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-03-13", last_updated: "2024-03-13", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 1.25, output: 5 } }, "openai/gpt-realtime-1.5": { id: "openai/gpt-realtime-1.5", name: "GPT-Realtime-1.5", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gpt", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "audio"], output: ["text", "audio"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 4, output: 16, cache_read: 0.4 } }, "openai/text-embedding-ada-002": { id: "openai/text-embedding-ada-002", name: "text-embedding-ada-002", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2022-12-15", last_updated: "2022-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, input: 6656, output: 1536 } }, "openai/gpt-realtime-mini": { id: "openai/gpt-realtime-mini", name: "GPT-Realtime mini", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gpt", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-10-10", last_updated: "2025-10-10", modalities: { input: ["text", "audio"], output: ["text", "audio"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 0.6, output: 2.4, cache_read: 0.06 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 122880, output: 8192 }, cost: { input: 0.05, output: 0.2 } }, "openai/gpt-oss-safeguard-20b": { id: "openai/gpt-oss-safeguard-20b", name: "gpt-oss-safeguard-20b", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-10-29", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, input: 65536, output: 65536 }, cost: { input: 0.075, output: 0.3, cache_read: 0.037 } }, "openai/gpt-image-1-mini": { id: "openai/gpt-image-1-mini", name: "GPT Image 1 Mini", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 2, output: 8, cache_read: 0.2 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT 5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-12-01", release_date: "2026-04-24", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 872000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "openai/o3-pro": { id: "openai/o3-pro", name: "o3 Pro", description: "High-effort o3 tier for difficult technical reasoning and careful answers", family: "o-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10", release_date: "2025-06-10", last_updated: "2025-06-10", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 1e5, output: 1e5 }, cost: { input: 20, output: 80 } }, "openai/gpt-realtime-2.1": { id: "openai/gpt-realtime-2.1", name: "gpt-realtime-2.1", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gpt", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2024-09-30", release_date: "2026-07-09", last_updated: "2026-07-06", modalities: { input: ["text", "audio"], output: ["text", "audio"] }, open_weights: false, limit: { context: 128000, input: 96000, output: 32000 }, cost: { input: 4, output: 24, cache_read: 0.4 } }, "openai/o3-deep-research": { id: "openai/o3-deep-research", name: "o3-deep-research", description: "Research model for long-horizon investigation, synthesis, and analytical reports", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium"] }], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-06-26", last_updated: "2024-06-26", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 1e5, output: 1e5 }, cost: { input: 10, output: 40, cache_read: 2.5 } }, "openai/gpt-5-codex": { id: "openai/gpt-5-codex", name: "GPT-5-Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "openai/tts-1-hd": { id: "openai/tts-1-hd", name: "TTS-1 HD", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2023-11-06", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "openai/gpt-3.5-turbo": { id: "openai/gpt-3.5-turbo", name: "GPT-3.5 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2021-09", release_date: "2023-03-01", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16385, input: 12289, output: 4096 }, cost: { input: 0.5, output: 1.5 } }, "openai/gpt-5.1-thinking": { id: "openai/gpt-5.1-thinking", name: "GPT 5.1 Thinking", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-11-12", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT 5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25 } }, "openai/gpt-realtime-whisper": { id: "openai/gpt-realtime-whisper", name: "gpt-realtime-whisper", description: "Streaming speech-to-text model for low-latency transcript deltas from live audio", family: "whisper", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 } }, "openai/gpt-image-1.5": { id: "openai/gpt-image-1.5", name: "GPT Image 1.5", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-16", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 5, output: 32, cache_read: 1.25 } }, "openai/gpt-5.2-codex": { id: "openai/gpt-5.2-codex", name: "GPT-5.2-Codex", description: "Code-specialist GPT for repository edits, reviews, and long-running software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10", release_date: "2025-12-18", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT 5.4 Nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "openai/gpt-5-pro": { id: "openai/gpt-5-pro", name: "GPT-5 pro", description: "Higher-accuracy GPT-5 tier for tough analysis, coding reviews, and planning", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10", release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 128000, output: 272000 }, cost: { input: 15, output: 120 } }, "openai/tts-1": { id: "openai/tts-1", name: "TTS-1", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2023-11-06", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT 5.4 Mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "openai/gpt-realtime-2": { id: "openai/gpt-realtime-2", name: "gpt-realtime-2", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gpt", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "audio"], output: ["text", "audio"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 4, output: 24, cache_read: 0.4 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.1, output: 0.5 } }, "openai/gpt-5.6-luna": { id: "openai/gpt-5.6-luna", name: "GPT 5.6 Luna", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, cache_write: 0.25 } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.3-codex": { id: "openai/gpt-5.3-codex", name: "GPT 5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.3-chat": { id: "openai/gpt-5.3-chat", name: "GPT-5.3 Chat", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-03", last_updated: "2026-03-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 111616, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.1-codex": { id: "openai/gpt-5.1-codex", name: "GPT-5.1-Codex", description: "Codex GPT for repository edits, code review, and practical software agents", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10", release_date: "2025-11-12", last_updated: "2025-11-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "openai/gpt-4o-mini-search-preview": { id: "openai/gpt-4o-mini-search-preview", name: "GPT 4o Mini Search Preview", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-09", release_date: "2025-03-12", last_updated: "2025-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 111616, output: 16384 }, cost: { input: 0.15, output: 0.6 } }, "openai/gpt-5.6-terra": { id: "openai/gpt-5.6-terra", name: "GPT 5.6 Terra", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 2.5 } }, "openai/gpt-image-1": { id: "openai/gpt-image-1", name: "GPT Image 1", description: "OpenAI image model for production generation, edits, and brand-safe visual workflows", family: "gpt-image", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-03-25", last_updated: "2025-04-24", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 5, output: 40, cache_read: 1.25 } }, "openai/gpt-5.1-codex-max": { id: "openai/gpt-5.1-codex-max", name: "GPT 5.1 Codex Max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10", release_date: "2025-11-19", last_updated: "2025-11-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/text-embedding-3-large": { id: "openai/text-embedding-3-large", name: "text-embedding-3-large", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, input: 6656, output: 1536 } }, "openai/gpt-4o-transcribe": { id: "openai/gpt-4o-transcribe", name: "GPT-4o Transcribe", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "gpt", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-03-13", last_updated: "2024-03-13", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 2.5, output: 10 } }, "openai/text-embedding-3-small": { id: "openai/text-embedding-3-small", name: "text-embedding-3-small", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, input: 6656, output: 1536 } }, "openai/o4-mini": { id: "openai/o4-mini", name: "o4-mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 1.1, output: 4.4, cache_read: 0.275 } }, "openai/gpt-4.1": { id: "openai/gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/o3": { id: "openai/o3", name: "o3", description: "Deliberate o-series reasoner for hard math, coding, and multi-step analysis", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/gpt-5-nano": { id: "openai/gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "openai/gpt-4-turbo": { id: "openai/gpt-4-turbo", name: "GPT-4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-12", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, status: "deprecated", cost: { input: 10, output: 30 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/o1": { id: "openai/o1", name: "o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2023-09", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 15, output: 60, cache_read: 7.5 } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4o-mini": { id: "openai/gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "openai/o3-mini": { id: "openai/o3-mini", name: "o3-mini", description: "Smaller o-series reasoner for economical coding, math, and planning tasks", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-4.1-nano": { id: "openai/gpt-4.1-nano", name: "GPT-4.1 nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, status: "deprecated", cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "openai/gpt-4o": { id: "openai/gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-4.1-mini": { id: "openai/gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "arcee-ai/trinity-mini": { id: "arcee-ai/trinity-mini", name: "Trinity Mini", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "trinity", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-10", release_date: "2025-12-01", last_updated: "2025-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.045, output: 0.15 } }, "arcee-ai/trinity-large-thinking": { id: "arcee-ai/trinity-large-thinking", name: "Trinity Large Thinking", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "trinity", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262100, output: 80000 }, cost: { input: 0.25, output: 0.8999999999999999 } }, "zai/glm-4.6v": { id: "zai/glm-4.6v", name: "GLM-4.6V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-09-30", last_updated: "2025-12-08", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 24000 }, cost: { input: 0.3, output: 0.9, cache_read: 0.05 } }, "zai/glm-5": { id: "zai/glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202800, output: 131100 }, cost: { input: 1, output: 3.2 } }, "zai/glm-4.5-air": { id: "zai/glm-4.5-air", name: "GLM 4.5 Air", description: "Lighter GLM-4.5 variant for fast coding assistance and cheaper agents", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 96000 }, cost: { input: 0.2, output: 1.1, cache_read: 0.03 } }, "zai/glm-5.1": { id: "zai/glm-5.1", name: "GLM 5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202800, output: 64000 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "zai/glm-4.7-flash": { id: "zai/glm-4.7-flash", name: "GLM 4.7 Flash", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131000 }, cost: { input: 0.07, output: 0.4 } }, "zai/glm-5.2": { id: "zai/glm-5.2", name: "GLM 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-16", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 1.1, output: 3.851, cache_read: 0.275 } }, "zai/glm-4.7-flashx": { id: "zai/glm-4.7-flashx", name: "GLM 4.7 FlashX", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, temperature: true, knowledge: "2025-01", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.06, output: 0.4, cache_read: 0.01 } }, "zai/glm-5.2-fast": { id: "zai/glm-5.2-fast", name: "GLM 5.2 Fast", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-23", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2.1, output: 6.6, cache_read: 0.21 } }, "zai/glm-4.6": { id: "zai/glm-4.6", name: "GLM 4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 96000 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "zai/glm-4.6v-flash": { id: "zai/glm-4.6v-flash", name: "GLM-4.6V-Flash", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 24000 } }, "zai/glm-4.5": { id: "zai/glm-4.5", name: "GLM 4.5", description: "Hybrid-reasoning GLM release that made the 4.5 line broadly useful", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 96000 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "zai/glm-4.5v": { id: "zai/glm-4.5v", name: "GLM 4.5V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-08", release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 66000, output: 16000 }, cost: { input: 0.6, output: 1.8, cache_read: 0.11 } }, "zai/glm-4.7": { id: "zai/glm-4.7", name: "GLM 4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, temperature: true, knowledge: "2024-10", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 120000 }, cost: { input: 0.6, output: 2.2, cache_read: 0.12 } }, "zai/glm-5-turbo": { id: "zai/glm-5-turbo", name: "GLM 5 Turbo", description: "Faster GLM-5 lane for coding agents that need lower latency", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-15", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202800, output: 131100 }, cost: { input: 1.2, output: 4, cache_read: 0.24 } }, "zai/glm-5v-turbo": { id: "zai/glm-5v-turbo", name: "GLM 5V Turbo", description: "Fast GLM vision model for screenshots, documents, and multimodal agent tasks", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 1.2, output: 4, cache_read: 0.24 } }, "stepfun/step-3.5-flash": { id: "stepfun/step-3.5-flash", name: "StepFun 3.5 Flash", description: "StepFun flash lane for quick multimodal reasoning and coding assistance", family: "step", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-01-29", last_updated: "2026-02-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262114, output: 262114 }, cost: { input: 0.09, output: 0.3, cache_read: 0.02 } }, "stepfun/step-3.7-flash": { id: "stepfun/step-3.7-flash", name: "Step 3.7 Flash", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", family: "step", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-28", last_updated: "2026-05-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0.2, output: 1.15, cache_read: 0.04 } }, "quiverai/arrow-1.1": { id: "quiverai/arrow-1.1", name: "Arrow 1.1", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 131072, output: 131072 } } } }, "alibaba-cn": { id: "alibaba-cn", env: ["DASHSCOPE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://dashscope.aliyuncs.com/compatible-mode/v1", name: "Alibaba (China)", doc: "https://www.alibabacloud.com/help/en/model-studio/models", models: { "qwen3-coder-480b-a35b-instruct": { id: "qwen3-coder-480b-a35b-instruct", name: "Qwen3-Coder 480B-A35B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.861, output: 3.441 } }, "qwen3.7-flash": { id: "qwen3.7-flash", name: "Qwen3.7 Flash", description: "Lightweight multimodal Qwen model for high-throughput text, image, and video tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 262144 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 991000, output: 65536 }, cost: { input: 0.02962, output: 0.1185, cache_read: 0.002962, cache_write: 0.03703, tiers: [{ input: 0.08887, output: 0.35549, cache_read: 0.008887, cache_write: 0.11109, tier: { type: "context", size: 32000 } }, { input: 0.17774, output: 0.71098, cache_read: 0.017774, cache_write: 0.22218, tier: { type: "context", size: 256000 } }] } }, "qwen3.7-plus": { id: "qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 262144 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 0.625, tiers: [{ input: 2, output: 6, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 128000 } }] } }, "qwen3-vl-plus": { id: "qwen3-vl-plus", name: "Qwen3-VL Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.143353, output: 1.433525, reasoning: 4.300576 } }, "qwen3-32b": { id: "qwen3-32b", name: "Qwen3 32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 38912 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.287, output: 1.147, reasoning: 2.868 } }, "glm-5": { id: "glm-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 32768 }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 16384 }, cost: { input: 0.86, output: 3.15 } }, "qwen-mt-plus": { id: "qwen-mt-plus", name: "Qwen-MT Plus", description: "Translation model for multilingual conversion, localization, and cross-language workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-04", release_date: "2025-01", last_updated: "2025-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 8192 }, cost: { input: 0.259, output: 0.775 } }, "qwen2-5-vl-72b-instruct": { id: "qwen2-5-vl-72b-instruct", name: "Qwen2.5-VL 72B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 2.294, output: 6.881 } }, "qwen-max": { id: "qwen-max", name: "Qwen Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-04-03", last_updated: "2025-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.345, output: 1.377 } }, "qwen3.5-plus": { id: "qwen3.5-plus", name: "Qwen3.5 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.573, output: 3.44, reasoning: 3.44 } }, "tongyi-intent-detect-v3": { id: "tongyi-intent-detect-v3", name: "Tongyi Intent Detect V3", description: "General-purpose chat model for instruction following, writing, and analysis", family: "yi", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-04", release_date: "2024-01", last_updated: "2024-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1024 }, cost: { input: 0.058, output: 0.144 } }, "qwen-omni-turbo": { id: "qwen-omni-turbo", name: "Qwen-Omni Turbo", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-01-19", last_updated: "2025-03-26", modalities: { input: ["text", "image", "audio", "video"], output: ["text", "audio"] }, open_weights: false, limit: { context: 32768, output: 2048 }, cost: { input: 0.058, output: 0.23, input_audio: 3.584, output_audio: 7.168 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 131072 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-14", last_updated: "2026-04-14", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 128000 }, cost: { input: 0.87, output: 3.48, cache_read: 0.17 } }, "qwen-vl-max": { id: "qwen-vl-max", name: "Qwen-VL Max", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-04-08", last_updated: "2025-08-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.23, output: 0.574 } }, "qwen-deep-research": { id: "qwen-deep-research", name: "Qwen Deep Research", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-01", last_updated: "2024-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 7.742, output: 23.367 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Moonshot Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.574, output: 2.411 } }, "qwen3-coder-30b-a3b-instruct": { id: "qwen3-coder-30b-a3b-instruct", name: "Qwen3-Coder 30B-A3B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.216, output: 0.861 } }, "qwen2-5-math-72b-instruct": { id: "qwen2-5-math-72b-instruct", name: "Qwen2.5-Math 72B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 4096, output: 3072 }, cost: { input: 0.574, output: 1.721 } }, "qwen3-vl-235b-a22b": { id: "qwen3-vl-235b-a22b", name: "Qwen3-VL 235B-A22B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.286705, output: 1.14682, reasoning: 2.867051 } }, "qwen2-5-72b-instruct": { id: "qwen2-5-72b-instruct", name: "Qwen2.5 72B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.574, output: 1.721 } }, "qwen2-5-math-7b-instruct": { id: "qwen2-5-math-7b-instruct", name: "Qwen2.5-Math 7B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 4096, output: 3072 }, cost: { input: 0.144, output: 0.287 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 1.1, output: 3.851, cache_read: 0.275, cache_write: 0 } }, "deepseek-r1-distill-qwen-14b": { id: "deepseek-r1-distill-qwen-14b", name: "DeepSeek R1 Distill Qwen 14B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 16384 }, cost: { input: 0.144, output: 0.431 } }, "qwen3.7-max": { id: "qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 262144 }], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5, cache_write: 3.125 } }, "qwen3-next-80b-a3b-thinking": { id: "qwen3-next-80b-a3b-thinking", name: "Qwen3-Next 80B-A3B (Thinking)", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.144, output: 1.434 } }, "qwen-mt-turbo": { id: "qwen-mt-turbo", name: "Qwen-MT Turbo", description: "Translation model for multilingual conversion, localization, and cross-language workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-04", release_date: "2025-01", last_updated: "2025-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 8192 }, cost: { input: 0.101, output: 0.28 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Moonshot Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.929, output: 3.858 } }, "qvq-max": { id: "qvq-max", name: "QVQ Max", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "qvq", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-03-25", last_updated: "2025-03-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 1.147, output: 4.588 } }, "qwen2-5-vl-7b-instruct": { id: "qwen2-5-vl-7b-instruct", name: "Qwen2.5-VL 7B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.287, output: 0.717 } }, "qwen-plus-character": { id: "qwen-plus-character", name: "Qwen Plus Character", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-01", last_updated: "2024-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 4096 }, cost: { input: 0.115, output: 0.287 } }, "qwen-math-turbo": { id: "qwen-math-turbo", name: "Qwen Math Turbo", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09-19", last_updated: "2024-09-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 4096, output: 3072 }, cost: { input: 0.287, output: 0.861 } }, "deepseek-r1-distill-llama-70b": { id: "deepseek-r1-distill-llama-70b", name: "DeepSeek R1 Distill Llama 70B", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 16384 }, cost: { input: 0.287, output: 0.861 } }, "qwen3-vl-30b-a3b": { id: "qwen3-vl-30b-a3b", name: "Qwen3-VL 30B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.108, output: 0.431, reasoning: 1.076 } }, "deepseek-r1-distill-qwen-1-5b": { id: "deepseek-r1-distill-qwen-1-5b", name: "DeepSeek R1 Distill Qwen 1.5B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 16384 }, cost: { input: 0, output: 0 } }, "qwen3-14b": { id: "qwen3-14b", name: "Qwen3 14B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 38912 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.144, output: 0.574, reasoning: 1.434 } }, "qwen2-5-32b-instruct": { id: "qwen2-5-32b-instruct", name: "Qwen2.5 32B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.287, output: 0.861 } }, "qwen3-omni-flash-realtime": { id: "qwen3-omni-flash-realtime", name: "Qwen3-Omni Flash Realtime", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image", "audio"], output: ["text", "audio"] }, open_weights: false, limit: { context: 65536, output: 16384 }, cost: { input: 0.23, output: 0.918, input_audio: 3.584, output_audio: 7.168 } }, "qwen3-235b-a22b": { id: "qwen3-235b-a22b", name: "Qwen3 235B-A22B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 38912 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.287, output: 1.147, reasoning: 2.868 } }, "qwen3.5-flash": { id: "qwen3.5-flash", name: "Qwen3.5 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.172, output: 1.72, reasoning: 1.72 } }, "qwen3-max": { id: "qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.861, output: 3.441 } }, "qwen3-8b": { id: "qwen3-8b", name: "Qwen3 8B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 38912 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.072, output: 0.287, reasoning: 0.717 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "deepseek-r1-0528": { id: "deepseek-r1-0528", name: "DeepSeek R1 0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-05-28", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0.574, output: 2.294 } }, "qwen2-5-14b-instruct": { id: "qwen2-5-14b-instruct", name: "Qwen2.5 14B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.144, output: 0.431 } }, "moonshot-kimi-k2-instruct": { id: "moonshot-kimi-k2-instruct", name: "Moonshot Kimi K2 Instruct", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.574, output: 2.294 } }, "qwen2-5-7b-instruct": { id: "qwen2-5-7b-instruct", name: "Qwen2.5 7B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.072, output: 0.144 } }, "qwen-doc-turbo": { id: "qwen-doc-turbo", name: "Qwen Doc Turbo", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-01", last_updated: "2024-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.087, output: 0.144 } }, "qwen3.8-max": { id: "qwen3.8-max", name: "Qwen3.8 Max", description: "2.4-trillion-parameter MoE flagship for coding, professional work, multimodal understanding, and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "xhigh"] }, { type: "budget_tokens", min: 0, max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 1.77744, output: 5.33231, cache_read: 0.22218, cache_write: 2.22179 } }, "deepseek-v3-2-exp": { id: "deepseek-v3-2-exp", name: "DeepSeek V3.2 Exp", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 65536 }, cost: { input: 0.287, output: 0.431 } }, "qwen3-coder-flash": { id: "qwen3-coder-flash", name: "Qwen3 Coder Flash", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.144, output: 0.574 } }, "deepseek-v3": { id: "deepseek-v3", name: "DeepSeek V3", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 65536, output: 8192 }, cost: { input: 0.287, output: 1.147 } }, "qwq-32b": { id: "qwq-32b", name: "QwQ 32B", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-12", last_updated: "2024-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.287, output: 0.861 } }, "qwen2-5-coder-32b-instruct": { id: "qwen2-5-coder-32b-instruct", name: "Qwen2.5-Coder 32B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-11", last_updated: "2024-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.287, output: 0.861 } }, "qwen-flash": { id: "qwen-flash", name: "Qwen Flash", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.022, output: 0.216 } }, "qwen-long": { id: "qwen-long", name: "Qwen Long", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-01-25", last_updated: "2025-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e7, output: 8192 }, cost: { input: 0.072, output: 0.287 } }, "qwen-plus": { id: "qwen-plus", name: "Qwen Plus", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-01-25", last_updated: "2025-09-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.115, output: 0.287, reasoning: 1.147 } }, "deepseek-r1-distill-llama-8b": { id: "deepseek-r1-distill-llama-8b", name: "DeepSeek R1 Distill Llama 8B", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 16384 }, cost: { input: 0, output: 0 } }, "deepseek-r1": { id: "deepseek-r1", name: "DeepSeek R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0.574, output: 2.294 } }, "MiniMax-M2.5": { id: "MiniMax-M2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "qwen-omni-turbo-realtime": { id: "qwen-omni-turbo-realtime", name: "Qwen-Omni Turbo Realtime", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-05-08", last_updated: "2025-05-08", modalities: { input: ["text", "image", "audio"], output: ["text", "audio"] }, open_weights: false, limit: { context: 32768, output: 2048 }, cost: { input: 0.23, output: 0.918, input_audio: 3.584, output_audio: 7.168 } }, "qwen-turbo": { id: "qwen-turbo", name: "Qwen Turbo", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 38912 }], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-11-01", last_updated: "2025-07-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 16384 }, cost: { input: 0.044, output: 0.087, reasoning: 0.431 } }, "qwen2-5-omni-7b": { id: "qwen2-5-omni-7b", name: "Qwen2.5-Omni 7B", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-12", last_updated: "2024-12", modalities: { input: ["text", "image", "audio", "video"], output: ["text", "audio"] }, open_weights: true, limit: { context: 32768, output: 2048 }, cost: { input: 0.087, output: 0.345, input_audio: 5.448 } }, "qwen3-asr-flash": { id: "qwen3-asr-flash", name: "Qwen3-ASR Flash", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2024-04", release_date: "2025-09-08", last_updated: "2025-09-08", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 53248, output: 4096 }, cost: { input: 0.032, output: 0.032 } }, "qwq-plus": { id: "qwq-plus", name: "QwQ Plus", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-03-05", last_updated: "2025-03-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.23, output: 0.574 } }, "qwen3.6-flash": { id: "qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 131072 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.1875, output: 1.125, cache_write: 0.234375 } }, "kimi-k2-thinking": { id: "kimi-k2-thinking", name: "Moonshot Kimi K2 Thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.574, output: 2.294 } }, "qwen3.5-397b-a17b": { id: "qwen3.5-397b-a17b", name: "Qwen3.5 397B-A17B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.43, output: 2.58, reasoning: 2.58 } }, "deepseek-v3-1": { id: "deepseek-v3-1", name: "DeepSeek V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 65536 }, cost: { input: 0.574, output: 1.721 } }, "deepseek-r1-distill-qwen-7b": { id: "deepseek-r1-distill-qwen-7b", name: "DeepSeek R1 Distill Qwen 7B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 16384 }, cost: { input: 0.072, output: 0.144 } }, "qwen3.6-max-preview": { id: "qwen3.6-max-preview", name: "Qwen3.6 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 131072 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-20", last_updated: "2026-04-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 245800, output: 65536 }, cost: { input: 1.32, output: 7.9, cache_read: 0.132 } }, "qwen-vl-ocr": { id: "qwen-vl-ocr", name: "Qwen-VL OCR", description: "OCR model for extracting structured text from documents and screenshots", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-04", release_date: "2024-10-28", last_updated: "2025-04-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 34096, output: 4096 }, cost: { input: 0.717, output: 0.717 } }, "deepseek-r1-distill-qwen-32b": { id: "deepseek-r1-distill-qwen-32b", name: "DeepSeek R1 Distill Qwen 32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 16384 }, cost: { input: 0.287, output: 0.861 } }, "qwen2-5-coder-7b-instruct": { id: "qwen2-5-coder-7b-instruct", name: "Qwen2.5-Coder 7B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-11", last_updated: "2024-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.144, output: 0.287 } }, "qwen-math-plus": { id: "qwen-math-plus", name: "Qwen Math Plus", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-08-16", last_updated: "2024-09-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 4096, output: 3072 }, cost: { input: 0.574, output: 1.721 } }, "qwen3-omni-flash": { id: "qwen3-omni-flash", name: "Qwen3-Omni Flash", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image", "audio", "video"], output: ["text", "audio"] }, open_weights: false, limit: { context: 65536, output: 16384 }, cost: { input: 0.058, output: 0.23, input_audio: 3.584, output_audio: 7.168 } }, "qwen3.6-plus": { id: "qwen3.6-plus", name: "Qwen3.6 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 0.625, tiers: [{ input: 2, output: 6, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.2, cache_write: 2.5 } } }, "qwen3-next-80b-a3b-instruct": { id: "qwen3-next-80b-a3b-instruct", name: "Qwen3-Next 80B-A3B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.144, output: 0.574 } }, "qwen-vl-plus": { id: "qwen-vl-plus", name: "Qwen-VL Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-01-25", last_updated: "2025-08-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.115, output: 0.287 } }, "siliconflow/deepseek-r1-0528": { id: "siliconflow/deepseek-r1-0528", name: "siliconflow/deepseek-r1-0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-05-28", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 32768 }, cost: { input: 0.5, output: 2.18 } }, "siliconflow/deepseek-v3-0324": { id: "siliconflow/deepseek-v3-0324", name: "siliconflow/deepseek-v3-0324", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-12-26", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 163840 }, cost: { input: 0.25, output: 1 } }, "siliconflow/deepseek-v3.2": { id: "siliconflow/deepseek-v3.2", name: "siliconflow/deepseek-v3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-03", last_updated: "2025-12-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 65536 }, cost: { input: 0.27, output: 0.42 } }, "siliconflow/deepseek-v3.1-terminus": { id: "siliconflow/deepseek-v3.1-terminus", name: "siliconflow/deepseek-v3.1-terminus", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-29", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 65536 }, cost: { input: 0.27, output: 1 } }, "MiniMax/MiniMax-M2.7": { id: "MiniMax/MiniMax-M2.7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06, cache_write: 0.375 } }, "qwen3-coder-plus": { id: "qwen3-coder-plus", name: "Qwen3 Coder Plus", description: "Hosted Qwen coder for software agents, repo edits, and long-context code", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 65536 }, cost: { input: 1, output: 5 } }, "kimi/kimi-k2.5": { id: "kimi/kimi-k2.5", name: "kimi/kimi-k2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } } } }, "novita-ai": { id: "novita-ai", env: ["NOVITA_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.novita.ai/openai", name: "NovitaAI", doc: "https://novita.ai/docs/guides/introduction", models: { "microsoft/wizardlm-2-8x22b": { id: "microsoft/wizardlm-2-8x22b", name: "Wizardlm 2 8x22B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-04-24", last_updated: "2024-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65535, output: 8000 }, cost: { input: 0.62, output: 0.62 } }, "google/gemma-4-26b-a4b-it": { id: "google/gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.13, output: 0.4 } }, "google/gemma-3-27b-it": { id: "google/gemma-3-27b-it", name: "Gemma 3 27B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-03-25", last_updated: "2025-03-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 98304, output: 16384 }, cost: { input: 0.119, output: 0.2 } }, "google/gemma-3-12b-it": { id: "google/gemma-3-12b-it", name: "Gemma 3 12B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.05, output: 0.1 } }, "google/gemma-4-31b-it": { id: "google/gemma-4-31b-it", name: "Gemma 4 31B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.14, output: 0.4 } }, "zai-org/glm-4.6v": { id: "zai-org/glm-4.6v", name: "GLM 4.6V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glmv", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "video", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.3, output: 0.9, cache_read: 0.055 } }, "zai-org/glm-5": { id: "zai-org/glm-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202800, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.2 } }, "zai-org/glm-4.5-air": { id: "zai-org/glm-4.5-air", name: "GLM 4.5 Air", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-10-13", last_updated: "2025-10-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.13, output: 0.85, cache_read: 0.025 } }, "zai-org/glm-5.1": { id: "zai-org/glm-5.1", name: "GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-27", last_updated: "2026-03-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 1.38, output: 4.4, cache_read: 0.26 } }, "zai-org/glm-4.7-flash": { id: "zai-org/glm-4.7-flash", name: "GLM-4.7-Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.07, output: 0.4, cache_read: 0.01 } }, "zai-org/glm-5.2": { id: "zai-org/glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "zai-org/autoglm-phone-9b-multilingual": { id: "zai-org/autoglm-phone-9b-multilingual", name: "AutoGLM-Phone-9B-Multilingual", description: "GLM vision model for visual reasoning, documents, and multimodal agents", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-10", last_updated: "2025-12-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 0.035, output: 0.138 } }, "zai-org/glm-4.6": { id: "zai-org/glm-4.6", name: "GLM 4.6", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.55, output: 2.2, cache_read: 0.11 } }, "zai-org/glm-4.5": { id: "zai-org/glm-4.5", name: "GLM-4.5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "zai-org/glm-4.5v": { id: "zai-org/glm-4.5v", name: "GLM 4.5V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glmv", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text", "video", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 16384 }, cost: { input: 0.6, output: 1.8, cache_read: 0.11 } }, "zai-org/glm-4.7": { id: "zai-org/glm-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "qwen/qwen3-coder-480b-a35b-instruct": { id: "qwen/qwen3-coder-480b-a35b-instruct", name: "Qwen3 Coder 480B A35B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.38, output: 1.55 } }, "qwen/qwen-mt-plus": { id: "qwen/qwen-mt-plus", name: "Qwen MT Plus", description: "Translation model for multilingual conversion, localization, and cross-language workflows", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-09-03", last_updated: "2025-09-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, output: 8192 }, cost: { input: 0.25, output: 0.75 } }, "qwen/qwen3-235b-a22b-thinking-2507": { id: "qwen/qwen3-235b-a22b-thinking-2507", name: "Qwen3 235B A22b Thinking 2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.3, output: 3 } }, "qwen/qwen3-vl-30b-a3b-thinking": { id: "qwen/qwen3-vl-30b-a3b-thinking", name: "qwen/qwen3-vl-30b-a3b-thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-11", last_updated: "2025-10-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.2, output: 1 } }, "qwen/qwen3-coder-30b-a3b-instruct": { id: "qwen/qwen3-coder-30b-a3b-instruct", name: "Qwen3 Coder 30b A3B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-09", last_updated: "2025-10-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 160000, output: 32768 }, cost: { input: 0.07, output: 0.27 } }, "qwen/qwen3.5-27b": { id: "qwen/qwen3.5-27b", name: "Qwen3.5-27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.3, output: 2.4 } }, "qwen/qwen3-8b-fp8": { id: "qwen/qwen3-8b-fp8", name: "Qwen3 8B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, release_date: "2025-04-29", last_updated: "2025-04-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 20000 }, cost: { input: 0.035, output: 0.138 } }, "qwen/qwen3.7-max": { id: "qwen/qwen3.7-max", name: "Qwen3.7-Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 1.25, output: 3.75, cache_read: 0.25, cache_write: 1.5625 } }, "qwen/qwen3-next-80b-a3b-thinking": { id: "qwen/qwen3-next-80b-a3b-thinking", name: "Qwen3 Next 80B A3B Thinking", description: "Qwen reasoning model for deliberate problem solving, math, and coding", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-10", last_updated: "2025-09-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 1.5 } }, "qwen/qwen3.5-35b-a3b": { id: "qwen/qwen3.5-35b-a3b", name: "Qwen3.5-35B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.25, output: 2 } }, "qwen/qwen3-32b-fp8": { id: "qwen/qwen3-32b-fp8", name: "Qwen3 32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, release_date: "2025-04-29", last_updated: "2025-04-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 20000 }, cost: { input: 0.1, output: 0.45 } }, "qwen/qwen3-30b-a3b-fp8": { id: "qwen/qwen3-30b-a3b-fp8", name: "Qwen3 30B A3B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, release_date: "2025-04-29", last_updated: "2025-04-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 20000 }, cost: { input: 0.09, output: 0.45 } }, "qwen/qwen3-max": { id: "qwen/qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-24", last_updated: "2025-09-24", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 2.11, output: 8.45 } }, "qwen/qwen3-vl-8b-instruct": { id: "qwen/qwen3-vl-8b-instruct", name: "qwen/qwen3-vl-8b-instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-17", last_updated: "2025-10-17", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.08, output: 0.5 } }, "qwen/qwen3-235b-a22b-fp8": { id: "qwen/qwen3-235b-a22b-fp8", name: "Qwen3 235B A22B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, release_date: "2025-04-29", last_updated: "2025-04-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 20000 }, cost: { input: 0.2, output: 0.8 } }, "qwen/qwen3-235b-a22b-instruct-2507": { id: "qwen/qwen3-235b-a22b-instruct-2507", name: "Qwen3 235B A22B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-22", last_updated: "2025-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.09, output: 0.58 } }, "qwen/qwen3-vl-235b-a22b-instruct": { id: "qwen/qwen3-vl-235b-a22b-instruct", name: "Qwen3 VL 235B A22B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-24", last_updated: "2025-09-24", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.3, output: 1.5 } }, "qwen/qwen-2.5-72b-instruct": { id: "qwen/qwen-2.5-72b-instruct", name: "Qwen 2.5 72B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2024-10-15", last_updated: "2024-10-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 8192 }, cost: { input: 0.38, output: 0.4 } }, "qwen/qwen3-omni-30b-a3b-instruct": { id: "qwen/qwen3-omni-30b-a3b-instruct", name: "Qwen3 Omni 30B A3B Instruct", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-09-24", last_updated: "2025-09-24", modalities: { input: ["text", "video", "audio", "image"], output: ["text", "audio"] }, open_weights: true, limit: { context: 65536, output: 16384 }, cost: { input: 0.25, output: 0.97, input_audio: 2.2, output_audio: 1.788 } }, "qwen/qwen3-4b-fp8": { id: "qwen/qwen3-4b-fp8", name: "Qwen3 4B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, release_date: "2025-04-29", last_updated: "2025-04-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 20000 }, cost: { input: 0.03, output: 0.03 } }, "qwen/qwen2.5-7b-instruct": { id: "qwen/qwen2.5-7b-instruct", name: "Qwen2.5 7B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 32000 }, cost: { input: 0.07, output: 0.07 } }, "qwen/qwen3-vl-30b-a3b-instruct": { id: "qwen/qwen3-vl-30b-a3b-instruct", name: "qwen/qwen3-vl-30b-a3b-instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-11", last_updated: "2025-10-11", modalities: { input: ["text", "video", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.2, output: 0.7 } }, "qwen/qwen3.5-397b-a17b": { id: "qwen/qwen3.5-397b-a17b", name: "Qwen3.5-397B-A17B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-17", last_updated: "2026-02-17", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 64000 }, cost: { input: 0.6, output: 3.6 } }, "qwen/qwen3-vl-235b-a22b-thinking": { id: "qwen/qwen3-vl-235b-a22b-thinking", name: "Qwen3 VL 235B A22B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, release_date: "2025-09-24", last_updated: "2025-09-24", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.98, output: 3.95 } }, "qwen/qwen3-coder-next": { id: "qwen/qwen3-coder-next", name: "Qwen3 Coder Next", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-03", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.2, output: 1.5 } }, "qwen/qwen3.5-122b-a10b": { id: "qwen/qwen3.5-122b-a10b", name: "Qwen3.5-122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.4, output: 3.2 } }, "qwen/qwen3-omni-30b-a3b-thinking": { id: "qwen/qwen3-omni-30b-a3b-thinking", name: "Qwen3 Omni 30B A3B Thinking", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-24", last_updated: "2025-09-24", modalities: { input: ["text", "audio", "video", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 16384 }, cost: { input: 0.25, output: 0.97, input_audio: 2.2, output_audio: 1.788 } }, "qwen/qwen3-next-80b-a3b-instruct": { id: "qwen/qwen3-next-80b-a3b-instruct", name: "Qwen3 Next 80B A3B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-10", last_updated: "2025-09-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 1.5 } }, "qwen/qwen2.5-vl-72b-instruct": { id: "qwen/qwen2.5-vl-72b-instruct", name: "Qwen2.5 VL 72B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-03-25", last_updated: "2025-03-25", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.8, output: 0.8 } }, "mistralai/mistral-nemo": { id: "mistralai/mistral-nemo", name: "Mistral Nemo", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-07-30", last_updated: "2024-07-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 60288, output: 16000 }, cost: { input: 0.04, output: 0.17 } }, "xiaomimimo/mimo-v2-flash": { id: "xiaomimimo/mimo-v2-flash", name: "XiaomiMiMo/MiMo-V2-Flash", description: "MiMo flash model for fast multimodal assistance and agent workflows", family: "mimo", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2025-12-19", last_updated: "2025-12-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32000 }, cost: { input: 0.1, output: 0.3, cache_read: 0.3 } }, "xiaomimimo/mimo-v2-pro": { id: "xiaomimimo/mimo-v2-pro", name: "MiMo-V2-Pro", description: "Earlier MiMo Pro model for multimodal agents, reasoning, and code tasks", family: "mimo", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-05-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, cost: { input: 2, output: 6, cache_read: 0.4, tiers: [{ input: 2, output: 6, cache_read: 0.4, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.4 } } }, "xiaomimimo/mimo-v2.5-pro": { id: "xiaomimimo/mimo-v2.5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-05-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.522, output: 1.044, cache_read: 0.0043, tiers: [{ input: 0.522, output: 1.044, cache_read: 0.0043, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.522, output: 1.044, cache_read: 0.0043 } } }, "gryphe/mythomax-l2-13b": { id: "gryphe/mythomax-l2-13b", name: "Mythomax L2 13B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-04-25", last_updated: "2024-04-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 4096, output: 3200 }, cost: { input: 0.09, output: 0.09 } }, "inclusionai/ring-2.6-1t": { id: "inclusionai/ring-2.6-1t", name: "Ring-2.6-1T", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "ring", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-08", last_updated: "2026-05-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.06 } }, "inclusionai/ling-2.6-1t": { id: "inclusionai/ling-2.6-1t", name: "Ling-2.6-1T", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "ling", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-23", last_updated: "2026-06-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.3, output: 2.5, cache_read: 0.06 } }, "inclusionai/ling-2.6-flash": { id: "inclusionai/ling-2.6-flash", name: "Ling-2.6-flash", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "ling", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.1, output: 0.3, cache_read: 0.02 } }, "paddlepaddle/paddleocr-vl": { id: "paddlepaddle/paddleocr-vl", name: "PaddleOCR-VL", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-10-22", last_updated: "2025-10-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 16384, output: 16384 }, cost: { input: 0.02, output: 0.02 } }, "nousresearch/hermes-2-pro-llama-3-8b": { id: "nousresearch/hermes-2-pro-llama-3-8b", name: "Hermes 2 Pro Llama 3 8B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-06-27", last_updated: "2024-06-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0.14, output: 0.14 } }, "sao10K/l3-70b-euryale-v2.1": { id: "sao10K/l3-70b-euryale-v2.1", name: "L3 70B Euryale V2.1\t", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-06-18", last_updated: "2024-06-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 1.48, output: 1.48 } }, "sao10K/l31-70b-euryale-v2.2": { id: "sao10K/l31-70b-euryale-v2.2", name: "L31 70B Euryale V2.2", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-09-19", last_updated: "2024-09-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 1.48, output: 1.48 } }, "sao10K/L3-8B-stheno-v3.2": { id: "sao10K/L3-8B-stheno-v3.2", name: "L3 8B Stheno V3.2", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-11-29", last_updated: "2024-11-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 32000 }, cost: { input: 0.05, output: 0.05 } }, "sao10K/l3-8b-lunaris": { id: "sao10K/l3-8b-lunaris", name: "Sao10k L3 8B Lunaris\t", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-11-28", last_updated: "2024-11-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0.05, output: 0.05 } }, "minimax/minimax-m2.7-highspeed": { id: "minimax/minimax-m2.7-highspeed", name: "MiniMax-M2.7-highspeed", description: "Low-latency M2.7 variant for interactive coding plans and agent loops", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-05-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.4, cache_read: 0.06, cache_write: 0.375 } }, "minimax/minimax-m2.7": { id: "minimax/minimax-m2.7", name: "MiniMax M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax-m2.7", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "minimax/minimax-m2.5-highspeed": { id: "minimax/minimax-m2.5-highspeed", name: "MiniMax M2.5 Highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax-m2.5", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131100 }, cost: { input: 0.6, output: 2.4, cache_read: 0.03 } }, "minimax/minimax-m2.5": { id: "minimax/minimax-m2.5", name: "MiniMax M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131100 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "minimax/minimax-m2": { id: "minimax/minimax-m2", name: "MiniMax-M2", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "minimax/minimax-m2.1": { id: "minimax/minimax-m2.1", name: "Minimax M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: false, tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "deepseek/deepseek-v3.1": { id: "deepseek/deepseek-v3.1", name: "DeepSeek V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.27, output: 1, cache_read: 0.135 } }, "deepseek/deepseek-v3.2-exp": { id: "deepseek/deepseek-v3.2-exp", name: "Deepseek V3.2 Exp", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 65536 }, cost: { input: 0.27, output: 0.41 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 393216 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "deepseek/deepseek-r1-distill-qwen-14b": { id: "deepseek/deepseek-r1-distill-qwen-14b", name: "DeepSeek R1 Distill Qwen 14B", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "deepseek-thinking", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-01-20", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 16384 }, cost: { input: 0.15, output: 0.15 } }, "deepseek/deepseek-r1-distill-llama-70b": { id: "deepseek/deepseek-r1-distill-llama-70b", name: "DeepSeek R1 Distill LLama 70B", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, release_date: "2025-01-27", last_updated: "2025-01-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0.8, output: 0.8 } }, "deepseek/deepseek-r1-turbo": { id: "deepseek/deepseek-r1-turbo", name: "DeepSeek R1 (Turbo)\t", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-03-05", last_updated: "2025-03-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 64000, output: 16000 }, cost: { input: 0.7, output: 2.5 } }, "deepseek/deepseek-ocr": { id: "deepseek/deepseek-ocr", name: "DeepSeek-OCR", description: "OCR model for extracting structured text from documents and screenshots", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-10-24", last_updated: "2025-10-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0.03, output: 0.03 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 393216 }, cost: { input: 1.6, output: 3.2, cache_read: 0.135 } }, "deepseek/deepseek-r1-0528": { id: "deepseek/deepseek-r1-0528", name: "DeepSeek R1 0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-05-28", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 32768 }, cost: { input: 0.7, output: 2.5, cache_read: 0.35 } }, "deepseek/deepseek-v3-0324": { id: "deepseek/deepseek-v3-0324", name: "DeepSeek V3 0324", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-03-25", last_updated: "2025-03-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 163840 }, cost: { input: 0.27, output: 1.12, cache_read: 0.135 } }, "deepseek/deepseek-r1-0528-qwen3-8b": { id: "deepseek/deepseek-r1-0528-qwen3-8b", name: "DeepSeek R1 0528 Qwen3 8B", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, release_date: "2025-05-29", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32000 }, cost: { input: 0.06, output: 0.09 } }, "deepseek/deepseek-v3.2": { id: "deepseek/deepseek-v3.2", name: "Deepseek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 65536 }, cost: { input: 0.269, output: 0.4, cache_read: 0.1345 } }, "deepseek/deepseek-ocr-2": { id: "deepseek/deepseek-ocr-2", name: "deepseek/deepseek-ocr-2", description: "OCR model for extracting structured text from documents and screenshots", attachment: true, reasoning: false, tool_call: false, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0.03, output: 0.03 } }, "deepseek/deepseek-v3-turbo": { id: "deepseek/deepseek-v3-turbo", name: "DeepSeek V3 (Turbo)\t", description: "Fast DeepSeek model for efficient chat, coding help, and agent loops", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-03-05", last_updated: "2025-03-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 64000, output: 16000 }, cost: { input: 0.4, output: 1.3 } }, "deepseek/deepseek-v3.1-terminus": { id: "deepseek/deepseek-v3.1-terminus", name: "Deepseek V3.1 Terminus", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-22", last_updated: "2025-09-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.27, output: 1, cache_read: 0.135 } }, "deepseek/deepseek-prover-v2-671b": { id: "deepseek/deepseek-prover-v2-671b", name: "Deepseek Prover V2 671B", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-30", last_updated: "2025-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 160000, output: 160000 }, cost: { input: 0.7, output: 2.5 } }, "deepseek/deepseek-r1-distill-qwen-32b": { id: "deepseek/deepseek-r1-distill-qwen-32b", name: "DeepSeek R1 Distill Qwen 32B", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "deepseek-thinking", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-01-20", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 64000, output: 32000 }, cost: { input: 0.3, output: 0.3 } }, "kwaipilot/kat-coder-pro": { id: "kwaipilot/kat-coder-pro", name: "Kat Coder Pro", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01-05", last_updated: "2026-01-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 128000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "moonshotai/kimi-k2.5": { id: "moonshotai/kimi-k2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "moonshotai/kimi-k2.6": { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.8, output: 3.4, cache_read: 0.16 } }, "moonshotai/kimi-k2.7-code": { id: "moonshotai/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "moonshotai/kimi-k2-thinking": { id: "moonshotai/kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2025-11-07", last_updated: "2026-06-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "moonshotai/kimi-k3": { id: "moonshotai/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "moonshotai/kimi-k2-instruct": { id: "moonshotai/kimi-k2-instruct", name: "Kimi K2 Instruct", description: "Kimi model for long-context chat, coding, and agentic reasoning", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-07-11", last_updated: "2025-07-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.57, output: 2.3 } }, "moonshotai/kimi-k2-0905": { id: "moonshotai/kimi-k2-0905", name: "Kimi K2 0905", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 2.5 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "OpenAI: GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: true, temperature: true, release_date: "2025-08-06", last_updated: "2025-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.04, output: 0.15 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "OpenAI GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-06", last_updated: "2025-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.05, output: 0.25 } }, "baidu/ernie-4.5-vl-424b-a47b": { id: "baidu/ernie-4.5-vl-424b-a47b", name: "ERNIE 4.5 VL 424B A47B", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, release_date: "2025-06-30", last_updated: "2025-06-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 123000, output: 16000 }, cost: { input: 0.42, output: 1.25 } }, "baidu/ernie-4.5-300b-a47b-paddle": { id: "baidu/ernie-4.5-300b-a47b-paddle", name: "ERNIE 4.5 300B A47B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-06-30", last_updated: "2025-06-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 123000, output: 12000 }, cost: { input: 0.28, output: 1.1 } }, "baidu/ernie-4.5-21B-a3b-thinking": { id: "baidu/ernie-4.5-21B-a3b-thinking", name: "ERNIE-4.5-21B-A3B-Thinking", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "ernie", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2025-03", release_date: "2025-09-19", last_updated: "2025-09-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0.07, output: 0.28 } }, "baidu/ernie-4.5-21B-a3b": { id: "baidu/ernie-4.5-21B-a3b", name: "ERNIE 4.5 21B A3B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "ernie", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-06-30", last_updated: "2025-06-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 120000, output: 8000 }, cost: { input: 0.07, output: 0.28 } }, "baidu/ernie-4.5-vl-28b-a3b-thinking": { id: "baidu/ernie-4.5-vl-28b-a3b-thinking", name: "ERNIE-4.5-VL-28B-A3B-Thinking", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-11-26", last_updated: "2025-11-26", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0.39, output: 0.39 } }, "baidu/ernie-4.5-vl-28b-a3b": { id: "baidu/ernie-4.5-vl-28b-a3b", name: "ERNIE 4.5 VL 28B A3B", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-06-30", last_updated: "2026-06-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 30000, output: 8000 }, cost: { input: 0.14, output: 0.56 } }, "meta-llama/llama-3-70b-instruct": { id: "meta-llama/llama-3-70b-instruct", name: "Llama3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-04-25", last_updated: "2024-04-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8000 }, cost: { input: 0.51, output: 0.74 } }, "meta-llama/llama-4-maverick-17b-128e-instruct-fp8": { id: "meta-llama/llama-4-maverick-17b-128e-instruct-fp8", name: "Llama 4 Maverick Instruct", description: "Open multimodal Llama model for strong reasoning and fast responses", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-06", last_updated: "2025-04-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 8192 }, cost: { input: 0.27, output: 0.85 } }, "meta-llama/llama-3-8b-instruct": { id: "meta-llama/llama-3-8b-instruct", name: "Llama 3 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-04-25", last_updated: "2024-04-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0.04, output: 0.04 } }, "meta-llama/llama-3.3-70b-instruct": { id: "meta-llama/llama-3.3-70b-instruct", name: "Llama 3.3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-07", last_updated: "2024-12-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 120000 }, cost: { input: 0.135, output: 0.4 } }, "meta-llama/llama-3.2-3b-instruct": { id: "meta-llama/llama-3.2-3b-instruct", name: "Llama 3.2 3B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-09-18", last_updated: "2024-09-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32000 }, cost: { input: 0.03, output: 0.05 } }, "meta-llama/llama-3.1-8b-instruct": { id: "meta-llama/llama-3.1-8b-instruct", name: "Llama 3.1 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-07-24", last_updated: "2024-07-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, output: 16384 }, cost: { input: 0.02, output: 0.05 } }, "meta-llama/llama-4-scout-17b-16e-instruct": { id: "meta-llama/llama-4-scout-17b-16e-instruct", name: "Llama 4 Scout Instruct", description: "Open multimodal Llama model for long-context analysis and efficient agents", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-06", last_updated: "2025-04-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.18, output: 0.59 } }, "minimaxai/minimax-m1-80k": { id: "minimaxai/minimax-m1-80k", name: "MiniMax M1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 40000 }, cost: { input: 0.55, output: 2.2 } }, "baichuan/baichuan-m2-32b": { id: "baichuan/baichuan-m2-32b", name: "baichuan-m2-32b", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "baichuan", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-12", release_date: "2025-08-13", last_updated: "2025-08-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.07, output: 0.07 } } } }, openrouter: { id: "openrouter", env: ["OPENROUTER_API_KEY"], npm: "@openrouter/ai-sdk-provider", api: "https://openrouter.ai/api/v1", name: "OpenRouter", doc: "https://openrouter.ai/models", models: { "~openai/gpt-latest": { id: "~openai/gpt-latest", name: "OpenAI GPT Latest", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 45, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1, cache_write: 12.5 } } }, "~openai/gpt-mini-latest": { id: "~openai/gpt-mini-latest", name: "OpenAI GPT Mini Latest", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "microsoft/phi-4": { id: "microsoft/phi-4", name: "Phi 4", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "phi", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-06-30", release_date: "2025-01-10", last_updated: "2025-01-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, output: 16384 }, cost: { input: 0.07, output: 0.14 } }, "microsoft/wizardlm-2-8x22b": { id: "microsoft/wizardlm-2-8x22b", name: "WizardLM-2 8x22B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-04-30", release_date: "2024-04-16", last_updated: "2024-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65535, output: 8000 }, cost: { input: 0.62, output: 0.62 } }, "cohere/command-r-08-2024": { id: "cohere/command-r-08-2024", name: "Command R", description: "Cohere retrieval model for long-context chat and enterprise RAG workflows", family: "command-r", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-08-30", last_updated: "2024-08-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 0.15, output: 0.6 } }, "cohere/command-a": { id: "cohere/command-a", name: "Command A", description: "Cohere command model for multilingual enterprise agents, tools, and chat", family: "command-a", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-08-31", release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8192 }, cost: { input: 2.5, output: 10 } }, "cohere/command-r-plus-08-2024": { id: "cohere/command-r-plus-08-2024", name: "Command R+", description: "Cohere's RAG workhorse for long-context enterprise search and tool use", family: "command-r", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-08-30", last_updated: "2024-08-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 2.5, output: 10 } }, "cohere/command-r7b-12-2024": { id: "cohere/command-r7b-12-2024", name: "Command R7B", description: "Cohere retrieval model for long-context chat and enterprise RAG workflows", family: "command-r", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-12-02", last_updated: "2024-12-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 0.0375, output: 0.15 } }, "cohere/north-mini-code:free": { id: "cohere/north-mini-code:free", name: "North Mini Code (free)", description: "Cohere coding model for practical software engineering and agentic edits", family: "north", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-06-17", last_updated: "2026-06-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-ultra-550b-a55b:free": { id: "nvidia/nemotron-3-ultra-550b-a55b:free", name: "Nemotron 3 Ultra (free)", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high"] }, { type: "budget_tokens" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-nano-30b-a3b": { id: "nvidia/nemotron-3-nano-30b-a3b", name: "Nemotron 3 Nano 30B A3B", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-15", last_updated: "2025-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.05, output: 0.2, cache_read: 0.03 } }, "nvidia/nemotron-nano-9b-v2:free": { id: "nvidia/nemotron-nano-9b-v2:free", name: "Nemotron Nano 9B V2 (free)", description: "Compact Nemotron model for efficient reasoning and deployable AI agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-18", last_updated: "2025-08-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-super-120b-a12b": { id: "nvidia/nemotron-3-super-120b-a12b", name: "Nemotron 3 Super 120B A12B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 16384 }, cost: { input: 0.3, output: 0.9 } }, "nvidia/nemotron-3-nano-30b-a3b:free": { id: "nvidia/nemotron-3-nano-30b-a3b:free", name: "Nemotron 3 Nano 30B A3B (free)", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-15", last_updated: "2025-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free": { id: "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free", name: "Nemotron 3 Nano Omni (free)", description: "Open Nemotron omni model combining reasoning with text, vision, and audio", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-28", last_updated: "2026-04-28", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 65536 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3.5-content-safety:free": { id: "nvidia/nemotron-3.5-content-safety:free", name: "Nemotron 3.5 Content Safety (free)", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-ultra-550b-a55b": { id: "nvidia/nemotron-3-ultra-550b-a55b", name: "Nemotron 3 Ultra 550B A55B", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512288, output: 16384 }, cost: { input: 0.6, output: 3.6, cache_read: 0.2 } }, "nvidia/nemotron-nano-12b-v2-vl:free": { id: "nvidia/nemotron-nano-12b-v2-vl:free", name: "Nemotron Nano 12B 2 VL (free)", description: "Nemotron multimodal model for visual reasoning and agentic AI workflows", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-10-28", last_updated: "2025-10-28", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-super-120b-a12b:free": { id: "nvidia/nemotron-3-super-120b-a12b:free", name: "Nemotron 3 Super (free)", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0 } }, "deepcogito/cogito-v2.1-671b": { id: "deepcogito/cogito-v2.1-671b", name: "Cogito v2.1 671B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "cogito", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 1.25, output: 1.25 } }, "google/lyria-3-pro-preview": { id: "google/lyria-3-pro-preview", name: "Lyria 3 Pro Preview", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "lyria", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-03-25", last_updated: "2026-03-25", modalities: { input: ["text", "image"], output: ["text", "audio"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0, output: 0 } }, "google/gemini-3.5-flash": { id: "google/gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, reasoning: 9, cache_read: 0.15, cache_write: 0.083333 } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.3, output: 2.5, reasoning: 2.5, cache_read: 0.03, cache_write: 0.083333 } }, "google/gemma-3-4b-it": { id: "google/gemma-3-4b-it", name: "Gemma 3 4B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-08-31", release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.05, output: 0.1 } }, "google/gemini-3.5-flash-lite": { id: "google/gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, reasoning: 2.5, cache_read: 0.03, cache_write: 0.083333 } }, "google/gemini-2.5-pro-preview": { id: "google/gemini-2.5-pro-preview", name: "Gemini 2.5 Pro Preview 06-05", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01-31", release_date: "2025-06-05", last_updated: "2025-06-05", modalities: { input: ["pdf", "image", "text", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, reasoning: 10, cache_read: 0.125, cache_write: 0.375, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "google/lyria-3-clip-preview": { id: "google/lyria-3-clip-preview", name: "Lyria 3 Clip Preview", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "lyria", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-03-25", last_updated: "2026-03-25", modalities: { input: ["text", "image"], output: ["text", "audio"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0, output: 0 } }, "google/gemini-3-pro-image-preview": { id: "google/gemini-3-pro-image-preview", name: "Nano Banana Pro", description: "Nano Banana Pro for higher-fidelity image generation and design-heavy edits", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 32768 }, cost: { input: 2, output: 12, reasoning: 12, cache_read: 0.2, cache_write: 0.375 } }, "google/gemini-3.1-flash-lite-preview": { id: "google/gemini-3.1-flash-lite-preview", name: "Gemini 3.1 Flash Lite Preview", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, reasoning: 1.5, cache_read: 0.025, cache_write: 0.083333 } }, "google/gemini-3-flash-preview": { id: "google/gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_details" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, reasoning: 3, cache_read: 0.05, cache_write: 0.083333 } }, "google/gemini-3.1-pro-preview-customtools": { id: "google/gemini-3.1-pro-preview-customtools", name: "Gemini 3.1 Pro Preview Custom Tools", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_details" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, reasoning: 12, cache_read: 0.2, cache_write: 0.375, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "google/gemini-3.1-flash-lite-image": { id: "google/gemini-3.1-flash-lite-image", name: "Nano Banana 2 Lite", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "high"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 65536 }, cost: { input: 0.25, output: 1.5 } }, "google/gemini-3.1-flash-image-preview": { id: "google/gemini-3.1-flash-image-preview", name: "Nano Banana 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "high"] }], tool_call: false, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["image", "text"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 65536 }, cost: { input: 0.5, output: 3 } }, "google/gemma-4-26b-a4b-it": { id: "google/gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.07, output: 0.34 } }, "google/gemma-2-27b-it": { id: "google/gemma-2-27b-it", name: "Gemma 2 27B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-06-30", release_date: "2024-07-13", last_updated: "2024-07-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 2048 }, cost: { input: 0.65, output: 0.65 } }, "google/gemma-3-27b-it": { id: "google/gemma-3-27b-it", name: "Gemma 3 27B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-08-31", release_date: "2025-03-12", last_updated: "2025-03-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.08, output: 0.45, cache_read: 0.04 } }, "google/gemma-4-26b-a4b-it:free": { id: "google/gemma-4-26b-a4b-it:free", name: "Gemma 4 26B A4B (free)", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "google/gemini-3.6-flash": { id: "google/gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, reasoning: 7.5, cache_read: 0.15, cache_write: 0.083333 } }, "google/gemini-3.1-flash-lite": { id: "google/gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, reasoning: 1.5, cache_read: 0.025, cache_write: 0.083333 } }, "google/gemini-2.5-pro-preview-05-06": { id: "google/gemini-2.5-pro-preview-05-06", name: "Gemini 2.5 Pro Preview 05-06", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01-31", release_date: "2025-05-07", last_updated: "2025-05-07", modalities: { input: ["text", "image", "pdf", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 1.25, output: 10, reasoning: 10, cache_read: 0.125, cache_write: 0.375, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "google/gemma-3-12b-it": { id: "google/gemma-3-12b-it", name: "Gemma 3 12B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-08-31", release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.05, output: 0.15 } }, "google/gemma-4-31b-it": { id: "google/gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.1, output: 0.34, cache_read: 0.1 } }, "google/gemini-3.1-flash-image": { id: "google/gemini-3.1-flash-image", name: "Nano Banana 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "high"] }], tool_call: false, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.5, output: 3 } }, "google/gemini-2.5-flash-image": { id: "google/gemini-2.5-flash-image", name: "Nano Banana", description: "Nano Banana image model for fast generation, edits, and character-consistent assets", family: "gemini-flash", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-06", release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 32768, output: 8192 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, cache_write: 0.083333 } }, "google/gemma-3n-e4b-it": { id: "google/gemma-3n-e4b-it", name: "Gemma 3n 4B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-08-31", release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.06, output: 0.12 } }, "google/gemini-3-pro-image": { id: "google/gemini-3-pro-image", name: "Nano Banana Pro", description: "Nano Banana Pro for higher-fidelity image generation and design-heavy edits", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 2, output: 12, reasoning: 12, cache_read: 0.2, cache_write: 0.375 } }, "google/gemini-3.1-pro-preview": { id: "google/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_details" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, reasoning: 12, cache_read: 0.2, cache_write: 0.375, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, reasoning: 10, cache_read: 0.125, cache_write: 0.375, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "google/gemini-2.5-flash-lite": { id: "google/gemini-2.5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 512, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.1, output: 0.4, reasoning: 0.4, cache_read: 0.01, cache_write: 0.083333 } }, "google/gemma-4-31b-it:free": { id: "google/gemma-4-31b-it:free", name: "Gemma 4 31B (free)", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "thinkingmachines/inkling-small": { id: "thinkingmachines/inkling-small", name: "Inkling Small", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-30", last_updated: "2026-07-30", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 262144 }, cost: { input: 0.45, output: 1.2, cache_read: 0.1 } }, "thinkingmachines/inkling": { id: "thinkingmachines/inkling", name: "Inkling", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "max"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 262144 }, cost: { input: 0.95, output: 4.05, cache_read: 0.16 } }, "relace/relace-apply-3": { id: "relace/relace-apply-3", name: "Relace Apply 3", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, release_date: "2025-09-26", last_updated: "2025-09-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 0.85, output: 1.25 } }, "relace/relace-search": { id: "relace/relace-search", name: "Relace Search", description: "Tool-capable chat model for instruction following and agentic application workflows", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 1, output: 3 } }, "~deepseek/deepseek-v4-flash-latest": { id: "~deepseek/deepseek-v4-flash-latest", name: "DeepSeek V4 Flash Latest", description: "Fast DeepSeek model for efficient chat, coding help, and agent loops", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-01", last_updated: "2026-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, cost: { input: 0.079996, output: 0.252, cache_read: 0.0252 } }, "perceptron/perceptron-mk1": { id: "perceptron/perceptron-mk1", name: "Perceptron Mk1", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, release_date: "2026-05-12", last_updated: "2026-05-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 8192 }, cost: { input: 0.15, output: 1.5 } }, "sakana/fugu-ultra": { id: "sakana/fugu-ultra", name: "Fugu Ultra", description: "Quality-first multi-agent model for hard research, analysis, and competitions", family: "fugu", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-06-15", last_updated: "2026-06-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "~google/gemini-flash-latest": { id: "~google/gemini-flash-latest", name: "Google Gemini Flash Latest", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video", "pdf", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, reasoning: 7.5, cache_read: 0.15, cache_write: 0.083333 } }, "~google/gemini-pro-latest": { id: "~google/gemini-pro-latest", name: "Google Gemini Pro Latest", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["audio", "pdf", "image", "text", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, reasoning: 12, cache_read: 0.2, cache_write: 0.375, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "qwen/qwen3.5-flash-02-23": { id: "qwen/qwen3.5-flash-02-23", name: "Qwen3.5-Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-25", last_updated: "2026-02-25", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.065, output: 0.26 } }, "qwen/qwen3.7-flash": { id: "qwen/qwen3.7-flash", name: "Qwen3.7 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 991000, output: 65536 }, cost: { input: 0.03, output: 0.13, cache_read: 0.006, cache_write: 0.038, tiers: [{ input: 0.1, output: 0.4, cache_read: 0.02, cache_write: 0.125, tier: { type: "context", size: 32000 } }, { input: 0.2, output: 0.8, cache_read: 0.04, cache_write: 0.25, tier: { type: "context", size: 256000 } }] } }, "qwen/qwen3.7-plus": { id: "qwen/qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 262144 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 0.32, output: 1.28, cache_read: 0.064, cache_write: 0.4, tiers: [{ input: 0.96, output: 3.84, cache_read: 0.192, cache_write: 1.2, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.96, output: 3.84, cache_read: 0.192, cache_write: 1.2 } } }, "qwen/qwen3-32b": { id: "qwen/qwen3-32b", name: "Qwen3 32B", description: "Dense open Qwen model for self-hosted chat, reasoning, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.08, output: 0.28 } }, "qwen/qwen3.6-35b-a3b": { id: "qwen/qwen3.6-35b-a3b", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.15, output: 1, cache_read: 0.05 } }, "qwen/qwen3-30b-a3b": { id: "qwen/qwen3-30b-a3b", name: "Qwen3 30B A3B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-03-31", release_date: "2025-04-28", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.12, output: 0.5 } }, "qwen/qwen3-235b-a22b-thinking-2507": { id: "qwen/qwen3-235b-a22b-thinking-2507", name: "Qwen3 235B A22B Thinking 2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-06-30", release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.23, output: 2.3 } }, "qwen/qwen3-vl-30b-a3b-thinking": { id: "qwen/qwen3-vl-30b-a3b-thinking", name: "Qwen3 VL 30B A3B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.2, output: 2.4 } }, "qwen/qwen3-coder-30b-a3b-instruct": { id: "qwen/qwen3-coder-30b-a3b-instruct", name: "Qwen3-Coder 30B-A3B Instruct", description: "Smaller Qwen coder for efficient local agents and repo-level fixes", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.07, output: 0.27 } }, "qwen/qwen3.5-plus-02-15": { id: "qwen/qwen3.5-plus-02-15", name: "Qwen3.5 Plus 2026-02-15", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.26, output: 1.56, tiers: [{ input: 0.325, output: 1.95, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.325, output: 1.95 } } }, "qwen/qwen3.5-27b": { id: "qwen/qwen3.5-27b", name: "Qwen3.5 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.195, output: 1.56 } }, "qwen/qwen3.7-max": { id: "qwen/qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 262144 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 1.475, output: 4.425, cache_read: 0.295, cache_write: 1.84375 } }, "qwen/qwen3-next-80b-a3b-thinking": { id: "qwen/qwen3-next-80b-a3b-thinking", name: "Qwen3-Next 80B-A3B (Thinking)", description: "Efficient Qwen thinking model for local reasoning, math, and coding agents", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.15, output: 1.2 } }, "qwen/qwen3.5-9b": { id: "qwen/qwen3.5-9b", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.1, output: 0.15 } }, "qwen/qwen3.6-27b": { id: "qwen/qwen3.6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3.6, cache_read: 0.12 } }, "qwen/qwen3.5-35b-a3b": { id: "qwen/qwen3.5-35b-a3b", name: "Qwen3.5 35B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.14, output: 1 } }, "qwen/qwen-2.5-7b-instruct": { id: "qwen/qwen-2.5-7b-instruct", name: "Qwen2.5 7B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06-30", release_date: "2024-10-16", last_updated: "2024-10-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.1, output: 0.2 } }, "qwen/qwen3-14b": { id: "qwen/qwen3-14b", name: "Qwen3 14B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-04-28", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.2275, output: 0.91 } }, "qwen/qwen3-235b-a22b": { id: "qwen/qwen3-235b-a22b", name: "Qwen3 235B-A22B", description: "Large open Qwen MoE for multilingual reasoning, coding, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 38912 }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.455, output: 1.82 } }, "qwen/qwen3-max": { id: "qwen/qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen3 model for coding agents, complex reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.78, output: 3.9, cache_read: 0.156, cache_write: 0.975, tiers: [{ input: 1.56, output: 7.8, cache_read: 0.312, cache_write: 1.95, tier: { type: "context", size: 32000 } }, { input: 1.95, output: 9.75, cache_read: 0.39, cache_write: 2.4375, tier: { type: "context", size: 128000 } }] } }, "qwen/qwen3-vl-8b-instruct": { id: "qwen/qwen3-vl-8b-instruct", name: "Qwen3 VL 8B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-14", last_updated: "2025-10-14", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.117, output: 0.455 } }, "qwen/qwen3-8b": { id: "qwen/qwen3-8b", name: "Qwen3 8B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-03-31", release_date: "2025-04-28", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.117, output: 0.455 } }, "qwen/qwen3-coder-plus": { id: "qwen/qwen3-coder-plus", name: "Qwen3 Coder Plus", description: "Hosted Qwen coder for software agents, repo edits, and long-context code", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.65, output: 3.25, cache_read: 0.13, cache_write: 0.8125, tiers: [{ input: 1.17, output: 5.85, cache_read: 0.234, cache_write: 1.4625, tier: { type: "context", size: 32000 } }, { input: 1.95, output: 9.75, cache_read: 0.39, cache_write: 2.4375, tier: { type: "context", size: 128000 } }] } }, "qwen/qwen3.8-max": { id: "qwen/qwen3.8-max", name: "Qwen3.8 Max", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 2, output: 6, cache_read: 0.25, cache_write: 2.5 } }, "qwen/qwen3-coder-flash": { id: "qwen/qwen3-coder-flash", name: "Qwen3 Coder Flash", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.195, output: 0.975, cache_read: 0.039, cache_write: 0.24375, tiers: [{ input: 0.325, output: 1.625, cache_read: 0.065, cache_write: 0.40625, tier: { type: "context", size: 32000 } }, { input: 0.52, output: 2.6, cache_read: 0.104, cache_write: 0.65, tier: { type: "context", size: 128000 } }] } }, "qwen/qwen3-vl-235b-a22b-instruct": { id: "qwen/qwen3-vl-235b-a22b-instruct", name: "Qwen3 VL 235B A22B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.21, output: 1.9, cache_read: 0.1 } }, "qwen/qwen3-vl-32b-instruct": { id: "qwen/qwen3-vl-32b-instruct", name: "Qwen3 VL 32B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-23", last_updated: "2025-10-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.104, output: 0.416 } }, "qwen/qwen-2.5-72b-instruct": { id: "qwen/qwen-2.5-72b-instruct", name: "Qwen2.5 72B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06-30", release_date: "2024-09-19", last_updated: "2024-09-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 16384 }, cost: { input: 0.36, output: 0.4 } }, "qwen/qwen-plus-2025-07-28:thinking": { id: "qwen/qwen-plus-2025-07-28:thinking", name: "Qwen Plus 0728 (thinking)", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-09-08", last_updated: "2025-09-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.4, output: 1.2, cache_write: 0.5, tiers: [{ input: 1.2, output: 3.6, cache_write: 1.5, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 1.2, output: 3.6, cache_write: 1.5 } } }, "qwen/qwen-plus": { id: "qwen/qwen-plus", name: "Qwen Plus", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2024-01-25", last_updated: "2025-09-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.26, output: 0.78, cache_read: 0.052, cache_write: 0.325, tiers: [{ input: 0.78, output: 2.34, cache_read: 0.156, cache_write: 0.975, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.78, output: 2.34, cache_read: 0.156, cache_write: 0.975 } } }, "qwen/qwen3-30b-a3b-thinking-2507": { id: "qwen/qwen3-30b-a3b-thinking-2507", name: "Qwen3 30B A3B Thinking 2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-06-30", release_date: "2025-08-28", last_updated: "2025-08-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 81920, output: 32768 }, cost: { input: 0.2, output: 2.4 } }, "qwen/qwen3-vl-8b-thinking": { id: "qwen/qwen3-vl-8b-thinking", name: "Qwen3 VL 8B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-14", last_updated: "2025-10-14", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.18, output: 2.1 } }, "qwen/qwen3-235b-a22b-2507": { id: "qwen/qwen3-235b-a22b-2507", name: "Qwen3 235B A22B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-06-30", release_date: "2025-07-21", last_updated: "2025-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.09, output: 0.55 } }, "qwen/qwen3.6-flash": { id: "qwen/qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.1875, output: 1.125, cache_write: 0.234375, tiers: [{ input: 0.75, output: 3, cache_write: 0.9375, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.75, output: 3, cache_write: 0.9375 } } }, "qwen/qwen3-30b-a3b-instruct-2507": { id: "qwen/qwen3-30b-a3b-instruct-2507", name: "Qwen3 30B A3B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-06-30", release_date: "2025-07-29", last_updated: "2025-07-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32000 }, cost: { input: 0.04815, output: 0.19305 } }, "qwen/qwen3-vl-30b-a3b-instruct": { id: "qwen/qwen3-vl-30b-a3b-instruct", name: "Qwen3 VL 30B A3B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.15, output: 0.6 } }, "qwen/qwen3.5-397b-a17b": { id: "qwen/qwen3.5-397b-a17b", name: "Qwen3.5 397B-A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.39, output: 2.34 } }, "qwen/qwen-2.5-coder-32b-instruct": { id: "qwen/qwen-2.5-coder-32b-instruct", name: "Qwen2.5 Coder 32B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-06-30", release_date: "2024-11-11", last_updated: "2024-11-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.66, output: 1 } }, "qwen/qwen3-vl-235b-a22b-thinking": { id: "qwen/qwen3-vl-235b-a22b-thinking", name: "Qwen3 VL 235B A22B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.4, output: 4 } }, "qwen/qwen3.6-max-preview": { id: "qwen/qwen3.6-max-preview", name: "Qwen3.6 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 131072 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 1.027, output: 6.162, cache_write: 1.28375, tiers: [{ input: 1.58, output: 9.48, cache_write: 1.975, tier: { type: "context", size: 128000 } }] } }, "qwen/qwen3-max-thinking": { id: "qwen/qwen3-max-thinking", name: "Qwen3 Max Thinking", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-09", last_updated: "2026-02-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.78, output: 3.9, tiers: [{ input: 1.56, output: 7.8, tier: { type: "context", size: 32000 } }, { input: 1.95, output: 9.75, tier: { type: "context", size: 128000 } }] } }, "qwen/qwen3-coder": { id: "qwen/qwen3-coder", name: "Qwen3 Coder 480B A35B", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-06-30", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.3, output: 1, cache_read: 0.1 } }, "qwen/qwen3-coder-next": { id: "qwen/qwen3-coder-next", name: "Qwen3 Coder Next", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-09", release_date: "2026-02-03", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.12, output: 0.8, cache_read: 0.07 } }, "qwen/qwen3.6-plus": { id: "qwen/qwen3.6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.325, output: 1.95, cache_write: 0.40625, tiers: [{ input: 1.3, output: 3.9, cache_write: 1.625, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 1.3, output: 3.9, cache_write: 1.625 } } }, "qwen/qwen3.5-122b-a10b": { id: "qwen/qwen3.5-122b-a10b", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 81920 }, cost: { input: 0.29, output: 2.4 } }, "qwen/qwen3.5-plus-20260420": { id: "qwen/qwen3.5-plus-20260420", name: "Qwen3.5 Plus 2026-04-20", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.3, output: 1.8, cache_write: 0.375, tiers: [{ input: 0.375, output: 2.25, cache_write: 0.46875, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.375, output: 2.25, cache_write: 0.46875 } } }, "qwen/qwen-plus-2025-07-28": { id: "qwen/qwen-plus-2025-07-28", name: "Qwen Plus 0728", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-09-08", last_updated: "2025-09-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.26, output: 0.78, tiers: [{ input: 0.78, output: 2.34, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.78, output: 2.34 } } }, "qwen/qwen3-next-80b-a3b-instruct": { id: "qwen/qwen3-next-80b-a3b-instruct", name: "Qwen3-Next 80B-A3B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.09, output: 1.1 } }, "qwen/qwen2.5-vl-72b-instruct": { id: "qwen/qwen2.5-vl-72b-instruct", name: "Qwen2.5 VL 72B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-06-30", release_date: "2025-02-01", last_updated: "2025-02-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.25, output: 0.75 } }, "inception/mercury-2": { id: "inception/mercury-2", name: "Mercury 2", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "mercury", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-04", last_updated: "2026-03-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 50000 }, cost: { input: 0.25, output: 0.75, cache_read: 0.025 } }, "rekaai/reka-edge": { id: "rekaai/reka-edge", name: "Reka Edge", description: "Multimodal model for analyzing text, images, documents, and rich media", family: "reka", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: true, limit: { context: 16384, output: 16384 }, cost: { input: 0.1, output: 0.1 } }, "rekaai/reka-flash-3": { id: "rekaai/reka-flash-3", name: "Reka Flash 3", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "reka", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, knowledge: "2025-01-31", release_date: "2025-03-12", last_updated: "2025-03-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 0.1, output: 0.2 } }, "tencent/hunyuan-a13b-instruct": { id: "tencent/hunyuan-a13b-instruct", name: "Hunyuan A13B Instruct", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "hunyuan", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-07-08", last_updated: "2025-07-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.14, output: 0.57 } }, "tencent/hy3": { id: "tencent/hy3", name: "Hy3", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 128000 }, cost: { input: 0.132, output: 0.528, cache_read: 0.033 } }, "tencent/hy3-preview": { id: "tencent/hy3-preview", name: "Hy3 preview", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.063, output: 0.21, cache_read: 0.021 } }, "upstage/solar-pro-3": { id: "upstage/solar-pro-3", name: "Solar Pro 3", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "solar-pro", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015 } }, "~x-ai/grok-latest": { id: "~x-ai/grok-latest", name: "Grok Latest", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 1e6 }, cost: { input: 2, output: 6, cache_read: 0.3, tiers: [{ input: 4, output: 12, cache_read: 0.6, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 12, cache_read: 0.6 } } }, "mistralai/mistral-large": { id: "mistralai/mistral-large", name: "Mistral Large", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-11-30", release_date: "2024-02-26", last_updated: "2024-02-26", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 2, output: 6, cache_read: 0.2 } }, "mistralai/ministral-8b-2512": { id: "mistralai/ministral-8b-2512", name: "Ministral 3 8B 2512", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.15, output: 0.15, cache_read: 0.015 } }, "mistralai/ministral-14b-2512": { id: "mistralai/ministral-14b-2512", name: "Ministral 3 14B 2512", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.2, output: 0.2, cache_read: 0.02 } }, "mistralai/ministral-3b-2512": { id: "mistralai/ministral-3b-2512", name: "Ministral 3 3B 2512", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.1, output: 0.1, cache_read: 0.01 } }, "mistralai/mistral-small-24b-instruct-2501": { id: "mistralai/mistral-small-24b-instruct-2501", name: "Mistral Small 3", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2023-10-31", release_date: "2025-01-30", last_updated: "2025-01-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 16384 }, cost: { input: 0.05, output: 0.08 } }, "mistralai/mistral-large-2407": { id: "mistralai/mistral-large-2407", name: "Mistral Large 2407", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-03-31", release_date: "2024-11-19", last_updated: "2024-11-19", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 2, output: 6, cache_read: 0.2 } }, "mistralai/mistral-medium-3.1": { id: "mistralai/mistral-medium-3.1", name: "Mistral Medium 3.1", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-06-30", release_date: "2025-08-13", last_updated: "2025-08-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 262144 }, cost: { input: 0.4, output: 2, cache_read: 0.04 } }, "mistralai/mistral-nemo": { id: "mistralai/mistral-nemo", name: "Mistral Nemo", description: "Efficient Mistral-NVIDIA open model for multilingual chat and local deployment", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2024-07-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.019, output: 0.03 } }, "mistralai/mistral-saba": { id: "mistralai/mistral-saba", name: "Saba", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-09-30", release_date: "2025-02-17", last_updated: "2025-02-17", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.2, output: 0.6, cache_read: 0.02 } }, "mistralai/mistral-small-2603": { id: "mistralai/mistral-small-2603", name: "Mistral Small 4", description: "Fast Mistral production model for chat, extraction, and cost-sensitive agents", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-06", release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015 } }, "mistralai/codestral-2508": { id: "mistralai/codestral-2508", name: "Codestral 2508", description: "Mistral coding model for code completion, generation, and developer workflows", family: "codestral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-01", last_updated: "2025-08-01", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.3, output: 0.9, cache_read: 0.03 } }, "mistralai/mixtral-8x22b-instruct": { id: "mistralai/mixtral-8x22b-instruct", name: "Mixtral 8x22B Instruct", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-01-31", release_date: "2024-04-17", last_updated: "2024-04-17", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 2, output: 6, cache_read: 0.2 } }, "mistralai/voxtral-small-24b-2507": { id: "mistralai/voxtral-small-24b-2507", name: "Voxtral Small 24B 2507", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-30", last_updated: "2025-10-30", modalities: { input: ["text", "audio", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 32000 }, cost: { input: 0.1, output: 0.3, cache_read: 0.01 } }, "mistralai/mistral-small-3.2-24b-instruct": { id: "mistralai/mistral-small-3.2-24b-instruct", name: "Mistral Small 3.2 24B", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-10-31", release_date: "2025-06-20", last_updated: "2025-06-20", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 0.09375, output: 0.25 } }, "mistralai/mistral-medium-3-5": { id: "mistralai/mistral-medium-3-5", name: "Mistral Medium 3.5", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 1.5, output: 7.5 } }, "mistralai/mistral-small-3.1-24b-instruct": { id: "mistralai/mistral-small-3.1-24b-instruct", name: "Mistral Small 3.1 24B", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-10-31", release_date: "2025-03-17", last_updated: "2025-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.351, output: 0.555 } }, "mistralai/mistral-medium-3": { id: "mistralai/mistral-medium-3", name: "Mistral Medium 3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-07", last_updated: "2025-05-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.4, output: 2, cache_read: 0.04 } }, "mistralai/mistral-large-2512": { id: "mistralai/mistral-large-2512", name: "Mistral Large 3", description: "Mistral's largest general model for enterprise agents, coding, and multilingual reasoning", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2025-12-02", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.5, output: 1.5, cache_read: 0.05 } }, "bytedance/ui-tars-1.5-7b": { id: "bytedance/ui-tars-1.5-7b", name: "UI-TARS 7B ", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2025-01-31", release_date: "2025-07-22", last_updated: "2025-07-22", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 2048 }, cost: { input: 0.1, output: 0.2, cache_read: 0.1 } }, "nex-agi/nex-n2-mini": { id: "nex-agi/nex-n2-mini", name: "Nex-N2-Mini", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "agi", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-24", last_updated: "2026-06-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.025, output: 0.1, cache_read: 0.0025 } }, "nex-agi/nex-n2-pro": { id: "nex-agi/nex-n2-pro", name: "Nex-N2-Pro", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "agi", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-06-08", last_updated: "2026-06-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.25, output: 1, cache_read: 0.025 } }, "thedrummer/rocinante-12b": { id: "thedrummer/rocinante-12b", name: "Rocinante 12B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-04-30", release_date: "2024-09-30", last_updated: "2024-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 0.25, output: 0.5 } }, "thedrummer/unslopnemo-12b": { id: "thedrummer/unslopnemo-12b", name: "UnslopNemo 12B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04-30", release_date: "2024-11-08", last_updated: "2024-11-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1024000, output: 1024000 }, cost: { input: 0.4, output: 0.4 } }, "thedrummer/cydonia-24b-v4.1": { id: "thedrummer/cydonia-24b-v4.1", name: "Cydonia 24B V4.1", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-04-30", release_date: "2025-09-27", last_updated: "2025-09-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.3, output: 0.5, cache_read: 0.15 } }, "thedrummer/skyfall-36b-v2": { id: "thedrummer/skyfall-36b-v2", name: "Skyfall 36B V2", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-06-30", release_date: "2025-03-10", last_updated: "2025-03-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.55, output: 0.8, cache_read: 0.25 } }, "undi95/remm-slerp-l2-13b": { id: "undi95/remm-slerp-l2-13b", name: "ReMM SLERP 13B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2023-06-30", release_date: "2023-07-22", last_updated: "2023-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 6144, output: 6144 }, cost: { input: 0.45, output: 0.65 } }, "meta/muse-spark-1.1": { id: "meta/muse-spark-1.1", name: "Muse Spark 1.1", description: "Open Llama multimodal model for image understanding and text reasoning", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-08", last_updated: "2026-07-09", modalities: { input: ["text", "image", "video", "pdf", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "meta/muse-spark-1.2": { id: "meta/muse-spark-1.2", name: "Muse Spark 1.2", description: "Muse Spark 1.2 is a coding-focused update to Muse Spark 1.1 with improvements in code generation, complex debugging, codebase understanding, and end-to-end developer workflows.", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-05", last_updated: "2026-08-05", modalities: { input: ["text", "image", "video", "pdf", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "gryphe/mythomax-l2-13b": { id: "gryphe/mythomax-l2-13b", name: "MythoMax 13B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2023-06-30", release_date: "2023-07-02", last_updated: "2023-07-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 4096 }, cost: { input: 0.08, output: 0.11 } }, "inclusionai/ling-3.0-tiny:free": { id: "inclusionai/ling-3.0-tiny:free", name: "Ling 3.0 Tiny (free)", description: "Free provider route for experiments, demos, and cost-sensitive chat workloads", family: "ling", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-08-06", last_updated: "2026-08-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "inclusionai/ling-3.0-flash": { id: "inclusionai/ling-3.0-flash", name: "Ling-3.0-flash", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "ling", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-23", last_updated: "2026-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.021, output: 0.063, cache_read: 0.0042 } }, "inclusionai/ring-2.6-1t": { id: "inclusionai/ring-2.6-1t", name: "Ring-2.6-1T", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "ring", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-05-08", last_updated: "2026-05-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.075, output: 0.625, cache_read: 0.015 } }, "inclusionai/ling-2.6-1t": { id: "inclusionai/ling-2.6-1t", name: "Ling-2.6-1T", description: "Tool-capable chat model for instruction following and agentic application workflows", family: "ling", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.075, output: 0.625, cache_read: 0.015 } }, "inclusionai/ling-2.6-flash": { id: "inclusionai/ling-2.6-flash", name: "Ling-2.6-flash", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "ling", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.01, output: 0.03, cache_read: 0.002 } }, "cognitivecomputations/dolphin-mistral-24b-venice-edition": { id: "cognitivecomputations/dolphin-mistral-24b-venice-edition", name: "Uncensored", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-04-30", release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.2, output: 0.9 } }, "allenai/olmo-3-32b-think": { id: "allenai/olmo-3-32b-think", name: "Olmo 3 32B Think", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "allenai", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, release_date: "2025-11-21", last_updated: "2025-11-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 0.15, output: 0.5 } }, "meituan/longcat-2.0": { id: "meituan/longcat-2.0", name: "LongCat 2.0", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "longcat", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-20", last_updated: "2026-07-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048756, output: 262144 }, cost: { input: 0.3, output: 1.2, cache_read: 0.006 } }, "ai21/jamba-large-1.7": { id: "ai21/jamba-large-1.7", name: "Jamba Large 1.7", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "jamba", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2024-08-31", release_date: "2025-08-08", last_updated: "2025-08-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 4096 }, cost: { input: 2, output: 8 } }, "mancer/weaver": { id: "mancer/weaver", name: "Weaver (alpha)", description: "General-purpose chat model for instruction following, writing, and analysis", family: "alpha", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2023-06-30", release_date: "2023-08-02", last_updated: "2023-08-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8000, output: 6000 }, cost: { input: 0.5, output: 0.75 } }, "morph/morph-v3-large": { id: "morph/morph-v3-large", name: "Morph V3 Large", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "morph", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-07-07", last_updated: "2025-07-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 131072 }, cost: { input: 0.9, output: 1.9 } }, "morph/morph-v3-fast": { id: "morph/morph-v3-fast", name: "Morph V3 Fast", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "morph", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-07-07", last_updated: "2025-07-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 81920, output: 38000 }, cost: { input: 0.8, output: 1.2 } }, "nousresearch/hermes-3-llama-3.1-70b": { id: "nousresearch/hermes-3-llama-3.1-70b", name: "Hermes 3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "nousresearch", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2023-12-31", release_date: "2024-08-18", last_updated: "2024-08-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.7, output: 0.7 } }, "nousresearch/hermes-3-llama-3.1-405b": { id: "nousresearch/hermes-3-llama-3.1-405b", name: "Hermes 3 405B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "nousresearch", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2023-12-31", release_date: "2024-08-16", last_updated: "2024-08-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 1, output: 1 } }, "nousresearch/hermes-4-405b": { id: "nousresearch/hermes-4-405b", name: "Hermes 4 405B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "hermes", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: false, temperature: true, knowledge: "2024-08-31", release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 1, output: 3 } }, "nousresearch/hermes-4-70b": { id: "nousresearch/hermes-4-70b", name: "Hermes 4 70B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "hermes", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: false, temperature: true, knowledge: "2024-08-31", release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.13, output: 0.4 } }, "poolside/laguna-xs-2.1": { id: "poolside/laguna-xs-2.1", name: "Laguna XS 2.1", description: "Agentic coding model from Poolside in the XS size class for local deployment", family: "laguna", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-02", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.06, output: 0.12, cache_read: 0.03 } }, "poolside/laguna-s-2.1": { id: "poolside/laguna-s-2.1", name: "Laguna S 2.1", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "laguna-s", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.09, output: 0.18, cache_read: 0.009 } }, "poolside/laguna-s-2.1:free": { id: "poolside/laguna-s-2.1:free", name: "Laguna S 2.1 (free)", description: "Free provider route for experiments, demos, and cost-sensitive chat workloads", family: "laguna-s", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "poolside/laguna-xs-2.1:free": { id: "poolside/laguna-xs-2.1:free", name: "Laguna XS 2.1 (free)", description: "Free provider route for experiments, demos, and cost-sensitive chat workloads", family: "laguna", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-02", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "minimax/minimax-m2-her": { id: "minimax/minimax-m2-her", name: "MiniMax M2-her", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-01-23", last_updated: "2026-01-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 65536, output: 2048 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "minimax/minimax-m2.7": { id: "minimax/minimax-m2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "minimax/minimax-m3": { id: "minimax/minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 512000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "minimax/minimax-m1": { id: "minimax/minimax-m1", name: "MiniMax M1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2024-06-30", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 40000 }, cost: { input: 0.55, output: 2.2 } }, "minimax/minimax-m2.5": { id: "minimax/minimax-m2.5", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_details" }, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 196608 }, cost: { input: 0.22, output: 0.9, cache_read: 0.05 } }, "minimax/minimax-m2": { id: "minimax/minimax-m2", name: "MiniMax-M2", description: "Efficient open MiniMax model built for coding agents and tool-heavy workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_details" }, structured_output: true, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.255, output: 1.02 } }, "minimax/minimax-01": { id: "minimax/minimax-01", name: "MiniMax-01", description: "MiniMax multimodal coding model for long-context reasoning and agent tasks", family: "minimax", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-03-31", release_date: "2025-01-15", last_updated: "2025-01-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1000192, output: 1000192 }, cost: { input: 0.2, output: 1.1 } }, "minimax/minimax-m2.1": { id: "minimax/minimax-m2.1", name: "MiniMax-M2.1", description: "Earlier MiniMax agent model for practical coding and productivity tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_details" }, structured_output: false, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "deepseek/deepseek-v3.2-exp": { id: "deepseek/deepseek-v3.2-exp", name: "DeepSeek V3.2 Exp", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 65536 }, cost: { input: 0.27, output: 0.41 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 393216 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "deepseek/deepseek-chat-v3-0324": { id: "deepseek/deepseek-chat-v3-0324", name: "DeepSeek V3 0324", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07-31", release_date: "2025-03-24", last_updated: "2025-03-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 65536 }, cost: { input: 0.27, output: 1.12, cache_read: 0.135 } }, "deepseek/deepseek-r1-distill-llama-70b": { id: "deepseek/deepseek-r1-distill-llama-70b", name: "R1 Distill Llama 70B", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2024-07-31", release_date: "2025-01-23", last_updated: "2025-01-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0.8, output: 0.8 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "deepseek/deepseek-r1-0528": { id: "deepseek/deepseek-r1-0528", name: "R1 0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-28", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 32768 }, cost: { input: 0.5, output: 2.15, cache_read: 0.35 } }, "deepseek/deepseek-v4-flash-0731": { id: "deepseek/deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 0.09, output: 0.18, cache_read: 0.018 } }, "deepseek/deepseek-v3.2": { id: "deepseek/deepseek-v3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 65536 }, cost: { input: 0.269, output: 0.4, cache_read: 0.1345 } }, "deepseek/deepseek-r1": { id: "deepseek/deepseek-r1", name: "DeepSeek-R1", description: "Classic open reasoning model for transparent math, coding, and deliberate problem solving", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 16000 }, cost: { input: 0.7, output: 2.5 } }, "deepseek/deepseek-chat": { id: "deepseek/deepseek-chat", name: "DeepSeek Chat", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-09", release_date: "2025-12-01", last_updated: "2026-02-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 16000 }, cost: { input: 0.2574, output: 1.0287 } }, "deepseek/deepseek-v3.1-terminus": { id: "deepseek/deepseek-v3.1-terminus", name: "DeepSeek V3.1 Terminus", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-09-22", last_updated: "2025-09-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 32768 }, cost: { input: 0.27, output: 1, cache_read: 0.135 } }, "deepseek/deepseek-chat-v3.1": { id: "deepseek/deepseek-chat-v3.1", name: "DeepSeek V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 32768 }, cost: { input: 0.25, output: 0.95, cache_read: 0.13 } }, "amazon/nova-premier-v1": { id: "amazon/nova-premier-v1", name: "Nova Premier 1.0", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "nova", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-10-31", last_updated: "2025-10-31", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32000 }, cost: { input: 2.5, output: 12.5, cache_read: 0.625 } }, "amazon/nova-2-lite-v1": { id: "amazon/nova-2-lite-v1", name: "Nova 2 Lite", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "nova", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65535 }, cost: { input: 0.3, output: 2.5 } }, "amazon/nova-pro-v1": { id: "amazon/nova-pro-v1", name: "Nova Pro 1.0", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "nova-pro", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2024-10-31", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 5120 }, cost: { input: 0.8, output: 3.2 } }, "amazon/nova-micro-v1": { id: "amazon/nova-micro-v1", name: "Nova Micro 1.0", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova-micro", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2024-10-31", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 5120 }, cost: { input: 0.035, output: 0.14 } }, "amazon/nova-lite-v1": { id: "amazon/nova-lite-v1", name: "Nova Lite 1.0", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova-lite", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2024-10-31", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 5120 }, cost: { input: 0.06, output: 0.24 } }, "~moonshotai/kimi-latest": { id: "~moonshotai/kimi-latest", name: "MoonshotAI Kimi Latest", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 2.8, output: 14, cache_read: 0.29 } }, "ibm-granite/granite-4.0-h-micro": { id: "ibm-granite/granite-4.0-h-micro", name: "Granite 4.0 Micro", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "granite", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-10-20", last_updated: "2025-10-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 131000 }, cost: { input: 0.017, output: 0.112 } }, "ibm-granite/granite-4.1-8b": { id: "ibm-granite/granite-4.1-8b", name: "Granite 4.1 8B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "granite", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.05, output: 0.1, cache_read: 0.05 } }, "x-ai/grok-4.20-multi-agent": { id: "x-ai/grok-4.20-multi-agent", name: "Grok 4.20 Multi-Agent", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: false, structured_output: true, temperature: true, knowledge: "2025-09-01", release_date: "2026-03-31", last_updated: "2026-03-31", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "x-ai/grok-4.3": { id: "x-ai/grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "x-ai/grok-4.5": { id: "x-ai/grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.3, tiers: [{ input: 4, output: 12, cache_read: 0.6, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 12, cache_read: 0.6 } } }, "x-ai/grok-build-0.1": { id: "x-ai/grok-build-0.1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1, output: 2, cache_read: 0.2, tiers: [{ input: 2, output: 4, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2, output: 4, cache_read: 0.4 } } }, "x-ai/grok-4.20": { id: "x-ai/grok-4.20", name: "Grok 4.20", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-09-01", release_date: "2026-03-31", last_updated: "2026-03-31", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "kwaipilot/kat-coder-pro-v2": { id: "kwaipilot/kat-coder-pro-v2", name: "KAT-Coder-Pro V2", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "kat-coder", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-27", last_updated: "2026-03-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 80000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "kwaipilot/kat-coder-pro-v2.5": { id: "kwaipilot/kat-coder-pro-v2.5", name: "KAT-Coder-Pro V2.5", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "kat-coder", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-10", last_updated: "2026-07-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 80000 }, cost: { input: 0.74, output: 2.96, cache_read: 0.15 } }, "kwaipilot/kat-coder-air-v2.5": { id: "kwaipilot/kat-coder-air-v2.5", name: "KAT-Coder-Air V2.5", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "kat-coder", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-10", last_updated: "2026-07-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 80000 }, cost: { input: 0.15, output: 0.6, cache_read: 0.03 } }, "sao10k/l3.1-euryale-70b": { id: "sao10k/l3.1-euryale-70b", name: "Llama 3.1 Euryale 70B v2.2", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12-31", release_date: "2024-08-28", last_updated: "2024-08-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.85, output: 0.85 } }, "sao10k/l3.3-euryale-70b": { id: "sao10k/l3.3-euryale-70b", name: "Llama 3.3 Euryale 70B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2023-12-31", release_date: "2024-12-18", last_updated: "2024-12-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.65, output: 0.75 } }, "sao10k/l3-lunaris-8b": { id: "sao10k/l3-lunaris-8b", name: "Llama 3 8B Lunaris", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2023-12-31", release_date: "2024-08-13", last_updated: "2024-08-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 16384 }, cost: { input: 0.04, output: 0.05 } }, "openrouter/pareto-code": { id: "openrouter/pareto-code", name: "Pareto Code Router", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 200000 } }, "openrouter/bodybuilder": { id: "openrouter/bodybuilder", name: "Body Builder (beta)", description: "Preview model for early access evaluation, prototyping, and compatibility testing", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, release_date: "2025-12-05", last_updated: "2025-12-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 } }, "openrouter/free": { id: "openrouter/free", name: "Free Models Router", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-01", last_updated: "2026-02-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 8000 }, cost: { input: 0, output: 0 } }, "openrouter/auto": { id: "openrouter/auto", name: "Auto Router", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "auto", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2023-11-08", last_updated: "2023-11-08", modalities: { input: ["text", "image", "audio", "pdf", "video"], output: ["text", "image"] }, open_weights: false, limit: { context: 2000000, output: 2000000 } }, "openrouter/fusion": { id: "openrouter/fusion", name: "Fusion", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 } }, "aion-labs/aion-2.0": { id: "aion-labs/aion-2.0", name: "Aion-2.0", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.8, output: 1.6, cache_read: 0.2 } }, "aion-labs/aion-3.0-mini": { id: "aion-labs/aion-3.0-mini", name: "Aion-3.0-Mini", description: "Efficient model for low-latency assistance, extraction, and routine automation", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-07", last_updated: "2026-07-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.7, output: 1.4, cache_read: 0.18 } }, "aion-labs/aion-rp-llama-3.1-8b": { id: "aion-labs/aion-rp-llama-3.1-8b", name: "Aion-RP 1.0 (8B)", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-12-31", release_date: "2025-02-04", last_updated: "2025-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.8, output: 1.6 } }, "aion-labs/aion-3.0": { id: "aion-labs/aion-3.0", name: "Aion-3.0", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-07", last_updated: "2026-07-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 3, output: 6, cache_read: 0.75 } }, "xiaomi/mimo-v2.5": { id: "xiaomi/mimo-v2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_details" }, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1050000, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "xiaomi/mimo-v2.5-pro": { id: "xiaomi/mimo-v2.5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1050000, output: 131072 }, cost: { input: 0.435, output: 0.87, cache_read: 0.0036 } }, "writer/palmyra-x5": { id: "writer/palmyra-x5", name: "Palmyra X5", description: "General-purpose chat model for instruction following, writing, and analysis", family: "palmyra", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-01-21", last_updated: "2026-01-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1040000, output: 8192 }, cost: { input: 0.6, output: 6 } }, "anthropic/claude-sonnet-4.6": { id: "anthropic/claude-sonnet-4.6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "anthropic/claude-fable-5": { id: "anthropic/claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4.8-fast": { id: "anthropic/claude-opus-4.8-fast", name: "Claude Opus 4.8 (Fast)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4.1": { id: "anthropic/claude-opus-4.1", name: "Claude Opus 4.1 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 31999 }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-opus-4.5": { id: "anthropic/claude-opus-4.5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4.7": { id: "anthropic/claude-opus-4.7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "anthropic/claude-sonnet-4.5": { id: "anthropic/claude-sonnet-4.5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "anthropic/claude-3-haiku": { id: "anthropic/claude-3-haiku", name: "Claude 3 Haiku", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-08-31", release_date: "2024-03-13", last_updated: "2024-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, cost: { input: 0.25, output: 1.25, cache_read: 0.03, cache_write: 0.3 } }, "anthropic/claude-opus-5-fast": { id: "anthropic/claude-opus-5-fast", name: "Claude Opus 5 (Fast)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-sonnet-4": { id: "anthropic/claude-sonnet-4", name: "Claude Sonnet 4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-01-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "anthropic/claude-haiku-4.5": { id: "anthropic/claude-haiku-4.5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "anthropic/claude-opus-4": { id: "anthropic/claude-opus-4", name: "Claude Opus 4", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 31999 }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-01-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-opus-4.8": { id: "anthropic/claude-opus-4.8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-5": { id: "anthropic/claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "anthropic/claude-opus-5": { id: "anthropic/claude-opus-5", name: "Claude Opus 5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4.6": { id: "anthropic/claude-opus-4.6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "anthropic/claude-opus-4.7-fast": { id: "anthropic/claude-opus-4.7-fast", name: "Claude Opus 4.7 (Fast)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 } }, "~anthropic/claude-sonnet-latest": { id: "~anthropic/claude-sonnet-latest", name: "Anthropic Claude Sonnet Latest", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "~anthropic/claude-opus-latest": { id: "~anthropic/claude-opus-latest", name: "Claude Opus Latest", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "~anthropic/claude-haiku-latest": { id: "~anthropic/claude-haiku-latest", name: "Anthropic Claude Haiku Latest", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "~anthropic/claude-fable-latest": { id: "~anthropic/claude-fable-latest", name: "Claude Fable Latest", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "z-ai/glm-4.6v": { id: "z-ai/glm-4.6v", name: "GLM-4.6V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.3, output: 0.9, cache_read: 0.055 } }, "z-ai/glm-5": { id: "z-ai/glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.95, output: 2.55, cache_read: 0.2 } }, "z-ai/glm-4.5-air": { id: "z-ai/glm-4.5-air", name: "GLM-4.5-Air", description: "Lighter GLM-4.5 variant for fast coding assistance and cheaper agents", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.13, output: 0.85, cache_read: 0.025 } }, "z-ai/glm-5.1": { id: "z-ai/glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.952, output: 2.992, cache_read: 0.1768 } }, "z-ai/glm-4.7-flash": { id: "z-ai/glm-4.7-flash", name: "GLM-4.7-Flash", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_details" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 16384 }, cost: { input: 0.06, output: 0.4, cache_read: 0.01 } }, "z-ai/glm-5.2": { id: "z-ai/glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 128000 }, cost: { input: 0.07, output: 0.22, cache_read: 0.013 } }, "z-ai/glm-4.6": { id: "z-ai/glm-4.6", name: "GLM-4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.5, output: 2, cache_read: 0.1 } }, "z-ai/glm-4.5": { id: "z-ai/glm-4.5", name: "GLM-4.5", description: "Hybrid-reasoning GLM release that made the 4.5 line broadly useful", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "z-ai/glm-4.5v": { id: "z-ai/glm-4.5v", name: "GLM-4.5V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 16384 }, cost: { input: 0.6, output: 1.8, cache_read: 0.11 } }, "z-ai/glm-4.7": { id: "z-ai/glm-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_details" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.4, output: 1.75, cache_read: 0.08 } }, "z-ai/glm-5-turbo": { id: "z-ai/glm-5-turbo", name: "GLM-5-Turbo", description: "Faster GLM-5 lane for coding agents that need lower latency", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24 } }, "z-ai/glm-5v-turbo": { id: "z-ai/glm-5v-turbo", name: "GLM-5V-Turbo", description: "Fast GLM vision model for screenshots, documents, and multimodal agent tasks", family: "glm", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24 } }, "perplexity/sonar-pro-search": { id: "perplexity/sonar-pro-search", name: "Sonar Pro Search", description: "Advanced Sonar search model for deeper research and cited synthesis", family: "sonar-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, release_date: "2025-10-30", last_updated: "2025-10-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8000 }, cost: { input: 3, output: 15 } }, "perplexity/sonar-deep-research": { id: "perplexity/sonar-deep-research", name: "Sonar Deep Research", description: "Sonar search model for current answers, retrieval, and citation-backed chat", family: "sonar-deep-research", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-03-07", last_updated: "2025-03-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 2, output: 8, reasoning: 3 } }, "perplexity/sonar": { id: "perplexity/sonar", name: "Sonar", description: "Sonar search model for current answers, retrieval, and citation-backed chat", family: "sonar", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-01-27", last_updated: "2025-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 127072, output: 127072 }, cost: { input: 1, output: 1 } }, "perplexity/sonar-pro": { id: "perplexity/sonar-pro", name: "Sonar Pro", description: "Advanced Sonar search model for deeper research and cited synthesis", family: "sonar-pro", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-03-07", last_updated: "2025-03-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8000 }, cost: { input: 3, output: 15 } }, "perplexity/sonar-reasoning-pro": { id: "perplexity/sonar-reasoning-pro", name: "Sonar Reasoning Pro", description: "Web-grounded reasoning model for multi-step research and cited answers", family: "sonar-reasoning", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-03-07", last_updated: "2025-03-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 2, output: 8 } }, "moonshotai/kimi-k2.5": { id: "moonshotai/kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_details" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.57, output: 2.85, cache_read: 0.095 } }, "moonshotai/kimi-k2.6": { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_details" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.5795, output: 2.44, cache_read: 0.0976 } }, "moonshotai/kimi-k2.7-code": { id: "moonshotai/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.7, output: 3.5, cache_read: 0.15 } }, "moonshotai/kimi-k2": { id: "moonshotai/kimi-k2", name: "Kimi K2 0711", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2024-12-31", release_date: "2025-07-11", last_updated: "2025-07-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 100352 }, cost: { input: 0.57, output: 2.3 } }, "moonshotai/kimi-k2-thinking": { id: "moonshotai/kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Thinking Kimi model for slower research passes, planning, and hard technical questions", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_details" }, structured_output: true, temperature: true, knowledge: "2024-08", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 100352 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "moonshotai/kimi-k3": { id: "moonshotai/kimi-k3", name: "Kimi K3", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "moonshotai/kimi-k2-0905": { id: "moonshotai/kimi-k2-0905", name: "Kimi K2 0905", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12-31", release_date: "2025-09-04", last_updated: "2025-09-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 100352 }, cost: { input: 0.6, output: 2.5 } }, "openai/gpt-5.1-codex-mini": { id: "openai/gpt-5.1-codex-mini", name: "GPT-5.1 Codex mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.03 } }, "openai/gpt-chat-latest": { id: "openai/gpt-chat-latest", name: "GPT Chat Latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2026-05-05", last_updated: "2026-05-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "openai/gpt-5.2-pro": { id: "openai/gpt-5.2-pro", name: "GPT-5.2 Pro", description: "Higher-accuracy GPT-5.2 variant for tougher reasoning and review workflows", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 21, output: 168 } }, "openai/gpt-5.5-pro": { id: "openai/gpt-5.5-pro", name: "GPT-5.5 Pro", description: "Highest-accuracy GPT-5.5 tier for slower, precision-heavy reasoning and coding", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "openai/gpt-4.1-mini": { id: "openai/gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "openai/gpt-4o": { id: "openai/gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.4-pro": { id: "openai/gpt-5.4-pro", name: "GPT-5.4 Pro", description: "More exact GPT-5.4 tier for demanding professional reasoning and agent tasks", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "openai/gpt-audio-mini": { id: "openai/gpt-audio-mini", name: "GPT Audio Mini", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "o-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text", "audio"], output: ["text", "audio"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.6, output: 2.4 } }, "openai/gpt-5.6-sol": { id: "openai/gpt-5.6-sol", name: "GPT-5.6 Sol", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 45, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1, cache_write: 12.5 } } }, "openai/o3-mini-high": { id: "openai/o3-mini-high", name: "o3 Mini High", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2023-10-31", release_date: "2025-02-12", last_updated: "2025-02-12", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-4o-mini-2024-07-18": { id: "openai/gpt-4o-mini-2024-07-18", name: "GPT-4o-mini (2024-07-18)", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "o-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-10-31", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "openai/gpt-4.1-nano": { id: "openai/gpt-4.1-nano", name: "GPT-4.1 nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.03, output: 0.13, cache_read: 0.03 } }, "openai/gpt-oss-safeguard-20b": { id: "openai/gpt-oss-safeguard-20b", name: "gpt-oss-safeguard-20b", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-29", last_updated: "2025-10-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0.075, output: 0.3, cache_read: 0.0375 } }, "openai/o3-mini": { id: "openai/o3-mini", name: "o3-mini", description: "Smaller o-series reasoner for economical coding, math, and planning tasks", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-5.6-sol-pro": { id: "openai/gpt-5.6-sol-pro", name: "GPT-5.6 Sol Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 45, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1, cache_write: 12.5 } } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "openai/gpt-3.5-turbo-0613": { id: "openai/gpt-3.5-turbo-0613", name: "GPT-3.5 Turbo (older v0613)", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2021-09-30", release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 4095, output: 4096 }, cost: { input: 1, output: 2 } }, "openai/o3-pro": { id: "openai/o3-pro", name: "o3-pro", description: "High-effort o3 tier for difficult technical reasoning and careful answers", family: "o-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-06-10", last_updated: "2025-06-10", modalities: { input: ["text", "pdf", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 20, output: 80 } }, "openai/gpt-4o-mini": { id: "openai/gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-audio": { id: "openai/gpt-audio", name: "GPT Audio", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text", "audio"], output: ["text", "audio"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10 } }, "openai/o4-mini-high": { id: "openai/o4-mini-high", name: "o4 Mini High", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-06-30", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.275 } }, "openai/gpt-3.5-turbo": { id: "openai/gpt-3.5-turbo", name: "GPT-3.5-turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2021-09-01", release_date: "2023-03-01", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16385, output: 4096 }, cost: { input: 0.5, output: 1.5 } }, "openai/gpt-4o-2024-05-13": { id: "openai/gpt-4o-2024-05-13", name: "GPT-4o (2024-05-13)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-05-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 5, output: 15 } }, "openai/gpt-4o-2024-11-20": { id: "openai/gpt-4o-2024-11-20", name: "GPT-4o (2024-11-20)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-11-20", last_updated: "2024-11-20", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "openai/gpt-5.6-luna-pro": { id: "openai/gpt-5.6-luna-pro", name: "GPT-5.6 Luna Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0.1, output: 0.6, cache_read: 0.01, cache_write: 0.125, tiers: [{ input: 0.2, output: 0.9, cache_read: 0.02, cache_write: 0.25, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 0.2, output: 0.9, cache_read: 0.02, cache_write: 0.25 } } }, "openai/gpt-5.2-chat": { id: "openai/gpt-5.2-chat", name: "GPT-5.2 Chat", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-codex", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-10", last_updated: "2025-12-10", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.2-codex": { id: "openai/gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Code-specialist GPT for repository edits, reviews, and long-running software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "openai/gpt-5-pro": { id: "openai/gpt-5-pro", name: "GPT-5 Pro", description: "Higher-accuracy GPT-5 tier for tough analysis, coding reviews, and planning", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 15, output: 120 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.037, output: 0.17 } }, "openai/gpt-3.5-turbo-16k": { id: "openai/gpt-3.5-turbo-16k", name: "GPT-3.5 Turbo 16k", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2021-09-30", release_date: "2023-08-28", last_updated: "2023-08-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16385, output: 4096 }, cost: { input: 3, output: 4 } }, "openai/o1": { id: "openai/o1", name: "o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2023-09", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 15, output: 60, cache_read: 7.5 } }, "openai/gpt-5.6-luna": { id: "openai/gpt-5.6-luna", name: "GPT-5.6 Luna", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0.1, output: 0.6, cache_read: 0.01, cache_write: 0.125, tiers: [{ input: 0.2, output: 0.9, cache_read: 0.02, cache_write: 0.25, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 0.2, output: 0.9, cache_read: 0.02, cache_write: 0.25 } } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.3-codex": { id: "openai/gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/gpt-5.3-chat": { id: "openai/gpt-5.3-chat", name: "GPT-5.3 Chat", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/o1-pro": { id: "openai/o1-pro", name: "o1-pro", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: false, knowledge: "2023-09", release_date: "2025-03-19", last_updated: "2025-03-19", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 150, output: 600 } }, "openai/gpt-5-image": { id: "openai/gpt-5-image", name: "GPT-5 Image", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, knowledge: "2024-10-01", release_date: "2025-10-14", last_updated: "2025-10-14", modalities: { input: ["image", "text", "pdf"], output: ["image", "text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 10, output: 10, cache_read: 1.25 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4-turbo-preview": { id: "openai/gpt-4-turbo-preview", name: "GPT-4 Turbo Preview", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12-31", release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 10, output: 30 } }, "openai/gpt-4-turbo": { id: "openai/gpt-4-turbo", name: "GPT-4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 10, output: 30 } }, "openai/gpt-4o-2024-08-06": { id: "openai/gpt-4o-2024-08-06", name: "GPT-4o (2024-08-06)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-08-06", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.4-image-2": { id: "openai/gpt-5.4-image-2", name: "GPT-5.4 Image 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: false, structured_output: true, temperature: false, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["image", "text", "pdf"], output: ["image", "text"] }, open_weights: false, limit: { context: 272000, output: 128000 }, cost: { input: 8, output: 15, cache_read: 2 } }, "openai/gpt-5.1-codex": { id: "openai/gpt-5.1-codex", name: "GPT-5.1 Codex", description: "Codex GPT for repository edits, code review, and practical software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "openai/gpt-5-nano": { id: "openai/gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "openai/o3": { id: "openai/o3", name: "o3", description: "Deliberate o-series reasoner for hard math, coding, and multi-step analysis", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/gpt-3.5-turbo-instruct": { id: "openai/gpt-3.5-turbo-instruct", name: "GPT-3.5 Turbo Instruct", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2021-09-30", release_date: "2023-09-28", last_updated: "2023-09-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 4095, output: 4096 }, cost: { input: 1.5, output: 2 } }, "openai/gpt-5.6-terra": { id: "openai/gpt-5.6-terra", name: "GPT-5.6 Terra", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 1, output: 6, cache_read: 0.1, cache_write: 1.25, tiers: [{ input: 2, output: 9, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 2, output: 9, cache_read: 0.2, cache_write: 2.5 } } }, "openai/gpt-5-image-mini": { id: "openai/gpt-5-image-mini", name: "GPT-5 Image Mini", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, release_date: "2025-10-16", last_updated: "2025-10-16", modalities: { input: ["pdf", "image", "text"], output: ["image", "text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 2.5, output: 2, cache_read: 0.25 } }, "openai/gpt-5.6-terra-pro": { id: "openai/gpt-5.6-terra-pro", name: "GPT-5.6 Terra Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 1, output: 6, cache_read: 0.1, cache_write: 1.25, tiers: [{ input: 2, output: 9, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 2, output: 9, cache_read: 0.2, cache_write: 2.5 } } }, "openai/gpt-4.1": { id: "openai/gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/o4-mini": { id: "openai/o4-mini", name: "o4-mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.275 } }, "openai/gpt-oss-20b:free": { id: "openai/gpt-oss-20b:free", name: "gpt-oss-20b (free)", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0, output: 0 } }, "openai/gpt-5.1-codex-max": { id: "openai/gpt-5.1-codex-max", name: "GPT-5.1 Codex Max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4": { id: "openai/gpt-4", name: "GPT-4", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-11", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8191, output: 4096 }, cost: { input: 30, output: 60 } }, "baidu/ernie-4.5-vl-424b-a47b": { id: "baidu/ernie-4.5-vl-424b-a47b", name: "ERNIE 4.5 VL 424B A47B ", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "ernie", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-03-31", release_date: "2025-06-30", last_updated: "2025-06-30", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: true, limit: { context: 123000, output: 16000 }, cost: { input: 0.42, output: 1.25 } }, "meta-llama/llama-3.1-70b-instruct": { id: "meta-llama/llama-3.1-70b-instruct", name: "Llama 3.1 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12-31", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.4, output: 0.4 } }, "meta-llama/llama-guard-4-12b": { id: "meta-llama/llama-guard-4-12b", name: "Llama Guard 4 12B", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "llama", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-08-31", release_date: "2025-04-30", last_updated: "2025-04-30", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 16384 }, cost: { input: 0.18, output: 0.18 } }, "meta-llama/llama-3.2-1b-instruct": { id: "meta-llama/llama-3.2-1b-instruct", name: "Llama 3.2 1B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-12-31", release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 60000, output: 60000 }, cost: { input: 0.027, output: 0.201 } }, "meta-llama/llama-3.3-70b-instruct": { id: "meta-llama/llama-3.3-70b-instruct", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.1, output: 0.32 } }, "meta-llama/llama-4-maverick": { id: "meta-llama/llama-4-maverick", name: "Llama 4 Maverick", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-08-31", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 16384 }, cost: { input: 0.2, output: 0.8 } }, "meta-llama/llama-4-scout": { id: "meta-llama/llama-4-scout", name: "Llama 4 Scout", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-08-31", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1310720, output: 16384 }, cost: { input: 0.1, output: 0.3 } }, "meta-llama/llama-3.2-3b-instruct": { id: "meta-llama/llama-3.2-3b-instruct", name: "Llama 3.2 3B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2023-12-31", release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.05, output: 0.33 } }, "meta-llama/llama-3.1-8b-instruct": { id: "meta-llama/llama-3.1-8b-instruct", name: "Llama 3.1 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12-31", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.05, output: 0.08, cache_read: 0.025 } }, "arcee-ai/virtuoso-large": { id: "arcee-ai/virtuoso-large", name: "Virtuoso Large", description: "Flagship model for demanding analysis, coding, and production agent workflows", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-05", last_updated: "2025-05-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 64000 }, cost: { input: 0.75, output: 1.2 } }, "arcee-ai/trinity-large-thinking": { id: "arcee-ai/trinity-large-thinking", name: "Trinity Large Thinking", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "trinity", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.22, output: 0.85, cache_read: 0.06 } }, "bytedance-seed/seed-1.6": { id: "bytedance-seed/seed-1.6", name: "Seed 1.6", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.25, output: 2, tiers: [{ input: 0.5, output: 4, tier: { type: "context", size: 128000 } }] } }, "bytedance-seed/seed-2.0-mini": { id: "bytedance-seed/seed-2.0-mini", name: "Seed-2.0-Mini", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 131072 }, cost: { input: 0.1, output: 0.4, tiers: [{ input: 0.2, output: 0.8, tier: { type: "context", size: 128000 } }] } }, "bytedance-seed/seed-1.6-flash": { id: "bytedance-seed/seed-1.6-flash", name: "Seed 1.6 Flash", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.075, output: 0.3, tiers: [{ input: 0.1, output: 0.8, tier: { type: "context", size: 128000 } }] } }, "bytedance-seed/seed-2.0-lite": { id: "bytedance-seed/seed-2.0-lite", name: "Seed-2.0-Lite", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-10", last_updated: "2026-03-10", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 131072 }, cost: { input: 0.25, output: 2, tiers: [{ input: 0.5, output: 4, tier: { type: "context", size: 128000 } }] } }, "stepfun/step-3.5-flash": { id: "stepfun/step-3.5-flash", name: "Step 3.5 Flash", description: "StepFun flash lane for quick multimodal reasoning and coding assistance", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-01-29", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.1, output: 0.3 } }, "stepfun/step-3.7-flash": { id: "stepfun/step-3.7-flash", name: "Step 3.7 Flash", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 256000, output: 256000 }, cost: { input: 0.2, output: 1.15, cache_read: 0.04 } }, "anthracite-org/magnum-v4-72b": { id: "anthracite-org/magnum-v4-72b", name: "Magnum v4 72B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-06-30", release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, output: 2048 }, cost: { input: 3, output: 5 } } } }, huggingface: { id: "huggingface", env: ["HF_TOKEN"], npm: "@ai-sdk/openai-compatible", api: "https://router.huggingface.co/v1", name: "Hugging Face", doc: "https://huggingface.co/docs/inference-providers", models: { "google/gemma-4-26B-A4B-it": { id: "google/gemma-4-26B-A4B-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.13, output: 0.4 } }, "google/gemma-4-31B-it": { id: "google/gemma-4-31B-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.14, output: 0.4 } }, "thinkingmachines/Inkling-Small": { id: "thinkingmachines/Inkling-Small", name: "Inkling Small", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "ling", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-07-30", last_updated: "2026-07-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 1048576 }, cost: { input: 0.5, output: 1.2 } }, "thinkingmachines/Inkling": { id: "thinkingmachines/Inkling", name: "Inkling", description: "Multimodal model for analyzing text, images, documents, and rich media", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 1, output: 4.05 } }, "zai-org/GLM-5": { id: "zai-org/GLM-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.2 } }, "zai-org/GLM-4.5": { id: "zai-org/GLM-4.5", name: "GLM-4.5", description: "Hybrid-reasoning GLM release that made the 4.5 line broadly useful", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.6, output: 2.2 } }, "zai-org/GLM-4.5-Air": { id: "zai-org/GLM-4.5-Air", name: "GLM-4.5-Air", description: "Lighter GLM-4.5 variant for fast coding assistance and cheaper agents", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.13, output: 0.85 } }, "zai-org/GLM-4.5V": { id: "zai-org/GLM-4.5V", name: "GLM-4.5V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 16384 }, cost: { input: 0.6, output: 1.8 } }, "zai-org/GLM-4.7-Flash": { id: "zai-org/GLM-4.7-Flash", name: "GLM-4.7-Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-08-08", last_updated: "2025-08-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0, output: 0 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 1.4, output: 4.4 } }, "zai-org/GLM-5.1": { id: "zai-org/GLM-5.1", name: "GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-03", last_updated: "2026-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.2 } }, "zai-org/GLM-4.6": { id: "zai-org/GLM-4.6", name: "GLM-4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.55, output: 2.2 } }, "zai-org/GLM-4.7": { id: "zai-org/GLM-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "tencent/Hy3": { id: "tencent/Hy3", name: "Hy3", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 64000 }, cost: { input: 0.14, output: 0.58 } }, "Qwen/Qwen3.5-27B": { id: "Qwen/Qwen3.5-27B", name: "Qwen3.5 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.3, output: 2.4 } }, "Qwen/Qwen3.5-9B": { id: "Qwen/Qwen3.5-9B", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.17, output: 0.25 } }, "Qwen/Qwen3-235B-A22B-Instruct-2507": { id: "Qwen/Qwen3-235B-A22B-Instruct-2507", name: "Qwen3 235B-A22B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-21", last_updated: "2025-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.855, output: 2.565 } }, "Qwen/Qwen3.5-122B-A10B": { id: "Qwen/Qwen3.5-122B-A10B", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.4, output: 3.2 } }, "Qwen/Qwen3-Coder-30B-A3B-Instruct": { id: "Qwen/Qwen3-Coder-30B-A3B-Instruct", name: "Qwen3-Coder 30B-A3B Instruct", description: "Smaller Qwen coder for efficient local agents and repo-level fixes", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.07, output: 0.26 } }, "Qwen/Qwen3-235B-A22B": { id: "Qwen/Qwen3-235B-A22B", name: "Qwen3 235B-A22B", description: "Large open Qwen MoE for multilingual reasoning, coding, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 16384 }, cost: { input: 0.2, output: 0.8 } }, "Qwen/Qwen3-Embedding-4B": { id: "Qwen/Qwen3-Embedding-4B", name: "Qwen 3 Embedding 4B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2024-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 2048 }, cost: { input: 0.01, output: 0 } }, "Qwen/Qwen3.5-35B-A3B": { id: "Qwen/Qwen3.5-35B-A3B", name: "Qwen3.5 35B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.25, output: 2 } }, "Qwen/Qwen3-Coder-Next": { id: "Qwen/Qwen3-Coder-Next", name: "Qwen3-Coder-Next", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-03", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.2, output: 1.5 } }, "Qwen/Qwen3.6-27B": { id: "Qwen/Qwen3.6-27B", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.47, output: 3.19 } }, "Qwen/Qwen3.5-397B-A17B": { id: "Qwen/Qwen3.5-397B-A17B", name: "Qwen3.5-397B-A17B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2026-02-01", last_updated: "2026-02-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.6, output: 3.6 } }, "Qwen/Qwen3-Embedding-8B": { id: "Qwen/Qwen3-Embedding-8B", name: "Qwen 3 Embedding 8B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2024-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 4096 }, cost: { input: 0.01, output: 0 } }, "Qwen/Qwen3.6-35B-A3B": { id: "Qwen/Qwen3.6-35B-A3B", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.15, output: 0.95 } }, "Qwen/Qwen3-Next-80B-A3B-Thinking": { id: "Qwen/Qwen3-Next-80B-A3B-Thinking", name: "Qwen3-Next-80B-A3B-Thinking", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-11", last_updated: "2025-09-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.3, output: 2 } }, "Qwen/Qwen3-Coder-480B-A35B-Instruct": { id: "Qwen/Qwen3-Coder-480B-A35B-Instruct", name: "Qwen3-Coder-480B-A35B-Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 66536 }, cost: { input: 2, output: 2 } }, "Qwen/Qwen3-32B": { id: "Qwen/Qwen3-32B", name: "Qwen3 32B", description: "Dense open Qwen model for self-hosted chat, reasoning, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.29, output: 0.59 } }, "Qwen/Qwen3-Next-80B-A3B-Instruct": { id: "Qwen/Qwen3-Next-80B-A3B-Instruct", name: "Qwen3-Next-80B-A3B-Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-11", last_updated: "2025-09-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 66536 }, cost: { input: 0.25, output: 1 } }, "Qwen/Qwen3-235B-A22B-Thinking-2507": { id: "Qwen/Qwen3-235B-A22B-Thinking-2507", name: "Qwen3-235B-A22B-Thinking-2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.3, output: 3 } }, "MiniMaxAI/MiniMax-M2": { id: "MiniMaxAI/MiniMax-M2", name: "MiniMax-M2", description: "Efficient open MiniMax model built for coding agents and tool-heavy workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 128000 }, cost: { input: 0.3, output: 1.2 } }, "MiniMaxAI/MiniMax-M2.7": { id: "MiniMaxAI/MiniMax-M2.7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "MiniMaxAI/MiniMax-M2.1": { id: "MiniMaxAI/MiniMax-M2.1", name: "MiniMax-M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-10", release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "MiniMaxAI/MiniMax-M2.5": { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "MiniMaxAI/MiniMax-M3": { id: "MiniMaxAI/MiniMax-M3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 128000 }, cost: { input: 0.3, output: 1.2 } }, "deepseek-ai/DeepSeek-V3": { id: "deepseek-ai/DeepSeek-V3", name: "DeepSeek-V3", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-12-26", last_updated: "2024-12-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 64000, output: 8192 }, cost: { input: 0.4, output: 1.3 } }, "deepseek-ai/DeepSeek-V4-Flash-0731": { id: "deepseek-ai/DeepSeek-V4-Flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 0.14, output: 0.28 } }, "deepseek-ai/DeepSeek-R1-0528": { id: "deepseek-ai/DeepSeek-R1-0528", name: "DeepSeek-R1-0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-05-28", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 163840 }, cost: { input: 3, output: 5 } }, "deepseek-ai/DeepSeek-R1": { id: "deepseek-ai/DeepSeek-R1", name: "DeepSeek-R1", description: "Classic open reasoning model for transparent math, coding, and deliberate problem solving", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 64000, output: 32768 }, cost: { input: 0.7, output: 2.5 } }, "deepseek-ai/DeepSeek-V3.2": { id: "deepseek-ai/DeepSeek-V3.2", name: "DeepSeek-V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 65536 }, cost: { input: 0.28, output: 0.4 } }, "deepseek-ai/DeepSeek-V3.1": { id: "deepseek-ai/DeepSeek-V3.1", name: "DeepSeek-V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.27, output: 1 } }, "deepseek-ai/DeepSeek-V4-Flash": { id: "deepseek-ai/DeepSeek-V4-Flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 0.14, output: 0.28 } }, "deepseek-ai/DeepSeek-V4-Pro": { id: "deepseek-ai/DeepSeek-V4-Pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 393216 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "stepfun-ai/Step-3.5-Flash": { id: "stepfun-ai/Step-3.5-Flash", name: "Step 3.5 Flash", description: "StepFun flash lane for quick multimodal reasoning and coding assistance", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-01-29", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 256000 }, cost: { input: 0.1, output: 0.3 } }, "stepfun-ai/Step-3.7-Flash": { id: "stepfun-ai/Step-3.7-Flash", name: "Step 3.7 Flash", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 256000 }, cost: { input: 0.2, output: 1.15 } }, "moonshotai/Kimi-K2-Instruct": { id: "moonshotai/Kimi-K2-Instruct", name: "Kimi-K2-Instruct", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-07-14", last_updated: "2025-07-14", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 1, output: 3 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi-K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "moonshotai/Kimi-K2.5": { id: "moonshotai/Kimi-K2.5", name: "Kimi-K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-01-01", last_updated: "2026-01-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "moonshotai/Kimi-K2-Instruct-0905": { id: "moonshotai/Kimi-K2-Instruct-0905", name: "Kimi-K2-Instruct-0905", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-09-04", last_updated: "2025-09-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 1, output: 3 } }, "moonshotai/Kimi-K2.7-Code": { id: "moonshotai/Kimi-K2.7-Code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4 } }, "moonshotai/Kimi-K2-Thinking": { id: "moonshotai/Kimi-K2-Thinking", name: "Kimi-K2-Thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-08", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "moonshotai/Kimi-K3": { id: "moonshotai/Kimi-K3", name: "Kimi K3", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 3, output: 15 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.1, output: 0.5 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.25, output: 0.69 } }, "meta-llama/Llama-3.3-70B-Instruct": { id: "meta-llama/Llama-3.3-70B-Instruct", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 4096 }, cost: { input: 0.59, output: 0.79 } }, "XiaomiMiMo/MiMo-V2.5-Pro": { id: "XiaomiMiMo/MiMo-V2.5-Pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1, output: 3 } }, "XiaomiMiMo/MiMo-V2.5": { id: "XiaomiMiMo/MiMo-V2.5", name: "MiMo-V2.5", description: "MiMo model for long-context reasoning, perception, and agentic tasks", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.4, output: 2 } }, "XiaomiMiMo/MiMo-V2-Flash": { id: "XiaomiMiMo/MiMo-V2-Flash", name: "MiMo-V2-Flash", description: "MiMo flash model for fast multimodal assistance and agent workflows", family: "mimo", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 4096 }, cost: { input: 0.1, output: 0.3 } } } }, "minimax-coding-plan": { id: "minimax-coding-plan", env: ["MINIMAX_API_KEY"], npm: "@ai-sdk/anthropic", api: "https://api.minimax.io/anthropic/v1", name: "MiniMax Token Plan (minimax.io)", doc: "https://platform.minimax.io/docs/token-plan/intro", models: { "MiniMax-M2": { id: "MiniMax-M2", name: "MiniMax-M2", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 128000 }, cost: { input: 0, output: 0 } }, "MiniMax-M2.7": { id: "MiniMax-M2.7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "MiniMax-M2.1": { id: "MiniMax-M2.1", name: "MiniMax-M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "MiniMax-M2.5": { id: "MiniMax-M2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "MiniMax-M2.5-highspeed": { id: "MiniMax-M2.5-highspeed", name: "MiniMax-M2.5-highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-13", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "MiniMax-M2.7-highspeed": { id: "MiniMax-M2.7-highspeed", name: "MiniMax-M2.7-highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "MiniMax-M3": { id: "MiniMax-M3", name: "MiniMax-M3", description: "MiniMax multimodal coding model for long-context reasoning and agent tasks", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-25", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, "siliconflow-cn": { id: "siliconflow-cn", env: ["SILICONFLOW_CN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.siliconflow.cn/v1", name: "SiliconFlow (China)", doc: "https://cloud.siliconflow.com/models", models: { "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1049000, output: 262000 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26, cache_write: 0 } }, "zai-org/GLM-4.5-Air": { id: "zai-org/GLM-4.5-Air", name: "zai-org/GLM-4.5-Air", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-air", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-28", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.14, output: 0.86 } }, "PaddlePaddle/PaddleOCR-VL-1.5": { id: "PaddlePaddle/PaddleOCR-VL-1.5", name: "PaddlePaddle/PaddleOCR-VL-1.5", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-29", last_updated: "2026-01-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 16384, output: 16384 }, cost: { input: 0, output: 0 } }, "tencent/Hunyuan-A13B-Instruct": { id: "tencent/Hunyuan-A13B-Instruct", name: "tencent/Hunyuan-A13B-Instruct", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "hunyuan", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-06-30", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.14, output: 0.57 } }, "Pro/zai-org/GLM-5": { id: "Pro/zai-org/GLM-5", name: "Pro/zai-org/GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 205000, output: 205000 }, cost: { input: 1, output: 3.2 } }, "Pro/zai-org/GLM-5.1": { id: "Pro/zai-org/GLM-5.1", name: "Pro/zai-org/GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-08", last_updated: "2026-04-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 205000, output: 205000 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26, cache_write: 0 } }, "Pro/MiniMaxAI/MiniMax-M2.5": { id: "Pro/MiniMaxAI/MiniMax-M2.5", name: "Pro/MiniMaxAI/MiniMax-M2.5", description: "Frontier MiniMax model for engineering, office tasks, and agentic reasoning", family: "minimax", attachment: false, reasoning: false, tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-13", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 192000, output: 131000 }, cost: { input: 0.3, output: 1.22 } }, "Pro/deepseek-ai/DeepSeek-V3": { id: "Pro/deepseek-ai/DeepSeek-V3", name: "Pro/deepseek-ai/DeepSeek-V3", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-12-26", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.25, output: 1 } }, "Pro/deepseek-ai/DeepSeek-R1": { id: "Pro/deepseek-ai/DeepSeek-R1", name: "Pro/deepseek-ai/DeepSeek-R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-05-28", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.5, output: 2.18 } }, "Pro/deepseek-ai/DeepSeek-V3.2": { id: "Pro/deepseek-ai/DeepSeek-V3.2", name: "Pro/deepseek-ai/DeepSeek-V3.2", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-03", last_updated: "2025-12-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.27, output: 0.42 } }, "Pro/deepseek-ai/DeepSeek-V3.1-Terminus": { id: "Pro/deepseek-ai/DeepSeek-V3.1-Terminus", name: "Pro/deepseek-ai/DeepSeek-V3.1-Terminus", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-29", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.27, output: 1 } }, "Pro/moonshotai/Kimi-K2.6": { id: "Pro/moonshotai/Kimi-K2.6", name: "Pro/moonshotai/Kimi-K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "Pro/moonshotai/Kimi-K2.5": { id: "Pro/moonshotai/Kimi-K2.5", name: "Pro/moonshotai/Kimi-K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.45, output: 2.25, cache_read: 0.07 } }, "Qwen/Qwen3.5-27B": { id: "Qwen/Qwen3.5-27B", name: "Qwen/Qwen3.5-27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-25", last_updated: "2026-02-25", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.26, output: 2.09 } }, "Qwen/Qwen3.5-9B": { id: "Qwen/Qwen3.5-9B", name: "Qwen/Qwen3.5-9B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.22, output: 1.74 } }, "Qwen/Qwen3-14B": { id: "Qwen/Qwen3-14B", name: "Qwen/Qwen3-14B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-30", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.07, output: 0.28 } }, "Qwen/Qwen3.5-122B-A10B": { id: "Qwen/Qwen3.5-122B-A10B", name: "Qwen/Qwen3.5-122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.29, output: 2.32 } }, "Qwen/Qwen3.5-4B": { id: "Qwen/Qwen3.5-4B", name: "Qwen/Qwen3.5-4B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0, output: 0 } }, "Qwen/Qwen3-8B": { id: "Qwen/Qwen3-8B", name: "Qwen/Qwen3-8B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-30", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.06, output: 0.06 } }, "Qwen/Qwen3.5-35B-A3B": { id: "Qwen/Qwen3.5-35B-A3B", name: "Qwen/Qwen3.5-35B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-25", last_updated: "2026-02-25", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.23, output: 1.86 } }, "Qwen/Qwen3.5-397B-A17B": { id: "Qwen/Qwen3.5-397B-A17B", name: "Qwen/Qwen3.5-397B-A17B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.29, output: 1.74 } }, "Qwen/Qwen3.6-35B-A3B": { id: "Qwen/Qwen3.6-35B-A3B", name: "Qwen/Qwen3.6-35B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.23, output: 1.86 } }, "Qwen/Qwen3-32B": { id: "Qwen/Qwen3-32B", name: "Qwen/Qwen3-32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-30", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.14, output: 0.57 } }, "Qwen/Qwen3-235B-A22B-Thinking-2507": { id: "Qwen/Qwen3-235B-A22B-Thinking-2507", name: "Qwen/Qwen3-235B-A22B-Thinking-2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-28", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.13, output: 0.6 } }, "Qwen/Qwen3-VL-32B-Thinking": { id: "Qwen/Qwen3-VL-32B-Thinking", name: "Qwen/Qwen3-VL-32B-Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-21", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.2, output: 1.5 } }, "Qwen/Qwen3-VL-30B-A3B-Instruct": { id: "Qwen/Qwen3-VL-30B-A3B-Instruct", name: "Qwen/Qwen3-VL-30B-A3B-Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-05", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.29, output: 1 } }, "Qwen/Qwen3-VL-32B-Instruct": { id: "Qwen/Qwen3-VL-32B-Instruct", name: "Qwen/Qwen3-VL-32B-Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-21", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.2, output: 0.6 } }, "Qwen/Qwen3-Coder-480B-A35B-Instruct": { id: "Qwen/Qwen3-Coder-480B-A35B-Instruct", name: "Qwen/Qwen3-Coder-480B-A35B-Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-31", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.25, output: 1 } }, "Qwen/Qwen3-30B-A3B-Instruct-2507": { id: "Qwen/Qwen3-30B-A3B-Instruct-2507", name: "Qwen/Qwen3-30B-A3B-Instruct-2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-30", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.09, output: 0.3 } }, "Qwen/Qwen3-VL-8B-Instruct": { id: "Qwen/Qwen3-VL-8B-Instruct", name: "Qwen/Qwen3-VL-8B-Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-15", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.18, output: 0.68 } }, "Qwen/Qwen3-VL-30B-A3B-Thinking": { id: "Qwen/Qwen3-VL-30B-A3B-Thinking", name: "Qwen/Qwen3-VL-30B-A3B-Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-11", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.29, output: 1 } }, "Qwen/Qwen3-VL-235B-A22B-Thinking": { id: "Qwen/Qwen3-VL-235B-A22B-Thinking", name: "Qwen/Qwen3-VL-235B-A22B-Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-04", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.45, output: 3.5 } }, "Qwen/Qwen3-VL-235B-A22B-Instruct": { id: "Qwen/Qwen3-VL-235B-A22B-Instruct", name: "Qwen/Qwen3-VL-235B-A22B-Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-04", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.3, output: 1.5 } }, "Qwen/Qwen3-Coder-30B-A3B-Instruct": { id: "Qwen/Qwen3-Coder-30B-A3B-Instruct", name: "Qwen/Qwen3-Coder-30B-A3B-Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-01", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.07, output: 0.28 } }, "Qwen/Qwen2.5-72B-Instruct": { id: "Qwen/Qwen2.5-72B-Instruct", name: "Qwen/Qwen2.5-72B-Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-09-18", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 33000, output: 4000 }, cost: { input: 0.59, output: 0.59 } }, "Qwen/Qwen2.5-7B-Instruct": { id: "Qwen/Qwen2.5-7B-Instruct", name: "Qwen/Qwen2.5-7B-Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-09-18", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 33000, output: 4000 }, cost: { input: 0.05, output: 0.05 } }, "inclusionAI/Ling-flash-2.0": { id: "inclusionAI/Ling-flash-2.0", name: "inclusionAI/Ling-flash-2.0", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "ling", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-18", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.14, output: 0.57 } }, "ByteDance-Seed/Seed-OSS-36B-Instruct": { id: "ByteDance-Seed/Seed-OSS-36B-Instruct", name: "ByteDance-Seed/Seed-OSS-36B-Instruct", description: "Tool-capable chat model for instruction following and agentic application workflows", family: "seed", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-04", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.21, output: 0.57 } }, "deepseek-ai/DeepSeek-R1": { id: "deepseek-ai/DeepSeek-R1", name: "deepseek-ai/DeepSeek-R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-05-28", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.5, output: 2.18 } }, "deepseek-ai/DeepSeek-V3.2": { id: "deepseek-ai/DeepSeek-V3.2", name: "deepseek-ai/DeepSeek-V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-03", last_updated: "2025-12-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.27, output: 0.42 } }, "deepseek-ai/DeepSeek-OCR": { id: "deepseek-ai/DeepSeek-OCR", name: "deepseek-ai/DeepSeek-OCR", description: "OCR model for extracting structured text from documents and screenshots", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-10-20", last_updated: "2025-10-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } }, "deepseek-ai/DeepSeek-V4-Flash": { id: "deepseek-ai/DeepSeek-V4-Flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.003 } }, "deepseek-ai/DeepSeek-V4-Pro": { id: "deepseek-ai/DeepSeek-V4-Pro", name: "deepseek-ai/DeepSeek-V4-Pro", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1049000, output: 393000 }, cost: { input: 1.74, output: 3.48, cache_read: 0.145 } }, "deepseek-ai/DeepSeek-V3.1-Terminus": { id: "deepseek-ai/DeepSeek-V3.1-Terminus", name: "deepseek-ai/DeepSeek-V3.1-Terminus", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-29", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.27, output: 1 } }, "deepseek-ai/DeepSeek-V3": { id: "deepseek-ai/DeepSeek-V3", name: "deepseek-ai/DeepSeek-V3", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-12-26", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.25, output: 1 } }, "stepfun-ai/Step-3.5-Flash": { id: "stepfun-ai/Step-3.5-Flash", name: "stepfun-ai/Step-3.5-Flash", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", family: "step", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.1, output: 0.3 } }, "baidu/ERNIE-4.5-300B-A47B": { id: "baidu/ERNIE-4.5-300B-A47B", name: "baidu/ERNIE-4.5-300B-A47B", description: "Tool-capable chat model for instruction following and agentic application workflows", family: "ernie", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-02", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.28, output: 1.1 } } } }, tinfoil: { id: "tinfoil", env: ["TINFOIL_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://inference.tinfoil.sh/v1", name: "Tinfoil", doc: "https://docs.tinfoil.sh", models: { "gemma4-31b": { id: "gemma4-31b", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 32768 }, cost: { input: 0.4, output: 1 } }, "kimi-k2-6": { id: "kimi-k2-6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 262144 }, cost: { input: 1.5, output: 5.25 } }, "gpt-oss-safeguard-120b": { id: "gpt-oss-safeguard-120b", name: "gpt-oss-safeguard-120b", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06", release_date: "2025-10-29", last_updated: "2025-10-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 32768 }, cost: { input: 0.15, output: 0.6 } }, "llama3-3-70b": { id: "llama3-3-70b", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 1.75, output: 2.75 } }, "glm-5-2": { id: "glm-5-2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 384000, output: 131072 }, cost: { input: 1.5, output: 5.25, cache_read: 0.375 } }, "nomic-embed-text": { id: "nomic-embed-text", name: "Nomic Embed Text v1.5", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, release_date: "2024-02", last_updated: "2024-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 768 }, cost: { input: 0.05, output: 0 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "gpt-oss-120b", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 32768 }, cost: { input: 0.15, output: 0.6 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 131072 }, cost: { input: 2, output: 6 } } } }, xiaomi: { id: "xiaomi", env: ["XIAOMI_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.xiaomimimo.com/v1", name: "Xiaomi", doc: "https://platform.xiaomimimo.com/#/docs", models: { "mimo-v2-omni": { id: "mimo-v2-omni", name: "MiMo-V2-Omni", description: "Legacy model retained for compatibility with older integrations", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-06-24", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 131072 }, status: "deprecated", cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "mimo-v2-flash": { id: "mimo-v2-flash", name: "MiMo-V2-Flash", description: "Legacy model retained for compatibility with older integrations", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12-01", release_date: "2025-12-16", last_updated: "2026-06-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, status: "deprecated", cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "mimo-v2.5-pro-ultraspeed": { id: "mimo-v2.5-pro-ultraspeed", name: "MiMo-V2.5-Pro-UltraSpeed", description: "MiMo pro model for strong multimodal reasoning and agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-06-08", last_updated: "2026-06-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, status: "beta", cost: { input: 1.305, output: 2.61, cache_read: 0.0108 } }, "mimo-v2-pro": { id: "mimo-v2-pro", name: "MiMo-V2-Pro", description: "Earlier MiMo Pro model for multimodal agents, reasoning, and code tasks", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-06-24", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, status: "deprecated", cost: { input: 0.435, output: 0.87, cache_read: 0.0036 } }, "mimo-v2.5": { id: "mimo-v2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-06-24", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "mimo-v2.5-pro": { id: "mimo-v2.5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-06-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.435, output: 0.87, cache_read: 0.0036 } } } }, stackit: { id: "stackit", env: ["STACKIT_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.openai-compat.model-serving.eu01.onstackit.cloud/v1", name: "STACKIT", doc: "https://docs.stackit.cloud/products/data-and-ai/ai-model-serving/basics/available-shared-models", models: { "intfloat/e5-mistral-7b-instruct": { id: "intfloat/e5-mistral-7b-instruct", name: "E5 Mistral 7B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "mistral", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, release_date: "2023-12-11", last_updated: "2023-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 4096, output: 4096 }, cost: { input: 0.02, output: 0.02 } }, "google/gemma-3-27b-it": { id: "google/gemma-3-27b-it", name: "Gemma 3 27B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-05-17", last_updated: "2025-05-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 37000, output: 4096 }, cost: { input: 0.53, output: 0.76 } }, "Qwen/Qwen3-VL-Embedding-8B": { id: "Qwen/Qwen3-VL-Embedding-8B", name: "Qwen3-VL Embedding 8B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: false, release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 4096 }, cost: { input: 0.09, output: 0.09 } }, "Qwen/Qwen3.6-27B": { id: "Qwen/Qwen3.6-27B", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.53, output: 0.76 } }, "Qwen/Qwen3-VL-235B-A22B-Instruct-FP8": { id: "Qwen/Qwen3-VL-235B-A22B-Instruct-FP8", name: "Qwen3-VL 235B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2024-11-01", last_updated: "2024-11-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 218000, output: 16384 }, cost: { input: 1.76, output: 2.05 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.18, output: 0.29 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 8192 }, cost: { input: 0.53, output: 0.76 } }, "cortecs/Llama-3.3-70B-Instruct-FP8-Dynamic": { id: "cortecs/Llama-3.3-70B-Instruct-FP8-Dynamic", name: "Llama 3.3 70B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.53, output: 0.76 } } } }, deepinfra: { id: "deepinfra", env: ["DEEPINFRA_API_KEY"], npm: "@ai-sdk/deepinfra", name: "Deep Infra", doc: "https://deepinfra.com/models", models: { "nvidia/Llama-3.3-Nemotron-Super-49B-v1.5": { id: "nvidia/Llama-3.3-Nemotron-Super-49B-v1.5", name: "Llama 3.3 Nemotron Super 49B v1.5", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, status: "deprecated", cost: { input: 0.4, output: 0.4 } }, "nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning": { id: "nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning", name: "Nemotron 3 Nano Omni 30B A3B Reasoning", description: "Open Nemotron omni model combining reasoning with text, vision, and audio", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-28", last_updated: "2026-04-28", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, status: "deprecated", cost: { input: 0.2, output: 0.8 } }, "nvidia/Nemotron-3-Nano-30B-A3B": { id: "nvidia/Nemotron-3-Nano-30B-A3B", name: "Nemotron 3 Nano 30B A3B", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2025-12-15", last_updated: "2025-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.05, output: 0.2, cache_read: 0.025 } }, "google/gemma-4-26B-A4B-it": { id: "google/gemma-4-26B-A4B-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.07, output: 0.34 } }, "google/gemma-4-E4B-it": { id: "google/gemma-4-E4B-it", name: "Gemma 4 E4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.02, output: 0.1 } }, "google/gemma-4-31B-it": { id: "google/gemma-4-31B-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.13, output: 0.38 } }, "thinkingmachines/Inkling-Small": { id: "thinkingmachines/Inkling-Small", name: "Inkling Small", description: "Multimodal MoE reasoning model (276B total, 12B active) for text, image, and audio", family: "ling", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-30", last_updated: "2026-07-30", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 1048576 }, cost: { input: 0.45, output: 1.2, cache_read: 0.1 } }, "thinkingmachines/Inkling": { id: "thinkingmachines/Inkling", name: "Inkling", description: "Multimodal MoE reasoning model (975B total, 41B active) for text, image, and audio", family: "ling", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 1048576 }, cost: { input: 0.95, output: 4.05, cache_read: 0.16 } }, "zai-org/GLM-5": { id: "zai-org/GLM-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-12", release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 16384 }, cost: { input: 0.6, output: 2.08, cache_read: 0.12 } }, "zai-org/GLM-4.7-Flash": { id: "zai-org/GLM-4.7-Flash", name: "GLM-4.7-Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 16384 }, cost: { input: 0.06, output: 0.4, cache_read: 0.01 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 32768 }, cost: { input: 0.75, output: 2.4, cache_read: 0.14 } }, "zai-org/GLM-5.1": { id: "zai-org/GLM-5.1", name: "GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 16384 }, cost: { input: 1.05, output: 3.5, cache_read: 0.205 } }, "zai-org/GLM-4.6": { id: "zai-org/GLM-4.6", name: "GLM-4.6", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 0.5, output: 2, cache_read: 0.1 } }, "zai-org/GLM-4.7": { id: "zai-org/GLM-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 16384 }, cost: { input: 0.4, output: 1.75, cache_read: 0.08 } }, "tencent/Hy3": { id: "tencent/Hy3", name: "Hy3", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 64000 }, cost: { input: 0.14, output: 0.58, cache_read: 0.035 } }, "Qwen/Qwen3.5-27B": { id: "Qwen/Qwen3.5-27B", name: "Qwen3.5 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.26, output: 2.6 } }, "Qwen/Qwen3.5-9B": { id: "Qwen/Qwen3.5-9B", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.1, output: 0.15 } }, "Qwen/Qwen3-235B-A22B-Instruct-2507": { id: "Qwen/Qwen3-235B-A22B-Instruct-2507", name: "Qwen3 235B-A22B Instruct 2507", description: "Updated large open Qwen3 MoE instruct model for multilingual chat, coding, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-21", last_updated: "2025-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.09, output: 0.55 } }, "Qwen/Qwen3.5-122B-A10B": { id: "Qwen/Qwen3.5-122B-A10B", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.29, output: 2.4 } }, "Qwen/Qwen3.7-Max": { id: "Qwen/Qwen3.7-Max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5, tiers: [{ input: 5, output: 15, cache_read: 1, tier: { type: "context", size: 32000 } }, { input: 6.25, output: 18.5, cache_read: 1.25, tier: { type: "context", size: 128000 } }] } }, "Qwen/Qwen3.5-35B-A3B": { id: "Qwen/Qwen3.5-35B-A3B", name: "Qwen 3.5 35B A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-01", last_updated: "2026-04-20", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 81920 }, cost: { input: 0.14, output: 1, cache_read: 0.05 } }, "Qwen/Qwen3.6-27B": { id: "Qwen/Qwen3.6-27B", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.32, output: 3.2 } }, "Qwen/Qwen3.5-397B-A17B": { id: "Qwen/Qwen3.5-397B-A17B", name: "Qwen 3.5 397B A17B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-01", last_updated: "2026-04-20", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 81920 }, cost: { input: 0.45, output: 3, cache_read: 0.22 } }, "Qwen/Qwen3.6-35B-A3B": { id: "Qwen/Qwen3.6-35B-A3B", name: "Qwen3.6 35B A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 81920 }, cost: { input: 0.1, output: 0.95 } }, "Qwen/Qwen3.8-Max": { id: "Qwen/Qwen3.8-Max", name: "Qwen3.8 Max", description: "2.4-trillion-parameter MoE flagship for coding, professional work, multimodal understanding, and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 131072 }, cost: { input: 1.65, output: 4.951, cache_read: 0.206 } }, "Qwen/Qwen3-32B": { id: "Qwen/Qwen3-32B", name: "Qwen3 32B", description: "Dense open Qwen model for self-hosted chat, reasoning, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 16384 }, cost: { input: 0.08, output: 0.28 } }, "Qwen/Qwen3-Next-80B-A3B-Instruct": { id: "Qwen/Qwen3-Next-80B-A3B-Instruct", name: "Qwen3-Next 80B-A3B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.09, output: 1.1 } }, "Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo": { id: "Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo", name: "Qwen3 Coder 480B A35B Instruct Turbo", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 66536 }, cost: { input: 0.3, output: 1, cache_read: 0.1 } }, "Qwen/Qwen3-Max": { id: "Qwen/Qwen3-Max", name: "Qwen3 Max", description: "Flagship Qwen3 model for coding agents, complex reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 65536 }, cost: { input: 1.2, output: 6, cache_read: 0.24, tiers: [{ input: 2.4, output: 12, cache_read: 0.48, tier: { type: "context", size: 32000 } }, { input: 3, output: 15, cache_read: 0.6, tier: { type: "context", size: 128000 } }] } }, "MiniMaxAI/MiniMax-M2.7": { id: "MiniMaxAI/MiniMax-M2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 131072 }, cost: { input: 0.25, output: 1, cache_read: 0.05 } }, "MiniMaxAI/MiniMax-M2.5": { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-06", release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 131072 }, status: "deprecated", cost: { input: 0.15, output: 1.15, cache_read: 0.03 } }, "MiniMaxAI/MiniMax-M3": { id: "MiniMaxAI/MiniMax-M3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 128000 }, cost: { input: 0.28, output: 1.1, cache_read: 0.056 } }, "deepseek-ai/DeepSeek-V3": { id: "deepseek-ai/DeepSeek-V3", name: "DeepSeek-V3", description: "Open DeepSeek MoE chat model for coding, math, and general reasoning", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-12-26", last_updated: "2024-12-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 8192 }, cost: { input: 0.32, output: 0.89 } }, "deepseek-ai/DeepSeek-V4-Flash-0731": { id: "deepseek-ai/DeepSeek-V4-Flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 0.09, output: 0.18, cache_read: 0.018 } }, "deepseek-ai/DeepSeek-R1-0528": { id: "deepseek-ai/DeepSeek-R1-0528", name: "DeepSeek-R1-0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-05-28", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 64000 }, cost: { input: 0.5, output: 2.15, cache_read: 0.35 } }, "deepseek-ai/DeepSeek-V3.2": { id: "deepseek-ai/DeepSeek-V3.2", name: "DeepSeek-V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 64000 }, cost: { input: 0.26, output: 0.38, cache_read: 0.13 } }, "deepseek-ai/DeepSeek-V3.1": { id: "deepseek-ai/DeepSeek-V3.1", name: "DeepSeek-V3.1", description: "Hybrid-reasoning DeepSeek model with thinking and non-thinking modes", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 8192 }, cost: { input: 0.25, output: 0.95, cache_read: 0.13 } }, "deepseek-ai/DeepSeek-V4-Flash": { id: "deepseek-ai/DeepSeek-V4-Flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 16384 }, cost: { input: 0.09, output: 0.18, cache_read: 0.018 } }, "deepseek-ai/DeepSeek-V4-Pro": { id: "deepseek-ai/DeepSeek-V4-Pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 16384 }, cost: { input: 1.3, output: 2.6, cache_read: 0.1 } }, "stepfun-ai/Step-3.7-Flash": { id: "stepfun-ai/Step-3.7-Flash", name: "Step 3.7 Flash", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 256000 }, cost: { input: 0.2, output: 1.15, cache_read: 0.04 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.75, output: 3.5, cache_read: 0.15 } }, "moonshotai/Kimi-K2.5": { id: "moonshotai/Kimi-K2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.45, output: 2.25, cache_read: 0.07 } }, "moonshotai/Kimi-K2.7-Code": { id: "moonshotai/Kimi-K2.7-Code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.68, output: 3.4, cache_read: 0.136 } }, "moonshotai/Kimi-K3": { id: "moonshotai/Kimi-K3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 2.85, output: 14.25, cache_read: 0.285 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.03, output: 0.14 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.037, output: 0.17 } }, "meta-llama/Llama-4-Scout-17B-16E-Instruct": { id: "meta-llama/Llama-4-Scout-17B-16E-Instruct", name: "Llama 4 Scout 17B", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: true, reasoning: false, tool_call: true, structured_output: true, release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 327680, output: 16384 }, cost: { input: 0.1, output: 0.3 } }, "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8": { id: "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", name: "Llama 4 Maverick 17B FP8", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: false, structured_output: true, release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 16384 }, cost: { input: 0.2, output: 0.8 } }, "meta-llama/Llama-3.3-70B-Instruct-Turbo": { id: "meta-llama/Llama-3.3-70B-Instruct-Turbo", name: "Llama 3.3 70B Turbo", description: "Compact Llama instruction model for fast chat and local deployment", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.1, output: 0.32 } }, "XiaomiMiMo/MiMo-V2.5-Pro": { id: "XiaomiMiMo/MiMo-V2.5-Pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "audio"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 16384 }, cost: { input: 1, output: 3, cache_read: 0.2 } }, "XiaomiMiMo/MiMo-V2.5": { id: "XiaomiMiMo/MiMo-V2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.4, output: 2, cache_read: 0.08 } } } }, anthropic: { id: "anthropic", env: ["ANTHROPIC_API_KEY"], npm: "@ai-sdk/anthropic", name: "Anthropic", doc: "https://docs.anthropic.com/en/docs/about-claude/models", models: { "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-04", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-06-07", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, experimental: { modes: { fast: { cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-sonnet-4-5": { id: "claude-sonnet-4-5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "claude-sonnet-4-5-20250929": { id: "claude-sonnet-4-5-20250929", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "claude-opus-4-5-20251101": { id: "claude-opus-4-5-20251101", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-haiku-4-5-20251001": { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-14", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-opus-4-5": { id: "claude-opus-4-5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-29", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "claude-opus-5": { id: "claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, experimental: { modes: { fast: { cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } } } }, "cloudflare-ai-gateway": { id: "cloudflare-ai-gateway", env: ["CLOUDFLARE_API_TOKEN", "CLOUDFLARE_ACCOUNT_ID", "CLOUDFLARE_GATEWAY_ID"], npm: "ai-gateway-provider", name: "Cloudflare AI Gateway", doc: "https://developers.cloudflare.com/ai-gateway/", models: { "workers-ai/@cf/aisingapore/gemma-sea-lion-v4-27b-it": { id: "workers-ai/@cf/aisingapore/gemma-sea-lion-v4-27b-it", name: "Gemma SEA-LION v4 27B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.35, output: 0.56 } }, "workers-ai/@cf/nvidia/nemotron-3-120b-a12b": { id: "workers-ai/@cf/nvidia/nemotron-3-120b-a12b", name: "Nemotron 3 Super 120B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.5, output: 1.5 } }, "workers-ai/@cf/google/gemma-3-12b-it": { id: "workers-ai/@cf/google/gemma-3-12b-it", name: "Gemma 3 12B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-11", last_updated: "2025-04-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.35, output: 0.56 } }, "workers-ai/@cf/zai-org/glm-4.7-flash": { id: "workers-ai/@cf/zai-org/glm-4.7-flash", name: "GLM-4.7-Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.06, output: 0.4 } }, "workers-ai/@cf/zai-org/glm-5.2": { id: "workers-ai/@cf/zai-org/glm-5.2", name: "Glm 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "workers-ai/@cf/baai/bge-base-en-v1.5": { id: "workers-ai/@cf/baai/bge-base-en-v1.5", name: "BGE Base EN v1.5", description: "General-purpose chat model for instruction following, writing, and analysis", family: "bge", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.067, output: 0 } }, "workers-ai/@cf/baai/bge-reranker-base": { id: "workers-ai/@cf/baai/bge-reranker-base", name: "BGE Reranker Base", description: "Reranking model for improving retrieval quality in search and recommendation systems", family: "bge", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-09", last_updated: "2025-04-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.0031, output: 0 } }, "workers-ai/@cf/baai/bge-large-en-v1.5": { id: "workers-ai/@cf/baai/bge-large-en-v1.5", name: "BGE Large EN v1.5", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "bge", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.2, output: 0 } }, "workers-ai/@cf/baai/bge-small-en-v1.5": { id: "workers-ai/@cf/baai/bge-small-en-v1.5", name: "BGE Small EN v1.5", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "bge", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.02, output: 0 } }, "workers-ai/@cf/baai/bge-m3": { id: "workers-ai/@cf/baai/bge-m3", name: "BGE M3", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "bge", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.012, output: 0 } }, "workers-ai/@cf/pipecat-ai/smart-turn-v2": { id: "workers-ai/@cf/pipecat-ai/smart-turn-v2", name: "Pipecat Smart Turn v2", description: "General-purpose chat model for instruction following, writing, and analysis", family: "smart-turn", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "workers-ai/@cf/qwen/qwen3-30b-a3b-fp8": { id: "workers-ai/@cf/qwen/qwen3-30b-a3b-fp8", name: "Qwen3 30B A3B FP8", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.051, output: 0.34 } }, "workers-ai/@cf/qwen/qwq-32b": { id: "workers-ai/@cf/qwen/qwq-32b", name: "QwQ 32B", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-11", last_updated: "2025-04-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.66, output: 1 } }, "workers-ai/@cf/qwen/qwen2.5-coder-32b-instruct": { id: "workers-ai/@cf/qwen/qwen2.5-coder-32b-instruct", name: "Qwen 2.5 Coder 32B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-11", last_updated: "2025-04-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.66, output: 1 } }, "workers-ai/@cf/qwen/qwen3-embedding-0.6b": { id: "workers-ai/@cf/qwen/qwen3-embedding-0.6b", name: "Qwen3 Embedding 0.6B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.012, output: 0 } }, "workers-ai/@cf/myshell-ai/melotts": { id: "workers-ai/@cf/myshell-ai/melotts", name: "MyShell MeloTTS", description: "General-purpose chat model for instruction following, writing, and analysis", family: "melotts", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "workers-ai/@cf/mistralai/mistral-small-3.1-24b-instruct": { id: "workers-ai/@cf/mistralai/mistral-small-3.1-24b-instruct", name: "Mistral Small 3.1 24B Instruct", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-11", last_updated: "2025-04-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.35, output: 0.56 } }, "workers-ai/@cf/meta/m2m100-1.2b": { id: "workers-ai/@cf/meta/m2m100-1.2b", name: "M2M100 1.2B", description: "General-purpose chat model for instruction following, writing, and analysis", family: "m2m", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.34, output: 0.34 } }, "workers-ai/@cf/meta/llama-3-8b-instruct-awq": { id: "workers-ai/@cf/meta/llama-3-8b-instruct-awq", name: "Llama 3 8B Instruct AWQ", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.12, output: 0.27 } }, "workers-ai/@cf/meta/llama-3.2-1b-instruct": { id: "workers-ai/@cf/meta/llama-3.2-1b-instruct", name: "Llama 3.2 1B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.027, output: 0.2 } }, "workers-ai/@cf/meta/llama-3-8b-instruct": { id: "workers-ai/@cf/meta/llama-3-8b-instruct", name: "Llama 3 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.28, output: 0.83 } }, "workers-ai/@cf/meta/llama-2-7b-chat-fp16": { id: "workers-ai/@cf/meta/llama-2-7b-chat-fp16", name: "Llama 2 7B Chat FP16", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.56, output: 6.67 } }, "workers-ai/@cf/meta/llama-3.2-3b-instruct": { id: "workers-ai/@cf/meta/llama-3.2-3b-instruct", name: "Llama 3.2 3B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.051, output: 0.34 } }, "workers-ai/@cf/meta/llama-3.1-8b-instruct-awq": { id: "workers-ai/@cf/meta/llama-3.1-8b-instruct-awq", name: "Llama 3.1 8B Instruct AWQ", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.12, output: 0.27 } }, "workers-ai/@cf/meta/llama-3.3-70b-instruct-fp8-fast": { id: "workers-ai/@cf/meta/llama-3.3-70b-instruct-fp8-fast", name: "Llama 3.3 70B Instruct FP8 Fast", description: "Compact Llama instruction model for fast chat and local deployment", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.29, output: 2.25 } }, "workers-ai/@cf/meta/llama-3.1-8b-instruct": { id: "workers-ai/@cf/meta/llama-3.1-8b-instruct", name: "Llama 3.1 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.28, output: 0.8299999999999998 } }, "workers-ai/@cf/meta/llama-guard-3-8b": { id: "workers-ai/@cf/meta/llama-guard-3-8b", name: "Llama Guard 3 8B", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.48, output: 0.03 } }, "workers-ai/@cf/meta/llama-3.2-11b-vision-instruct": { id: "workers-ai/@cf/meta/llama-3.2-11b-vision-instruct", name: "Llama 3.2 11B Vision Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.049, output: 0.68 } }, "workers-ai/@cf/meta/llama-3.1-8b-instruct-fp8": { id: "workers-ai/@cf/meta/llama-3.1-8b-instruct-fp8", name: "Llama 3.1 8B Instruct FP8", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.29 } }, "workers-ai/@cf/meta/llama-4-scout-17b-16e-instruct": { id: "workers-ai/@cf/meta/llama-4-scout-17b-16e-instruct", name: "Llama 4 Scout 17B 16E Instruct", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.27, output: 0.85 } }, "workers-ai/@cf/pfnet/plamo-embedding-1b": { id: "workers-ai/@cf/pfnet/plamo-embedding-1b", name: "PLaMo Embedding 1B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "plamo", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.019, output: 0 } }, "workers-ai/@cf/deepgram/aura-2-en": { id: "workers-ai/@cf/deepgram/aura-2-en", name: "Deepgram Aura 2 (EN)", description: "General-purpose chat model for instruction following, writing, and analysis", family: "aura", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "workers-ai/@cf/deepgram/aura-2-es": { id: "workers-ai/@cf/deepgram/aura-2-es", name: "Deepgram Aura 2 (ES)", description: "General-purpose chat model for instruction following, writing, and analysis", family: "aura", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "workers-ai/@cf/deepgram/nova-3": { id: "workers-ai/@cf/deepgram/nova-3", name: "Deepgram Nova 3", description: "General-purpose chat model for instruction following, writing, and analysis", family: "nova", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "workers-ai/@cf/facebook/bart-large-cnn": { id: "workers-ai/@cf/facebook/bart-large-cnn", name: "BART Large CNN", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "bart", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-09", last_updated: "2025-04-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "workers-ai/@cf/mistral/mistral-7b-instruct-v0.1": { id: "workers-ai/@cf/mistral/mistral-7b-instruct-v0.1", name: "Mistral 7B Instruct v0.1", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.11, output: 0.19 } }, "workers-ai/@cf/ibm-granite/granite-4.0-h-micro": { id: "workers-ai/@cf/ibm-granite/granite-4.0-h-micro", name: "IBM Granite 4.0 H Micro", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "granite", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.017, output: 0.11 } }, "workers-ai/@cf/deepseek-ai/deepseek-r1-distill-qwen-32b": { id: "workers-ai/@cf/deepseek-ai/deepseek-r1-distill-qwen-32b", name: "DeepSeek R1 Distill Qwen 32B", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "deepseek-thinking", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.5, output: 4.88 } }, "workers-ai/@cf/huggingface/distilbert-sst-2-int8": { id: "workers-ai/@cf/huggingface/distilbert-sst-2-int8", name: "DistilBERT SST-2 INT8", description: "General-purpose chat model for instruction following, writing, and analysis", family: "distilbert", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.026, output: 0 } }, "workers-ai/@cf/ai4bharat/indictrans2-en-indic-1B": { id: "workers-ai/@cf/ai4bharat/indictrans2-en-indic-1B", name: "IndicTrans2 EN-Indic 1B", description: "General-purpose chat model for instruction following, writing, and analysis", family: "indictrans", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.34, output: 0.34 } }, "workers-ai/@cf/moonshotai/kimi-k2.5": { id: "workers-ai/@cf/moonshotai/kimi-k2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "workers-ai/@cf/moonshotai/kimi-k2.6": { id: "workers-ai/@cf/moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "workers-ai/@cf/openai/gpt-oss-20b": { id: "workers-ai/@cf/openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.2, output: 0.3 } }, "workers-ai/@cf/openai/gpt-oss-120b": { id: "workers-ai/@cf/openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.35, output: 0.75 } }, "anthropic/claude-sonnet-4-6": { id: "anthropic/claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-02-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, provider: { npm: "ai-gateway-provider" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "anthropic/claude-haiku-4-5": { id: "anthropic/claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "anthropic/claude-3-opus": { id: "anthropic/claude-3-opus", name: "Claude Opus 3", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-08-31", release_date: "2024-02-29", last_updated: "2024-02-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-opus-4-6": { id: "anthropic/claude-opus-4-6", name: "Claude Opus 4.6 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "anthropic/claude-fable-5": { id: "anthropic/claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4-8": { id: "anthropic/claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-3.5-haiku": { id: "anthropic/claude-3.5-haiku", name: "Claude Haiku 3.5 (latest)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07-31", release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 0.8, output: 4, cache_read: 0.08, cache_write: 1 } }, "anthropic/claude-opus-4-1": { id: "anthropic/claude-opus-4-1", name: "Claude Opus 4.1 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-sonnet-4-5": { id: "anthropic/claude-sonnet-4-5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-3-haiku": { id: "anthropic/claude-3-haiku", name: "Claude Haiku 3", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-08-31", release_date: "2024-03-13", last_updated: "2024-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, cost: { input: 0.25, output: 1.25, cache_read: 0.03, cache_write: 0.3 } }, "anthropic/claude-sonnet-4": { id: "anthropic/claude-sonnet-4", name: "Claude Sonnet 4 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-3-sonnet": { id: "anthropic/claude-3-sonnet", name: "Claude Sonnet 3", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-08-31", release_date: "2024-03-04", last_updated: "2024-03-04", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 0.3 } }, "anthropic/claude-opus-4": { id: "anthropic/claude-opus-4", name: "Claude Opus 4 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-3-5-haiku": { id: "anthropic/claude-3-5-haiku", name: "Claude Haiku 3.5 (latest)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07-31", release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 0.8, output: 4, cache_read: 0.08, cache_write: 1 } }, "anthropic/claude-3.5-sonnet": { id: "anthropic/claude-3.5-sonnet", name: "Claude Sonnet 3.5 v2", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04-30", release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-opus-4-7": { id: "anthropic/claude-opus-4-7", name: "Claude Opus 4.7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4-5": { id: "anthropic/claude-opus-4-5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-5": { id: "anthropic/claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "anthropic/claude-opus-5": { id: "anthropic/claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "moonshotai/kimi-k3": { id: "moonshotai/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "openai/gpt-4o": { id: "openai/gpt-4o", name: "GPT-4o", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.6-sol": { id: "openai/gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "openai/o3-mini": { id: "openai/o3-mini", name: "o3-mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "openai/o3-pro": { id: "openai/o3-pro", name: "o3-pro", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-06-10", last_updated: "2025-06-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 20, output: 80 } }, "openai/gpt-4o-mini": { id: "openai/gpt-4o-mini", name: "GPT-4o mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.08 } }, "openai/gpt-3.5-turbo": { id: "openai/gpt-3.5-turbo", name: "GPT-3.5-turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2021-09-01", release_date: "2023-03-01", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16385, output: 4096 }, cost: { input: 0.5, output: 1.5, cache_read: 1.25 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT-5.4", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "ai-gateway-provider" }, cost: { input: 2.5, output: 15, cache_read: 0.25 } }, "openai/gpt-5.2-codex": { id: "openai/gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "ai-gateway-provider" }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/o1": { id: "openai/o1", name: "o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2023-09", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 15, output: 60, cache_read: 7.5 } }, "openai/gpt-5.6-luna": { id: "openai/gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 1, output: 6, cache_read: 0.1, tiers: [{ input: 2, output: 9, cache_read: 0.2, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 2, output: 9, cache_read: 0.2 } } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.3-codex": { id: "openai/gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "ai-gateway-provider" }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT-5.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "openai/gpt-4-turbo": { id: "openai/gpt-4-turbo", name: "GPT-4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-12", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 10, output: 30 } }, "openai/gpt-5.1-codex": { id: "openai/gpt-5.1-codex", name: "GPT-5.1 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/o3": { id: "openai/o3", name: "o3", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/gpt-5.6-terra": { id: "openai/gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "openai/o4-mini": { id: "openai/o4-mini", name: "o4-mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.28 } }, "openai/gpt-4": { id: "openai/gpt-4", name: "GPT-4", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-11", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 8192 }, cost: { input: 30, output: 60 } } } }, lynkr: { id: "lynkr", env: ["LYNKR_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "http://127.0.0.1:8081/v1", name: "Lynkr", doc: "https://github.com/Fast-Editor/Lynkr", models: { "lynkr-auto": { id: "lynkr-auto", name: "Lynkr Auto (complexity routing)", description: "Virtual model: Lynkr scores each request on complexity and routes it to the tier model the user configured (local Ollama/llama.cpp for simple requests, configured cloud providers for complex ones).", family: "auto", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-12-03", last_updated: "2026-07-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } } } }, "alibaba-token-plan-cn": { id: "alibaba-token-plan-cn", env: ["ALIBABA_TOKEN_PLAN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1", name: "Alibaba Token Plan (China)", doc: "https://www.alibabacloud.com/help/zh/model-studio/token-plan-overview", models: { "qwen3.7-plus": { id: "qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3.8-max-preview": { id: "qwen3.8-max-preview", name: "Qwen3.8 Max Preview", description: "Preview Qwen flagship for million-token multimodal reasoning and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "xhigh"] }, { type: "budget_tokens", min: 0, max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-07-19", last_updated: "2026-07-19", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, status: "beta", cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5": { id: "glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 16384 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 128000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 98304 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "wan2.7-image-pro": { id: "wan2.7-image-pro", name: "Wan2.7 Image Pro", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 8192, output: 0 }, cost: { input: 0, output: 0 } }, "qwen3.7-max": { id: "qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "wan2.7-image": { id: "wan2.7-image", name: "Wan2.7 Image", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 8192, output: 0 }, cost: { input: 0, output: 0 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "happyhorse-1.1-i2v": { id: "happyhorse-1.1-i2v", name: "HappyHorse 1.1 Image-to-Video", description: "Video model for image-to-video generation", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2026-07-17", last_updated: "2026-07-17", modalities: { input: ["image", "text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 0, output: 0 } }, "qwen3.8-max": { id: "qwen3.8-max", name: "Qwen3.8 Max", description: "2.4-trillion-parameter MoE flagship for coding, professional work, multimodal understanding, and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "xhigh"] }, { type: "budget_tokens", min: 0, max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "deepseek-v4-flash-0731": { id: "deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "deepseek-v3.2": { id: "deepseek-v3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-03", last_updated: "2025-12-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0, output: 0 } }, "happyhorse-1.1-r2v": { id: "happyhorse-1.1-r2v", name: "HappyHorse 1.1 Reference-to-Video", description: "Video model for reference-guided video generation", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2026-07-17", last_updated: "2026-07-17", modalities: { input: ["image", "text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 0, output: 0 } }, "qwen-image-2.0-pro": { id: "qwen-image-2.0-pro", name: "Qwen Image 2.0 Pro", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 8192, output: 0 }, cost: { input: 0, output: 0 } }, "MiniMax-M2.5": { id: "MiniMax-M2.5", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, input: 196601, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3.6-flash": { id: "qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 131072 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "happyhorse-1.1-t2v": { id: "happyhorse-1.1-t2v", name: "HappyHorse 1.1 Text-to-Video", description: "Video model for prompt-driven text-to-video generation", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-07-17", last_updated: "2026-07-17", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 0, output: 0 } }, "qwen-image-2.0": { id: "qwen-image-2.0", name: "Qwen Image 2.0", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 8192, output: 0 }, cost: { input: 0, output: 0 } }, "qwen3.6-plus": { id: "qwen3.6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 131072 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, "stepfun-ai": { id: "stepfun-ai", env: ["STEPFUN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.stepfun.ai/v1", name: "StepFun (Global)", doc: "https://platform.stepfun.ai/docs/en/overview/concept", models: { "step-2-16k": { id: "step-2-16k", name: "Step 2 (16K)", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06", release_date: "2025-01-01", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 5.21, output: 16.44, cache_read: 1.04 } }, "stepaudio-2.5-asr": { id: "stepaudio-2.5-asr", name: "StepAudio 2.5 ASR", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "step", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-24", last_updated: "2026-07-02", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 } }, "step-1-32k": { id: "step-1-32k", name: "Step 1 (32K)", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06", release_date: "2025-01-01", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 32768 }, cost: { input: 2.05, output: 9.59, cache_read: 0.41 } }, "stepaudio-2.5-tts": { id: "stepaudio-2.5-tts", name: "StepAudio 2.5 TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "step", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-16", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "step-tts-2": { id: "step-tts-2", name: "Step TTS 2", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "step", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-03-01", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "step-3.5-flash-2603": { id: "step-3.5-flash-2603", name: "Step 3.5 Flash 2603", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0.1, output: 0.3, cache_read: 0.02 } }, "step-3.7-flash": { id: "step-3.7-flash", name: "Step 3.7 Flash", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-06-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0.185, output: 1.11, cache_read: 0.037 } }, "step-3.5-flash": { id: "step-3.5-flash", name: "Step 3.5 Flash", description: "StepFun flash lane for quick multimodal reasoning and coding assistance", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-01-29", last_updated: "2026-06-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0.1, output: 0.3, cache_read: 0.02 } } } }, chutes: { id: "chutes", env: ["CHUTES_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://llm.chutes.ai/v1", name: "Chutes", doc: "https://llm.chutes.ai/v1/models", models: { "Nemotron-3-Nano-Omni-30B-TEE": { id: "Nemotron-3-Nano-Omni-30B-TEE", name: "Nemotron 3 Nano Omni 30B TEE", description: "Omni-modal model for text, vision, audio, and multimodal agent tasks", family: "nemotron", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-07-23", last_updated: "2026-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 0 }, cost: { input: 0.0245, output: 0.0978, cache_read: 0.0024499999999999995 } }, "google/gemma-4-31B-turbo-TEE": { id: "google/gemma-4-31B-turbo-TEE", name: "gemma 4 31B turbo TEE", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0.12, output: 0.37, cache_read: 0.011999999999999997 } }, "zai-org/GLM-5.1-TEE": { id: "zai-org/GLM-5.1-TEE", name: "GLM 5.1 TEE", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 65535 }, cost: { input: 0.98, output: 3.08, cache_read: 0.09799999999999998 } }, "zai-org/GLM-5.2-TEE": { id: "zai-org/GLM-5.2-TEE", name: "GLM 5.2 TEE", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 65535 }, cost: { input: 1.25, output: 3.95, cache_read: 0.12499999999999997 } }, "unsloth/Mistral-Nemo-Instruct-2407-TEE": { id: "unsloth/Mistral-Nemo-Instruct-2407-TEE", name: "Mistral Nemo Instruct 2407 TEE", description: "Efficient Mistral-NVIDIA open model for multilingual chat and local deployment", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-07", release_date: "2024-07-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.0245, output: 0.0978, cache_read: 0.0024499999999999995 } }, "Qwen/Qwen3-235B-A22B-Thinking-2507-TEE": { id: "Qwen/Qwen3-235B-A22B-Thinking-2507-TEE", name: "Qwen3 235B A22B Thinking 2507 TEE", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-07", last_updated: "2026-06-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.2989, output: 1.1957, cache_read: 0.029889999999999993 } }, "Qwen/Qwen3-32B-TEE": { id: "Qwen/Qwen3-32B-TEE", name: "Qwen3 32B TEE", description: "Dense open Qwen model for self-hosted chat, reasoning, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 40960 }, cost: { input: 0.104, output: 0.416, cache_read: 0.010399999999999998 } }, "Qwen/Qwen3.6-27B-TEE": { id: "Qwen/Qwen3.6-27B-TEE", name: "Qwen3.6 27B TEE", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.3, output: 2, cache_read: 0.029999999999999992 } }, "Qwen/Qwen3.5-397B-A17B-TEE": { id: "Qwen/Qwen3.5-397B-A17B-TEE", name: "Qwen3.5 397B A17B TEE", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.45, output: 3, cache_read: 0.04499999999999999 } }, "deepseek-ai/DeepSeek-V3.2-TEE": { id: "deepseek-ai/DeepSeek-V3.2-TEE", name: "DeepSeek V3.2 TEE", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-12", last_updated: "2026-06-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 1, output: 1, cache_read: 0.09999999999999998 } }, "deepseek-ai/DeepSeek-V4-Flash-0731-TEE": { id: "deepseek-ai/DeepSeek-V4-Flash-0731-TEE", name: "DeepSeek V4 Flash 0731 TEE", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-08-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.013999999999999999 } }, "moonshotai/Kimi-K2.6-TEE": { id: "moonshotai/Kimi-K2.6-TEE", name: "Kimi K2.6 TEE", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-12", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65535 }, cost: { input: 0.58, output: 3.4, cache_read: 0.05799999999999998 } }, "moonshotai/Kimi-K3-TEE": { id: "moonshotai/Kimi-K3-TEE", name: "Kimi K3 TEE", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-29", last_updated: "2026-07-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 65535 }, cost: { input: 3, output: 15, cache_read: 0.29999999999999993 } } } }, cerebras: { id: "cerebras", env: ["CEREBRAS_API_KEY"], npm: "@ai-sdk/cerebras", name: "Cerebras", doc: "https://inference-docs.cerebras.ai/models/overview", models: { "gemma-4-31b": { id: "gemma-4-31b", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-07-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 40960 }, status: "beta", cost: { input: 0.99, output: 1.49 } }, "zai-glm-4.7": { id: "zai-glm-4.7", name: "Z.AI GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01-07", last_updated: "2026-06-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 40960 }, status: "beta", cost: { input: 2.25, output: 2.75, cache_read: 2.25, cache_write: 0 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2026-06-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 40960 }, cost: { input: 0.35, output: 0.75 } } } }, "qiniu-ai": { id: "qiniu-ai", env: ["QINIU_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.qnaigc.com/v1", name: "Qiniu", doc: "https://developer.qiniu.com/aitokenapi", models: { "qwen3-coder-480b-a35b-instruct": { id: "qwen3-coder-480b-a35b-instruct", name: "Qwen3 Coder 480B A35B Instruct", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-14", last_updated: "2025-08-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 4096 } }, "qwen-vl-max-2025-01-25": { id: "qwen-vl-max-2025-01-25", name: "Qwen VL-MAX-2025-01-25", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 } }, "qwen3-32b": { id: "qwen3-32b", name: "Qwen3 32B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 40000, output: 4096 } }, "deepseek-v3.1": { id: "deepseek-v3.1", name: "DeepSeek-V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-19", last_updated: "2025-08-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 } }, "doubao-1.5-vision-pro": { id: "doubao-1.5-vision-pro", name: "Doubao 1.5 Vision Pro", description: "Flagship model for demanding analysis, coding, and production agent workflows", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16000 } }, "claude-3.7-sonnet": { id: "claude-3.7-sonnet", name: "Claude 3.7 Sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 } }, "qwen3-30b-a3b": { id: "qwen3-30b-a3b", name: "Qwen3 30B A3B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 40000, output: 4096 } }, "glm-4.5-air": { id: "glm-4.5-air", name: "GLM 4.5 Air", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 4096 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 64000 } }, "mimo-v2-flash": { id: "mimo-v2-flash", name: "Mimo-V2-Flash", description: "MiMo flash model for fast multimodal assistance and agent workflows", family: "mimo", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12-01", release_date: "2025-12-16", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.1, output: 0.3, cache_read: 0.01 } }, "doubao-seed-2.0-pro": { id: "doubao-seed-2.0-pro", name: "Doubao Seed 2.0 Pro", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 } }, "qwen3-235b-a22b-thinking-2507": { id: "qwen3-235b-a22b-thinking-2507", name: "Qwen3 235B A22B Thinking 2507", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-12", last_updated: "2025-08-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 4096 } }, "qwen-max-2025-01-25": { id: "qwen-max-2025-01-25", name: "Qwen2.5-Max-2025-01-25", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 } }, "qwen3-vl-30b-a3b-thinking": { id: "qwen3-vl-30b-a3b-thinking", name: "Qwen3-Vl 30b A3b Thinking", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-09", last_updated: "2026-02-09", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 } }, "gemini-3.0-flash-preview": { id: "gemini-3.0-flash-preview", name: "Gemini 3.0 Flash Preview", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-18", last_updated: "2025-12-18", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 } }, "gpt-oss-20b": { id: "gpt-oss-20b", name: "gpt-oss-20b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-06", last_updated: "2025-08-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 } }, "doubao-seed-2.0-lite": { id: "doubao-seed-2.0-lite", name: "Doubao Seed 2.0 Lite", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 } }, "qwen3-next-80b-a3b-thinking": { id: "qwen3-next-80b-a3b-thinking", name: "Qwen3 Next 80B A3B Thinking", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-12", last_updated: "2025-09-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 } }, "doubao-1.5-pro-32k": { id: "doubao-1.5-pro-32k", name: "Doubao 1.5 Pro 32k", description: "Flagship model for demanding analysis, coding, and production agent workflows", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 12000 } }, "doubao-seed-2.0-code": { id: "doubao-seed-2.0-code", name: "Doubao Seed 2.0 Code", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 } }, "MiniMax-M1": { id: "MiniMax-M1", name: "MiniMax M1", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 80000 } }, "claude-3.5-haiku": { id: "claude-3.5-haiku", name: "Claude 3.5 Haiku", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 } }, "qwen3-max-preview": { id: "qwen3-max-preview", name: "Qwen3 Max Preview", description: "Flagship model for demanding analysis, coding, and production agent workflows", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-06", last_updated: "2025-09-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 } }, "qwen3-235b-a22b": { id: "qwen3-235b-a22b", name: "Qwen 3 235B A22B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 } }, "claude-4.1-opus": { id: "claude-4.1-opus", name: "Claude 4.1 Opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-06", last_updated: "2025-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 } }, "claude-4.5-opus": { id: "claude-4.5-opus", name: "Claude 4.5 Opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-11-25", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 200000 } }, "claude-4.5-sonnet": { id: "claude-4.5-sonnet", name: "Claude 4.5 Sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 } }, "qwen3-max": { id: "qwen3-max", name: "Qwen3 Max", description: "Flagship model for demanding analysis, coding, and production agent workflows", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-24", last_updated: "2025-09-24", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 } }, "qwen2.5-vl-7b-instruct": { id: "qwen2.5-vl-7b-instruct", name: "Qwen 2.5 VL 7B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 } }, "doubao-1.5-thinking-pro": { id: "doubao-1.5-thinking-pro", name: "Doubao 1.5 Thinking Pro", description: "Flagship model for demanding analysis, coding, and production agent workflows", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16000 } }, "deepseek-r1-0528": { id: "deepseek-r1-0528", name: "DeepSeek-R1-0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 } }, "claude-4.5-haiku": { id: "claude-4.5-haiku", name: "Claude 4.5 Haiku", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-10-16", last_updated: "2025-10-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 } }, "doubao-seed-1.6": { id: "doubao-seed-1.6", name: "Doubao-Seed 1.6", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-15", last_updated: "2025-08-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 } }, "glm-4.5": { id: "glm-4.5", name: "GLM 4.5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 98304 } }, "deepseek-v3-0324": { id: "deepseek-v3-0324", name: "DeepSeek-V3-0324", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16000 } }, "deepseek-v3": { id: "deepseek-v3", name: "DeepSeek-V3", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-13", last_updated: "2025-08-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16000 } }, "qwen3-235b-a22b-instruct-2507": { id: "qwen3-235b-a22b-instruct-2507", name: "Qwen3 235b A22B Instruct 2507", description: "Tool-capable chat model for instruction following and agentic application workflows", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-12", last_updated: "2025-08-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 64000 } }, "gemini-2.0-flash": { id: "gemini-2.0-flash", name: "Gemini 2.0 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 8192 } }, "doubao-seed-2.0-mini": { id: "doubao-seed-2.0-mini", name: "Doubao Seed 2.0 Mini", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 } }, "gemini-3.0-pro-image-preview": { id: "gemini-3.0-pro-image-preview", name: "Gemini 3.0 Pro Image Preview", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 32768, output: 8192 } }, "gemini-3.0-pro-preview": { id: "gemini-3.0-pro-preview", name: "Gemini 3.0 Pro Preview", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-11-19", last_updated: "2025-11-19", modalities: { input: ["text", "image", "video", "pdf", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "gpt-oss-120b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-06", last_updated: "2025-08-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 } }, "qwen3-30b-a3b-thinking-2507": { id: "qwen3-30b-a3b-thinking-2507", name: "Qwen3 30b A3b Thinking 2507", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-04", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 126000, output: 32000 } }, "gemini-2.5-flash-image": { id: "gemini-2.5-flash-image", name: "Gemini 2.5 Flash Image", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-10-22", last_updated: "2025-10-22", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 32768, output: 8192 } }, "kling-v2-6": { id: "kling-v2-6", name: "Kling-V2 6", description: "Video model for prompt-guided generation, editing, and motion workflows", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-01-13", last_updated: "2026-01-13", modalities: { input: ["text", "image", "video"], output: ["video"] }, open_weights: false, limit: { context: 99999999, output: 99999999 } }, "deepseek-r1": { id: "deepseek-r1", name: "DeepSeek-R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 } }, "qwen-turbo": { id: "qwen-turbo", name: "Qwen-Turbo", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 4096 } }, "doubao-seed-1.6-thinking": { id: "doubao-seed-1.6-thinking", name: "Doubao-Seed 1.6 Thinking", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-15", last_updated: "2025-08-15", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 } }, "kimi-k2": { id: "kimi-k2", name: "Kimi K2", description: "Kimi model for long-context chat, coding, and agentic reasoning", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 } }, "qwen3-30b-a3b-instruct-2507": { id: "qwen3-30b-a3b-instruct-2507", name: "Qwen3 30b A3b Instruct 2507", description: "Tool-capable chat model for instruction following and agentic application workflows", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-04", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 } }, "doubao-seed-1.6-flash": { id: "doubao-seed-1.6-flash", name: "Doubao-Seed 1.6 Flash", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-15", last_updated: "2025-08-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 } }, "claude-3.5-sonnet": { id: "claude-3.5-sonnet", name: "Claude 3.5 Sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-09", last_updated: "2025-09-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8200 } }, "qwen3.5-397b-a17b": { id: "qwen3.5-397b-a17b", name: "Qwen3.5 397B A17B", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-22", last_updated: "2026-02-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 } }, "gemini-2.5-flash-lite": { id: "gemini-2.5-flash-lite", name: "Gemini 2.5 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 64000 } }, "claude-4.0-sonnet": { id: "claude-4.0-sonnet", name: "Claude 4.0 Sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 } }, "gemini-2.0-flash-lite": { id: "gemini-2.0-flash-lite", name: "Gemini 2.0 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 8192 } }, "claude-4.0-opus": { id: "claude-4.0-opus", name: "Claude 4.0 Opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 } }, "qwen3-next-80b-a3b-instruct": { id: "qwen3-next-80b-a3b-instruct", name: "Qwen3 Next 80B A3B Instruct", description: "Tool-capable chat model for instruction following and agentic application workflows", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-12", last_updated: "2025-09-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 } }, "qwen2.5-vl-72b-instruct": { id: "qwen2.5-vl-72b-instruct", name: "Qwen 2.5 VL 72B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 } }, "meituan/longcat-flash-lite": { id: "meituan/longcat-flash-lite", name: "Meituan/Longcat-Flash-Lite", description: "Efficient model for low-latency assistance, extraction, and routine automation", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-06", last_updated: "2026-02-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 320000 } }, "meituan/longcat-flash-chat": { id: "meituan/longcat-flash-chat", name: "Meituan/Longcat-Flash-Chat", description: "Efficient model for low-latency assistance, extraction, and routine automation", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-11-05", last_updated: "2025-11-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 } }, "minimax/minimax-m2.5-highspeed": { id: "minimax/minimax-m2.5-highspeed", name: "Minimax/Minimax-M2.5 Highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 128000 } }, "minimax/minimax-m2.5": { id: "minimax/minimax-m2.5", name: "Minimax/Minimax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 128000 } }, "minimax/minimax-m2": { id: "minimax/minimax-m2", name: "Minimax/Minimax-M2", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-10-28", last_updated: "2025-10-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 } }, "minimax/minimax-m2.1": { id: "minimax/minimax-m2.1", name: "Minimax/Minimax-M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 128000 } }, "deepseek/deepseek-v3.2-exp": { id: "deepseek/deepseek-v3.2-exp", name: "DeepSeek/DeepSeek-V3.2-Exp", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 } }, "deepseek/deepseek-math-v2": { id: "deepseek/deepseek-math-v2", name: "Deepseek/Deepseek-Math-V2", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-12-04", last_updated: "2025-12-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 160000, output: 160000 } }, "deepseek/deepseek-v3.2-251201": { id: "deepseek/deepseek-v3.2-251201", name: "Deepseek/DeepSeek-V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 } }, "deepseek/deepseek-v3.2-exp-thinking": { id: "deepseek/deepseek-v3.2-exp-thinking", name: "DeepSeek/DeepSeek-V3.2-Exp-Thinking", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 } }, "deepseek/deepseek-v3.1-terminus-thinking": { id: "deepseek/deepseek-v3.1-terminus-thinking", name: "DeepSeek/DeepSeek-V3.1-Terminus-Thinking", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-09-22", last_updated: "2025-09-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 } }, "deepseek/deepseek-v3.1-terminus": { id: "deepseek/deepseek-v3.1-terminus", name: "DeepSeek/DeepSeek-V3.1-Terminus", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-22", last_updated: "2025-09-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 } }, "x-ai/grok-4.1-fast-reasoning": { id: "x-ai/grok-4.1-fast-reasoning", name: "X-Ai/Grok 4.1 Fast Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-19", last_updated: "2025-12-19", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 20000000, output: 2000000 } }, "x-ai/grok-4-fast-reasoning": { id: "x-ai/grok-4-fast-reasoning", name: "X-Ai/Grok-4-Fast-Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-18", last_updated: "2025-12-18", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 } }, "x-ai/grok-4.1-fast": { id: "x-ai/grok-4.1-fast", name: "x-AI/Grok-4.1-Fast", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 } }, "x-ai/grok-4-fast": { id: "x-ai/grok-4-fast", name: "x-AI/Grok-4-Fast", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-20", last_updated: "2025-09-20", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 } }, "x-ai/grok-code-fast-1": { id: "x-ai/grok-code-fast-1", name: "x-AI/Grok-Code-Fast 1", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-02", last_updated: "2025-09-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 1e4 } }, "x-ai/grok-4-fast-non-reasoning": { id: "x-ai/grok-4-fast-non-reasoning", name: "X-Ai/Grok-4-Fast-Non-Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-18", last_updated: "2025-12-18", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 } }, "x-ai/grok-4.1-fast-non-reasoning": { id: "x-ai/grok-4.1-fast-non-reasoning", name: "X-Ai/Grok 4.1 Fast Non Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-19", last_updated: "2025-12-19", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 } }, "xiaomi/mimo-v2-flash": { id: "xiaomi/mimo-v2-flash", name: "Xiaomi/Mimo-V2-Flash", description: "MiMo flash model for fast multimodal assistance and agent workflows", family: "mimo", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12-01", release_date: "2025-12-16", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.1, output: 0.3, cache_read: 0.01 } }, "stepfun-ai/gelab-zero-4b-preview": { id: "stepfun-ai/gelab-zero-4b-preview", name: "Stepfun-Ai/Gelab Zero 4b Preview", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 4096 } }, "z-ai/glm-5": { id: "z-ai/glm-5", name: "Z-Ai/GLM 5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 } }, "z-ai/glm-4.6": { id: "z-ai/glm-4.6", name: "Z-AI/GLM 4.6", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-10-11", last_updated: "2025-10-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 200000 } }, "z-ai/autoglm-phone-9b": { id: "z-ai/autoglm-phone-9b", name: "Z-Ai/Autoglm Phone 9b", description: "GLM vision model for visual reasoning, documents, and multimodal agents", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 12800, output: 4096 } }, "z-ai/glm-4.7": { id: "z-ai/glm-4.7", name: "Z-Ai/GLM 4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 200000 } }, "moonshotai/kimi-k2.5": { id: "moonshotai/kimi-k2.5", name: "Moonshotai/Kimi-K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2026-01-28", last_updated: "2026-01-28", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 } }, "moonshotai/kimi-k2-thinking": { id: "moonshotai/kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-11-07", last_updated: "2025-11-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 1e5 } }, "moonshotai/kimi-k2-0905": { id: "moonshotai/kimi-k2-0905", name: "Kimi K2 0905", description: "Kimi model for long-context chat, coding, and agentic reasoning", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-08", last_updated: "2025-09-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 1e5 } }, "openai/gpt-5": { id: "openai/gpt-5", name: "OpenAI/GPT-5", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-19", last_updated: "2025-09-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "OpenAI/GPT-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 } }, "stepfun/step-3.5-flash": { id: "stepfun/step-3.5-flash", name: "Stepfun/Step-3.5 Flash", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-02", last_updated: "2026-02-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 64000, output: 4096 } } } }, longcat: { id: "longcat", env: ["LONGCAT_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.longcat.chat/openai", name: "LongCat", doc: "https://longcat.chat/platform/docs/", models: { "LongCat-2.0": { id: "LongCat-2.0", name: "LongCat-2.0", description: "Meituan LongCat-2.0, a reasoning model with tool calling and a 1M-token context window", family: "longcat", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 0.75, output: 2.95, cache_read: 0.015 } } } }, "ollama-cloud": { id: "ollama-cloud", env: ["OLLAMA_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://ollama.com/v1", name: "Ollama Cloud", doc: "https://docs.ollama.com/cloud", models: { "glm-5.1": { id: "glm-5.1", name: "glm-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, release_date: "2026-03-27", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 } }, "nemotron-3-super": { id: "nemotron-3-super", name: "nemotron-3-super", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "deepseek-v4-flash", description: "Fast DeepSeek model for efficient chat, coding help, and agent loops", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "kimi-k2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 } }, "minimax-m2.7": { id: "minimax-m2.7", name: "minimax-m2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 196608 } }, "nemotron-3-nano:30b": { id: "nemotron-3-nano:30b", name: "nemotron-3-nano:30b", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2025-12-15", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 } }, "mistral-large-3:675b": { id: "mistral-large-3:675b", name: "mistral-large-3:675b", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, release_date: "2025-12-02", last_updated: "2026-01-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 976000, output: 131072 } }, "nemotron-3-ultra": { id: "nemotron-3-ultra", name: "nemotron-3-ultra", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 128000 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "kimi-k2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 } }, "qwen3.5:397b": { id: "qwen3.5:397b", name: "qwen3.5:397b", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_details" }, release_date: "2026-02-15", last_updated: "2026-02-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 } }, "minimax-m3": { id: "minimax-m3", name: "minimax-m3", description: "MiniMax multimodal coding model for long-context reasoning and agent tasks", family: "minimax-m3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-31", last_updated: "2026-05-31", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 512000, output: 131072 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "deepseek-v4-pro", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 } }, "gpt-oss:120b": { id: "gpt-oss:120b", name: "gpt-oss:120b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, release_date: "2025-08-05", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 } }, "deepseek-v4-flash:0731": { id: "deepseek-v4-flash:0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 } }, "gemma4:31b": { id: "gemma4:31b", name: "gemma4:31b", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, knowledge: "2025-01", release_date: "2026-04-02", last_updated: "2026-04-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 } }, "minimax-m2.5": { id: "minimax-m2.5", name: "minimax-m2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, knowledge: "2025-01", release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "kimi-k2.7-code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 } }, "kimi-k3": { id: "kimi-k3", name: "kimi-k3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 } }, "gpt-oss:20b": { id: "gpt-oss:20b", name: "gpt-oss:20b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, release_date: "2025-08-05", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 } } } }, jiekou: { id: "jiekou", env: ["JIEKOU_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.jiekou.ai/openai", name: "Jiekou.AI", doc: "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", models: { "gpt-5.1-codex-mini": { id: "gpt-5.1-codex-mini", name: "gpt-5.1-codex-mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.225, output: 1.8 } }, "gpt-5.2-pro": { id: "gpt-5.2-pro", name: "gpt-5.2-pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 18.9, output: 151.2 } }, "gemini-2.5-flash-lite-preview-06-17": { id: "gemini-2.5-flash-lite-preview-06-17", name: "gemini-2.5-flash-lite-preview-06-17", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "video", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.09, output: 0.36 } }, "grok-4-fast-reasoning": { id: "grok-4-fast-reasoning", name: "grok-4-fast-reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 0.18, output: 0.45 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "gemini-2.5-flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.27, output: 2.25 } }, "grok-4-0709": { id: "grok-4-0709", name: "grok-4-0709", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 8192 }, cost: { input: 2.7, output: 13.5 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "claude-opus-4-6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024, max: 127999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02", last_updated: "2026-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25 } }, "o3-mini": { id: "o3-mini", name: "o3-mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 1.1, output: 4.4 } }, "grok-code-fast-1": { id: "grok-code-fast-1", name: "grok-code-fast-1", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.18, output: 1.35 } }, "gemini-3-flash-preview": { id: "gemini-3-flash-preview", name: "gemini-3-flash-preview", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3 } }, "gpt-5-codex": { id: "gpt-5-codex", name: "gpt-5-codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.125, output: 9 } }, "grok-4-fast-non-reasoning": { id: "grok-4-fast-non-reasoning", name: "grok-4-fast-non-reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 0.18, output: 0.45 } }, "gpt-5-chat-latest": { id: "gpt-5-chat-latest", name: "gpt-5-chat-latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.125, output: 9 } }, "grok-4-1-fast-reasoning": { id: "grok-4-1-fast-reasoning", name: "grok-4-1-fast-reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 0.18, output: 0.45 } }, "claude-sonnet-4-5-20250929": { id: "claude-sonnet-4-5-20250929", name: "claude-sonnet-4-5-20250929", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 2.7, output: 13.5 } }, "gpt-5.2-codex": { id: "gpt-5.2-codex", name: "gpt-5.2-codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.75, output: 14 } }, "claude-opus-4-5-20251101": { id: "claude-opus-4-5-20251101", name: "claude-opus-4-5-20251101", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 65536 }, cost: { input: 4.5, output: 22.5 } }, "gpt-5-pro": { id: "gpt-5-pro", name: "gpt-5-pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 272000 }, cost: { input: 13.5, output: 108 } }, "gpt-5.2": { id: "gpt-5.2", name: "gpt-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.575, output: 12.6 } }, "gemini-2.5-pro-preview-06-05": { id: "gemini-2.5-pro-preview-06-05", name: "gemini-2.5-pro-preview-06-05", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 200000 }, cost: { input: 1.125, output: 9 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "gpt-5-mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.225, output: 1.8 } }, "claude-haiku-4-5-20251001": { id: "claude-haiku-4-5-20251001", name: "claude-haiku-4-5-20251001", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 20000, output: 64000 }, cost: { input: 0.9, output: 4.5 } }, "gemini-2.5-flash-preview-05-20": { id: "gemini-2.5-flash-preview-05-20", name: "gemini-2.5-flash-preview-05-20", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 200000 }, cost: { input: 0.135, output: 3.15 } }, "gemini-2.5-flash-lite-preview-09-2025": { id: "gemini-2.5-flash-lite-preview-09-2025", name: "gemini-2.5-flash-lite-preview-09-2025", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.09, output: 0.36 } }, "gpt-5.1": { id: "gpt-5.1", name: "gpt-5.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02", last_updated: "2026-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.125, output: 9 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "gemini-2.5-pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 1.125, output: 9 } }, "grok-4-1-fast-non-reasoning": { id: "grok-4-1-fast-non-reasoning", name: "grok-4-1-fast-non-reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 0.18, output: 0.45 } }, "gpt-5.1-codex": { id: "gpt-5.1-codex", name: "gpt-5.1-codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.125, output: 9 } }, "gpt-5-nano": { id: "gpt-5-nano", name: "gpt-5-nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.045, output: 0.36 } }, "gemini-3-pro-preview": { id: "gemini-3-pro-preview", name: "gemini-3-pro-preview", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.8, output: 10.8 } }, "gemini-2.5-flash-lite": { id: "gemini-2.5-flash-lite", name: "gemini-2.5-flash-lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.09, output: 0.36 } }, "claude-sonnet-4-20250514": { id: "claude-sonnet-4-20250514", name: "claude-sonnet-4-20250514", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 2.7, output: 13.5 } }, o3: { id: "o3", name: "o3", description: "O-series reasoning model for hard analysis, math, coding, and planning", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 10, output: 40 } }, "o4-mini": { id: "o4-mini", name: "o4-mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4 } }, "claude-opus-4-20250514": { id: "claude-opus-4-20250514", name: "claude-opus-4-20250514", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 13.5, output: 67.5 } }, "gpt-5.1-codex-max": { id: "gpt-5.1-codex-max", name: "gpt-5.1-codex-max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.125, output: 9 } }, "claude-opus-4-1-20250805": { id: "claude-opus-4-1-20250805", name: "claude-opus-4-1-20250805", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 13.5, output: 67.5 } }, "zai-org/glm-4.7-flash": { id: "zai-org/glm-4.7-flash", name: "GLM-4.7-Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.07, output: 0.4 } }, "zai-org/glm-4.5": { id: "zai-org/glm-4.5", name: "GLM-4.5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.6, output: 2.2 } }, "zai-org/glm-4.5v": { id: "zai-org/glm-4.5v", name: "GLM 4.5V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glmv", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 16384 }, cost: { input: 0.6, output: 1.8 } }, "zai-org/glm-4.7": { id: "zai-org/glm-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2 } }, "qwen/qwen3-coder-480b-a35b-instruct": { id: "qwen/qwen3-coder-480b-a35b-instruct", name: "Qwen3 Coder 480B A35B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.29, output: 1.2 } }, "qwen/qwen3-235b-a22b-thinking-2507": { id: "qwen/qwen3-235b-a22b-thinking-2507", name: "Qwen3 235B A22b Thinking 2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.3, output: 3 } }, "qwen/qwen3-next-80b-a3b-thinking": { id: "qwen/qwen3-next-80b-a3b-thinking", name: "Qwen3 Next 80B A3B Thinking", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 0.15, output: 1.5 } }, "qwen/qwen3-32b-fp8": { id: "qwen/qwen3-32b-fp8", name: "Qwen3 32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 20000 }, cost: { input: 0.1, output: 0.45 } }, "qwen/qwen3-30b-a3b-fp8": { id: "qwen/qwen3-30b-a3b-fp8", name: "Qwen3 30B A3B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 20000 }, cost: { input: 0.09, output: 0.45 } }, "qwen/qwen3-235b-a22b-fp8": { id: "qwen/qwen3-235b-a22b-fp8", name: "Qwen3 235B A22B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 20000 }, cost: { input: 0.2, output: 0.8 } }, "qwen/qwen3-235b-a22b-instruct-2507": { id: "qwen/qwen3-235b-a22b-instruct-2507", name: "Qwen3 235B A22B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.15, output: 0.8 } }, "qwen/qwen3-coder-next": { id: "qwen/qwen3-coder-next", name: "qwen/qwen3-coder-next", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-02", last_updated: "2026-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.2, output: 1.5 } }, "qwen/qwen3-next-80b-a3b-instruct": { id: "qwen/qwen3-next-80b-a3b-instruct", name: "Qwen3 Next 80B A3B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 0.15, output: 1.5 } }, "xiaomimimo/mimo-v2-flash": { id: "xiaomimimo/mimo-v2-flash", name: "XiaomiMiMo/MiMo-V2-Flash", description: "MiMo flash model for fast multimodal assistance and agent workflows", family: "mimo", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0, output: 0 } }, "minimax/minimax-m2.1": { id: "minimax/minimax-m2.1", name: "Minimax M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 131071 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "deepseek/deepseek-v3.1": { id: "deepseek/deepseek-v3.1", name: "DeepSeek V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 32767 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 32768 }, cost: { input: 0.27, output: 1 } }, "deepseek/deepseek-r1-0528": { id: "deepseek/deepseek-r1-0528", name: "DeepSeek R1 0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 32768 }, cost: { input: 0.7, output: 2.5 } }, "deepseek/deepseek-v3-0324": { id: "deepseek/deepseek-v3-0324", name: "DeepSeek V3 0324", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 163840 }, cost: { input: 0.28, output: 1.14 } }, "moonshotai/kimi-k2.5": { id: "moonshotai/kimi-k2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 262143 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3 } }, "moonshotai/kimi-k2-instruct": { id: "moonshotai/kimi-k2-instruct", name: "Kimi K2 Instruct", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.57, output: 2.3 } }, "moonshotai/kimi-k2-0905": { id: "moonshotai/kimi-k2-0905", name: "Kimi K2 0905", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 2.5 } }, "baidu/ernie-4.5-vl-424b-a47b": { id: "baidu/ernie-4.5-vl-424b-a47b", name: "ERNIE 4.5 VL 424B A47B", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "ernie", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 123000, output: 16000 }, cost: { input: 0.42, output: 1.25 } }, "baidu/ernie-4.5-300b-a47b-paddle": { id: "baidu/ernie-4.5-300b-a47b-paddle", name: "ERNIE 4.5 300B A47B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "ernie", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 123000, output: 12000 }, cost: { input: 0.28, output: 1.1 } }, "minimaxai/minimax-m1-80k": { id: "minimaxai/minimax-m1-80k", name: "MiniMax M1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 40000 }, cost: { input: 0.55, output: 2.2 } } } }, perplexity: { id: "perplexity", env: ["PERPLEXITY_API_KEY"], npm: "@ai-sdk/perplexity", name: "Perplexity", doc: "https://docs.perplexity.ai", models: { "sonar-deep-research": { id: "sonar-deep-research", name: "Perplexity Sonar Deep Research", description: "Sonar search model for current answers, retrieval, and citation-backed chat", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: false, temperature: false, knowledge: "2025-01", release_date: "2025-02-01", last_updated: "2025-09-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32768 }, cost: { input: 2, output: 8, reasoning: 3 } }, sonar: { id: "sonar", name: "Sonar", description: "Fast web-grounded Sonar for current answers, citations, and lightweight retrieval", family: "sonar", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 1, output: 1 } }, "sonar-pro": { id: "sonar-pro", name: "Sonar Pro", description: "Deeper Sonar search model with broader retrieval and stronger synthesis", family: "sonar-pro", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 3, output: 15 } }, "sonar-reasoning-pro": { id: "sonar-reasoning-pro", name: "Sonar Reasoning Pro", description: "Web-grounded Sonar for multi-step research questions that need cited reasoning", family: "sonar-reasoning", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 2, output: 8 } } } }, "perplexity-agent": { id: "perplexity-agent", env: ["PERPLEXITY_API_KEY"], npm: "@ai-sdk/openai", api: "https://api.perplexity.ai/v1", name: "Perplexity Agent", doc: "https://docs.perplexity.ai/docs/agent-api/models", models: { "nvidia/nemotron-3-super-120b-a12b": { id: "nvidia/nemotron-3-super-120b-a12b", name: "Nemotron 3 Super 120B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2026-02", release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 32000 }, cost: { input: 0.25, output: 2.5 } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-03-20", last_updated: "2025-06-05", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "google/gemini-3-flash-preview": { id: "google/gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, tiers: [{ input: 0.5, output: 3, cache_read: 0.05, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 0.5, output: 3, cache_read: 0.05 } } }, "google/gemini-3.1-pro-preview": { id: "google/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-03-20", last_updated: "2025-06-05", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "moonshot-ai/kimi-k2.7-code": { id: "moonshot-ai/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-07-30", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "moonshot-ai/kimi-k3": { id: "moonshot-ai/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-30", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "xai/grok-4-1-fast-non-reasoning": { id: "xai/grok-4-1-fast-non-reasoning", name: "Grok 4.1 Fast (Non-Reasoning)", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-07", release_date: "2025-11-19", last_updated: "2025-11-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "anthropic/claude-sonnet-4-6": { id: "anthropic/claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-02-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "anthropic/claude-haiku-4-5": { id: "anthropic/claude-haiku-4-5", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1 } }, "anthropic/claude-opus-4-6": { id: "anthropic/claude-opus-4-6", name: "Claude Opus 4.6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "anthropic/claude-sonnet-4-5": { id: "anthropic/claude-sonnet-4-5", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "anthropic/claude-opus-4-7": { id: "anthropic/claude-opus-4-7", name: "Claude Opus 4.7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "anthropic/claude-opus-4-5": { id: "anthropic/claude-opus-4-5", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "perplexity/sonar": { id: "perplexity/sonar", name: "Sonar", description: "Sonar search model for current answers, retrieval, and citation-backed chat", family: "sonar", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.25, output: 2.5, cache_read: 0.0625 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT-5.4", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25 } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT-5 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT-5.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } } } }, moonshotai: { id: "moonshotai", env: ["MOONSHOT_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.moonshot.ai/v1", name: "Moonshot AI", doc: "https://platform.moonshot.ai/docs/api/chat", models: { "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "kimi-k2-thinking-turbo": { id: "kimi-k2-thinking-turbo", name: "Kimi K2 Thinking Turbo", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-08", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.15, output: 8, cache_read: 0.15 } }, "kimi-k2-0711-preview": { id: "kimi-k2-0711-preview", name: "Kimi K2 0711", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-07-14", last_updated: "2025-07-14", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "kimi-k2.7-code-highspeed": { id: "kimi-k2.7-code-highspeed", name: "Kimi K2.7 Code HighSpeed", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.9, output: 8, cache_read: 0.38 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "kimi-k2-turbo-preview": { id: "kimi-k2-turbo-preview", name: "Kimi K2 Turbo", description: "Fast Kimi model for responsive chat, coding help, and agent loops", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 2.4, output: 10, cache_read: 0.6 } }, "kimi-k2-0905-preview": { id: "kimi-k2-0905-preview", name: "Kimi K2 0905", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "kimi-k2-thinking": { id: "kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Thinking Kimi model for slower research passes, planning, and hard technical questions", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-08", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } } } }, openai: { id: "openai", env: ["OPENAI_API_KEY"], npm: "@ai-sdk/openai", name: "OpenAI", doc: "https://platform.openai.com/docs/models", models: { "gpt-image-2": { id: "gpt-image-2", name: "gpt-image-2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 0, input: 0, output: 0 }, cost: { input: 5, output: 30, cache_read: 1.25 } }, "gpt-5.2-pro": { id: "gpt-5.2-pro", name: "GPT-5.2 Pro", description: "Higher-accuracy GPT-5.2 variant for tougher reasoning and review workflows", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 21, output: 168 } }, "gpt-5.5-pro": { id: "gpt-5.5-pro", name: "GPT-5.5 Pro", description: "Highest-accuracy GPT-5.5 tier for slower, precision-heavy reasoning and coding", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "gpt-4.1-mini": { id: "gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "gpt-4o": { id: "gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "gpt-5.3-codex-spark": { id: "gpt-5.3-codex-spark", name: "GPT-5.3 Codex Spark", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex-spark", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 1e5, output: 32000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5.4-pro": { id: "gpt-5.4-pro", name: "GPT-5.4 Pro", description: "More exact GPT-5.4 tier for demanding professional reasoning and agent tasks", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 10, output: 60, cache_read: 1, cache_write: 12.5 }, provider: { body: { service_tier: "priority" } } }, pro: { provider: { body: { reasoning: { mode: "pro" } } } } } }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 45, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1, cache_write: 12.5 } } }, "text-embedding-ada-002": { id: "text-embedding-ada-002", name: "text-embedding-ada-002", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2022-12", release_date: "2022-12-15", last_updated: "2022-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 }, cost: { input: 0.1, output: 0 } }, "gpt-4.1-nano": { id: "gpt-4.1-nano", name: "GPT-4.1 nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, status: "deprecated", cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "gpt-5.2-chat-latest": { id: "gpt-5.2-chat-latest", name: "GPT-5.2 Chat", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "o3-mini": { id: "o3-mini", name: "o3-mini", description: "Smaller o-series reasoner for economical coding, math, and planning tasks", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "gpt-image-1-mini": { id: "gpt-image-1-mini", name: "gpt-image-1-mini", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-09-26", last_updated: "2025-09-26", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 0, input: 0, output: 0 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 12.5, output: 75, cache_read: 1.25 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "o3-pro": { id: "o3-pro", name: "o3-pro", description: "High-effort o3 tier for difficult technical reasoning and careful answers", family: "o-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-06-10", last_updated: "2025-06-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 20, output: 80 } }, "gpt-4o-mini": { id: "gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "chatgpt-image-latest": { id: "chatgpt-image-latest", name: "chatgpt-image-latest", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 0, input: 0, output: 0 } }, "gpt-5": { id: "gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "gpt-realtime-2.1": { id: "gpt-realtime-2.1", name: "GPT-Realtime-2.1", description: "Realtime speech-to-speech model with configurable reasoning, tool use, and robust voice-agent behavior", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2024-09-30", release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text", "audio", "image"], output: ["text", "audio"] }, open_weights: false, limit: { context: 128000, input: 96000, output: 32000 }, cost: { input: 4, output: 24, cache_read: 0.4, input_audio: 32, output_audio: 64 } }, "gpt-3.5-turbo": { id: "gpt-3.5-turbo", name: "GPT-3.5-turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2021-09-01", release_date: "2023-03-01", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16385, output: 4096 }, status: "deprecated", cost: { input: 0.5, output: 1.5, cache_read: 0 } }, "gpt-4o-2024-05-13": { id: "gpt-4o-2024-05-13", name: "GPT-4o (2024-05-13)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-05-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, status: "deprecated", cost: { input: 5, output: 15 } }, "gpt-4o-2024-11-20": { id: "gpt-4o-2024-11-20", name: "GPT-4o (2024-11-20)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-11-20", last_updated: "2024-11-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 5, output: 30, cache_read: 0.5 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "gpt-5.3-chat-latest": { id: "gpt-5.3-chat-latest", name: "GPT-5.3 Chat (latest)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-image-1.5": { id: "gpt-image-1.5", name: "gpt-image-1.5", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-11-25", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 0, input: 0, output: 0 } }, "gpt-5.4-nano": { id: "gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "gpt-5-pro": { id: "gpt-5-pro", name: "GPT-5 Pro", description: "Higher-accuracy GPT-5 tier for tough analysis, coding reviews, and planning", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 272000 }, cost: { input: 15, output: 120 } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 1.5, output: 9, cache_read: 0.15 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, o1: { id: "o1", name: "o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2023-09", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 15, output: 60, cache_read: 7.5 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 0.4, output: 2.4, cache_read: 0.04, cache_write: 0.5 }, provider: { body: { service_tier: "priority" } } }, pro: { provider: { body: { reasoning: { mode: "pro" } } } } } }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, cache_write: 0.25, tiers: [{ input: 0.4, output: 1.8, cache_read: 0.04, cache_write: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 0.4, output: 1.8, cache_read: 0.04, cache_write: 0.5 } } }, "gpt-5.2": { id: "gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5.3-codex": { id: "gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "o1-pro": { id: "o1-pro", name: "o1-pro", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2023-09", release_date: "2025-03-19", last_updated: "2025-03-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 150, output: 600 } }, "gpt-5.6": { id: "gpt-5.6", name: "GPT-5.6", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 10, output: 60, cache_read: 1, cache_write: 12.5 }, provider: { body: { service_tier: "priority" } } }, pro: { provider: { body: { reasoning: { mode: "pro" } } } } } }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 45, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1, cache_write: 12.5 } } }, "gpt-5.1": { id: "gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "gpt-4-turbo": { id: "gpt-4-turbo", name: "GPT-4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-12", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, status: "deprecated", cost: { input: 10, output: 30 } }, "gpt-4o-2024-08-06": { id: "gpt-4o-2024-08-06", name: "GPT-4o (2024-08-06)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-08-06", last_updated: "2024-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "gpt-5-nano": { id: "gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, o3: { id: "o3", name: "o3", description: "Deliberate o-series reasoner for hard math, coding, and multi-step analysis", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 4, output: 24, cache_read: 0.4, cache_write: 5 }, provider: { body: { service_tier: "priority" } } }, pro: { provider: { body: { reasoning: { mode: "pro" } } } } } }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 2.5, tiers: [{ input: 4, output: 18, cache_read: 0.4, cache_write: 5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4, cache_write: 5 } } }, "gpt-image-1": { id: "gpt-image-1", name: "gpt-image-1", description: "OpenAI image model for production generation, edits, and brand-safe visual workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-04-24", last_updated: "2025-04-24", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 0, input: 0, output: 0 }, status: "deprecated" }, "gpt-4.1": { id: "gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "o4-mini": { id: "o4-mini", name: "o4-mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 1.1, output: 4.4, cache_read: 0.275 } }, "gpt-4": { id: "gpt-4", name: "GPT-4", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-11", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 8192 }, status: "deprecated", cost: { input: 30, output: 60 } }, "text-embedding-3-large": { id: "text-embedding-3-large", name: "text-embedding-3-large", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2024-01", release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8191, output: 3072 }, cost: { input: 0.13, output: 0 } }, "text-embedding-3-small": { id: "text-embedding-3-small", name: "text-embedding-3-small", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2024-01", release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8191, output: 1536 }, cost: { input: 0.02, output: 0 } } } }, xpersona: { id: "xpersona", env: ["XPERSONA_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://www.xpersona.co/v1", name: "Xpersona", doc: "https://www.xpersona.co/docs", models: { "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 0.9, output: 5.55, reasoning: 5.55, cache_read: 0.09 } }, "xpersona-frieren-coder": { id: "xpersona-frieren-coder", name: "Xpersona Frieren 1", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-30", release_date: "2026-05-01", last_updated: "2026-05-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 384000 }, cost: { input: 1.5, output: 6, reasoning: 6, cache_read: 0.15 } }, "gemini-3.5-flash": { id: "gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 1.55, output: 12.2, reasoning: 12.2, cache_read: 0.155 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 0.6, output: 3.7, reasoning: 3.7, cache_read: 0.06 } }, "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 372000, output: 128000 }, cost: { input: 1.5, output: 12, reasoning: 12, cache_read: 0.15 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3, output: 18.5, reasoning: 18.5, cache_read: 0.3 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 1.5, output: 9.25, reasoning: 9.25, cache_read: 0.15 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, cost: { input: 1.5, output: 12, reasoning: 12, cache_read: 0.15 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, cost: { input: 0.75, output: 6, reasoning: 6, cache_read: 0.075 } }, "xpersona-gpt-5.5": { id: "xpersona-gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-12-30", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3, output: 18, reasoning: 18, cache_read: 0.3 } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 272000, output: 128000 }, cost: { input: 0.375, output: 4, reasoning: 4, cache_read: 0.0375 } }, "gpt-5.6": { id: "gpt-5.6", name: "GPT-5.6", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 372000, output: 128000 }, cost: { input: 1.5, output: 12, reasoning: 12, cache_read: 0.15 } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 372000, output: 128000 }, cost: { input: 1.5, output: 2, reasoning: 2, cache_read: 0.15 } } } }, sarvam: { id: "sarvam", env: ["SARVAM_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.sarvam.ai/v1", name: "Sarvam AI", doc: "https://docs.sarvam.ai/api-reference-docs/getting-started/models", models: { "sarvam-30b": { id: "sarvam-30b", name: "Sarvam-30B", description: "Efficient Indian-language reasoning model for chat, coding, and multilingual work", family: "sarvam", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: [null, "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-18", last_updated: "2026-03-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 } }, "sarvam-105b": { id: "sarvam-105b", name: "Sarvam-105B", description: "Flagship Indian-language reasoning model for enterprise multilingual applications", family: "sarvam", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: [null, "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-18", last_updated: "2026-03-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 } } } }, zai: { id: "zai", env: ["ZHIPU_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.z.ai/api/paas/v4", name: "Z.AI", doc: "https://docs.z.ai/guides/overview/pricing", models: { "glm-4.6v": { id: "glm-4.6v", name: "GLM-4.6V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.3, output: 0.9 } }, "glm-5": { id: "glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.2, cache_write: 0 } }, "glm-4.5-air": { id: "glm-4.5-air", name: "GLM-4.5-Air", description: "Lighter GLM-4.5 variant for fast coding assistance and cheaper agents", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.2, output: 1.1, cache_read: 0.03, cache_write: 0 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26, cache_write: 0 } }, "glm-4.7-flash": { id: "glm-4.7-flash", name: "GLM-4.7-Flash", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26, cache_write: 0 } }, "glm-4.7-flashx": { id: "glm-4.7-flashx", name: "GLM-4.7-FlashX", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0.07, output: 0.4, cache_read: 0.01, cache_write: 0 } }, "glm-4.6": { id: "glm-4.6", name: "GLM-4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "glm-4.5": { id: "glm-4.5", name: "GLM-4.5", description: "Hybrid-reasoning GLM release that made the 4.5 line broadly useful", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "glm-4.5v": { id: "glm-4.5v", name: "GLM-4.5V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 64000, output: 16384 }, cost: { input: 0.6, output: 1.8 } }, "glm-4.7": { id: "glm-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "glm-5-turbo": { id: "glm-5-turbo", name: "GLM-5-Turbo", description: "Faster GLM-5 lane for coding agents that need lower latency", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24, cache_write: 0 } }, "glm-5v-turbo": { id: "glm-5v-turbo", name: "GLM-5V-Turbo", description: "Fast GLM vision model for screenshots, documents, and multimodal agent tasks", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24, cache_write: 0 } }, "glm-4.5-flash": { id: "glm-4.5-flash", name: "GLM-4.5-Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, inferx: { id: "inferx", env: ["INFERX_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://model.inferx.net/endpoints/v1", name: "InferX", doc: "https://model.inferx.net/endpoints", models: { "qwen3-coder-next-fp8-1m": { id: "qwen3-coder-next-fp8-1m", name: "Qwen3 Coder Next FP8 1M", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-03", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1024000, output: 65536 }, cost: { input: 0, output: 0 } }, "qwen3-coder-next-fp8": { id: "qwen3-coder-next-fp8", name: "Qwen3 Coder Next FP8", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-03", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256144, output: 65536 }, cost: { input: 0, output: 0 } }, "google/gemma-4-31b-it-fp8": { id: "google/gemma-4-31b-it-fp8", name: "Gemma 4 31B IT FP8", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "qwen/qwen3.6-35b-a3b-fp8": { id: "qwen/qwen3.6-35b-a3b-fp8", name: "Qwen3.6 35B A3B FP8", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 65536 }, cost: { input: 0, output: 0 } }, "qwen/qwen3.5-122b-a10b-nvfp4": { id: "qwen/qwen3.5-122b-a10b-nvfp4", name: "Qwen3.5 122B A10B NVFP4", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 256144, output: 65536 }, cost: { input: 0, output: 0 } }, "qwen/qwen3.6-27b-fp8": { id: "qwen/qwen3.6-27b-fp8", name: "Qwen3.6 27B FP8", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0, output: 0 } } } }, meganova: { id: "meganova", env: ["MEGANOVA_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.meganova.ai/v1", name: "Meganova", doc: "https://docs.meganova.ai", models: { "zai-org/GLM-5": { id: "zai-org/GLM-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 0.8, output: 2.56 } }, "zai-org/GLM-4.6": { id: "zai-org/GLM-4.6", name: "GLM-4.6", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 0.45, output: 1.9 } }, "zai-org/GLM-4.7": { id: "zai-org/GLM-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 0.2, output: 0.8 } }, "mistralai/Mistral-Nemo-Instruct-2407": { id: "mistralai/Mistral-Nemo-Instruct-2407", name: "Mistral Nemo Instruct 2407", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0.02, output: 0.04 } }, "mistralai/Mistral-Small-3.2-24B-Instruct-2506": { id: "mistralai/Mistral-Small-3.2-24B-Instruct-2506", name: "Mistral Small 3.2 24B Instruct", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10", release_date: "2025-06-20", last_updated: "2025-06-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 0, output: 0 } }, "Qwen/Qwen3-235B-A22B-Instruct-2507": { id: "Qwen/Qwen3-235B-A22B-Instruct-2507", name: "Qwen3 235B A22B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.09, output: 0.6 } }, "Qwen/Qwen2.5-VL-32B-Instruct": { id: "Qwen/Qwen2.5-VL-32B-Instruct", name: "Qwen2.5 VL 32B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-03-24", last_updated: "2025-03-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 16384, output: 16384 }, cost: { input: 0.2, output: 0.6 } }, "Qwen/Qwen3.5-Plus": { id: "Qwen/Qwen3.5-Plus", name: "Qwen3.5 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02", last_updated: "2026-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.4, output: 2.4, reasoning: 2.4 } }, "MiniMaxAI/MiniMax-M2.1": { id: "MiniMaxAI/MiniMax-M2.1", name: "MiniMax M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 131072 }, cost: { input: 0.28, output: 1.2 } }, "MiniMaxAI/MiniMax-M2.5": { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "deepseek-ai/DeepSeek-R1-0528": { id: "deepseek-ai/DeepSeek-R1-0528", name: "DeepSeek R1 0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-07", release_date: "2025-05-28", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 64000 }, cost: { input: 0.5, output: 2.15 } }, "deepseek-ai/DeepSeek-V3-0324": { id: "deepseek-ai/DeepSeek-V3-0324", name: "DeepSeek V3 0324", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-03-24", last_updated: "2025-03-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 163840 }, cost: { input: 0.25, output: 0.88 } }, "deepseek-ai/DeepSeek-V3.2": { id: "deepseek-ai/DeepSeek-V3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-03", last_updated: "2025-12-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 164000, output: 164000 }, cost: { input: 0.26, output: 0.38 } }, "deepseek-ai/DeepSeek-V3.2-Exp": { id: "deepseek-ai/DeepSeek-V3.2-Exp", name: "DeepSeek V3.2 Exp", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-10", last_updated: "2025-10-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 164000, output: 164000 }, cost: { input: 0.27, output: 0.4 } }, "deepseek-ai/DeepSeek-V3.1": { id: "deepseek-ai/DeepSeek-V3.1", name: "DeepSeek V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-25", last_updated: "2025-08-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 164000, output: 164000 }, cost: { input: 0.27, output: 1 } }, "moonshotai/Kimi-K2.5": { id: "moonshotai/Kimi-K2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2026-01", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.45, output: 2.8 } }, "moonshotai/Kimi-K2-Thinking": { id: "moonshotai/Kimi-K2-Thinking", name: "Kimi K2 Thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-08", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 2.6 } }, "meta-llama/Llama-3.3-70B-Instruct": { id: "meta-llama/Llama-3.3-70B-Instruct", name: "Llama 3.3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.1, output: 0.3 } }, "XiaomiMiMo/MiMo-V2-Flash": { id: "XiaomiMiMo/MiMo-V2-Flash", name: "MiMo V2 Flash", description: "MiMo flash model for fast multimodal assistance and agent workflows", family: "mimo", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32000 }, cost: { input: 0.1, output: 0.3 } } } }, stepfun: { id: "stepfun", env: ["STEPFUN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.stepfun.com/v1", name: "StepFun (China)", doc: "https://platform.stepfun.com/docs/zh/overview/concept", models: { "step-3.5-flash": { id: "step-3.5-flash", name: "Step 3.5 Flash", description: "StepFun flash lane for quick multimodal reasoning and coding assistance", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-01-29", last_updated: "2026-06-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0.1, output: 0.3, cache_read: 0.02 } }, "step-3.7-flash": { id: "step-3.7-flash", name: "Step 3.7 Flash", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-06-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0.185, output: 1.11, cache_read: 0.037 } }, "step-3.5-flash-2603": { id: "step-3.5-flash-2603", name: "Step 3.5 Flash 2603", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0.1, output: 0.3, cache_read: 0.02 } }, "step-tts-2": { id: "step-tts-2", name: "Step TTS 2", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "step", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-03-01", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "stepaudio-2.5-tts": { id: "stepaudio-2.5-tts", name: "StepAudio 2.5 TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "step", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-16", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "step-1-32k": { id: "step-1-32k", name: "Step 1 (32K)", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06", release_date: "2025-01-01", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 32768 }, cost: { input: 2.05, output: 9.59, cache_read: 0.41 } }, "stepaudio-2.5-asr": { id: "stepaudio-2.5-asr", name: "StepAudio 2.5 ASR", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "step", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-24", last_updated: "2026-07-02", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 } }, "step-2-16k": { id: "step-2-16k", name: "Step 2 (16K)", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06", release_date: "2025-01-01", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 5.21, output: 16.44, cache_read: 1.04 } } } }, cortecs: { id: "cortecs", env: ["CORTECS_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.cortecs.ai/v1", name: "Cortecs", doc: "https://api.cortecs.ai/v1/models", models: { "claude-opus4-7": { id: "claude-opus4-7", name: "Claude Opus 4.7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 5.437, output: 27.186, cache_read: 0.544, cache_write: 6.797 } }, "qwen3-32b": { id: "qwen3-32b", name: "Qwen3 32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40000, output: 40000 }, cost: { input: 0.099, output: 0.299 } }, "mistral-medium-3.5": { id: "mistral-medium-3.5", name: "mistral-medium-3.5", description: "Mistral Medium 3.5 is a frontier multimodal 128B model combining reasoning, coding, and instruction-following with strong agentic performance and efficient deployment.", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1.671, output: 5.57 } }, "gpt-4.1-mini": { id: "gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 1047576 }, cost: { input: 0.434, output: 1.704, cache_read: 0.134 } }, "gpt-4o": { id: "gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 2.659, output: 10.635, cache_read: 1.33 } }, "glm-5": { id: "glm-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, cost: { input: 0.988, output: 3.164, cache_read: 0.247 } }, "claude-4-6-sonnet": { id: "claude-4-6-sonnet", name: "Claude Sonnet 4.6", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 3.196, output: 15.94, cache_read: 0.32, cache_write: 3.999 } }, "gemini-3.5-flash": { id: "gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 1.483, output: 8.898, cache_read: 0.148, cache_write: 0.988 } }, "qwen3.6-35b-a3b": { id: "qwen3.6-35b-a3b", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.167, output: 0.557 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 200000 }, cost: { input: 0.996, output: 4.982, cache_read: 0.099, cache_write: 1.186 } }, "holo2-30b-a3b": { id: "holo2-30b-a3b", name: "holo2-30b-a3b", description: "Holo2 30B A3B is a text-and-vision model optimized for analyzing graphical user interfaces, including web, desktop, and mobile, and enabling agents to interpret interfaces, reason over content, and take actions.", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2025-12-10", last_updated: "2025-12-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 22000, output: 22000 }, cost: { input: 0.334, output: 0.78 } }, "apertus-70b": { id: "apertus-70b", name: "Apertus 70B", description: "Apertus 70B is an open, multilingual language model designed for research, long-context reasoning, and sovereignty-focused AI systems.", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-09", release_date: "2025-09-02", last_updated: "2025-09-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 1.393, output: 2.228 } }, "voxtral-small-2507": { id: "voxtral-small-2507", name: "voxtral-small-2507", description: "Voxtral Small is a multimodal model with audio input, combining advanced speech capabilities with strong text performance for transcription, translation, and audio understanding.", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2026-02-02", last_updated: "2026-02-02", modalities: { input: ["text", "audio"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 }, cost: { input: 0.111, output: 0.334, cache_read: 0.011 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 0.299, output: 2.491, cache_read: 0.029, cache_write: 0.097 } }, "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 1050000 }, cost: { input: 5.5, output: 32.998, cache_read: 0.55, cache_write: 6.879 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, cost: { input: 1.384, output: 4.348, cache_read: 0.346 } }, "gemini-3.5-flash-lite": { id: "gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 0.33, output: 2.749, cache_read: 0.033 } }, "gpt-oss-safeguard-120b": { id: "gpt-oss-safeguard-120b", name: "GPT OSS Safeguard 120B", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-29", last_updated: "2025-10-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.179, output: 0.697 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 256000 }, cost: { input: 0.495, output: 2.768, cache_read: 0.124 } }, "minimax-m2.7": { id: "minimax-m2.7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 196072 }, cost: { input: 0.668, output: 2.674 } }, "gpt-4.1-nano": { id: "gpt-4.1-nano", name: "GPT-4.1 nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 1047576 }, cost: { input: 0.111, output: 0.434, cache_read: 0.056 } }, "qwen3-coder-30b-a3b-instruct": { id: "qwen3-coder-30b-a3b-instruct", name: "Qwen3-Coder 30B-A3B Instruct", description: "Smaller Qwen coder for efficient local agents and repo-level fixes", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262000 }, cost: { input: 0.067, output: 0.245, cache_read: 0.014 } }, "gpt-oss-20b": { id: "gpt-oss-20b", name: "GPT OSS 20B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 131000 }, cost: { input: 0.045, output: 0.167 } }, "qwen3-vl-235b-a22b": { id: "qwen3-vl-235b-a22b", name: "qwen3-vl-235b-a22b", description: "Qwen3 VL 235B A22B is a 235B-parameter MoE vision-language flagship model (\u224822B active) designed for frontier-level multimodal understanding across text, images, documents, and long videos.", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2026-01-13", last_updated: "2026-01-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.617, output: 3.119, cache_read: 0.052 } }, "glm-4.7-flash": { id: "glm-4.7-flash", name: "GLM-4.7-Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 203000, output: 203000 }, cost: { input: 0.08, output: 0.478 } }, "mistral-nemo-instruct-2407": { id: "mistral-nemo-instruct-2407", name: "mistral-nemo-instruct-2407", description: "A 12B parameter, instruct-tuned language model by Mistral AI and NVIDIA, designed for advanced instruction following, multi-turn conversations, and generating text and code across multiple languages.", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2024-08-07", last_updated: "2024-08-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 131072 }, cost: { input: 0.145, output: 0.145, cache_read: 0.014 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 1.2, output: 4.2, cache_read: 0.26 } }, "ministral-8b-2512": { id: "ministral-8b-2512", name: "ministral-8b-2512", description: "Ministral 3 8B is a balanced, efficient multimodal model offering strong text and vision capabilities, optimized for edge and local deployment.", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2025-12-03", last_updated: "2025-12-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.167, output: 0.167, cache_read: 0.017 } }, "qwen3-next-80b-a3b-thinking": { id: "qwen3-next-80b-a3b-thinking", name: "Qwen3-Next 80B-A3B (Thinking)", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.149, output: 1.195 } }, "ministral-14b-2512": { id: "ministral-14b-2512", name: "ministral-14b-2512", description: "Ministral 3 14B is a frontier-level 14B multimodal model optimized for local deployment, delivering state-of-the-art text and vision reasoning with a 256K context window and strong agentic capabilities.", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2025-12-03", last_updated: "2025-12-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.223, output: 0.223, cache_read: 0.022 } }, "ministral-3b-2512": { id: "ministral-3b-2512", name: "ministral-3b-2512", description: "Ministral 3 3B is a compact, efficient multimodal model with strong language, vision capabilities, and ideal for custom fine-tuning.", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2025-12-03", last_updated: "2025-12-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.111, output: 0.111, cache_read: 0.011 } }, "qwen3.5-9b": { id: "qwen3.5-9b", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.111, output: 0.167 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 256000 }, cost: { input: 0.773, output: 3.38, cache_read: 0.193 } }, "mistral-medium-2508": { id: "mistral-medium-2508", name: "mistral-medium-2508", description: "Mistral Medium 2508 is a frontier-class multimodal LLM with a 128,000 token context window, optimized for reasoning, coding, and multimodal tasks.", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2024-08-07", last_updated: "2024-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.446, output: 2.228, cache_read: 0.045 } }, "pixtral-12b-2409": { id: "pixtral-12b-2409", name: "pixtral-12b-2409", description: "Pixtral 2409 12B is a state-of-the-art multimodal model with 12B parameters and a 400M vision encoder, natively trained on interleaved text and image data. It excels in tasks spanning vision-language reasoning, instruction following, and pure text understanding, making it highly effective for real-world multimodal applications.", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2024-11-09", last_updated: "2024-11-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.223, output: 0.223 } }, "pixtral-large-2502": { id: "pixtral-large-2502", name: "pixtral-large-2502", description: "Pixtral Large (25.02) is a 124B open-weight multimodal model built on Mistral Large 2, offering advanced image understanding and strong performance across text and code tasks.", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2025-05-26", last_updated: "2025-05-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 1.993, output: 5.978 } }, "qwen3.6-27b": { id: "qwen3.6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.446, output: 3.008 } }, "gpt-4o-mini": { id: "gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.159, output: 0.638, cache_read: 0.081 } }, "minimax-m3": { id: "minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 0.395, output: 1.977, cache_read: 0.099 } }, "gpt-5": { id: "gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 400000 }, cost: { input: 1.375, output: 10.96, cache_read: 0.156 } }, "nemotron-nano-v2-12b": { id: "nemotron-nano-v2-12b", name: "nemotron-nano-v2-12b", description: "NVIDIA Nemotron Nano v2 12B is a 12-billion-parameter multimodal reasoning model designed for advanced video understanding, document intelligence, and visual reasoning, built with a hybrid Transformer-Mamba architecture for high efficiency and low latency.", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2025-10-31", last_updated: "2025-10-31", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.24, output: 0.707 } }, "gemma-4-26b-a4b-it": { id: "gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.111, output: 0.557 } }, "llama-3.3-70b-instruct": { id: "llama-3.3-70b-instruct", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 131000 }, cost: { input: 0.129, output: 0.399 } }, "mistral-large-2402": { id: "mistral-large-2402", name: "mistral-large-2402", description: "Mistral Large (24.02) is Mistral AI\u2019s most advanced language model, built for complex multilingual reasoning, code generation, and deep text understanding.", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2025-05-26", last_updated: "2025-05-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 }, cost: { input: 4.284, output: 12.952 } }, "minicpm-v-4.5": { id: "minicpm-v-4.5", name: "minicpm-v-4.5", description: "MiniCPM-V 4.5 is a compact, high-performance vision-language model excelling in video understanding, OCR, and multimodal reasoning with efficient deployment.", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 }, cost: { input: 0.651, output: 1.097 } }, "qwen3guard-gen-8b": { id: "qwen3guard-gen-8b", name: "qwen3guard-gen-8b", description: "Qwen3Guard-Gen-8B is a large-scale multilingual safety moderation model designed for high-accuracy prompt and response classification.", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, release_date: "2026-02-04", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 }, cost: { input: 0, output: 0 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 1.73, output: 3.46, cache_read: 0.432 } }, "gemma-3-27b-it": { id: "gemma-3-27b-it", name: "gemma-3-27b-it", description: "Gemma 3 is a family of lightweight, multimodal models from Google, supporting text and image inputs, multilingual capabilities, and a 131K context window.", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: false, release_date: "2025-03-12", last_updated: "2025-03-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.099, output: 0.299 } }, "deepseek-r1-0528": { id: "deepseek-r1-0528", name: "DeepSeek R1 0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-05-28", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 164000, output: 164000 }, cost: { input: 0.652, output: 2.57, cache_read: 0.163 } }, "llama-3.1-nemotron-ultra-253b-v1": { id: "llama-3.1-nemotron-ultra-253b-v1", name: "llama-3.1-nemotron-ultra-253b-v1", description: "A reasoning-optimized LLM based on Llama 3.1, Nemotron Ultra 253B delivers strong performance in tasks like RAG and tool use, with high efficiency and reduced latency.", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2025-04-07", last_updated: "2025-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.598, output: 1.794 } }, "nvidia-nemotron-3-nano-30b-a3b": { id: "nvidia-nemotron-3-nano-30b-a3b", name: "nvidia-nemotron-3-nano-30b-a3b", description: "Nemotron-Nano-3-30B-A3B is a compact Mixture-of-Experts model optimized for efficient reasoning, chat, and coding, with strong multilingual support and long-context RAG and agent workflows.", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2026-01-12", last_updated: "2026-01-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.06, output: 0.24 } }, "nova-2-lite": { id: "nova-2-lite", name: "nova-2-lite", description: "Nova 2 Lite is an advanced multimodal reasoning model that combines efficiency and performance, delivering reliable AI for agentic workflows and enterprise applications.", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2025-12-04", last_updated: "2025-12-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 0.373, output: 3.144 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 1050000 }, cost: { input: 2.898, output: 15.453, cache_read: 0.242 } }, "cosmos3-super-reasoner": { id: "cosmos3-super-reasoner", name: "cosmos3-super-reasoner", description: "Cosmos3 Super Reasoner is a high-capacity reasoning model designed for complex multi-agent tasks and advanced physical AI understanding.", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.099, output: 0.296 } }, "deepseek-v4-flash-0731": { id: "deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 0.25, output: 0.3, cache_read: 0.062 } }, "mixtral-8x7B-instruct-v0.1": { id: "mixtral-8x7B-instruct-v0.1", name: "Mixtral 8x7B Instruct v0.1", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2023-12-11", last_updated: "2023-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 32000 }, cost: { input: 0.488, output: 0.758 } }, "qwen3-235b-a22b-instruct-2507": { id: "qwen3-235b-a22b-instruct-2507", name: "Qwen3 235B-A22B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-21", last_updated: "2025-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 131000 }, cost: { input: 0.069, output: 0.455, cache_read: 0.018 } }, "claude-opus4-8": { id: "claude-opus4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 5.437, output: 27.186, cache_read: 0.544, cache_write: 6.797 } }, "mistral-small-2603": { id: "mistral-small-2603", name: "Mistral Small 4", description: "Fast Mistral production model for chat, extraction, and cost-sensitive agents", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-06", release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.143, output: 0.568, cache_read: 0.014 } }, "codestral-2508": { id: "codestral-2508", name: "Codestral 2508", description: "Mistral coding model for code completion, generation, and developer workflows", family: "mistral", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03", release_date: "2025-07-30", last_updated: "2025-07-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.334, output: 1.003, cache_read: 0.033 } }, "deepseek-v3.2": { id: "deepseek-v3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 163840 }, cost: { input: 0.296, output: 0.495, cache_read: 0.075 } }, "claude-sonnet-4": { id: "claude-sonnet-4", name: "Claude Sonnet 4 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 200000 }, cost: { input: 2.898, output: 14.493, cache_read: 0.29, cache_write: 3.624 } }, "mistral-small-2503": { id: "mistral-small-2503", name: "mistral-small-2503", description: "Combines advanced text and vision capabilities with 24 billion parameters, supporting multilingual tasks and long contexts up to 131k tokens, making it versatile for various applications without sacrificing performance.", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2025-03-20", last_updated: "2025-03-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.111, output: 0.334 } }, "gemini-3.1-flash-lite": { id: "gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 0.272, output: 1.631, cache_read: 0.025, cache_write: 0.082 } }, "nova-pro-v1": { id: "nova-pro-v1", name: "Nova Pro 1.0", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "nova-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2024-12-03", last_updated: "2024-12-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 5000 }, cost: { input: 0.918, output: 3.671 } }, "glm-4.7": { id: "glm-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 198000 }, cost: { input: 0.78, output: 2.785 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 128000 }, cost: { input: 0.089, output: 0.446, cache_read: 0.01 } }, "minimax-m2.5": { id: "minimax-m2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196680, output: 196608 }, cost: { input: 0.296, output: 1.087, cache_read: 0.03 } }, "minimax-m2": { id: "minimax-m2", name: "MiniMax-M2", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 400000, output: 400000 }, cost: { input: 0.349, output: 1.405 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 1050000 }, cost: { input: 1.1, output: 6.599, cache_read: 0.11, cache_write: 1.38 } }, "gemma-4-31b-it": { id: "gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.223, output: 0.39 } }, "hermes-4-405b": { id: "hermes-4-405b", name: "hermes-4-405b", description: "Hermes 4 405B is a frontier hybrid-mode reasoning model built on Llama 3.1, optimized for advanced logic, math, coding, and structured output generation.", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2024-08-13", last_updated: "2024-08-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.996, output: 2.989 } }, "claude-opus4-6": { id: "claude-opus4-6", name: "Claude Opus 4.6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 5.313, output: 26.561, cache_read: 0.531, cache_write: 6.645 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 400000 }, cost: { input: 0.279, output: 2.192, cache_read: 0.056 } }, "mistral-7b-instruct-v0.2": { id: "mistral-7b-instruct-v0.2", name: "mistral-7b-instruct-v0.2", description: "Mistral 7B Instruct is a compact, 7B parameter model optimized for fast and efficient text and code generation with a 32K token context window.", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, release_date: "2025-05-26", last_updated: "2025-05-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 }, cost: { input: 0.159, output: 0.219 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.75, output: 3.5, cache_read: 0.201 } }, "mistral-small-3.2-24b-instruct-2506": { id: "mistral-small-3.2-24b-instruct-2506", name: "mistral-small-3.2-24b-instruct-2506", description: "Mistral-Small-3.2-24B-Instruct-2506 is a 24B parameter instruction-tuned model with enhanced long-context support (128k) and state-of-the-art vision understanding.", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2025-05-26", last_updated: "2025-05-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.1, output: 0.312 } }, "nova-micro-v1": { id: "nova-micro-v1", name: "nova-micro-v1", description: "Nova Micro is a multilingual text-to-text foundation model with strong reasoning capabilities and broad language coverage across 200+ languages.", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.04, output: 0.159 } }, "claude-opus4-5": { id: "claude-opus4-5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 200000 }, cost: { input: 5.313, output: 26.568, cache_read: 0.531, cache_write: 6.645 } }, "nvidia-nemotron-3-nano-omni": { id: "nvidia-nemotron-3-nano-omni", name: "nvidia-nemotron-3-nano-omni", description: "Nemotron-3-Nano-Omni is an open, efficient omni-modal reasoning model that unifies text, image, audio, and video for agentic AI workflows.", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 300000 }, cost: { input: 0.059, output: 0.237 } }, "gpt-5.1": { id: "gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 400000 }, cost: { input: 1.375, output: 10.96, cache_read: 0.156 } }, "qwen3-30b-a3b-instruct-2507": { id: "qwen3-30b-a3b-instruct-2507", name: "qwen3-30b-a3b-instruct-2507", description: "Qwen3-30B-A3B-Instruct-2507 is an advanced Mixture-of-Experts model optimized for reasoning, coding, and multilingual instruction following.", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.099, output: 0.299 } }, "nova-lite-v1": { id: "nova-lite-v1", name: "nova-lite-v1", description: "Nova Lite is a fast, low-cost multimodal foundation model capable of reasoning over text, images, and video in 200+ languages.", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 300000 }, cost: { input: 0.069, output: 0.275 } }, "devstral-2512": { id: "devstral-2512", name: "Devstral 2", description: "Mistral coding agent model for repository tasks and software engineering workflows", family: "devstral", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-12", release_date: "2025-12-09", last_updated: "2025-12-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.446, output: 2.228, cache_read: 0.045 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 1.495, output: 9.964, cache_read: 0.242, cache_write: 0.434 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 3, output: 14.999 } }, "llama-3.1-8b-instruct": { id: "llama-3.1-8b-instruct", name: "llama-3.1-8b-instruct", description: "Optimized for dialogue, this LLM by Meta outperforms other open-source chat models in benchmarks while prioritizing helpfulness and safety.", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2024-04-09", last_updated: "2024-04-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.167, output: 0.167 } }, "gpt-5-nano": { id: "gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 400000 }, cost: { input: 0.06, output: 0.439, cache_read: 0.019 } }, "glm-5-turbo": { id: "glm-5-turbo", name: "GLM-5-Turbo", description: "Faster GLM-5 lane for coding agents that need lower latency", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 202752 }, cost: { input: 1.186, output: 3.955, cache_read: 0.296, cache_write: 1.544 } }, "glm-5v-turbo": { id: "glm-5v-turbo", name: "GLM-5V-Turbo", description: "Fast GLM vision model for screenshots, documents, and multimodal agent tasks", family: "glm", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 202752 }, cost: { input: 1.186, output: 3.955, cache_read: 0.296, cache_write: 1.544 } }, "qwen3.5-397b-a17b": { id: "qwen3.5-397b-a17b", name: "Qwen3.5 397B-A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 250000 }, cost: { input: 0.668, output: 4.01 } }, "minimax-m2.1": { id: "minimax-m2.1", name: "MiniMax-M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196000, output: 196000 }, cost: { input: 0.359, output: 1.435 } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 1050000 }, cost: { input: 2.749, output: 16.498, cache_read: 0.275, cache_write: 3.437 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 2.2, output: 11, cache_read: 0.219, cache_write: 2.749 } }, "gpt-4.1": { id: "gpt-4.1", name: "GPT-4.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 1047576 }, cost: { input: 2.192, output: 8.769, cache_read: 0.546 } }, "qwen3guard-gen-0.6b": { id: "qwen3guard-gen-0.6b", name: "qwen3guard-gen-0.6b", description: "Qwen3Guard-Gen-0.6B is a lightweight multilingual safety moderation model that classifies prompts and responses into safe, controversial, or unsafe categories.", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, release_date: "2026-02-04", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 }, cost: { input: 0, output: 0 } }, "llama-3.1-405b-instruct": { id: "llama-3.1-405b-instruct", name: "Llama 3.1 405B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 1.95, output: 1.95 } }, "claude-opus-5": { id: "claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 5.5, output: 27.498, cache_read: 0.55, cache_write: 6.874 } }, "qwen3-coder-next": { id: "qwen3-coder-next", name: "Qwen3 Coder Next", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-09", release_date: "2026-02-03", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.167, output: 0.891 } }, "mistral-7b-instruct-v0.3": { id: "mistral-7b-instruct-v0.3", name: "mistral-7b-instruct-v0.3", description: "Mistral-7B-Instruct-v0.3 model is a fine-tuned version of the Mistral 7B base model, optimized for instruction-following tasks. Released in 2023, it is intended for demonstration purposes and does not include built-in guardrails or moderation features.", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2025-05-26", last_updated: "2025-05-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 127000, output: 127000 }, cost: { input: 0.111, output: 0.111 } }, "qwen3.5-122b-a10b": { id: "qwen3.5-122b-a10b", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.495, output: 3.46, cache_read: 0.124 } }, "hermes-4-70b": { id: "hermes-4-70b", name: "Hermes 4 70B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.129, output: 0.399 } }, "claude-4-5-sonnet": { id: "claude-4-5-sonnet", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 200000 }, cost: { input: 2.989, output: 14.945, cache_read: 0.326, cache_write: 4.078 } }, "mistral-large-2512": { id: "mistral-large-2512", name: "Mistral Large 3", description: "Mistral's largest general model for enterprise agents, coding, and multilingual reasoning", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.557, output: 1.671, cache_read: 0.056 } }, "qwen2.5-vl-72b-instruct": { id: "qwen2.5-vl-72b-instruct", name: "qwen2.5-vl-72b-instruct", description: "Qwen2.5-VL is a powerful vision-language model with advanced capabilities in visual understanding, long video reasoning, and structured output generation.", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: false, release_date: "2025-01-27", last_updated: "2025-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 }, cost: { input: 0.25, output: 0.747 } } } }, "xiaomi-token-plan-sgp": { id: "xiaomi-token-plan-sgp", env: ["XIAOMI_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://token-plan-sgp.xiaomimimo.com/v1", name: "Xiaomi Token Plan (Singapore)", doc: "https://platform.xiaomimimo.com/#/docs", models: { "mimo-v2.5-pro": { id: "mimo-v2.5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0 } }, "mimo-v2.5-tts-voiceclone": { id: "mimo-v2.5-tts-voiceclone", name: "MiMo-V2.5-TTS-VoiceClone", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "mimo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } }, "mimo-v2.5": { id: "mimo-v2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0 } }, "mimo-v2.5-tts-voicedesign": { id: "mimo-v2.5-tts-voicedesign", name: "MiMo-V2.5-TTS-VoiceDesign", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "mimo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } }, "mimo-v2-pro": { id: "mimo-v2-pro", name: "MiMo-V2-Pro", description: "Earlier MiMo Pro model for multimodal agents, reasoning, and code tasks", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "mimo-v2-tts": { id: "mimo-v2-tts", name: "MiMo-V2-TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "mimo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } }, "mimo-v2.5-tts": { id: "mimo-v2.5-tts", name: "MiMo-V2.5-TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "mimo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } } } }, "hpc-ai": { id: "hpc-ai", env: ["HPC_AI_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.hpc-ai.com/inference/v1", name: "HPC-AI", doc: "https://www.hpc-ai.com/doc/docs/quickstart/", models: { "zai-org/glm-5.1": { id: "zai-org/glm-5.1", name: "GLM 5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-08", last_updated: "2026-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202000, output: 202000 }, cost: { input: 0.615, output: 2.46, cache_read: 0.133 } }, "zai-org/glm-5.2": { id: "zai-org/glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "minimax/minimax-m2.5": { id: "minimax/minimax-m2.5", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196000, output: 195000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 128000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1002000, output: 128000 }, cost: { input: 1.74, output: 3.48, cache_read: 0.145 } }, "anthropic/claude-opus-4.7": { id: "anthropic/claude-opus-4.7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "moonshotai/kimi-k2.5": { id: "moonshotai/kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "moonshotai/kimi-k2.7-code": { id: "moonshotai/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } } } }, "minimax-cn": { id: "minimax-cn", env: ["MINIMAX_API_KEY"], npm: "@ai-sdk/anthropic", api: "https://api.minimaxi.com/anthropic/v1", name: "MiniMax (minimaxi.com)", doc: "https://platform.minimaxi.com/docs/guides/quickstart", models: { "MiniMax-M2": { id: "MiniMax-M2", name: "MiniMax-M2", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 128000 }, cost: { input: 0.3, output: 1.2 } }, "MiniMax-M2.7": { id: "MiniMax-M2.7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06, cache_write: 0.375 } }, "MiniMax-M2.1": { id: "MiniMax-M2.1", name: "MiniMax-M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "MiniMax-M2.5": { id: "MiniMax-M2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "MiniMax-M2.5-highspeed": { id: "MiniMax-M2.5-highspeed", name: "MiniMax-M2.5-highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-13", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.4, cache_read: 0.06, cache_write: 0.375 } }, "MiniMax-M2.7-highspeed": { id: "MiniMax-M2.7-highspeed", name: "MiniMax-M2.7-highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.4, cache_read: 0.06, cache_write: 0.375 } }, "MiniMax-M3": { id: "MiniMax-M3", name: "MiniMax-M3", description: "MiniMax multimodal coding model for long-context reasoning and agent tasks", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-25", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06, tiers: [{ input: 0.6, output: 2.4, cache_read: 0.12, tier: { type: "context", size: 512000 } }], context_over_200k: { input: 0.6, output: 2.4, cache_read: 0.12 } } } } }, ebcloud: { id: "ebcloud", env: ["EBCLOUD_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://maas-api.ebcloud.com/v1", name: "EBCloud", doc: "https://docs.ebtech.com/ai/model-api.html", models: { "Kimi-K2.6": { id: "Kimi-K2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.9286, output: 3.8571 } }, "DeepSeek-V4-Flash": { id: "DeepSeek-V4-Flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.143, output: 0.2857 } }, "GLM-5.1": { id: "GLM-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0.8571, output: 3.4286 } }, "DeepSeek-V4-Pro": { id: "DeepSeek-V4-Pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.4286, output: 0.8571 } } } }, databricks: { id: "databricks", env: ["DATABRICKS_HOST", "DATABRICKS_TOKEN"], npm: "@ai-sdk/openai-compatible", api: "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", name: "Databricks", doc: "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", models: { "databricks-gpt-5-nano": { id: "databricks-gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "databricks-gemini-3-1-flash-lite": { id: "databricks-gemini-3-1-flash-lite", name: "Gemini 3.1 Flash Lite Preview", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "databricks-gpt-oss-120b": { id: "databricks-gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.072, output: 0.28 } }, "databricks-claude-opus-4-5": { id: "databricks-claude-opus-4-5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "databricks-claude-sonnet-4-6": { id: "databricks-claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "databricks-claude-sonnet-4": { id: "databricks-claude-sonnet-4", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "databricks-gemini-3-flash": { id: "databricks-gemini-3-flash", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, input_audio: 1 } }, "databricks-gpt-oss-20b": { id: "databricks-gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.05, output: 0.2 } }, "databricks-glm-5-2": { id: "databricks-glm-5-2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "databricks-claude-opus-4-7": { id: "databricks-claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "databricks-gpt-5-6-sol": { id: "databricks-gpt-5-6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "databricks-gpt-5-4-nano": { id: "databricks-gpt-5-4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "databricks-gemini-2-5-pro": { id: "databricks-gemini-2-5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "databricks-gpt-5-6-terra": { id: "databricks-gpt-5-6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "databricks-gpt-5-5": { id: "databricks-gpt-5-5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 12.5, output: 75, cache_read: 1.25 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "databricks-gpt-5-2": { id: "databricks-gpt-5-2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "databricks-gemini-3-1-pro": { id: "databricks-gemini-3-1-pro", name: "Gemini 3.1 Pro Preview Custom Tools", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "databricks-claude-sonnet-4-5": { id: "databricks-claude-sonnet-4-5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "databricks-claude-haiku-4-5": { id: "databricks-claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "databricks-kimi-k2-7-code": { id: "databricks-kimi-k2-7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "databricks-claude-opus-4-1": { id: "databricks-claude-opus-4-1", name: "Claude Opus 4.1 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "databricks-gemini-3-pro": { id: "databricks-gemini-3-pro", name: "Gemini 3 Pro Preview", description: "Preview Gemini flagship for complex reasoning, coding, and rich multimodal prompts", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "databricks-gemini-2-5-flash": { id: "databricks-gemini-2-5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, input_audio: 1 } }, "databricks-claude-opus-4-6": { id: "databricks-claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "databricks-gpt-5-1": { id: "databricks-gpt-5-1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "databricks-gpt-5-4-mini": { id: "databricks-gpt-5-4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 1.5, output: 9, cache_read: 0.15 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "databricks-gpt-5-6-luna": { id: "databricks-gpt-5-6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1, output: 6, cache_read: 0.1, tiers: [{ input: 2, output: 9, cache_read: 0.2, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 2, output: 9, cache_read: 0.2 } } }, "databricks-gpt-5": { id: "databricks-gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "databricks-gpt-5-4": { id: "databricks-gpt-5-4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 5, output: 30, cache_read: 0.5 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "databricks-gpt-5-mini": { id: "databricks-gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } } } }, "minimax-cn-coding-plan": { id: "minimax-cn-coding-plan", env: ["MINIMAX_API_KEY"], npm: "@ai-sdk/anthropic", api: "https://api.minimaxi.com/anthropic/v1", name: "MiniMax Token Plan (minimaxi.com)", doc: "https://platform.minimaxi.com/docs/token-plan/intro", models: { "MiniMax-M2": { id: "MiniMax-M2", name: "MiniMax-M2", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 128000 }, cost: { input: 0, output: 0 } }, "MiniMax-M2.7": { id: "MiniMax-M2.7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "MiniMax-M2.1": { id: "MiniMax-M2.1", name: "MiniMax-M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "MiniMax-M2.5": { id: "MiniMax-M2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "MiniMax-M2.5-highspeed": { id: "MiniMax-M2.5-highspeed", name: "MiniMax-M2.5-highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-13", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "MiniMax-M2.7-highspeed": { id: "MiniMax-M2.7-highspeed", name: "MiniMax-M2.7-highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "MiniMax-M3": { id: "MiniMax-M3", name: "MiniMax-M3", description: "MiniMax multimodal coding model for long-context reasoning and agent tasks", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-25", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } } }; -}); - // packages/unifia/src/provider/models.ts -import path13 from "path"; +import path14 from "path"; var ModelsDev; var init_models = __esm(async () => { init_zod(); @@ -168978,7 +169275,7 @@ var init_models = __esm(async () => { } ModelsDev.onRefresh = onRefresh; const source = url3(); - const filepath = path13.join(Global.Path.cache, source === "https://models.dev" ? "models.json" : `models-${Hash.fast(source)}.json`); + const filepath = path14.join(Global.Path.cache, source === "https://models.dev" ? "models.json" : `models-${Hash.fast(source)}.json`); const ttl = 5 * 60 * 1000; ModelsDev.Model = zod_default.object({ id: zod_default.string(), @@ -169051,11 +169348,11 @@ var init_models = __esm(async () => { const result6 = await Filesystem.readJson(Flag.UNIFIA_MODELS_PATH ?? filepath).catch(() => {}); if (result6) return result6; - const snapshot4 = await Promise.resolve().then(() => (init_models_snapshot(), exports_models_snapshot)).then((m3) => m3.snapshot).catch(() => { + const snapshot3 = await import("./models-snapshot.js").then((m3) => m3.snapshot).catch(() => { return; }); - if (snapshot4) - return snapshot4; + if (snapshot3) + return snapshot3; if (Flag.UNIFIA_DISABLE_MODELS_FETCH) return {}; try { @@ -169134,15 +169431,15 @@ var init_models = __esm(async () => { }); // packages/unifia/src/util/archive.ts -import path14 from "path"; +import path15 from "path"; var Archive; var init_archive = __esm(() => { init_process2(); ((Archive) => { async function extractZip(zipPath, destDir) { if (process.platform === "win32") { - const winZipPath = path14.resolve(zipPath); - const winDestDir = path14.resolve(destDir); + const winZipPath = path15.resolve(zipPath); + const winDestDir = path15.resolve(destDir); const cmd = `$global:ProgressPreference = 'SilentlyContinue'; Expand-Archive -Path '${winZipPath}' -DestinationPath '${winDestDir}' -Force`; await Process.run(["powershell", "-NoProfile", "-NonInteractive", "-Command", cmd]); return; @@ -169155,13 +169452,13 @@ var init_archive = __esm(() => { // packages/util/src/module.ts import { createRequire as createRequire3 } from "module"; -import path15 from "path"; +import path16 from "path"; var Module2; var init_module = __esm(() => { ((Module) => { function resolve9(id2, dir2) { try { - return createRequire3(path15.join(dir2, "package.json")).resolve(id2); + return createRequire3(path16.join(dir2, "package.json")).resolve(id2); } catch {} } Module.resolve = resolve9; @@ -169187,14 +169484,14 @@ var init_launch = __esm(() => { }); // packages/unifia/src/lsp/server-shared.ts -import path16 from "path"; +import path17 from "path"; import fs6 from "fs/promises"; var log7, pathExists = async (p2) => fs6.stat(p2).then(() => true).catch(() => false), run7 = (cmd, opts = {}) => Process.run(cmd, { ...opts, nothrow: true }), output = (cmd, opts = {}) => Process.text(cmd, { ...opts, nothrow: true }), NearestRoot = (includePatterns, excludePatterns) => { return async (file4) => { if (excludePatterns) { const excludedFiles = Filesystem.up({ targets: excludePatterns, - start: path16.dirname(file4), + start: path17.dirname(file4), stop: Instance.directory }); const excluded = await excludedFiles.next(); @@ -169204,14 +169501,14 @@ var log7, pathExists = async (p2) => fs6.stat(p2).then(() => true).catch(() => f } const files = Filesystem.up({ targets: includePatterns, - start: path16.dirname(file4), + start: path17.dirname(file4), stop: Instance.directory }); const first2 = await files.next(); await files.return(); if (!first2.value) return Instance.directory; - return path16.dirname(first2.value); + return path17.dirname(first2.value); }; }; var init_server_shared = __esm(async () => { @@ -169225,7 +169522,7 @@ var init_server_shared = __esm(async () => { }); // packages/unifia/src/lsp/server-defs-a.ts -import path17 from "path"; +import path18 from "path"; import fs7 from "fs/promises"; import { text as text5 } from "stream/consumers"; var Deno2, Typescript, Vue, ESLint, Oxlint, Biome, Gopls, Rubocop, Ty, Pyright, ElixirLS, Zls; @@ -169248,14 +169545,14 @@ var init_server_defs_a = __esm(async () => { root: async (file4) => { const files = Filesystem.up({ targets: ["deno.json", "deno.jsonc"], - start: path17.dirname(file4), + start: path18.dirname(file4), stop: Instance.directory }); const first2 = await files.next(); await files.return(); if (!first2.value) return; - return path17.dirname(first2.value); + return path18.dirname(first2.value); }, extensions: [".ts", ".tsx", ".js", ".jsx", ".mjs"], async spawn(root) { @@ -169336,7 +169633,7 @@ var init_server_defs_a = __esm(async () => { if (!eslint) return; log7.info("spawning eslint server"); - const serverPath = path17.join(Global.Path.bin, "vscode-eslint", "server", "out", "eslintServer.js"); + const serverPath = path18.join(Global.Path.bin, "vscode-eslint", "server", "out", "eslintServer.js"); if (!await Filesystem.exists(serverPath)) { if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; @@ -169344,7 +169641,7 @@ var init_server_defs_a = __esm(async () => { const response = await fetch("https://github.com/microsoft/vscode-eslint/archive/refs/heads/main.zip"); if (!response.ok) return; - const zipPath = path17.join(Global.Path.bin, "vscode-eslint.zip"); + const zipPath = path18.join(Global.Path.bin, "vscode-eslint.zip"); if (response.body) await Filesystem.writeStream(zipPath, response.body); const ok = await Archive.extractZip(zipPath, Global.Path.bin).then(() => true).catch((error46) => { @@ -169354,8 +169651,8 @@ var init_server_defs_a = __esm(async () => { if (!ok) return; await fs7.rm(zipPath, { force: true }); - const extractedPath = path17.join(Global.Path.bin, "vscode-eslint-main"); - const finalPath = path17.join(Global.Path.bin, "vscode-eslint"); + const extractedPath = path18.join(Global.Path.bin, "vscode-eslint-main"); + const finalPath = path18.join(Global.Path.bin, "vscode-eslint"); const stats = await fs7.stat(finalPath).catch(() => { return; }); @@ -169394,10 +169691,10 @@ var init_server_defs_a = __esm(async () => { extensions: [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".mts", ".cts", ".vue", ".astro", ".svelte"], async spawn(root) { const ext2 = process.platform === "win32" ? ".cmd" : ""; - const serverTarget = path17.join("node_modules", ".bin", "oxc_language_server" + ext2); - const lintTarget = path17.join("node_modules", ".bin", "oxlint" + ext2); + const serverTarget = path18.join("node_modules", ".bin", "oxc_language_server" + ext2); + const lintTarget = path18.join("node_modules", ".bin", "oxlint" + ext2); const resolveBin = async (target) => { - const localBin = path17.join(root, target); + const localBin = path18.join(root, target); if (await Filesystem.exists(localBin)) return localBin; const candidates = Filesystem.up({ @@ -169479,7 +169776,7 @@ var init_server_defs_a = __esm(async () => { ".html" ], async spawn(root) { - const localBin = path17.join(root, "node_modules", ".bin", "biome"); + const localBin = path18.join(root, "node_modules", ".bin", "biome"); let bin; if (await Filesystem.exists(localBin)) bin = localBin; @@ -169537,7 +169834,7 @@ var init_server_defs_a = __esm(async () => { log7.error("Failed to install gopls"); return; } - bin = path17.join(Global.Path.bin, "gopls" + (process.platform === "win32" ? ".exe" : "")); + bin = path18.join(Global.Path.bin, "gopls" + (process.platform === "win32" ? ".exe" : "")); log7.info(`installed gopls`, { bin }); @@ -169575,7 +169872,7 @@ var init_server_defs_a = __esm(async () => { log7.error("Failed to install rubocop"); return; } - bin = path17.join(Global.Path.bin, "rubocop" + (process.platform === "win32" ? ".exe" : "")); + bin = path18.join(Global.Path.bin, "rubocop" + (process.platform === "win32" ? ".exe" : "")); log7.info(`installed rubocop`, { bin }); @@ -169605,10 +169902,10 @@ var init_server_defs_a = __esm(async () => { } let binary2 = which("ty"); const initialization = {}; - const potentialVenvPaths = [process.env["VIRTUAL_ENV"], path17.join(root, ".venv"), path17.join(root, "venv")].filter((p2) => p2 !== undefined); + const potentialVenvPaths = [process.env["VIRTUAL_ENV"], path18.join(root, ".venv"), path18.join(root, "venv")].filter((p2) => p2 !== undefined); for (const venvPath of potentialVenvPaths) { const isWindows = process.platform === "win32"; - const potentialPythonPath = isWindows ? path17.join(venvPath, "Scripts", "python.exe") : path17.join(venvPath, "bin", "python"); + const potentialPythonPath = isWindows ? path18.join(venvPath, "Scripts", "python.exe") : path18.join(venvPath, "bin", "python"); if (await Filesystem.exists(potentialPythonPath)) { initialization["pythonPath"] = potentialPythonPath; break; @@ -169617,7 +169914,7 @@ var init_server_defs_a = __esm(async () => { if (!binary2) { for (const venvPath of potentialVenvPaths) { const isWindows = process.platform === "win32"; - const potentialTyPath = isWindows ? path17.join(venvPath, "Scripts", "ty.exe") : path17.join(venvPath, "bin", "ty"); + const potentialTyPath = isWindows ? path18.join(venvPath, "Scripts", "ty.exe") : path18.join(venvPath, "bin", "ty"); if (await Filesystem.exists(potentialTyPath)) { binary2 = potentialTyPath; break; @@ -169654,10 +169951,10 @@ var init_server_defs_a = __esm(async () => { } args3.push("--stdio"); const initialization = {}; - const potentialVenvPaths = [process.env["VIRTUAL_ENV"], path17.join(root, ".venv"), path17.join(root, "venv")].filter((p2) => p2 !== undefined); + const potentialVenvPaths = [process.env["VIRTUAL_ENV"], path18.join(root, ".venv"), path18.join(root, "venv")].filter((p2) => p2 !== undefined); for (const venvPath of potentialVenvPaths) { const isWindows = process.platform === "win32"; - const potentialPythonPath = isWindows ? path17.join(venvPath, "Scripts", "python.exe") : path17.join(venvPath, "bin", "python"); + const potentialPythonPath = isWindows ? path18.join(venvPath, "Scripts", "python.exe") : path18.join(venvPath, "bin", "python"); if (await Filesystem.exists(potentialPythonPath)) { initialization["pythonPath"] = potentialPythonPath; break; @@ -169682,8 +169979,8 @@ var init_server_defs_a = __esm(async () => { async spawn(root) { let binary2 = which("elixir-ls"); if (!binary2) { - const elixirLsPath = path17.join(Global.Path.bin, "elixir-ls"); - binary2 = path17.join(Global.Path.bin, "elixir-ls-master", "release", process.platform === "win32" ? "language_server.bat" : "language_server.sh"); + const elixirLsPath = path18.join(Global.Path.bin, "elixir-ls"); + binary2 = path18.join(Global.Path.bin, "elixir-ls-master", "release", process.platform === "win32" ? "language_server.bat" : "language_server.sh"); if (!await Filesystem.exists(binary2)) { const elixir = which("elixir"); if (!elixir) { @@ -169696,7 +169993,7 @@ var init_server_defs_a = __esm(async () => { const response = await fetch("https://github.com/elixir-lsp/elixir-ls/archive/refs/heads/master.zip"); if (!response.ok) return; - const zipPath = path17.join(Global.Path.bin, "elixir-ls.zip"); + const zipPath = path18.join(Global.Path.bin, "elixir-ls.zip"); if (response.body) await Filesystem.writeStream(zipPath, response.body); const ok = await Archive.extractZip(zipPath, Global.Path.bin).then(() => true).catch((error46) => { @@ -169709,7 +170006,7 @@ var init_server_defs_a = __esm(async () => { force: true, recursive: true }); - const cwd = path17.join(Global.Path.bin, "elixir-ls-master"); + const cwd = path18.join(Global.Path.bin, "elixir-ls-master"); const env3 = { MIX_ENV: "prod", ...process.env }; await Process.run(["mix", "deps.get"], { cwd, env: env3 }); await Process.run(["mix", "compile"], { cwd, env: env3 }); @@ -169789,7 +170086,7 @@ var init_server_defs_a = __esm(async () => { log7.error("Failed to download zls"); return; } - const tempPath = path17.join(Global.Path.bin, assetName); + const tempPath = path18.join(Global.Path.bin, assetName); if (downloadResponse.body) await Filesystem.writeStream(tempPath, downloadResponse.body); if (ext2 === "zip") { @@ -169803,7 +170100,7 @@ var init_server_defs_a = __esm(async () => { await run7(["tar", "-xf", tempPath], { cwd: Global.Path.bin }); } await fs7.rm(tempPath, { force: true }); - bin = path17.join(Global.Path.bin, "zls" + (platform === "win32" ? ".exe" : "")); + bin = path18.join(Global.Path.bin, "zls" + (platform === "win32" ? ".exe" : "")); if (!await Filesystem.exists(bin)) { log7.error("Failed to extract zls binary"); return; @@ -169823,7 +170120,7 @@ var init_server_defs_a = __esm(async () => { }); // packages/unifia/src/lsp/server-defs-b.ts -import path18 from "path"; +import path19 from "path"; import os6 from "os"; import fs8 from "fs/promises"; var CSharp, FSharp, SourceKit, RustAnalyzer, Clangd, Svelte, Astro, JDTLS, KotlinLS, YamlLS, LuaLS; @@ -169852,7 +170149,7 @@ var init_server_defs_b = __esm(async () => { log7.error(".NET SDK is required to install csharp-ls"); return; } - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; log7.info("installing csharp-ls via dotnet tool"); const proc = Process.spawn(["dotnet", "tool", "install", "csharp-ls", "--tool-path", Global.Path.bin], { @@ -169865,7 +170162,7 @@ var init_server_defs_b = __esm(async () => { log7.error("Failed to install csharp-ls"); return; } - bin = path18.join(Global.Path.bin, "csharp-ls" + (process.platform === "win32" ? ".exe" : "")); + bin = path19.join(Global.Path.bin, "csharp-ls" + (process.platform === "win32" ? ".exe" : "")); log7.info(`installed csharp-ls`, { bin }); } return { @@ -169886,7 +170183,7 @@ var init_server_defs_b = __esm(async () => { log7.error(".NET SDK is required to install fsautocomplete"); return; } - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; log7.info("installing fsautocomplete via dotnet tool"); const proc = Process.spawn(["dotnet", "tool", "install", "fsautocomplete", "--tool-path", Global.Path.bin], { @@ -169899,7 +170196,7 @@ var init_server_defs_b = __esm(async () => { log7.error("Failed to install fsautocomplete"); return; } - bin = path18.join(Global.Path.bin, "fsautocomplete" + (process.platform === "win32" ? ".exe" : "")); + bin = path19.join(Global.Path.bin, "fsautocomplete" + (process.platform === "win32" ? ".exe" : "")); log7.info(`installed fsautocomplete`, { bin }); } return { @@ -169943,15 +170240,15 @@ var init_server_defs_b = __esm(async () => { return; } let currentDir = crateRoot; - while (currentDir !== path18.dirname(currentDir)) { - const cargoTomlPath = path18.join(currentDir, "Cargo.toml"); + while (currentDir !== path19.dirname(currentDir)) { + const cargoTomlPath = path19.join(currentDir, "Cargo.toml"); try { const cargoTomlContent = await Filesystem.readText(cargoTomlPath); if (cargoTomlContent.includes("[workspace]")) { return currentDir; } } catch (_err) {} - const parentDir = path18.dirname(currentDir); + const parentDir = path19.dirname(currentDir); if (parentDir === currentDir) break; currentDir = parentDir; @@ -169989,7 +170286,7 @@ var init_server_defs_b = __esm(async () => { }; } const ext2 = process.platform === "win32" ? ".exe" : ""; - const direct = path18.join(Global.Path.bin, "clangd" + ext2); + const direct = path19.join(Global.Path.bin, "clangd" + ext2); if (await Filesystem.exists(direct)) { return { process: spawn(direct, args3, { @@ -170003,7 +170300,7 @@ var init_server_defs_b = __esm(async () => { continue; if (!entry.name.startsWith("clangd_")) continue; - const candidate = path18.join(Global.Path.bin, entry.name, "bin", "clangd" + ext2); + const candidate = path19.join(Global.Path.bin, entry.name, "bin", "clangd" + ext2); if (await Filesystem.exists(candidate)) { return { process: spawn(candidate, args3, { @@ -170012,7 +170309,7 @@ var init_server_defs_b = __esm(async () => { }; } } - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; log7.info("downloading clangd from GitHub releases"); const releaseResponse = await fetch("https://api.github.com/repos/clangd/clangd/releases/latest"); @@ -170058,7 +170355,7 @@ var init_server_defs_b = __esm(async () => { log7.error("Failed to download clangd"); return; } - const archive = path18.join(Global.Path.bin, name3); + const archive = path19.join(Global.Path.bin, name3); const buf = await downloadResponse.arrayBuffer(); if (buf.byteLength === 0) { log7.error("Failed to write clangd archive"); @@ -170083,7 +170380,7 @@ var init_server_defs_b = __esm(async () => { await run7(["tar", "-xf", archive], { cwd: Global.Path.bin }); } await fs8.rm(archive, { force: true }); - const bin = path18.join(Global.Path.bin, "clangd_" + tag4, "bin", "clangd" + ext2); + const bin = path19.join(Global.Path.bin, "clangd_" + tag4, "bin", "clangd" + ext2); if (!await Filesystem.exists(bin)) { log7.error("Failed to extract clangd binary"); return; @@ -170091,8 +170388,8 @@ var init_server_defs_b = __esm(async () => { if (platform !== "win32") { await fs8.chmod(bin, 493).catch(() => {}); } - await fs8.unlink(path18.join(Global.Path.bin, "clangd")).catch(() => {}); - await fs8.symlink(bin, path18.join(Global.Path.bin, "clangd")).catch(() => {}); + await fs8.unlink(path19.join(Global.Path.bin, "clangd")).catch(() => {}); + await fs8.symlink(bin, path19.join(Global.Path.bin, "clangd")).catch(() => {}); log7.info(`installed clangd`, { bin }); return { process: spawn(bin, args3, { @@ -170109,7 +170406,7 @@ var init_server_defs_b = __esm(async () => { let binary2 = which("svelteserver"); const args3 = []; if (!binary2) { - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; const resolved = await Npm.which("svelte-language-server"); if (!resolved) @@ -170139,11 +170436,11 @@ var init_server_defs_b = __esm(async () => { log7.info("typescript not found, required for Astro language server"); return; } - const tsdk = path18.dirname(tsserver); + const tsdk = path19.dirname(tsserver); let binary2 = which("astro-ls"); const args3 = []; if (!binary2) { - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; const resolved = await Npm.which("@astrojs/language-server"); if (!resolved) @@ -170200,11 +170497,11 @@ var init_server_defs_b = __esm(async () => { log7.error("JDTLS requires at least Java 21."); return; } - const distPath = path18.join(Global.Path.bin, "jdtls"); - const launcherDir = path18.join(distPath, "plugins"); + const distPath = path19.join(Global.Path.bin, "jdtls"); + const launcherDir = path19.join(distPath, "plugins"); const installed = await pathExists(launcherDir); if (!installed) { - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; log7.info("Downloading JDTLS LSP server."); await fs8.mkdir(distPath, { recursive: true }); @@ -170216,23 +170513,23 @@ var init_server_defs_b = __esm(async () => { log7.error("Failed to download JDTLS", { status: download.status, statusText: download.statusText }); return; } - await Filesystem.writeStream(path18.join(distPath, archiveName), download.body); + await Filesystem.writeStream(path19.join(distPath, archiveName), download.body); log7.info("Extracting JDTLS archive"); const tarResult = await run7(["tar", "-xzf", archiveName], { cwd: distPath }); if (tarResult.code !== 0) { log7.error("Failed to extract JDTLS", { exitCode: tarResult.code, stderr: tarResult.stderr.toString() }); return; } - await fs8.rm(path18.join(distPath, archiveName), { force: true }); + await fs8.rm(path19.join(distPath, archiveName), { force: true }); log7.info("JDTLS download and extraction completed"); } const jarFileName = (await fs8.readdir(launcherDir).catch(() => [])).find((item) => /^org\.eclipse\.equinox\.launcher_.*\.jar$/.test(item))?.trim() ?? ""; - const launcherJar = path18.join(launcherDir, jarFileName); + const launcherJar = path19.join(launcherDir, jarFileName); if (!await pathExists(launcherJar)) { log7.error(`Failed to locate the JDTLS launcher module in the installed directory: ${distPath}.`); return; } - const configFile = path18.join(distPath, (() => { + const configFile = path19.join(distPath, (() => { switch (process.platform) { case "darwin": return "config_mac"; @@ -170244,7 +170541,7 @@ var init_server_defs_b = __esm(async () => { return "config_linux"; } })()); - const dataDir = await fs8.mkdtemp(path18.join(os6.tmpdir(), "opencode-jdtls-data")); + const dataDir = await fs8.mkdtemp(path19.join(os6.tmpdir(), "opencode-jdtls-data")); return { process: spawn(java, [ "-jar", @@ -170282,11 +170579,11 @@ var init_server_defs_b = __esm(async () => { return NearestRoot(["pom.xml"])(file4); }, async spawn(root) { - const distPath = path18.join(Global.Path.bin, "kotlin-ls"); - const launcherScript = process.platform === "win32" ? path18.join(distPath, "kotlin-lsp.cmd") : path18.join(distPath, "kotlin-lsp.sh"); + const distPath = path19.join(Global.Path.bin, "kotlin-ls"); + const launcherScript = process.platform === "win32" ? path19.join(distPath, "kotlin-lsp.cmd") : path19.join(distPath, "kotlin-lsp.sh"); const installed = await Filesystem.exists(launcherScript); if (!installed) { - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; log7.info("Downloading Kotlin Language Server from GitHub."); const releaseResponse = await fetch("https://api.github.com/repos/Kotlin/kotlin-lsp/releases/latest"); @@ -170323,7 +170620,7 @@ var init_server_defs_b = __esm(async () => { const assetName = `kotlin-lsp-${version4}-${kotlinPlatform}-${kotlinArch}.zip`; const releaseURL = `https://download-cdn.jetbrains.com/kotlin-lsp/${version4}/${assetName}`; await fs8.mkdir(distPath, { recursive: true }); - const archivePath = path18.join(distPath, "kotlin-ls.zip"); + const archivePath = path19.join(distPath, "kotlin-ls.zip"); const download = await fetch(releaseURL); if (!download.ok || !download.body) { log7.error("Failed to download Kotlin Language Server", { @@ -170364,7 +170661,7 @@ var init_server_defs_b = __esm(async () => { let binary2 = which("yaml-language-server"); const args3 = []; if (!binary2) { - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; const resolved = await Npm.which("yaml-language-server"); if (!resolved) @@ -170398,7 +170695,7 @@ var init_server_defs_b = __esm(async () => { async spawn(root) { let bin = which("lua-language-server"); if (!bin) { - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; log7.info("downloading lua-language-server from GitHub releases"); const releaseResponse = await fetch("https://api.github.com/repos/LuaLS/lua-language-server/releases/latest"); @@ -170450,10 +170747,10 @@ var init_server_defs_b = __esm(async () => { log7.error("Failed to download lua-language-server"); return; } - const tempPath = path18.join(Global.Path.bin, assetName); + const tempPath = path19.join(Global.Path.bin, assetName); if (downloadResponse.body) await Filesystem.writeStream(tempPath, downloadResponse.body); - const installDir = path18.join(Global.Path.bin, `lua-language-server-${lualsArch}-${lualsPlatform}`); + const installDir = path19.join(Global.Path.bin, `lua-language-server-${lualsArch}-${lualsPlatform}`); const stats = await fs8.stat(installDir).catch(() => { return; }); @@ -170477,7 +170774,7 @@ var init_server_defs_b = __esm(async () => { return; } await fs8.rm(tempPath, { force: true }); - bin = path18.join(installDir, "bin", "lua-language-server" + (platform === "win32" ? ".exe" : "")); + bin = path19.join(installDir, "bin", "lua-language-server" + (platform === "win32" ? ".exe" : "")); if (!await Filesystem.exists(bin)) { log7.error("Failed to extract lua-language-server binary"); return; @@ -170504,7 +170801,7 @@ var init_server_defs_b = __esm(async () => { }); // packages/unifia/src/lsp/server-defs-c.ts -import path19 from "path"; +import path20 from "path"; import fs9 from "fs/promises"; var PHPIntelephense, Prisma, Dart, Ocaml, BashLS, TerraformLS, TexLab, DockerfileLS, Gleam, Clojure, Nixd, Tinymist, HLS, JuliaLS; var init_server_defs_c = __esm(async () => { @@ -170527,7 +170824,7 @@ var init_server_defs_c = __esm(async () => { let binary2 = which("intelephense"); const args3 = []; if (!binary2) { - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; const resolved = await Npm.which("intelephense"); if (!resolved) @@ -170610,7 +170907,7 @@ var init_server_defs_c = __esm(async () => { let binary2 = which("bash-language-server"); const args3 = []; if (!binary2) { - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; const resolved = await Npm.which("bash-language-server"); if (!resolved) @@ -170636,7 +170933,7 @@ var init_server_defs_c = __esm(async () => { async spawn(root) { let bin = which("terraform-ls"); if (!bin) { - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; log7.info("downloading terraform-ls from HashiCorp releases"); const releaseResponse = await fetch("https://api.releases.hashicorp.com/v1/releases/terraform-ls/latest"); @@ -170660,7 +170957,7 @@ var init_server_defs_c = __esm(async () => { log7.error("Failed to download terraform-ls"); return; } - const tempPath = path19.join(Global.Path.bin, "terraform-ls.zip"); + const tempPath = path20.join(Global.Path.bin, "terraform-ls.zip"); if (downloadResponse.body) await Filesystem.writeStream(tempPath, downloadResponse.body); const ok = await Archive.extractZip(tempPath, Global.Path.bin).then(() => true).catch((error46) => { @@ -170670,7 +170967,7 @@ var init_server_defs_c = __esm(async () => { if (!ok) return; await fs9.rm(tempPath, { force: true }); - bin = path19.join(Global.Path.bin, "terraform-ls" + (platform === "win32" ? ".exe" : "")); + bin = path20.join(Global.Path.bin, "terraform-ls" + (platform === "win32" ? ".exe" : "")); if (!await Filesystem.exists(bin)) { log7.error("Failed to extract terraform-ls binary"); return; @@ -170700,7 +170997,7 @@ var init_server_defs_c = __esm(async () => { async spawn(root) { let bin = which("texlab"); if (!bin) { - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; log7.info("downloading texlab from GitHub releases"); const response = await fetch("https://api.github.com/repos/latex-lsp/texlab/releases/latest"); @@ -170731,7 +171028,7 @@ var init_server_defs_c = __esm(async () => { log7.error("Failed to download texlab"); return; } - const tempPath = path19.join(Global.Path.bin, assetName); + const tempPath = path20.join(Global.Path.bin, assetName); if (downloadResponse.body) await Filesystem.writeStream(tempPath, downloadResponse.body); if (ext2 === "zip") { @@ -170746,7 +171043,7 @@ var init_server_defs_c = __esm(async () => { await run7(["tar", "-xzf", tempPath], { cwd: Global.Path.bin }); } await fs9.rm(tempPath, { force: true }); - bin = path19.join(Global.Path.bin, "texlab" + (platform === "win32" ? ".exe" : "")); + bin = path20.join(Global.Path.bin, "texlab" + (platform === "win32" ? ".exe" : "")); if (!await Filesystem.exists(bin)) { log7.error("Failed to extract texlab binary"); return; @@ -170771,7 +171068,7 @@ var init_server_defs_c = __esm(async () => { let binary2 = which("docker-langserver"); const args3 = []; if (!binary2) { - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; const resolved = await Npm.which("dockerfile-language-server-nodejs"); if (!resolved) @@ -170861,7 +171158,7 @@ var init_server_defs_c = __esm(async () => { async spawn(root) { let bin = which("tinymist"); if (!bin) { - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; log7.info("downloading tinymist from GitHub releases"); const response = await fetch("https://api.github.com/repos/Myriad-Dreamin/tinymist/releases/latest"); @@ -170897,7 +171194,7 @@ var init_server_defs_c = __esm(async () => { log7.error("Failed to download tinymist"); return; } - const tempPath = path19.join(Global.Path.bin, assetName); + const tempPath = path20.join(Global.Path.bin, assetName); if (downloadResponse.body) await Filesystem.writeStream(tempPath, downloadResponse.body); if (ext2 === "zip") { @@ -170911,7 +171208,7 @@ var init_server_defs_c = __esm(async () => { await run7(["tar", "-xzf", tempPath, "--strip-components=1"], { cwd: Global.Path.bin }); } await fs9.rm(tempPath, { force: true }); - bin = path19.join(Global.Path.bin, "tinymist" + (platform === "win32" ? ".exe" : "")); + bin = path20.join(Global.Path.bin, "tinymist" + (platform === "win32" ? ".exe" : "")); if (!await Filesystem.exists(bin)) { log7.error("Failed to extract tinymist binary"); return; @@ -171090,8 +171387,8 @@ function toBatchEvents(projection) { class LangfuseExporter { config; name = "langfuse"; - constructor(config3) { - this.config = config3; + constructor(config2) { + this.config = config2; } async export(batch) { if (!batch.length) @@ -171133,10 +171430,10 @@ var init_langfuse = __esm(() => { }); // packages/unifia/src/observability/exporter.ts -function fromConfig(config3) { - if (!config3?.exporters?.length) +function fromConfig(config2) { + if (!config2?.exporters?.length) return []; - return config3.exporters.map((entry) => { + return config2.exporters.map((entry) => { switch (entry.type) { case "langfuse": return new LangfuseExporter(entry); @@ -171458,7 +171755,7 @@ var init_config_schema = __esm(async () => { $schema: zod_default.string().optional().describe("JSON schema reference for configuration validation"), logLevel: Log.Level.optional().describe("Log level"), server: Server.optional().describe("Server configuration for unifia serve and web commands"), - command: zod_default.record(zod_default.string(), Command).optional().describe("Command configuration, see https://opencode.ai/docs/commands"), + command: zod_default.record(zod_default.string(), Command).optional().describe("Command configuration, see https://github.com/Rwanbt/unifia"), skills: Skills.optional().describe("Additional skill folder paths"), watcher: zod_default.object({ ignore: zod_default.array(zod_default.string()).optional() @@ -171487,7 +171784,7 @@ var init_config_schema = __esm(async () => { title: Agent.optional(), summary: Agent.optional(), compaction: Agent.optional() - }).catchall(Agent).optional().describe("Agent configuration, see https://opencode.ai/docs/agents"), + }).catchall(Agent).optional().describe("Agent configuration, see https://github.com/Rwanbt/unifia"), provider: zod_default.record(zod_default.string(), Provider).optional().describe("Custom provider configurations and model overrides"), mcp: zod_default.record(zod_default.string(), zod_default.union([ Mcp, @@ -171524,12 +171821,12 @@ var init_config_schema = __esm(async () => { if (typeof data2 === "boolean") return true; const serverIds = new Set(Object.values(LSPServer).map((s5) => s5.id)); - return Object.entries(data2).every(([id2, config3]) => { - if (config3.disabled) + return Object.entries(data2).every(([id2, config2]) => { + if (config2.disabled) return true; if (serverIds.has(id2)) return true; - return Boolean(config3.extensions); + return Boolean(config2.extensions); }); }, { error: "For custom LSP servers, 'extensions' array is required." @@ -172492,7 +172789,7 @@ function ceil2(x3) { function clamp9(x3, min13, max13) { return new this(x3).clamp(min13, max13); } -function config3(obj) { +function config2(obj) { if (!obj || typeof obj !== "object") throw Error(decimalError + "Object expected"); var i6, p2, v3, useDefaults = obj.defaults === true, ps2 = [ @@ -172655,7 +172952,7 @@ function clone3(obj) { Decimal.ROUND_HALF_CEIL = 7; Decimal.ROUND_HALF_FLOOR = 8; Decimal.EUCLID = 9; - Decimal.config = Decimal.set = config3; + Decimal.config = Decimal.set = config2; Decimal.clone = clone3; Decimal.isDecimal = isDecimalInstance; Decimal.abs = abs4; @@ -174129,7 +174426,7 @@ var init_sync = __esm(async () => { } Database.transaction((tx2) => { projector(tx2, event.data); - if (Flag.OPENCODE_EXPERIMENTAL_WORKSPACES) { + if (Flag.UNIFIA_EXPERIMENTAL_WORKSPACES) { tx2.insert(EventSequenceTable).values({ aggregate_id: event.aggregateID, seq: event.seq @@ -174231,7 +174528,7 @@ var init_sync = __esm(async () => { // packages/unifia/src/git/credentials.ts import fs10 from "fs/promises"; import os7 from "os"; -import path20 from "path"; +import path21 from "path"; async function readCredentials() { try { const raw3 = await fs10.readFile(CREDS_FILE, "utf8"); @@ -174268,8 +174565,8 @@ async function buildAuthEnv(creds) { if (creds.passphrase) { throw new Error("SSH keys with a passphrase are not yet supported. Please use an unencrypted key or HTTPS token auth."); } - const keyDir = await fs10.mkdtemp(path20.join(os7.tmpdir(), "oc-git-")); - const keyPath = path20.join(keyDir, "key"); + const keyDir = await fs10.mkdtemp(path21.join(os7.tmpdir(), "oc-git-")); + const keyPath = path21.join(keyDir, "key"); await fs10.writeFile(keyPath, creds.privateKey, { mode: 384, encoding: "utf8" }); const sshCmd = `ssh -i "${keyPath}" -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new -o BatchMode=yes`; return { @@ -174287,7 +174584,7 @@ function maskCredentials(creds) { var CREDS_FILE, CREDS_MODE = 384; var init_credentials = __esm(async () => { await init_global(); - CREDS_FILE = path20.join(Global.Path.config, "git-credentials.json"); + CREDS_FILE = path21.join(Global.Path.config, "git-credentials.json"); }); // packages/unifia/src/security/dlp.ts @@ -174529,12 +174826,12 @@ var init_client = __esm(async () => { }); // packages/unifia/src/github/auth.ts -import path21 from "path"; +import path22 from "path"; function backend() { - const override = process.env.OPENCODE_AUTH_STORAGE?.toLowerCase(); + const override = process.env.UNIFIA_AUTH_STORAGE?.toLowerCase(); if (override === "file" || override === "keychain" || override === "encrypted-file") return override; - return process.env.OPENCODE_CLIENT === "mobile-embedded" ? "encrypted-file" : "file"; + return process.env.UNIFIA_CLIENT === "mobile-embedded" ? "encrypted-file" : "file"; } function keychain() { const kc = new KeychainStorage(SERVICE); @@ -174572,7 +174869,7 @@ async function writeEncrypted(session) { const iv = crypto3.randomBytes(12); const cipher = crypto3.createCipheriv("aes-256-gcm", key, iv); const ciphertext = Buffer.concat([cipher.update(JSON.stringify(session), "utf8"), cipher.final()]); - await fs11.mkdir(path21.dirname(encryptedFile2), { recursive: true }); + await fs11.mkdir(path22.dirname(encryptedFile2), { recursive: true }); await fs11.writeFile(encryptedFile2, JSON.stringify({ v: 1, iv: iv.toString("base64"), @@ -174594,9 +174891,15 @@ async function writePlain(session) { await fs11.rm(file4, { force: true }); return; } - const tmp = `${file4}.tmp`; - await fs11.writeFile(tmp, JSON.stringify(session, null, 2), { mode: 384 }); - await fs11.rename(tmp, file4); + const crypto3 = await import("crypto"); + const tmp = `${file4}.${process.pid}.${crypto3.randomUUID()}.tmp`; + try { + await fs11.writeFile(tmp, JSON.stringify(session, null, 2), { mode: 384, flag: "wx" }); + await fs11.rename(tmp, file4); + } catch (cause) { + await fs11.rm(tmp, { force: true }); + throw cause; + } } async function readSession() { const b2 = backend(); @@ -174721,12 +175024,12 @@ var init_auth2 = __esm(async () => { init_dlp(), init_client() ]); - file4 = path21.join(Global.Path.data, "github-auth.json"); - encryptedFile2 = path21.join(Global.Path.data, "github-auth.enc.json"); + file4 = path22.join(Global.Path.data, "github-auth.json"); + encryptedFile2 = path22.join(Global.Path.data, "github-auth.enc.json"); }); // packages/unifia/src/git/android-launcher.ts -import path22 from "path"; +import path23 from "path"; function resolveGitInvocation() { if (cached4) return cached4; @@ -174736,10 +175039,10 @@ function resolveGitInvocation() { cached4 = { bin: "git", args: (gitArgs) => gitArgs }; return cached4; } - const gitBin = path22.posix.join(rootfs, "usr/bin/git"); - const gitExecPath = path22.posix.join(rootfs, "usr/libexec/git-core"); - const gitSslCaInfo = path22.posix.join(rootfs, "etc/ssl/certs/ca-certificates.crt"); - const ldLibraryPath = [path22.posix.join(rootfs, "lib"), path22.posix.join(rootfs, "usr/lib"), gitExecPath].join(":"); + const gitBin = path23.posix.join(rootfs, "usr/bin/git"); + const gitExecPath = path23.posix.join(rootfs, "usr/libexec/git-core"); + const gitSslCaInfo = path23.posix.join(rootfs, "etc/ssl/certs/ca-certificates.crt"); + const ldLibraryPath = [path23.posix.join(rootfs, "lib"), path23.posix.join(rootfs, "usr/lib"), gitExecPath].join(":"); cached4 = { bin: linker, args: (gitArgs) => [`--library-path`, ldLibraryPath, gitBin, `--exec-path=${gitExecPath}`, ...gitArgs], @@ -174801,7 +175104,7 @@ async function buildGithubAuthEnv(cwd, remote) { } } async function persistGithubGitConfigForTerminal() { - if (process.env.OPENCODE_CLIENT !== "mobile-embedded") + if (process.env.UNIFIA_CLIENT !== "mobile-embedded") return; try { const manual2 = await readCredentials(); @@ -175327,7 +175630,7 @@ var init_git = __esm(async () => { }); // packages/unifia/src/storage/storage.ts -import path23 from "path"; +import path24 from "path"; var Storage; var init_storage = __esm(async () => { init_error(); @@ -175374,7 +175677,7 @@ var init_storage = __esm(async () => { } Storage.Service = Service3; function file5(dir2, key) { - return path23.join(dir2, ...key) + ".json"; + return path24.join(dir2, ...key) + ".json"; } function missing(err2) { if (!err2 || typeof err2 !== "object") @@ -175392,7 +175695,7 @@ var init_storage = __esm(async () => { } const MIGRATIONS = [ exports_Effect.fn("Storage.migration.1")(function* (dir2, fs12) { - const project = path23.resolve(dir2, "../project"); + const project = path24.resolve(dir2, "../project"); if (!(yield* fs12.isDir(project))) return; const projectDirs = yield* fs12.glob("*", { @@ -175400,7 +175703,7 @@ var init_storage = __esm(async () => { include: "all" }); for (const projectDir of projectDirs) { - const full = path23.join(project, projectDir); + const full = path24.join(project, projectDir); if (!(yield* fs12.isDir(full))) continue; log11.info(`migrating project ${projectDir}`); @@ -175430,7 +175733,7 @@ var init_storage = __esm(async () => { if (!id2) continue; projectID = id2; - yield* fs12.writeWithDirs(path23.join(dir2, "project", projectID + ".json"), JSON.stringify({ + yield* fs12.writeWithDirs(path24.join(dir2, "project", projectID + ".json"), JSON.stringify({ id: id2, vcs: "git", worktree, @@ -175444,7 +175747,7 @@ var init_storage = __esm(async () => { cwd: full, absolute: true })) { - const dest = path23.join(dir2, "session", projectID, path23.basename(sessionFile)); + const dest = path24.join(dir2, "session", projectID, path24.basename(sessionFile)); log11.info("copying", { sessionFile, dest }); const session = yield* fs12.readJson(sessionFile); const info3 = decodeSession(session, { onExcessProperty: "preserve" }); @@ -175456,7 +175759,7 @@ var init_storage = __esm(async () => { cwd: full, absolute: true })) { - const next3 = path23.join(dir2, "message", info3.value.id, path23.basename(msgFile)); + const next3 = path24.join(dir2, "message", info3.value.id, path24.basename(msgFile)); log11.info("copying", { msgFile, dest: next3 @@ -175471,7 +175774,7 @@ var init_storage = __esm(async () => { cwd: full, absolute: true })) { - const out2 = path23.join(dir2, "part", item.value.id, path23.basename(partFile)); + const out2 = path24.join(dir2, "part", item.value.id, path24.basename(partFile)); const part = yield* fs12.readJson(partFile); log11.info("copying", { partFile, @@ -175494,8 +175797,8 @@ var init_storage = __esm(async () => { if (exports_Option.isNone(session)) continue; const diffs = session.value.summary.diffs; - yield* fs12.writeWithDirs(path23.join(dir2, "session_diff", session.value.id + ".json"), JSON.stringify(diffs, null, 2)); - yield* fs12.writeWithDirs(path23.join(dir2, "session", session.value.projectID, session.value.id + ".json"), JSON.stringify({ + yield* fs12.writeWithDirs(path24.join(dir2, "session_diff", session.value.id + ".json"), JSON.stringify(diffs, null, 2)); + yield* fs12.writeWithDirs(path24.join(dir2, "session", session.value.projectID, session.value.id + ".json"), JSON.stringify({ ...raw3, summary: { additions: diffs.reduce((sum9, x3) => sum9 + x3.additions, 0), @@ -175511,9 +175814,9 @@ var init_storage = __esm(async () => { lookup: () => exports_TxReentrantLock.make(), idleTimeToLive: 0 }); - const state2 = yield* exports_Effect.cached(exports_Effect.gen(function* () { - const dir2 = path23.join(Global.Path.data, "storage"); - const marker = path23.join(dir2, "migration"); + const state = yield* exports_Effect.cached(exports_Effect.gen(function* () { + const dir2 = path24.join(Global.Path.data, "storage"); + const marker = path24.join(dir2, "migration"); const migration = yield* fs12.readFileString(marker).pipe(exports_Effect.map(parseMigration), exports_Effect.catchIf(missing, () => exports_Effect.succeed(0)), exports_Effect.orElseSucceed(() => 0)); for (let i6 = migration;i6 < MIGRATIONS.length; i6++) { log11.info("running migration", { index: i6 }); @@ -175533,7 +175836,7 @@ var init_storage = __esm(async () => { yield* fs12.writeWithDirs(target, JSON.stringify(content, null, 2)); }); const withResolved = (key, fn3) => exports_Effect.scoped(exports_Effect.gen(function* () { - const target = file5((yield* state2).dir, key); + const target = file5((yield* state).dir, key); return yield* fn3(target, yield* exports_RcMap.get(locks, target)); })); const remove20 = exports_Effect.fn("Storage.remove")(function* (key) { @@ -175556,13 +175859,13 @@ var init_storage = __esm(async () => { yield* withResolved(key, (target, rw) => exports_TxReentrantLock.withWriteLock(rw, writeJson(target, content))); }); const list2 = exports_Effect.fn("Storage.list")(function* (prefix3) { - const dir2 = (yield* state2).dir; - const cwd = path23.join(dir2, ...prefix3); + const dir2 = (yield* state).dir; + const cwd = path24.join(dir2, ...prefix3); const result6 = yield* fs12.glob("**/*", { cwd, include: "file" }).pipe(exports_Effect.catch(() => exports_Effect.succeed([]))); - return result6.map((x3) => [...prefix3, ...x3.slice(0, -5).split(path23.sep)]).toSorted((a4, b2) => a4.join("/").localeCompare(b2.join("/"))); + return result6.map((x3) => [...prefix3, ...x3.slice(0, -5).split(path24.sep)]).toSorted((a4, b2) => a4.join("/").localeCompare(b2.join("/"))); }); return Service3.of({ remove: remove20, @@ -176385,8 +176688,8 @@ class ParseStatus2 { } } var makeIssue2 = (params) => { - const { data: data2, path: path24, errorMaps, issueData } = params; - const fullPath = [...path24, ...issueData.path || []]; + const { data: data2, path: path25, errorMaps, issueData } = params; + const fullPath = [...path25, ...issueData.path || []]; const fullIssue = { ...issueData, path: fullPath @@ -176431,11 +176734,11 @@ var init_errorUtil2 = __esm(() => { // node_modules/zod/v3/types.js class ParseInputLazyPath2 { - constructor(parent, value8, path24, key) { + constructor(parent, value8, path25, key) { this._cachedPath = []; this.parent = parent; this.data = value8; - this._path = path24; + this._path = path25; this._key = key; } get path() { @@ -179757,10 +180060,10 @@ var init_v3 = __esm(() => { // node_modules/eventsource-parser/dist/index.js function noop(_arg) {} -function createParser(config4) { - if (typeof config4 == "function") +function createParser(config3) { + if (typeof config3 == "function") throw new TypeError("`config` must be an object, got a function instead. Did you mean `createParser({onEvent: fn})`?"); - const { onEvent = noop, onError: onError5 = noop, onRetry = noop, onComment, maxBufferSize } = config4, pendingFragments = []; + const { onEvent = noop, onError: onError5 = noop, onRetry = noop, onComment, maxBufferSize } = config3, pendingFragments = []; let pendingFragmentsLength = 0, isFirstChunk = true, id2, data2 = "", dataLines = 0, eventType, terminated = false; function feed(chunk) { if (terminated) @@ -182356,19 +182659,19 @@ var require_token_io = __commonJS((exports, module2) => { getUserDataDir: () => getUserDataDir }); module2.exports = __toCommonJS(token_io_exports); - var import_path6 = __toESM2(__require("path")); + var import_path8 = __toESM2(__require("path")); var import_fs5 = __toESM2(__require("fs")); var import_os2 = __toESM2(__require("os")); var import_token_error = require_token_error(); function findRootDir() { try { let dir2 = process.cwd(); - while (dir2 !== import_path6.default.dirname(dir2)) { - const pkgPath = import_path6.default.join(dir2, ".vercel"); + while (dir2 !== import_path8.default.dirname(dir2)) { + const pkgPath = import_path8.default.join(dir2, ".vercel"); if (import_fs5.default.existsSync(pkgPath)) { return dir2; } - dir2 = import_path6.default.dirname(dir2); + dir2 = import_path8.default.dirname(dir2); } } catch (e2) { throw new import_token_error.VercelOidcTokenError("Token refresh only supported in node server environments"); @@ -182381,9 +182684,9 @@ var require_token_io = __commonJS((exports, module2) => { } switch (import_os2.default.platform()) { case "darwin": - return import_path6.default.join(import_os2.default.homedir(), "Library/Application Support"); + return import_path8.default.join(import_os2.default.homedir(), "Library/Application Support"); case "linux": - return import_path6.default.join(import_os2.default.homedir(), ".local/share"); + return import_path8.default.join(import_os2.default.homedir(), ".local/share"); case "win32": if (process.env.LOCALAPPDATA) { return process.env.LOCALAPPDATA; @@ -182425,14 +182728,14 @@ var require_auth_config = __commonJS((exports, module2) => { }); module2.exports = __toCommonJS(auth_config_exports); var fs12 = __toESM2(__require("fs")); - var path24 = __toESM2(__require("path")); + var path25 = __toESM2(__require("path")); var import_token_util = require_token_util(); function getAuthConfigPath() { const dataDir = (0, import_token_util.getVercelDataDir)(); if (!dataDir) { throw new Error(`Unable to find Vercel CLI data directory. Your platform: ${process.platform}. Supported: darwin, linux, win32.`); } - return path24.join(dataDir, "auth.json"); + return path25.join(dataDir, "auth.json"); } function readAuthConfig() { try { @@ -182449,13 +182752,13 @@ var require_auth_config = __commonJS((exports, module2) => { return null; } } - function writeAuthConfig(config4) { + function writeAuthConfig(config3) { const authPath = getAuthConfigPath(); - const authDir = path24.dirname(authPath); + const authDir = path25.dirname(authPath); if (!fs12.existsSync(authDir)) { fs12.mkdirSync(authDir, { mode: 504, recursive: true }); } - fs12.writeFileSync(authPath, JSON.stringify(config4, null, 2), { mode: 384 }); + fs12.writeFileSync(authPath, JSON.stringify(config3, null, 2), { mode: 384 }); } function isValidAccessToken(authConfig) { if (!authConfig.token) @@ -182588,7 +182891,7 @@ var require_token_util = __commonJS((exports, module2) => { saveToken: () => saveToken }); module2.exports = __toCommonJS(token_util_exports); - var path24 = __toESM2(__require("path")); + var path25 = __toESM2(__require("path")); var fs12 = __toESM2(__require("fs")); var import_token_error = require_token_error(); var import_token_io = require_token_io(); @@ -182600,7 +182903,7 @@ var require_token_util = __commonJS((exports, module2) => { if (!dataDir) { return null; } - return path24.join(dataDir, vercelFolder); + return path25.join(dataDir, vercelFolder); } async function getVercelCliToken() { const authConfig = (0, import_auth_config.readAuthConfig)(); @@ -182665,7 +182968,7 @@ var require_token_util = __commonJS((exports, module2) => { if (!dir2) { throw new import_token_error.VercelOidcTokenError("Unable to find project root directory. Have you linked your project with `vc link?`"); } - const prjPath = path24.join(dir2, ".vercel", "project.json"); + const prjPath = path25.join(dir2, ".vercel", "project.json"); if (!fs12.existsSync(prjPath)) { throw new import_token_error.VercelOidcTokenError("project.json not found, have you linked your project with `vc link?`"); } @@ -182680,9 +182983,9 @@ var require_token_util = __commonJS((exports, module2) => { if (!dir2) { throw new import_token_error.VercelOidcTokenError("Unable to find user data directory. Please reach out to Vercel support."); } - const tokenPath = path24.join(dir2, "com.vercel.token", `${projectId}.json`); + const tokenPath = path25.join(dir2, "com.vercel.token", `${projectId}.json`); const tokenJson = JSON.stringify(token); - fs12.mkdirSync(path24.dirname(tokenPath), { mode: 504, recursive: true }); + fs12.mkdirSync(path25.dirname(tokenPath), { mode: 504, recursive: true }); fs12.writeFileSync(tokenPath, tokenJson); fs12.chmodSync(tokenPath, 432); return; @@ -182692,7 +182995,7 @@ var require_token_util = __commonJS((exports, module2) => { if (!dir2) { throw new import_token_error.VercelOidcTokenError("Unable to find user data directory. Please reach out to Vercel support."); } - const tokenPath = path24.join(dir2, "com.vercel.token", `${projectId}.json`); + const tokenPath = path25.join(dir2, "com.vercel.token", `${projectId}.json`); if (!fs12.existsSync(tokenPath)) { return null; } @@ -183182,8 +183485,8 @@ async function getGatewayAuthToken(options4) { }; } var import_oidc, import_oidc2, marker17 = "vercel.ai.gateway.error", symbol17, _a17, _b17, GatewayError, name16 = "GatewayAuthenticationError", marker22, symbol23, _a23, _b23, GatewayAuthenticationError, name23 = "GatewayInvalidRequestError", marker32, symbol33, _a33, _b32, GatewayInvalidRequestError, name33 = "GatewayRateLimitError", marker42, symbol43, _a42, _b42, GatewayRateLimitError, name42 = "GatewayModelNotFoundError", marker52, symbol53, modelNotFoundParamSchema, _a52, _b52, GatewayModelNotFoundError, name52 = "GatewayInternalServerError", marker62, symbol63, _a62, _b62, GatewayInternalServerError, name62 = "GatewayResponseError", marker72, symbol73, _a72, _b72, GatewayResponseError, gatewayErrorResponseSchema, name72 = "GatewayTimeoutError", marker82, symbol83, _a82, _b82, GatewayTimeoutError, GATEWAY_AUTH_METHOD_HEADER = "ai-gateway-auth-method", gatewayAuthMethodSchema, GatewayFetchMetadata = class { - constructor(config4) { - this.config = config4; + constructor(config3) { + this.config = config3; } async getAvailableModels() { try { @@ -183221,9 +183524,9 @@ var import_oidc, import_oidc2, marker17 = "vercel.ai.gateway.error", symbol17, _ } } }, gatewayAvailableModelsResponseSchema, gatewayCreditsResponseSchema, GatewayLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.supportedUrls = { "*/*": [/.*/] }; } @@ -183343,9 +183646,9 @@ var import_oidc, import_oidc2, marker17 = "vercel.ai.gateway.error", symbol17, _ }; } }, GatewayEmbeddingModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.maxEmbeddingsPerCall = 2048; this.supportsParallelCalls = true; @@ -183402,9 +183705,9 @@ var import_oidc, import_oidc2, marker17 = "vercel.ai.gateway.error", symbol17, _ }; } }, gatewayEmbeddingResponseSchema, GatewayImageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.maxImagesPerCall = Number.MAX_SAFE_INTEGER; } @@ -183484,9 +183787,9 @@ var import_oidc, import_oidc2, marker17 = "vercel.ai.gateway.error", symbol17, _ }; } }, providerMetadataEntrySchema, gatewayImageWarningSchema, gatewayImageUsageSchema, gatewayImageResponseSchema, GatewayVideoModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.maxVideosPerCall = Number.MAX_SAFE_INTEGER; } @@ -183617,7 +183920,7 @@ var import_oidc, import_oidc2, marker17 = "vercel.ai.gateway.error", symbol17, _ "ai-model-id": this.modelId }; } -}, providerMetadataEntrySchema2, gatewayVideoDataSchema, gatewayVideoWarningSchema, gatewayVideoEventSchema, parallelSearchInputSchema, parallelSearchOutputSchema, parallelSearchToolFactory, parallelSearch = (config4 = {}) => parallelSearchToolFactory(config4), perplexitySearchInputSchema, perplexitySearchOutputSchema, perplexitySearchToolFactory, perplexitySearch = (config4 = {}) => perplexitySearchToolFactory(config4), gatewayTools, VERSION3 = "3.0.80", AI_GATEWAY_PROTOCOL_VERSION = "0.0.1", gateway; +}, providerMetadataEntrySchema2, gatewayVideoDataSchema, gatewayVideoWarningSchema, gatewayVideoEventSchema, parallelSearchInputSchema, parallelSearchOutputSchema, parallelSearchToolFactory, parallelSearch = (config3 = {}) => parallelSearchToolFactory(config3), perplexitySearchInputSchema, perplexitySearchOutputSchema, perplexitySearchToolFactory, perplexitySearch = (config3 = {}) => perplexitySearchToolFactory(config3), gatewayTools, VERSION3 = "3.0.80", AI_GATEWAY_PROTOCOL_VERSION = "0.0.1", gateway; var init_dist13 = __esm(() => { init_dist12(); init_dist10(); @@ -187170,8 +187473,8 @@ function fixJson(input) { } let result6 = input.slice(0, lastValidIndex + 1); for (let i6 = stack.length - 1;i6 >= 0; i6--) { - const state2 = stack[i6]; - switch (state2) { + const state = stack[i6]; + switch (state) { case "INSIDE_STRING": { result6 += '"'; break; @@ -188397,10 +188700,10 @@ function processUIMessageStream({ }) { return stream4.pipeThrough(new TransformStream({ async transform(chunk, controller) { - await runUpdateMessageJob(async ({ state: state2, write: write2 }) => { + await runUpdateMessageJob(async ({ state, write: write2 }) => { var _a21, _b16, _c2, _d; function getToolInvocation(toolCallId) { - const toolInvocations = state2.message.parts.filter(isToolUIPart); + const toolInvocations = state.message.parts.filter(isToolUIPart); const toolInvocation = toolInvocations.find((invocation) => invocation.toolCallId === toolCallId); if (toolInvocation == null) { throw new UIMessageStreamError({ @@ -188413,7 +188716,7 @@ function processUIMessageStream({ } function updateToolPart(options4) { var _a222; - const part = state2.message.parts.find((part2) => isStaticToolUIPart(part2) && part2.toolCallId === options4.toolCallId); + const part = state.message.parts.find((part2) => isStaticToolUIPart(part2) && part2.toolCallId === options4.toolCallId); const anyOptions = options4; const anyPart = part; if (part != null) { @@ -188437,7 +188740,7 @@ function processUIMessageStream({ } } } else { - state2.message.parts.push({ + state.message.parts.push({ type: `tool-${options4.toolName}`, toolCallId: options4.toolCallId, state: options4.state, @@ -188455,7 +188758,7 @@ function processUIMessageStream({ } function updateDynamicToolPart(options4) { var _a222, _b24; - const part = state2.message.parts.find((part2) => part2.type === "dynamic-tool" && part2.toolCallId === options4.toolCallId); + const part = state.message.parts.find((part2) => part2.type === "dynamic-tool" && part2.toolCallId === options4.toolCallId); const anyOptions = options4; const anyPart = part; if (part != null) { @@ -188480,7 +188783,7 @@ function processUIMessageStream({ } } } else { - state2.message.parts.push({ + state.message.parts.push({ type: "dynamic-tool", toolName: options4.toolName, toolCallId: options4.toolCallId, @@ -188498,18 +188801,18 @@ function processUIMessageStream({ } async function updateMessageMetadata(metadata2) { if (metadata2 != null) { - const mergedMetadata = state2.message.metadata != null ? mergeObjects(state2.message.metadata, metadata2) : metadata2; + const mergedMetadata = state.message.metadata != null ? mergeObjects(state.message.metadata, metadata2) : metadata2; if (messageMetadataSchema != null) { await validateTypes({ value: mergedMetadata, schema: messageMetadataSchema, context: { field: "message.metadata", - entityId: state2.message.id + entityId: state.message.id } }); } - state2.message.metadata = mergedMetadata; + state.message.metadata = mergedMetadata; } } switch (chunk.type) { @@ -188520,13 +188823,13 @@ function processUIMessageStream({ providerMetadata: chunk.providerMetadata, state: "streaming" }; - state2.activeTextParts[chunk.id] = textPart; - state2.message.parts.push(textPart); + state.activeTextParts[chunk.id] = textPart; + state.message.parts.push(textPart); write2(); break; } case "text-delta": { - const textPart = state2.activeTextParts[chunk.id]; + const textPart = state.activeTextParts[chunk.id]; if (textPart == null) { throw new UIMessageStreamError({ chunkType: "text-delta", @@ -188540,7 +188843,7 @@ function processUIMessageStream({ break; } case "text-end": { - const textPart = state2.activeTextParts[chunk.id]; + const textPart = state.activeTextParts[chunk.id]; if (textPart == null) { throw new UIMessageStreamError({ chunkType: "text-end", @@ -188550,7 +188853,7 @@ function processUIMessageStream({ } textPart.state = "done"; textPart.providerMetadata = (_b16 = chunk.providerMetadata) != null ? _b16 : textPart.providerMetadata; - delete state2.activeTextParts[chunk.id]; + delete state.activeTextParts[chunk.id]; write2(); break; } @@ -188561,13 +188864,13 @@ function processUIMessageStream({ providerMetadata: chunk.providerMetadata, state: "streaming" }; - state2.activeReasoningParts[chunk.id] = reasoningPart; - state2.message.parts.push(reasoningPart); + state.activeReasoningParts[chunk.id] = reasoningPart; + state.message.parts.push(reasoningPart); write2(); break; } case "reasoning-delta": { - const reasoningPart = state2.activeReasoningParts[chunk.id]; + const reasoningPart = state.activeReasoningParts[chunk.id]; if (reasoningPart == null) { throw new UIMessageStreamError({ chunkType: "reasoning-delta", @@ -188581,7 +188884,7 @@ function processUIMessageStream({ break; } case "reasoning-end": { - const reasoningPart = state2.activeReasoningParts[chunk.id]; + const reasoningPart = state.activeReasoningParts[chunk.id]; if (reasoningPart == null) { throw new UIMessageStreamError({ chunkType: "reasoning-end", @@ -188591,12 +188894,12 @@ function processUIMessageStream({ } reasoningPart.providerMetadata = (_d = chunk.providerMetadata) != null ? _d : reasoningPart.providerMetadata; reasoningPart.state = "done"; - delete state2.activeReasoningParts[chunk.id]; + delete state.activeReasoningParts[chunk.id]; write2(); break; } case "file": { - state2.message.parts.push({ + state.message.parts.push({ type: "file", mediaType: chunk.mediaType, url: chunk.url, @@ -188606,7 +188909,7 @@ function processUIMessageStream({ break; } case "source-url": { - state2.message.parts.push({ + state.message.parts.push({ type: "source-url", sourceId: chunk.sourceId, url: chunk.url, @@ -188617,7 +188920,7 @@ function processUIMessageStream({ break; } case "source-document": { - state2.message.parts.push({ + state.message.parts.push({ type: "source-document", sourceId: chunk.sourceId, mediaType: chunk.mediaType, @@ -188629,8 +188932,8 @@ function processUIMessageStream({ break; } case "tool-input-start": { - const toolInvocations = state2.message.parts.filter(isStaticToolUIPart); - state2.partialToolCalls[chunk.toolCallId] = { + const toolInvocations = state.message.parts.filter(isStaticToolUIPart); + state.partialToolCalls[chunk.toolCallId] = { text: "", toolName: chunk.toolName, index: toolInvocations.length, @@ -188662,7 +188965,7 @@ function processUIMessageStream({ break; } case "tool-input-delta": { - const partialToolCall = state2.partialToolCalls[chunk.toolCallId]; + const partialToolCall = state.partialToolCalls[chunk.toolCallId]; if (partialToolCall == null) { throw new UIMessageStreamError({ chunkType: "tool-input-delta", @@ -188723,7 +189026,7 @@ function processUIMessageStream({ break; } case "tool-input-error": { - const existingPart = state2.message.parts.filter(isToolUIPart).find((p2) => p2.toolCallId === chunk.toolCallId); + const existingPart = state.message.parts.filter(isToolUIPart).find((p2) => p2.toolCallId === chunk.toolCallId); const isDynamic = existingPart != null ? existingPart.type === "dynamic-tool" : !!chunk.dynamic; if (isDynamic) { updateDynamicToolPart({ @@ -188823,17 +189126,17 @@ function processUIMessageStream({ break; } case "start-step": { - state2.message.parts.push({ type: "step-start" }); + state.message.parts.push({ type: "step-start" }); break; } case "finish-step": { - state2.activeTextParts = {}; - state2.activeReasoningParts = {}; + state.activeTextParts = {}; + state.activeReasoningParts = {}; break; } case "start": { if (chunk.messageId != null) { - state2.message.id = chunk.messageId; + state.message.id = chunk.messageId; } await updateMessageMetadata(chunk.messageMetadata); if (chunk.messageId != null || chunk.messageMetadata != null) { @@ -188843,7 +189146,7 @@ function processUIMessageStream({ } case "finish": { if (chunk.finishReason != null) { - state2.finishReason = chunk.finishReason; + state.finishReason = chunk.finishReason; } await updateMessageMetadata(chunk.messageMetadata); if (chunk.messageMetadata != null) { @@ -188865,8 +189168,8 @@ function processUIMessageStream({ default: { if (isDataUIMessageChunk(chunk)) { if ((dataPartSchemas == null ? undefined : dataPartSchemas[chunk.type]) != null) { - const partIdx = state2.message.parts.findIndex((p2) => ("id" in p2) && ("data" in p2) && p2.id === chunk.id && p2.type === chunk.type); - const actualPartIdx = partIdx >= 0 ? partIdx : state2.message.parts.length; + const partIdx = state.message.parts.findIndex((p2) => ("id" in p2) && ("data" in p2) && p2.id === chunk.id && p2.type === chunk.type); + const actualPartIdx = partIdx >= 0 ? partIdx : state.message.parts.length; await validateTypes({ value: chunk.data, schema: dataPartSchemas[chunk.type], @@ -188882,11 +189185,11 @@ function processUIMessageStream({ onData == null || onData(dataChunk); break; } - const existingUIPart = dataChunk.id != null ? state2.message.parts.find((chunkArg) => dataChunk.type === chunkArg.type && dataChunk.id === chunkArg.id) : undefined; + const existingUIPart = dataChunk.id != null ? state.message.parts.find((chunkArg) => dataChunk.type === chunkArg.type && dataChunk.id === chunkArg.id) : undefined; if (existingUIPart != null) { existingUIPart.data = dataChunk.data; } else { - state2.message.parts.push(dataChunk); + state.message.parts.push(dataChunk); } onData == null || onData(dataChunk); write2(); @@ -188930,12 +189233,12 @@ function handleUIMessageStreamFinish({ if (onFinish == null && onStepFinish == null) { return idInjectedStream; } - const state2 = createStreamingUIMessageState({ + const state = createStreamingUIMessageState({ lastMessage: lastMessage ? structuredClone(lastMessage) : undefined, messageId: messageId != null ? messageId : "" }); const runUpdateMessageJob = async (job) => { - await job({ state: state2, write: () => {} }); + await job({ state, write: () => {} }); }; let finishCalled = false; const callOnFinish = async () => { @@ -188943,30 +189246,30 @@ function handleUIMessageStreamFinish({ return; } finishCalled = true; - const isContinuation = state2.message.id === (lastMessage == null ? undefined : lastMessage.id); + const isContinuation = state.message.id === (lastMessage == null ? undefined : lastMessage.id); await onFinish({ isAborted: isAborted3, isContinuation, - responseMessage: state2.message, + responseMessage: state.message, messages: [ ...isContinuation ? originalMessages.slice(0, -1) : originalMessages, - state2.message + state.message ], - finishReason: state2.finishReason + finishReason: state.finishReason }); }; const callOnStepFinish = async () => { if (!onStepFinish) { return; } - const isContinuation = state2.message.id === (lastMessage == null ? undefined : lastMessage.id); + const isContinuation = state.message.id === (lastMessage == null ? undefined : lastMessage.id); try { await onStepFinish({ isContinuation, - responseMessage: structuredClone(state2.message), + responseMessage: structuredClone(state.message), messages: [ ...isContinuation ? originalMessages.slice(0, -1) : originalMessages, - structuredClone(state2.message) + structuredClone(state.message) ] }); } catch (error46) { @@ -194500,7 +194803,7 @@ var require_is2 = __commonJS((exports) => { var require_messages = __commonJS((exports) => { Object.defineProperty(exports, "__esModule", { value: true }); exports.Message = exports.NotificationType9 = exports.NotificationType8 = exports.NotificationType7 = exports.NotificationType6 = exports.NotificationType5 = exports.NotificationType4 = exports.NotificationType3 = exports.NotificationType2 = exports.NotificationType1 = exports.NotificationType0 = exports.NotificationType = exports.RequestType9 = exports.RequestType8 = exports.RequestType7 = exports.RequestType6 = exports.RequestType5 = exports.RequestType4 = exports.RequestType3 = exports.RequestType2 = exports.RequestType1 = exports.RequestType = exports.RequestType0 = exports.AbstractMessageSignature = exports.ParameterStructures = exports.ResponseError = exports.ErrorCodes = undefined; - var is8 = require_is2(); + var is7 = require_is2(); var ErrorCodes; (function(ErrorCodes2) { ErrorCodes2.ParseError = -32700; @@ -194523,7 +194826,7 @@ var require_messages = __commonJS((exports) => { class ResponseError extends Error { constructor(code, message, data2) { super(message); - this.code = is8.number(code) ? code : ErrorCodes.UnknownErrorCode; + this.code = is7.number(code) ? code : ErrorCodes.UnknownErrorCode; this.data = data2; Object.setPrototypeOf(this, ResponseError.prototype); } @@ -194740,17 +195043,17 @@ var require_messages = __commonJS((exports) => { (function(Message2) { function isRequest2(message) { const candidate = message; - return candidate && is8.string(candidate.method) && (is8.string(candidate.id) || is8.number(candidate.id)); + return candidate && is7.string(candidate.method) && (is7.string(candidate.id) || is7.number(candidate.id)); } Message2.isRequest = isRequest2; function isNotification(message) { const candidate = message; - return candidate && is8.string(candidate.method) && message.id === undefined; + return candidate && is7.string(candidate.method) && message.id === undefined; } Message2.isNotification = isNotification; function isResponse(message) { const candidate = message; - return candidate && (candidate.result !== undefined || !!candidate.error) && (is8.string(candidate.id) || is8.number(candidate.id) || candidate.id === null); + return candidate && (candidate.result !== undefined || !!candidate.error) && (is7.string(candidate.id) || is7.number(candidate.id) || candidate.id === null); } Message2.isResponse = isResponse; })(Message || (exports.Message = Message = {})); @@ -194866,7 +195169,7 @@ var require_linkedMap = __commonJS((exports) => { return item.value; } forEach(callbackfn, thisArg) { - const state2 = this._state; + const state = this._state; let current = this._head; while (current) { if (thisArg) { @@ -194874,21 +195177,21 @@ var require_linkedMap = __commonJS((exports) => { } else { callbackfn(current.value, current.key, this); } - if (this._state !== state2) { + if (this._state !== state) { throw new Error(`LinkedMap got modified during iteration.`); } current = current.next; } } keys() { - const state2 = this._state; + const state = this._state; let current = this._head; const iterator = { [Symbol.iterator]: () => { return iterator; }, next: () => { - if (this._state !== state2) { + if (this._state !== state) { throw new Error(`LinkedMap got modified during iteration.`); } if (current) { @@ -194903,14 +195206,14 @@ var require_linkedMap = __commonJS((exports) => { return iterator; } values() { - const state2 = this._state; + const state = this._state; let current = this._head; const iterator = { [Symbol.iterator]: () => { return iterator; }, next: () => { - if (this._state !== state2) { + if (this._state !== state) { throw new Error(`LinkedMap got modified during iteration.`); } if (current) { @@ -194925,14 +195228,14 @@ var require_linkedMap = __commonJS((exports) => { return iterator; } entries() { - const state2 = this._state; + const state = this._state; let current = this._head; const iterator = { [Symbol.iterator]: () => { return iterator; }, next: () => { - if (this._state !== state2) { + if (this._state !== state) { throw new Error(`LinkedMap got modified during iteration.`); } if (current) { @@ -195297,11 +195600,11 @@ var require_cancellation = __commonJS((exports) => { isCancellationRequested: true, onCancellationRequested: events_1.Event.None }); - function is8(value8) { + function is7(value8) { const candidate = value8; return candidate && (candidate === CancellationToken2.None || candidate === CancellationToken2.Cancelled || Is2.boolean(candidate.isCancellationRequested) && !!candidate.onCancellationRequested); } - CancellationToken2.is = is8; + CancellationToken2.is = is7; })(CancellationToken || (exports.CancellationToken = CancellationToken = {})); var shortcutEvent = Object.freeze(function(callback5, context4) { const handle2 = (0, ral_1.default)().timer.setTimeout(callback5.bind(context4), 0); @@ -195521,11 +195824,11 @@ var require_messageReader = __commonJS((exports) => { var semaphore_1 = require_semaphore(); var MessageReader; (function(MessageReader2) { - function is8(value8) { + function is7(value8) { let candidate = value8; return candidate && Is2.func(candidate.listen) && Is2.func(candidate.dispose) && Is2.func(candidate.onError) && Is2.func(candidate.onClose) && Is2.func(candidate.onPartialMessage); } - MessageReader2.is = is8; + MessageReader2.is = is7; })(MessageReader || (exports.MessageReader = MessageReader = {})); class AbstractMessageReader { @@ -195712,11 +196015,11 @@ var require_messageWriter = __commonJS((exports) => { `; var MessageWriter; (function(MessageWriter2) { - function is8(value8) { + function is7(value8) { let candidate = value8; return candidate && Is2.func(candidate.dispose) && Is2.func(candidate.onClose) && Is2.func(candidate.onError) && Is2.func(candidate.write); } - MessageWriter2.is = is8; + MessageWriter2.is = is7; })(MessageWriter || (exports.MessageWriter = MessageWriter = {})); class AbstractMessageWriter { @@ -195838,7 +196141,7 @@ var require_messageBuffer = __commonJS((exports) => { if (this._chunks.length === 0) { return; } - let state2 = 0; + let state = 0; let chunkIndex = 0; let offset = 0; let chunkBytesRead = 0; @@ -195851,39 +196154,39 @@ var require_messageBuffer = __commonJS((exports) => { const value8 = chunk[offset]; switch (value8) { case CR3: - switch (state2) { + switch (state) { case 0: - state2 = 1; + state = 1; break; case 2: - state2 = 3; + state = 3; break; default: - state2 = 0; + state = 0; } break; case LF3: - switch (state2) { + switch (state) { case 1: - state2 = 2; + state = 2; break; case 3: - state2 = 4; + state = 4; offset++; break row; default: - state2 = 0; + state = 0; } break; default: - state2 = 0; + state = 0; } offset++; } chunkBytesRead += chunk.byteLength; chunkIndex++; } - if (state2 !== 4) { + if (state !== 4) { return; } const buffer4 = this._read(chunkBytesRead + offset); @@ -195976,10 +196279,10 @@ var require_connection = __commonJS((exports) => { })(CancelNotification || (CancelNotification = {})); var ProgressToken; (function(ProgressToken2) { - function is8(value8) { + function is7(value8) { return typeof value8 === "string" || typeof value8 === "number"; } - ProgressToken2.is = is8; + ProgressToken2.is = is7; })(ProgressToken || (exports.ProgressToken = ProgressToken = {})); var ProgressNotification; (function(ProgressNotification2) { @@ -195992,10 +196295,10 @@ var require_connection = __commonJS((exports) => { exports.ProgressType = ProgressType; var StarRequestHandler; (function(StarRequestHandler2) { - function is8(value8) { + function is7(value8) { return Is2.func(value8); } - StarRequestHandler2.is = is8; + StarRequestHandler2.is = is7; })(StarRequestHandler || (StarRequestHandler = {})); exports.NullLogger = Object.freeze({ error: () => {}, @@ -196097,27 +196400,27 @@ var require_connection = __commonJS((exports) => { exports.ConnectionError = ConnectionError; var ConnectionStrategy; (function(ConnectionStrategy2) { - function is8(value8) { + function is7(value8) { const candidate = value8; return candidate && Is2.func(candidate.cancelUndispatched); } - ConnectionStrategy2.is = is8; + ConnectionStrategy2.is = is7; })(ConnectionStrategy || (exports.ConnectionStrategy = ConnectionStrategy = {})); var IdCancellationReceiverStrategy; (function(IdCancellationReceiverStrategy2) { - function is8(value8) { + function is7(value8) { const candidate = value8; return candidate && (candidate.kind === undefined || candidate.kind === "id") && Is2.func(candidate.createCancellationTokenSource) && (candidate.dispose === undefined || Is2.func(candidate.dispose)); } - IdCancellationReceiverStrategy2.is = is8; + IdCancellationReceiverStrategy2.is = is7; })(IdCancellationReceiverStrategy || (exports.IdCancellationReceiverStrategy = IdCancellationReceiverStrategy = {})); var RequestCancellationReceiverStrategy; (function(RequestCancellationReceiverStrategy2) { - function is8(value8) { + function is7(value8) { const candidate = value8; return candidate && candidate.kind === "request" && Is2.func(candidate.createCancellationTokenSource) && (candidate.dispose === undefined || Is2.func(candidate.dispose)); } - RequestCancellationReceiverStrategy2.is = is8; + RequestCancellationReceiverStrategy2.is = is7; })(RequestCancellationReceiverStrategy || (exports.RequestCancellationReceiverStrategy = RequestCancellationReceiverStrategy = {})); var CancellationReceiverStrategy; (function(CancellationReceiverStrategy2) { @@ -196126,10 +196429,10 @@ var require_connection = __commonJS((exports) => { return new cancellation_1.CancellationTokenSource; } }); - function is8(value8) { + function is7(value8) { return IdCancellationReceiverStrategy.is(value8) || RequestCancellationReceiverStrategy.is(value8); } - CancellationReceiverStrategy2.is = is8; + CancellationReceiverStrategy2.is = is7; })(CancellationReceiverStrategy || (exports.CancellationReceiverStrategy = CancellationReceiverStrategy = {})); var CancellationSenderStrategy; (function(CancellationSenderStrategy2) { @@ -196139,11 +196442,11 @@ var require_connection = __commonJS((exports) => { }, cleanup(_3) {} }); - function is8(value8) { + function is7(value8) { const candidate = value8; return candidate && Is2.func(candidate.sendCancellation) && Is2.func(candidate.cleanup); } - CancellationSenderStrategy2.is = is8; + CancellationSenderStrategy2.is = is7; })(CancellationSenderStrategy || (exports.CancellationSenderStrategy = CancellationSenderStrategy = {})); var CancellationStrategy; (function(CancellationStrategy2) { @@ -196151,27 +196454,27 @@ var require_connection = __commonJS((exports) => { receiver: CancellationReceiverStrategy.Message, sender: CancellationSenderStrategy.Message }); - function is8(value8) { + function is7(value8) { const candidate = value8; return candidate && CancellationReceiverStrategy.is(candidate.receiver) && CancellationSenderStrategy.is(candidate.sender); } - CancellationStrategy2.is = is8; + CancellationStrategy2.is = is7; })(CancellationStrategy || (exports.CancellationStrategy = CancellationStrategy = {})); var MessageStrategy; (function(MessageStrategy2) { - function is8(value8) { + function is7(value8) { const candidate = value8; return candidate && Is2.func(candidate.handleMessage); } - MessageStrategy2.is = is8; + MessageStrategy2.is = is7; })(MessageStrategy || (exports.MessageStrategy = MessageStrategy = {})); var ConnectionOptions; (function(ConnectionOptions2) { - function is8(value8) { + function is7(value8) { const candidate = value8; return candidate && (CancellationStrategy.is(candidate.cancellationStrategy) || ConnectionStrategy.is(candidate.connectionStrategy) || MessageStrategy.is(candidate.messageStrategy)); } - ConnectionOptions2.is = is8; + ConnectionOptions2.is = is7; })(ConnectionOptions || (exports.ConnectionOptions = ConnectionOptions = {})); var ConnectionState; (function(ConnectionState2) { @@ -196199,7 +196502,7 @@ var require_connection = __commonJS((exports) => { let trace4 = Trace.Off; let traceFormat = TraceFormat.Text; let tracer4; - let state2 = ConnectionState.New; + let state = ConnectionState.New; const errorEmitter = new events_1.Emitter; const closeEmitter = new events_1.Emitter; const unhandledNotificationEmitter = new events_1.Emitter; @@ -196235,17 +196538,17 @@ var require_connection = __commonJS((exports) => { return; } function isListening() { - return state2 === ConnectionState.Listening; + return state === ConnectionState.Listening; } function isClosed() { - return state2 === ConnectionState.Closed; + return state === ConnectionState.Closed; } function isDisposed() { - return state2 === ConnectionState.Disposed; + return state === ConnectionState.Disposed; } function closeHandler() { - if (state2 === ConnectionState.New || state2 === ConnectionState.Listening) { - state2 = ConnectionState.Closed; + if (state === ConnectionState.New || state === ConnectionState.Listening) { + state = ConnectionState.Closed; closeEmitter.fire(undefined); } } @@ -197043,7 +197346,7 @@ ${JSON.stringify(message, null, 4)}`); if (isDisposed()) { return; } - state2 = ConnectionState.Disposed; + state = ConnectionState.Disposed; disposeEmitter.fire(undefined); const error46 = new messages_1.ResponseError(messages_1.ErrorCodes.PendingResponseRejected, "Pending response rejected since connection got disposed"); for (const promise5 of responsePromises.values()) { @@ -197063,7 +197366,7 @@ ${JSON.stringify(message, null, 4)}`); listen: () => { throwIfClosedOrDisposed(); throwIfListening(); - state2 = ConnectionState.Listening; + state = ConnectionState.Listening; messageReader.listen(callback5); }, inspect: () => { @@ -197471,7 +197774,7 @@ var require_main = __commonJS((exports) => { exports.createMessageConnection = exports.createServerSocketTransport = exports.createClientSocketTransport = exports.createServerPipeTransport = exports.createClientPipeTransport = exports.generateRandomPipeName = exports.StreamMessageWriter = exports.StreamMessageReader = exports.SocketMessageWriter = exports.SocketMessageReader = exports.PortMessageWriter = exports.PortMessageReader = exports.IPCMessageWriter = exports.IPCMessageReader = undefined; var ril_1 = require_ril(); ril_1.default.install(); - var path24 = __require("path"); + var path25 = __require("path"); var os8 = __require("os"); var crypto_1 = __require("crypto"); var net_1 = __require("net"); @@ -197613,9 +197916,9 @@ var require_main = __commonJS((exports) => { } let result6; if (XDG_RUNTIME_DIR) { - result6 = path24.join(XDG_RUNTIME_DIR, `vscode-ipc-${randomSuffix}.sock`); + result6 = path25.join(XDG_RUNTIME_DIR, `vscode-ipc-${randomSuffix}.sock`); } else { - result6 = path24.join(os8.tmpdir(), `vscode-${randomSuffix}.sock`); + result6 = path25.join(os8.tmpdir(), `vscode-${randomSuffix}.sock`); } const limit = safeIpcPathLengths.get(process.platform); if (limit !== undefined && result6.length > limit) { @@ -197854,7 +198157,7 @@ function withTimeout(promise5, ms2) { } // packages/unifia/src/lsp/client.ts -import path24 from "path"; +import path25 from "path"; import { pathToFileURL as pathToFileURL3, fileURLToPath as fileURLToPath4 } from "url"; var import_node5, DIAGNOSTICS_DEBOUNCE_MS = 150, LSPClient; var init_client2 = __esm(async () => { @@ -197982,9 +198285,9 @@ var init_client2 = __esm(async () => { async open(input2) { if (shuttingDown) return; - input2.path = path24.isAbsolute(input2.path) ? input2.path : path24.resolve(Instance.directory, input2.path); + input2.path = path25.isAbsolute(input2.path) ? input2.path : path25.resolve(Instance.directory, input2.path); const text7 = await Filesystem.readText(input2.path); - const extension2 = path24.extname(input2.path); + const extension2 = path25.extname(input2.path); const languageId = LANGUAGE_EXTENSIONS[extension2] ?? "plaintext"; const version4 = files[input2.path]; if (version4 !== undefined) { @@ -198047,7 +198350,7 @@ var init_client2 = __esm(async () => { return diagnostics; }, async waitForDiagnostics(input2) { - const normalizedPath = Filesystem.normalizePath(path24.isAbsolute(input2.path) ? input2.path : path24.resolve(Instance.directory, input2.path)); + const normalizedPath = Filesystem.normalizePath(path25.isAbsolute(input2.path) ? input2.path : path25.resolve(Instance.directory, input2.path)); log11.info("waiting for diagnostics", { path: normalizedPath }); let unsub; let debounceTimer; @@ -198079,13 +198382,10 @@ var init_client2 = __esm(async () => { try { await connection.sendNotification("exit"); } catch {} - await new Promise((r4) => setTimeout(r4, 50)); - try { - connection.end(); - } catch {} try { connection.dispose(); } catch {} + await new Promise((r4) => setTimeout(r4, 50)); await Process.stop(input.server.process).catch(() => {}); l2.info("shutdown"); } @@ -198103,7 +198403,7 @@ var init_pool = __esm(async () => { await init_log(); log11 = Log.create({ service: "lsp.pool" }); ((LSPPool) => { - function create(config4) { + function create(config3) { const pool = new Map; const evictListeners = []; function key(serverID, root) { @@ -198112,7 +198412,7 @@ var init_pool = __esm(async () => { function resetIdleTimer(entry) { if (entry.idleTimer) clearTimeout(entry.idleTimer); - if (config4.idleTimeoutMs <= 0) + if (config3.idleTimeoutMs <= 0) return; entry.idleTimer = setTimeout(async () => { log11.info("idle timeout, shutting down LSP", { @@ -198120,7 +198420,7 @@ var init_pool = __esm(async () => { root: entry.root }); await shutdownEntry(entry); - }, config4.idleTimeoutMs); + }, config3.idleTimeoutMs); } async function shutdownEntry(entry) { const k3 = key(entry.serverID, entry.root); @@ -198136,7 +198436,7 @@ var init_pool = __esm(async () => { } } return { - config: config4, + config: config3, track(client, serverID, root) { const k3 = key(serverID, root); if (pool.has(k3)) @@ -198152,7 +198452,7 @@ var init_pool = __esm(async () => { log11.info("tracking LSP client", { serverID, active: pool.size, - max: config4.maxConcurrent + max: config3.maxConcurrent }); }, touch(serverID, root) { @@ -198200,7 +198500,7 @@ var init_pool = __esm(async () => { return pool.size; }, atCapacity() { - return pool.size >= config4.maxConcurrent; + return pool.size >= config3.maxConcurrent; }, entries() { return [...pool.values()]; @@ -198215,7 +198515,7 @@ var init_pool = __esm(async () => { }); // packages/unifia/src/lsp/index.ts -import path25 from "path"; +import path26 from "path"; import { pathToFileURL as pathToFileURL4, fileURLToPath as fileURLToPath5 } from "url"; var LSP; var init_lsp = __esm(async () => { @@ -198410,12 +198710,12 @@ var init_lsp = __esm(async () => { } LSP.Service = Service3; LSP.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { - const config4 = yield* Config.Service; - const state2 = yield* InstanceState.make(exports_Effect.fn("LSP.state")(function* () { - const cfg = yield* config4.get(); + const config3 = yield* Config.Service; + const state = yield* InstanceState.make(exports_Effect.fn("LSP.state")(function* () { + const cfg = yield* config3.get(); const servers = {}; - if (cfg.lsp === false) { - log12.info("all LSPs are disabled"); + if (cfg.lsp === false || Flag.UNIFIA_DISABLE_LSP) { + log12.info("all LSPs are disabled", { reason: cfg.lsp === false ? "config" : "UNIFIA_DISABLE_LSP" }); } else { for (const server of Object.values(LSPServer)) { servers[server.id] = server; @@ -198474,9 +198774,9 @@ var init_lsp = __esm(async () => { const getClients = exports_Effect.fnUntraced(function* (file5) { if (!Instance.containsPath(file5)) return []; - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); return yield* exports_Effect.promise(async () => { - const extension2 = path25.parse(file5).ext || file5; + const extension2 = path26.parse(file5).ext || file5; const result6 = []; for (const server of Object.values(s5.servers)) { if (server.extensions.length && !server.extensions.includes(extension2)) @@ -198493,24 +198793,24 @@ var init_lsp = __esm(async () => { }); const run8 = exports_Effect.fnUntraced(function* (file5, fn3) { const clients = yield* getClients(file5); - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); for (const c2 of clients) s5.pool.touch(c2.serverID, c2.root); return yield* exports_Effect.promise(() => Promise.all(clients.map((x3) => fn3(x3)))); }); const runAll = exports_Effect.fnUntraced(function* (fn3) { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); for (const c2 of s5.clients) s5.pool.touch(c2.serverID, c2.root); return yield* exports_Effect.promise(() => Promise.all(s5.clients.map((x3) => fn3(x3)))); }); const init5 = exports_Effect.fn("LSP.init")(function* () { - yield* InstanceState.get(state2); + yield* InstanceState.get(state); }); const warmup2 = exports_Effect.fn("LSP.warmup")(function* () { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); yield* exports_Effect.promise(async () => { - const sentinel = path25.join(Instance.directory, "__lsp_warmup_sentinel__"); + const sentinel = path26.join(Instance.directory, "__lsp_warmup_sentinel__"); await Promise.all(Object.values(s5.servers).map(async (server) => { if (!server.extensions.length) return; @@ -198524,13 +198824,13 @@ var init_lsp = __esm(async () => { }); }); const status2 = exports_Effect.fn("LSP.status")(function* () { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); const result6 = []; for (const client of s5.clients) { result6.push({ id: client.serverID, name: s5.servers[client.serverID].id, - root: path25.relative(Instance.directory, client.root), + root: path26.relative(Instance.directory, client.root), status: "connected" }); } @@ -198540,16 +198840,16 @@ var init_lsp = __esm(async () => { result6.push({ id: entry.serverID, name: s5.servers[entry.serverID]?.id ?? entry.serverID, - root: path25.relative(Instance.directory, entry.root), + root: path26.relative(Instance.directory, entry.root), status: "error" }); } return result6; }); const hasClients2 = exports_Effect.fn("LSP.hasClients")(function* (file5) { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); return yield* exports_Effect.promise(async () => { - const extension2 = path25.parse(file5).ext || file5; + const extension2 = path26.parse(file5).ext || file5; for (const server of Object.values(s5.servers)) { if (server.extensions.length && !server.extensions.includes(extension2)) continue; @@ -198756,7 +199056,7 @@ var init_lsp = __esm(async () => { }); // packages/unifia/src/snapshot/index.ts -import path26 from "path"; +import path27 from "path"; var Snapshot; var init_snapshot = __esm(async () => { init_dist3(); @@ -198800,7 +199100,7 @@ var init_snapshot = __esm(async () => { Snapshot.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const fs12 = yield* AppFileSystem.Service; const spawner = yield* exports_ChildProcessSpawner.ChildProcessSpawner; - const config4 = yield* Config.Service; + const config3 = yield* Config.Service; const locks = new Map; const lock = (key) => { const hit = locks.get(key); @@ -198810,14 +199110,14 @@ var init_snapshot = __esm(async () => { locks.set(key, next3); return next3; }; - const state2 = yield* InstanceState.make(exports_Effect.fn("Snapshot.state")(function* (ctx) { - const state3 = { + const state = yield* InstanceState.make(exports_Effect.fn("Snapshot.state")(function* (ctx) { + const state2 = { directory: ctx.directory, worktree: ctx.worktree, - gitdir: path26.join(Global.Path.data, "snapshot", ctx.project.id, Hash.fast(ctx.worktree)), + gitdir: path27.join(Global.Path.data, "snapshot", ctx.project.id, Hash.fast(ctx.worktree)), vcs: ctx.project.vcs }; - const args3 = (cmd) => ["--git-dir", state3.gitdir, "--work-tree", state3.worktree, ...cmd]; + const args3 = (cmd) => ["--git-dir", state2.gitdir, "--work-tree", state2.worktree, ...cmd]; const git = exports_Effect.fnUntraced(function* (cmd, opts) { const proc = exports_ChildProcess.make("git", cmd, { cwd: opts?.cwd, @@ -198836,15 +199136,15 @@ var init_snapshot = __esm(async () => { const exists3 = (file5) => fs12.exists(file5).pipe(exports_Effect.orDie); const read3 = (file5) => fs12.readFileString(file5).pipe(exports_Effect.catch(() => exports_Effect.succeed(""))); const remove19 = (file5) => fs12.remove(file5).pipe(exports_Effect.catch(() => exports_Effect.void)); - const locked2 = (fx) => lock(state3.gitdir).withPermits(1)(fx); + const locked2 = (fx) => lock(state2.gitdir).withPermits(1)(fx); const enabled = exports_Effect.fnUntraced(function* () { - if (state3.vcs !== "git") + if (state2.vcs !== "git") return false; - return (yield* config4.get()).snapshot !== false; + return (yield* config3.get()).snapshot !== false; }); const excludes = exports_Effect.fnUntraced(function* () { const result6 = yield* git(["rev-parse", "--path-format=absolute", "--git-path", "info/exclude"], { - cwd: state3.worktree + cwd: state2.worktree }); const file5 = result6.text.trim(); if (!file5) @@ -198855,13 +199155,13 @@ var init_snapshot = __esm(async () => { }); const sync8 = exports_Effect.fnUntraced(function* (list = []) { const file5 = yield* excludes(); - const target = path26.join(state3.gitdir, "info", "exclude"); + const target = path27.join(state2.gitdir, "info", "exclude"); const text7 = [ file5 ? (yield* read3(file5)).trimEnd() : "", ...list.map((item) => `/${item.replaceAll("\\", "/")}`) ].filter(Boolean).join(` `); - yield* fs12.ensureDir(path26.join(state3.gitdir, "info")).pipe(exports_Effect.orDie); + yield* fs12.ensureDir(path27.join(state2.gitdir, "info")).pipe(exports_Effect.orDie); yield* fs12.writeFileString(target, text7 ? `${text7} ` : "").pipe(exports_Effect.orDie); }); @@ -198869,10 +199169,10 @@ var init_snapshot = __esm(async () => { yield* sync8(); const [diff3, other] = yield* exports_Effect.all([ git([...quote, ...args3(["diff-files", "--name-only", "-z", "--", "."])], { - cwd: state3.directory + cwd: state2.directory }), git([...quote, ...args3(["ls-files", "--others", "--exclude-standard", "-z", "--", "."])], { - cwd: state3.directory + cwd: state2.directory }) ], { concurrency: 2 }); if (diff3.code !== 0 || other.code !== 0) { @@ -198889,14 +199189,14 @@ var init_snapshot = __esm(async () => { const all7 = Array.from(new Set([...tracked, ...untracked])); if (!all7.length) return; - const large = (yield* exports_Effect.all(all7.map((item) => fs12.stat(path26.join(state3.directory, item)).pipe(exports_Effect.catch(() => exports_Effect.void)).pipe(exports_Effect.map((stat4) => { + const large = (yield* exports_Effect.all(all7.map((item) => fs12.stat(path27.join(state2.directory, item)).pipe(exports_Effect.catch(() => exports_Effect.void)).pipe(exports_Effect.map((stat4) => { if (!stat4 || stat4.type !== "File") return; const size24 = typeof stat4.size === "bigint" ? Number(stat4.size) : stat4.size; return size24 > limit ? item : undefined; }))), { concurrency: 8 })).filter((item) => Boolean(item)); yield* sync8(large); - const result6 = yield* git([...cfg, ...args3(["add", "--sparse", "."])], { cwd: state3.directory }); + const result6 = yield* git([...cfg, ...args3(["add", "--sparse", "."])], { cwd: state2.directory }); if (result6.code !== 0) { log12.warn("failed to add snapshot files", { exitCode: result6.code, @@ -198908,9 +199208,9 @@ var init_snapshot = __esm(async () => { return yield* locked2(exports_Effect.gen(function* () { if (!(yield* enabled())) return; - if (!(yield* exists3(state3.gitdir))) + if (!(yield* exists3(state2.gitdir))) return; - const result6 = yield* git(args3(["gc", `--prune=${prune}`]), { cwd: state3.directory }); + const result6 = yield* git(args3(["gc", `--prune=${prune}`]), { cwd: state2.directory }); if (result6.code !== 0) { log12.warn("cleanup failed", { exitCode: result6.code, @@ -198925,22 +199225,22 @@ var init_snapshot = __esm(async () => { return yield* locked2(exports_Effect.gen(function* () { if (!(yield* enabled())) return; - const existed = yield* exists3(state3.gitdir); - yield* fs12.ensureDir(state3.gitdir).pipe(exports_Effect.orDie); + const existed = yield* exists3(state2.gitdir); + yield* fs12.ensureDir(state2.gitdir).pipe(exports_Effect.orDie); if (!existed) { yield* git(["init"], { - env: { GIT_DIR: state3.gitdir, GIT_WORK_TREE: state3.worktree } + env: { GIT_DIR: state2.gitdir, GIT_WORK_TREE: state2.worktree } }); - yield* git(["--git-dir", state3.gitdir, "config", "core.autocrlf", "false"]); - yield* git(["--git-dir", state3.gitdir, "config", "core.longpaths", "true"]); - yield* git(["--git-dir", state3.gitdir, "config", "core.symlinks", "true"]); - yield* git(["--git-dir", state3.gitdir, "config", "core.fsmonitor", "false"]); + yield* git(["--git-dir", state2.gitdir, "config", "core.autocrlf", "false"]); + yield* git(["--git-dir", state2.gitdir, "config", "core.longpaths", "true"]); + yield* git(["--git-dir", state2.gitdir, "config", "core.symlinks", "true"]); + yield* git(["--git-dir", state2.gitdir, "config", "core.fsmonitor", "false"]); log12.info("initialized"); } yield* add11(); - const result6 = yield* git(args3(["write-tree"]), { cwd: state3.directory }); + const result6 = yield* git(args3(["write-tree"]), { cwd: state2.directory }); const hash4 = result6.text.trim(); - log12.info("tracking", { hash: hash4, cwd: state3.directory, git: state3.gitdir }); + log12.info("tracking", { hash: hash4, cwd: state2.directory, git: state2.gitdir }); return hash4; })); }); @@ -198948,7 +199248,7 @@ var init_snapshot = __esm(async () => { return yield* locked2(exports_Effect.gen(function* () { yield* add11(); const result6 = yield* git([...quote, ...args3(["diff", "--cached", "--no-ext-diff", "--name-only", hash4, "--", "."])], { - cwd: state3.directory + cwd: state2.directory }); if (result6.code !== 0) { log12.warn("failed to get diff", { hash: hash4, exitCode: result6.code }); @@ -198957,29 +199257,29 @@ var init_snapshot = __esm(async () => { return { hash: hash4, files: result6.text.trim().split(` -`).map((x3) => x3.trim()).filter(Boolean).map((x3) => path26.join(state3.worktree, x3).replaceAll("\\", "/")) +`).map((x3) => x3.trim()).filter(Boolean).map((x3) => path27.join(state2.worktree, x3).replaceAll("\\", "/")) }; })); }); - const restore2 = exports_Effect.fnUntraced(function* (snapshot4) { + const restore2 = exports_Effect.fnUntraced(function* (snapshot3) { return yield* locked2(exports_Effect.gen(function* () { - log12.info("restore", { commit: snapshot4 }); - const result6 = yield* git([...core2, ...args3(["read-tree", snapshot4])], { cwd: state3.worktree }); + log12.info("restore", { commit: snapshot3 }); + const result6 = yield* git([...core2, ...args3(["read-tree", snapshot3])], { cwd: state2.worktree }); if (result6.code === 0) { const checkout = yield* git([...core2, ...args3(["checkout-index", "-a", "-f"])], { - cwd: state3.worktree + cwd: state2.worktree }); if (checkout.code === 0) return; log12.error("failed to restore snapshot", { - snapshot: snapshot4, + snapshot: snapshot3, exitCode: checkout.code, stderr: checkout.stderr }); return; } log12.error("failed to restore snapshot", { - snapshot: snapshot4, + snapshot: snapshot3, exitCode: result6.code, stderr: result6.stderr }); @@ -198997,19 +199297,19 @@ var init_snapshot = __esm(async () => { ops.push({ hash: item.hash, file: file5, - rel: path26.relative(state3.worktree, file5).replaceAll("\\", "/") + rel: path27.relative(state2.worktree, file5).replaceAll("\\", "/") }); } } const single = exports_Effect.fnUntraced(function* (op) { log12.info("reverting", { file: op.file, hash: op.hash }); const result6 = yield* git([...core2, ...args3(["checkout", op.hash, "--", op.rel])], { - cwd: state3.worktree + cwd: state2.worktree }); if (result6.code === 0) return; const tree = yield* git([...core2, ...args3(["ls-tree", op.hash, "--", op.rel])], { - cwd: state3.worktree + cwd: state2.worktree }); if (tree.code === 0 && tree.text.trim()) { log12.info("file existed in snapshot but checkout failed, keeping", { file: op.file, hash: op.hash }); @@ -199038,7 +199338,7 @@ var init_snapshot = __esm(async () => { continue; } const tree = yield* git([...quote, ...args3(["ls-tree", "--name-only", first2.hash, "--", ...run8.map((item) => item.rel)])], { - cwd: state3.worktree + cwd: state2.worktree }); if (tree.code !== 0) { log12.info("batched ls-tree failed, falling back to single-file revert", { @@ -199057,7 +199357,7 @@ var init_snapshot = __esm(async () => { if (list.length) { log12.info("reverting", { hash: first2.hash, files: list.length }); const result6 = yield* git([...core2, ...args3(["checkout", first2.hash, "--", ...list.map((item) => item.rel)])], { - cwd: state3.worktree + cwd: state2.worktree }); if (result6.code !== 0) { log12.info("batched checkout failed, falling back to single-file revert", { @@ -199085,7 +199385,7 @@ var init_snapshot = __esm(async () => { return yield* locked2(exports_Effect.gen(function* () { yield* add11(); const result6 = yield* git([...quote, ...args3(["diff", "--cached", "--no-ext-diff", hash4, "--", "."])], { - cwd: state3.worktree + cwd: state2.worktree }); if (result6.code !== 0) { log12.warn("failed to get diff", { @@ -199137,7 +199437,7 @@ var init_snapshot = __esm(async () => { if (!refs.length) return new Map; const proc = exports_ChildProcess.make("git", [...cfg, ...args3(["cat-file", "--batch"])], { - cwd: state3.directory, + cwd: state2.directory, extendEnv: true, stdin: exports_Stream.make(new TextEncoder().encode(refs.map((item) => item.ref).join(` `) + ` @@ -199197,7 +199497,7 @@ var init_snapshot = __esm(async () => { }, exports_Effect.scoped, exports_Effect.catch(() => exports_Effect.succeed(undefined))); const result6 = []; const status = new Map; - const statuses = yield* git([...quote, ...args3(["diff", "--no-ext-diff", "--name-status", "--no-renames", from, to2, "--", "."])], { cwd: state3.directory }); + const statuses = yield* git([...quote, ...args3(["diff", "--no-ext-diff", "--name-status", "--no-renames", from, to2, "--", "."])], { cwd: state2.directory }); for (const line2 of statuses.text.trim().split(` `)) { if (!line2) @@ -199208,7 +199508,7 @@ var init_snapshot = __esm(async () => { status.set(file5, code.startsWith("A") ? "added" : code.startsWith("D") ? "deleted" : "modified"); } const numstat = yield* git([...quote, ...args3(["diff", "--no-ext-diff", "--no-renames", "--numstat", from, to2, "--", "."])], { - cwd: state3.directory + cwd: state2.directory }); const rows = numstat.text.trim().split(` `).filter(Boolean).flatMap((line2) => { @@ -199256,28 +199556,28 @@ var init_snapshot = __esm(async () => { })); return Service3.of({ init: exports_Effect.fn("Snapshot.init")(function* () { - yield* InstanceState.get(state2); + yield* InstanceState.get(state); }), cleanup: exports_Effect.fn("Snapshot.cleanup")(function* () { - return yield* InstanceState.useEffect(state2, (s5) => s5.cleanup()); + return yield* InstanceState.useEffect(state, (s5) => s5.cleanup()); }), track: exports_Effect.fn("Snapshot.track")(function* () { - return yield* InstanceState.useEffect(state2, (s5) => s5.track()); + return yield* InstanceState.useEffect(state, (s5) => s5.track()); }), patch: exports_Effect.fn("Snapshot.patch")(function* (hash4) { - return yield* InstanceState.useEffect(state2, (s5) => s5.patch(hash4)); + return yield* InstanceState.useEffect(state, (s5) => s5.patch(hash4)); }), - restore: exports_Effect.fn("Snapshot.restore")(function* (snapshot4) { - return yield* InstanceState.useEffect(state2, (s5) => s5.restore(snapshot4)); + restore: exports_Effect.fn("Snapshot.restore")(function* (snapshot3) { + return yield* InstanceState.useEffect(state, (s5) => s5.restore(snapshot3)); }), revert: exports_Effect.fn("Snapshot.revert")(function* (patches) { - return yield* InstanceState.useEffect(state2, (s5) => s5.revert(patches)); + return yield* InstanceState.useEffect(state, (s5) => s5.revert(patches)); }), diff: exports_Effect.fn("Snapshot.diff")(function* (hash4) { - return yield* InstanceState.useEffect(state2, (s5) => s5.diff(hash4)); + return yield* InstanceState.useEffect(state, (s5) => s5.diff(hash4)); }), diffFull: exports_Effect.fn("Snapshot.diffFull")(function* (from, to2) { - return yield* InstanceState.useEffect(state2, (s5) => s5.diffFull(from, to2)); + return yield* InstanceState.useEffect(state, (s5) => s5.diffFull(from, to2)); }) }); })); @@ -199295,8 +199595,8 @@ var init_snapshot = __esm(async () => { return runPromise3((svc) => svc.patch(hash4)); } Snapshot.patch = patch3; - async function restore(snapshot4) { - return runPromise3((svc) => svc.restore(snapshot4)); + async function restore(snapshot3) { + return runPromise3((svc) => svc.restore(snapshot3)); } Snapshot.restore = restore; async function revert(patches) { @@ -200390,7 +200690,7 @@ var init_summary = __esm(async () => { SessionSummary.Service = Service3; SessionSummary.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const sessions = yield* Session.Service; - const snapshot4 = yield* Snapshot.Service; + const snapshot3 = yield* Snapshot.Service; const storage = yield* Storage.Service; const bus = yield* Bus.Service; const computeDiff = exports_Effect.fn("SessionSummary.computeDiff")(function* (input) { @@ -200411,7 +200711,7 @@ var init_summary = __esm(async () => { } } if (from && to2) - return yield* snapshot4.diffFull(from, to2); + return yield* snapshot3.diffFull(from, to2); return []; }); const summarize2 = exports_Effect.fn("SessionSummary.summarize")(function* (input) { @@ -201611,7 +201911,7 @@ var separatorArrayExplode = (style) => { }; // packages/sdk/js/src/gen/core/utils.gen.ts -var PATH_PARAM_RE, defaultPathSerializer = ({ path: path27, url: _url2 }) => { +var PATH_PARAM_RE, defaultPathSerializer = ({ path: path28, url: _url2 }) => { let url3 = _url2; const matches = _url2.match(PATH_PARAM_RE); if (matches) { @@ -201630,7 +201930,7 @@ var PATH_PARAM_RE, defaultPathSerializer = ({ path: path27, url: _url2 }) => { name21 = name21.substring(1); style = "matrix"; } - const value8 = path27[name21]; + const value8 = path28[name21]; if (value8 === undefined || value8 === null) { continue; } @@ -201662,15 +201962,15 @@ var PATH_PARAM_RE, defaultPathSerializer = ({ path: path27, url: _url2 }) => { return url3; }, getUrl = ({ baseUrl: baseUrl2, - path: path27, + path: path28, query, querySerializer, url: _url2 }) => { const pathUrl = _url2.startsWith("/") ? _url2 : `/${_url2}`; let url3 = (baseUrl2 ?? "") + pathUrl; - if (path27) { - url3 = defaultPathSerializer({ path: path27, url: url3 }); + if (path28) { + url3 = defaultPathSerializer({ path: path28, url: url3 }); } let search2 = query ? querySerializer(query) : ""; if (search2.startsWith("?")) { @@ -201834,12 +202134,12 @@ var createQuerySerializer = ({ allowReserved, array: array8, object: object6 } = querySerializer: typeof options4.querySerializer === "function" ? options4.querySerializer : createQuerySerializer(options4.querySerializer), url: options4.url }), mergeConfigs = (a4, b2) => { - const config4 = { ...a4, ...b2 }; - if (config4.baseUrl?.endsWith("/")) { - config4.baseUrl = config4.baseUrl.substring(0, config4.baseUrl.length - 1); + const config3 = { ...a4, ...b2 }; + if (config3.baseUrl?.endsWith("/")) { + config3.baseUrl = config3.baseUrl.substring(0, config3.baseUrl.length - 1); } - config4.headers = mergeHeaders(a4.headers, b2.headers); - return config4; + config3.headers = mergeHeaders(a4.headers, b2.headers); + return config3; }, mergeHeaders = (...headers) => { const mergedHeaders = new Headers; for (const header of headers) { @@ -201891,11 +202191,11 @@ var init_utils_gen2 = __esm(() => { }); // packages/sdk/js/src/gen/client/client.gen.ts -var createClient = (config4 = {}) => { - let _config = mergeConfigs(createConfig(), config4); +var createClient = (config3 = {}) => { + let _config = mergeConfigs(createConfig(), config3); const getConfig = () => ({ ..._config }); - const setConfig = (config5) => { - _config = mergeConfigs(_config, config5); + const setConfig = (config4) => { + _config = mergeConfigs(_config, config4); return getConfig(); }; const interceptors = createInterceptors(); @@ -202747,25 +203047,25 @@ function rewrite(request3, directory) { next3.headers.delete("x-unifia-directory"); return next3; } -function createUnifiaClient(config4) { - if (!config4?.fetch) { +function createUnifiaClient(config3) { + if (!config3?.fetch) { const customFetch = (req) => { req.timeout = false; return fetch(req); }; - config4 = { - ...config4, + config3 = { + ...config3, fetch: customFetch }; } - if (config4?.directory) { - config4.headers = { - ...config4.headers, - "x-unifia-directory": encodeURIComponent(config4.directory) + if (config3?.directory) { + config3.headers = { + ...config3.headers, + "x-unifia-directory": encodeURIComponent(config3.directory) }; } - const client2 = createClient(config4); - client2.interceptors.request.use((request3) => rewrite(request3, config4?.directory)); + const client2 = createClient(config3); + client2.interceptors.request.use((request3) => rewrite(request3, config3?.directory)); return new UnifiaClient({ client: client2 }); } var init_client4 = __esm(() => { @@ -202841,7 +203141,7 @@ function extractAccountId(tokens) { } return; } -function buildAuthorizeUrl(redirectUri, pkce, state2) { +function buildAuthorizeUrl(redirectUri, pkce, state) { const params = new URLSearchParams({ response_type: "code", client_id: CLIENT_ID2, @@ -202851,7 +203151,7 @@ function buildAuthorizeUrl(redirectUri, pkce, state2) { code_challenge_method: "S256", id_token_add_organizations: "true", codex_cli_simplified_flow: "true", - state: state2, + state, originator: "unifia" }); return `${ISSUER}/oauth/authorize?${params.toString()}`; @@ -202898,7 +203198,7 @@ async function startOAuthServer() { const url3 = new URL(req.url); if (url3.pathname === "/auth/callback") { const code = url3.searchParams.get("code"); - const state2 = url3.searchParams.get("state"); + const state = url3.searchParams.get("state"); const error46 = url3.searchParams.get("error"); const errorDescription = url3.searchParams.get("error_description"); if (error46) { @@ -202918,7 +203218,7 @@ async function startOAuthServer() { headers: { "Content-Type": "text/html" } }); } - if (!pendingOAuth || state2 !== pendingOAuth.state) { + if (!pendingOAuth || state !== pendingOAuth.state) { const errorMsg = "Invalid state - potential CSRF attack"; pendingOAuth?.reject(new Error(errorMsg)); pendingOAuth = undefined; @@ -202952,7 +203252,7 @@ function stopOAuthServer() { log13.info("codex oauth server stopped"); } } -function waitForOAuthCallback(pkce, state2) { +function waitForOAuthCallback(pkce, state) { return new Promise((resolve10, reject) => { const timeout4 = setTimeout(() => { if (pendingOAuth) { @@ -202962,7 +203262,7 @@ function waitForOAuthCallback(pkce, state2) { }, 5 * 60 * 1000); pendingOAuth = { pkce, - state: state2, + state, resolve: (tokens) => { clearTimeout(timeout4); resolve10(tokens); @@ -203080,9 +203380,9 @@ async function CodexAuthPlugin(input) { authorize: async () => { const { redirectUri } = await startOAuthServer(); const pkce = await generatePKCE(); - const state2 = generateState(); - const authUrl = buildAuthorizeUrl(redirectUri, pkce, state2); - const callbackPromise = waitForOAuthCallback(pkce, state2); + const state = generateState(); + const authUrl = buildAuthorizeUrl(redirectUri, pkce, state); + const callbackPromise = waitForOAuthCallback(pkce, state); return { url: authUrl, instructions: "Complete authorization in your browser. This window will close automatically.", @@ -203805,19 +204105,19 @@ var init_client5 = __esm(async () => { log15 = Log.create({ service: "anythingllm" }); ((AnythingLLMClient) => { let _config = null; - function configure(config4) { - _config = config4; - log15.info("configured", { url: config4.url }); + function configure(config3) { + _config = config3; + log15.info("configured", { url: config3.url }); } AnythingLLMClient.configure = configure; function isConfigured2() { return _config !== null; } AnythingLLMClient.isConfigured = isConfigured2; - async function request3(path27, opts) { + async function request3(path28, opts) { if (!_config) throw new Error("AnythingLLM client not configured"); - const url3 = `${_config.url.replace(/\/+$/, "")}${path27}`; + const url3 = `${_config.url.replace(/\/+$/, "")}${path28}`; const response = await fetch(url3, { ...opts, headers: { @@ -204035,8 +204335,8 @@ var init_plugin2 = __esm(async () => { } Plugin.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const bus = yield* Bus.Service; - const config4 = yield* Config.Service; - const state2 = yield* InstanceState.make(exports_Effect.fn("Plugin.state")(function* (ctx) { + const config3 = yield* Config.Service; + const state = yield* InstanceState.make(exports_Effect.fn("Plugin.state")(function* (ctx) { const hooks = []; const { Server: Server2 } = yield* exports_Effect.promise(() => init_server4().then(() => exports_server)); const client3 = createUnifiaClient({ @@ -204047,7 +204347,7 @@ var init_plugin2 = __esm(async () => { } : undefined, fetch: async (...args3) => Server2.Default().fetch(...args3) }); - const cfg = yield* config4.get(); + const cfg = yield* config3.get(); const input = { client: client3, project: ctx.project, @@ -204090,7 +204390,7 @@ var init_plugin2 = __esm(async () => { log12.info("skipping external plugins in pure mode", { count: cfg.plugin_origins.length }); } if (plugins.length) - yield* config4.waitForDependencies(); + yield* config3.waitForDependencies(); const loaded = yield* exports_Effect.promise(() => PluginLoader.loadExternal({ items: plugins, kind: "server", @@ -204160,7 +204460,7 @@ var init_plugin2 = __esm(async () => { const trigger2 = exports_Effect.fn("Plugin.trigger")(function* (name21, input, output2) { if (!name21) return output2; - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); for (const hook of s5.hooks) { const fn3 = hook[name21]; if (!fn3) @@ -204170,11 +204470,11 @@ var init_plugin2 = __esm(async () => { return output2; }); const list2 = exports_Effect.fn("Plugin.list")(function* () { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); return s5.hooks; }); const has18 = exports_Effect.fn("Plugin.has")(function* (name21) { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); for (const hook of s5.hooks) { if (typeof hook[name21] === "function") return true; @@ -204182,7 +204482,7 @@ var init_plugin2 = __esm(async () => { return false; }); const init5 = exports_Effect.fn("Plugin.init")(function* () { - yield* InstanceState.get(state2); + yield* InstanceState.get(state); }); return Service3.of({ trigger: trigger2, list: list2, has: has18, init: init5 }); })); @@ -205570,12 +205870,12 @@ var anthropicErrorDataSchema, anthropicFailedResponseHandler, anthropicMessagesR }, toolSearchRegex_20251119OutputSchema, toolSearchRegex_20251119InputSchema, factory9, toolSearchRegex_20251119 = (args3 = {}) => { return factory9(args3); }, AnthropicMessagesLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; var _a21; this.modelId = modelId; - this.config = config4; - this.generateId = (_a21 = config4.generateId) != null ? _a21 : generateId; + this.config = config3; + this.generateId = (_a21 = config3.generateId) != null ? _a21 : generateId; } supportsUrl(url3) { return url3.protocol === "https:"; @@ -209015,26 +209315,26 @@ var require_tslib = __commonJS((exports, module2) => { __importDefault = function(mod2) { return mod2 && mod2.__esModule ? mod2 : { default: mod2 }; }; - __classPrivateFieldGet2 = function(receiver, state2, kind, f4) { + __classPrivateFieldGet2 = function(receiver, state, kind, f4) { if (kind === "a" && !f4) throw new TypeError("Private accessor was defined without a getter"); - if (typeof state2 === "function" ? receiver !== state2 || !f4 : !state2.has(receiver)) + if (typeof state === "function" ? receiver !== state || !f4 : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f4 : kind === "a" ? f4.call(receiver) : f4 ? f4.value : state2.get(receiver); + return kind === "m" ? f4 : kind === "a" ? f4.call(receiver) : f4 ? f4.value : state.get(receiver); }; - __classPrivateFieldSet2 = function(receiver, state2, value8, kind, f4) { + __classPrivateFieldSet2 = function(receiver, state, value8, kind, f4) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f4) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state2 === "function" ? receiver !== state2 || !f4 : !state2.has(receiver)) + if (typeof state === "function" ? receiver !== state || !f4 : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return kind === "a" ? f4.call(receiver, value8) : f4 ? f4.value = value8 : state2.set(receiver, value8), value8; + return kind === "a" ? f4.call(receiver, value8) : f4 ? f4.value = value8 : state.set(receiver, value8), value8; }; - __classPrivateFieldIn = function(state2, receiver) { + __classPrivateFieldIn = function(state, receiver) { if (receiver === null || typeof receiver !== "object" && typeof receiver !== "function") throw new TypeError("Cannot use 'in' operator on non-object"); - return typeof state2 === "function" ? receiver === state2 : state2.has(receiver); + return typeof state === "function" ? receiver === state : state.has(receiver); }; __addDisposableResource = function(env3, value8, async) { if (value8 !== null && value8 !== undefined) { @@ -209104,13 +209404,13 @@ var require_tslib = __commonJS((exports, module2) => { } return next3(); }; - __rewriteRelativeImportExtension = function(path27, preserveJsx) { - if (typeof path27 === "string" && /^\.\.?\//.test(path27)) { - return path27.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function(m3, tsx, d4, ext2, cm) { + __rewriteRelativeImportExtension = function(path28, preserveJsx) { + if (typeof path28 === "string" && /^\.\.?\//.test(path28)) { + return path28.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function(m3, tsx, d4, ext2, cm) { return tsx ? preserveJsx ? ".jsx" : ".js" : d4 && (!ext2 || !cm) ? m3 : d4 + ext2 + "." + cm.toLowerCase() + "js"; }); } - return path27; + return path28; }; exporter("__extends", __extends); exporter("__assign", __assign); @@ -209662,8 +209962,8 @@ var require_dist_cjs = __commonJS((exports) => { var getDefaultClientConfiguration = (runtimeConfig) => { return getChecksumConfiguration(runtimeConfig); }; - var resolveDefaultRuntimeConfig = (config4) => { - return resolveChecksumRuntimeConfig(config4); + var resolveDefaultRuntimeConfig = (config3) => { + return resolveChecksumRuntimeConfig(config3); }; var FieldPosition; (function(FieldPosition2) { @@ -209878,13 +210178,13 @@ var require_schema2 = __commonJS((exports) => { input, output: output2 }); - var schemaDeserializationMiddleware = (config4) => (next3, context4) => async (args3) => { + var schemaDeserializationMiddleware = (config3) => (next3, context4) => async (args3) => { const { response } = await next3(args3); const { operationSchema } = getSmithyContext(context4); const [, ns2, n10, t2, i6, o3] = operationSchema ?? []; try { - const parsed = await config4.protocol.deserializeResponse(operation(ns2, n10, t2, i6, o3), { - ...config4, + const parsed = await config3.protocol.deserializeResponse(operation(ns2, n10, t2, i6, o3), { + ...config3, ...context4 }, response); return { @@ -209936,12 +210236,12 @@ var require_schema2 = __commonJS((exports) => { return k3.match(pattern); }) || [undefined, undefined])[1]; }; - var schemaSerializationMiddleware = (config4) => (next3, context4) => async (args3) => { + var schemaSerializationMiddleware = (config3) => (next3, context4) => async (args3) => { const { operationSchema } = getSmithyContext(context4); const [, ns2, n10, t2, i6, o3] = operationSchema ?? []; - const endpoint = context4.endpointV2 ? async () => toEndpointV1(context4.endpointV2) : config4.endpoint; - const request3 = await config4.protocol.serializeRequest(operation(ns2, n10, t2, i6, o3), args3.input, { - ...config4, + const endpoint = context4.endpointV2 ? async () => toEndpointV1(context4.endpointV2) : config3.endpoint; + const request3 = await config3.protocol.serializeRequest(operation(ns2, n10, t2, i6, o3), args3.input, { + ...config3, ...context4, endpoint }); @@ -209962,12 +210262,12 @@ var require_schema2 = __commonJS((exports) => { tags: ["SERIALIZER"], override: true }; - function getSchemaSerdePlugin(config4) { + function getSchemaSerdePlugin(config3) { return { applyToStack: (commandStack) => { - commandStack.add(schemaSerializationMiddleware(config4), serializerMiddlewareOption); - commandStack.add(schemaDeserializationMiddleware(config4), deserializerMiddlewareOption); - config4.protocol.setSerdeContext(config4); + commandStack.add(schemaSerializationMiddleware(config3), serializerMiddlewareOption); + commandStack.add(schemaDeserializationMiddleware(config3), deserializerMiddlewareOption); + config3.protocol.setSerdeContext(config3); } }; } @@ -210884,14 +211184,14 @@ var require_client5 = __commonJS((exports) => { } await sleep5(delayMs / 1000); } - const { state: state2, reason: reason2 } = await acceptorChecks(client3, input); + const { state, reason: reason2 } = await acceptorChecks(client3, input); if (reason2) { const message = createMessageFromResponse(reason2); observedResponses[message] |= 0; observedResponses[message] += 1; } - if (state2 !== WaiterState.RETRY) { - return { state: state2, reason: reason2, final: reason2, observedResponses }; + if (state !== WaiterState.RETRY) { + return { state, reason: reason2, final: reason2, observedResponses }; } currentAttempt += 1; if (!didWarn403 && Date.now() >= warn403Time) { @@ -211006,12 +211306,12 @@ var require_client5 = __commonJS((exports) => { middlewareStack = constructStack(); initConfig; handlers; - constructor(config4) { - this.config = config4; - const { protocol, protocolSettings } = config4; + constructor(config3) { + this.config = config3; + const { protocol, protocolSettings } = config3; if (protocolSettings) { if (typeof protocol === "function") { - config4.protocol = new protocol(protocolSettings); + config3.protocol = new protocol(protocolSettings); } } } @@ -211239,14 +211539,14 @@ var require_client5 = __commonJS((exports) => { for (const [waiterName, waiterFn] of Object.entries(waiters)) { if (Client2.prototype[waiterName] === undefined) { Client2.prototype[waiterName] = async function(commandInput = {}, waiterConfiguration, ...rest) { - let config4 = waiterConfiguration; + let config3 = waiterConfiguration; if (typeof waiterConfiguration === "number") { - config4 = { + config3 = { maxWaitTime: waiterConfiguration }; } return waiterFn({ - ...config4, + ...config3, client: this }, commandInput, ...rest); }; @@ -211417,8 +211717,8 @@ var require_client5 = __commonJS((exports) => { return Object.assign(getChecksumConfiguration(runtimeConfig), getRetryConfiguration(runtimeConfig)); }; var getDefaultClientConfiguration = getDefaultExtensionConfiguration; - var resolveDefaultRuntimeConfig = (config4) => { - return Object.assign(resolveChecksumRuntimeConfig(config4), resolveRetryRuntimeConfig(config4)); + var resolveDefaultRuntimeConfig = (config3) => { + return Object.assign(resolveChecksumRuntimeConfig(config3), resolveRetryRuntimeConfig(config3)); }; var getArrayIfSingleItem = (mayBeArray) => Array.isArray(mayBeArray) ? mayBeArray : [mayBeArray]; var getValueFromTextNode = (obj) => { @@ -211565,9 +211865,9 @@ var require_client5 = __commonJS((exports) => { function makeBuilder(common, service3, name21, ep) { return function makeCommand(added, plugins, op, $2, smithyContext = {}) { const epMerged = Object.assign({}, common, added); - return Command3.classBuilder().ep(epMerged).m(function(CommandCtor, clientStack, config4, options4) { - const list = plugins.call(this, CommandCtor, clientStack, config4, options4); - list.unshift(ep(config4, CommandCtor.getEndpointParameterInstructions())); + return Command3.classBuilder().ep(epMerged).m(function(CommandCtor, clientStack, config3, options4) { + const list = plugins.call(this, CommandCtor, clientStack, config3, options4); + list.unshift(ep(config3, CommandCtor.getEndpointParameterInstructions())); return list; }).s(service3, op, smithyContext).n(name21, op.charAt(0).toUpperCase() + op.slice(1) + "Command").sc($2).build(); }; @@ -211850,14 +212150,14 @@ var require_config4 = __commonJS((exports) => { }; var filePromises = {}; var fileIntercept = {}; - var readFile5 = (path27, options4) => { - if (fileIntercept[path27] !== undefined) { - return fileIntercept[path27]; + var readFile5 = (path28, options4) => { + if (fileIntercept[path28] !== undefined) { + return fileIntercept[path28]; } - if (!filePromises[path27] || options4?.ignoreCache) { - filePromises[path27] = readFile$1(path27, "utf8"); + if (!filePromises[path28] || options4?.ignoreCache) { + filePromises[path28] = readFile$1(path28, "utf8"); } - return filePromises[path27]; + return filePromises[path28]; }; var swallowError$1 = () => ({}); var loadSharedConfigFiles = async (init4 = {}) => { @@ -211909,8 +212209,8 @@ var require_config4 = __commonJS((exports) => { getFileRecord() { return fileIntercept; }, - interceptFile(path27, contents) { - fileIntercept[path27] = Promise.resolve(contents); + interceptFile(path28, contents) { + fileIntercept[path28] = Promise.resolve(contents); }, getTokenRecord() { return tokenIntercept; @@ -211932,11 +212232,11 @@ var require_config4 = __commonJS((exports) => { } var fromEnv2 = (envVarSelector, options4) => async () => { try { - const config4 = envVarSelector(process.env, options4); - if (config4 === undefined) { + const config3 = envVarSelector(process.env, options4); + if (config3 === undefined) { throw new Error; } - return config4; + return config3; } catch (e2) { throw new CredentialsProviderError(e2.message || `Not found in ENV: ${getSelectorName(envVarSelector.toString())}`, { logger: options4?.logger }); } @@ -212326,13 +212626,13 @@ var require_endpoints = __commonJS((exports) => { return endpointUrl; return; }, - configFileSelector: (profile, config4) => { + configFileSelector: (profile, config3) => { if (profile.services) { const servicesSectionKey = ["services", profile.services].join(CONFIG_PREFIX_SEPARATOR); - if (!config4 || !config4[servicesSectionKey]) { + if (!config3 || !config3[servicesSectionKey]) { throw new Error(`The services section "${profile.services}" specified in the profile is not present in the shared configuration file.`); } - const servicesSection = config4[servicesSectionKey]; + const servicesSection = config3[servicesSectionKey]; const servicePrefixParts = serviceId.split(" ").map((w2) => w2.toLowerCase()); const endpointUrl2 = servicesSection[[servicePrefixParts.join("_"), CONFIG_ENDPOINT_URL].join(CONFIG_PREFIX_SEPARATOR)]; if (endpointUrl2) @@ -212390,15 +212690,15 @@ var require_endpoints = __commonJS((exports) => { } return isValidArn; }; - var createConfigValueProvider = (configKey, canonicalEndpointParamKey, config4, isClientContextParam = false) => { + var createConfigValueProvider = (configKey, canonicalEndpointParamKey, config3, isClientContextParam = false) => { const configProvider = async () => { let configValue; if (isClientContextParam) { - const clientContextParams = config4.clientContextParams; + const clientContextParams = config3.clientContextParams; const nestedValue = clientContextParams?.[configKey]; - configValue = nestedValue ?? config4[configKey] ?? config4[canonicalEndpointParamKey]; + configValue = nestedValue ?? config3[configKey] ?? config3[canonicalEndpointParamKey]; } else { - configValue = config4[configKey] ?? config4[canonicalEndpointParamKey]; + configValue = config3[configKey] ?? config3[canonicalEndpointParamKey]; } if (typeof configValue === "function") { return configValue(); @@ -212407,21 +212707,21 @@ var require_endpoints = __commonJS((exports) => { }; if (configKey === "credentialScope" || canonicalEndpointParamKey === "CredentialScope") { return async () => { - const credentials = typeof config4.credentials === "function" ? await config4.credentials() : config4.credentials; + const credentials = typeof config3.credentials === "function" ? await config3.credentials() : config3.credentials; const configValue = credentials?.credentialScope ?? credentials?.CredentialScope; return configValue; }; } if (configKey === "accountId" || canonicalEndpointParamKey === "AccountId") { return async () => { - const credentials = typeof config4.credentials === "function" ? await config4.credentials() : config4.credentials; + const credentials = typeof config3.credentials === "function" ? await config3.credentials() : config3.credentials; const configValue = credentials?.accountId ?? credentials?.AccountId; return configValue; }; } if (configKey === "endpoint" || canonicalEndpointParamKey === "endpoint") { return async () => { - if (config4.isCustomEndpoint === false) { + if (config3.isCustomEndpoint === false) { return; } const endpoint = await configProvider(); @@ -212430,8 +212730,8 @@ var require_endpoints = __commonJS((exports) => { return endpoint.url.href; } if ("hostname" in endpoint) { - const { protocol, hostname: hostname3, port: port2, path: path27 } = endpoint; - return `${protocol}//${hostname3}${port2 ? ":" + port2 : ""}${path27}`; + const { protocol, hostname: hostname3, port: port2, path: path28 } = endpoint; + return `${protocol}//${hostname3}${port2 ? ":" + port2 : ""}${path28}`; } } return endpoint; @@ -212511,16 +212811,16 @@ var require_endpoints = __commonJS((exports) => { } function bindEndpointMiddleware(getEndpointFromConfig2) { const getEndpointFromInstructions2 = bindGetEndpointFromInstructions(getEndpointFromConfig2); - return ({ config: config4, instructions }) => { + return ({ config: config3, instructions }) => { return (next3, context4) => async (args3) => { - if (config4.isCustomEndpoint) { + if (config3.isCustomEndpoint) { setFeature(context4, "ENDPOINT_OVERRIDE", "N"); } const endpoint = await getEndpointFromInstructions2(args3.input, { getEndpointParameterInstructions() { return instructions; } - }, { ...config4 }, context4); + }, { ...config3 }, context4); context4.endpointV2 = endpoint; context4.authSchemes = endpoint.properties?.authSchemes; const authScheme = context4.authSchemes?.[0]; @@ -212558,10 +212858,10 @@ var require_endpoints = __commonJS((exports) => { }; function bindGetEndpointPlugin(getEndpointFromConfig2) { const endpointMiddleware2 = bindEndpointMiddleware(getEndpointFromConfig2); - return (config4, instructions) => ({ + return (config3, instructions) => ({ applyToStack: (clientStack) => { clientStack.addRelativeTo(endpointMiddleware2({ - config: config4, + config: config3, instructions }), endpointMiddlewareOptions); } @@ -212688,18 +212988,18 @@ var require_endpoints = __commonJS((exports) => { } return; } - var getAttrPathList = (path27) => { - const parts3 = path27.split("."); + var getAttrPathList = (path28) => { + const parts3 = path28.split("."); const pathList = []; for (const part of parts3) { const squareBracketIndex = part.indexOf("["); if (squareBracketIndex !== -1) { if (part.indexOf("]") !== part.length - 1) { - throw new EndpointError(`Path: '${path27}' does not end with ']'`); + throw new EndpointError(`Path: '${path28}' does not end with ']'`); } const arrayIndex = part.slice(squareBracketIndex + 1, -1); if (Number.isNaN(parseInt(arrayIndex))) { - throw new EndpointError(`Invalid array index: '${arrayIndex}' in path: '${path27}'`); + throw new EndpointError(`Invalid array index: '${arrayIndex}' in path: '${path28}'`); } if (squareBracketIndex !== 0) { pathList.push(part.slice(0, squareBracketIndex)); @@ -212711,9 +213011,9 @@ var require_endpoints = __commonJS((exports) => { } return pathList; }; - var getAttr = (value8, path27) => getAttrPathList(path27).reduce((acc, index3) => { + var getAttr = (value8, path28) => getAttrPathList(path28).reduce((acc, index3) => { if (typeof acc !== "object") { - throw new EndpointError(`Index '${index3}' in '${path27}' not found in '${JSON.stringify(value8)}'`); + throw new EndpointError(`Index '${index3}' in '${path28}' not found in '${JSON.stringify(value8)}'`); } else if (Array.isArray(acc)) { const i6 = parseInt(index3); return acc[i6 < 0 ? acc.length + i6 : i6]; @@ -212738,8 +213038,8 @@ var require_endpoints = __commonJS((exports) => { return value8; } if (typeof value8 === "object" && "hostname" in value8) { - const { hostname: hostname4, port: port2, protocol: protocol2 = "", path: path27 = "", query = {} } = value8; - const url3 = new URL(`${protocol2}//${hostname4}${port2 ? `:${port2}` : ""}${path27}`); + const { hostname: hostname4, port: port2, protocol: protocol2 = "", path: path28 = "", query = {} } = value8; + const url3 = new URL(`${protocol2}//${hostname4}${port2 ? `:${port2}` : ""}${path28}`); url3.search = Object.entries(query).map(([k3, v3]) => `${k3}=${v3}`).join("&"); return url3; } @@ -213996,11 +214296,11 @@ var require_serde = __commonJS((exports) => { tags: ["SERIALIZER"], override: true }; - function getSerdePlugin(config4, serializer, deserializer) { + function getSerdePlugin(config3, serializer, deserializer) { return { applyToStack: (commandStack) => { - commandStack.add(deserializerMiddleware(config4, deserializer), deserializerMiddlewareOption); - commandStack.add(serializerMiddleware(config4, serializer), serializerMiddlewareOption); + commandStack.add(deserializerMiddleware(config3, deserializer), deserializerMiddlewareOption); + commandStack.add(serializerMiddleware(config3, serializer), serializerMiddlewareOption); } }; } @@ -215400,7 +215700,7 @@ var init_aws4fetch_esm = __esm(() => { function createBedrockEventStreamDecoder(body3, processEvent) { const codec2 = new EventStreamCodec(import_util_utf82.toUtf8, import_util_utf82.fromUtf8); let buffer4 = new Uint8Array(0); - const textDecoder3 = new TextDecoder; + const textDecoder2 = new TextDecoder; return body3.pipeThrough(new TransformStream({ async transform(chunk, controller) { var _a21, _b16; @@ -215419,7 +215719,7 @@ function createBedrockEventStreamDecoder(body3, processEvent) { buffer4 = buffer4.slice(totalLength); const messageType = (_a21 = decoded.headers[":message-type"]) == null ? undefined : _a21.value; const eventType = (_b16 = decoded.headers[":event-type"]) == null ? undefined : _b16.value; - const data2 = textDecoder3.decode(decoded.body); + const data2 = textDecoder2.decode(decoded.body); await processEvent({ messageType, eventType, data: data2 }, controller); } catch (e2) { break; @@ -216182,9 +216482,9 @@ var import_util_utf82, BEDROCK_STOP_REASONS, BEDROCK_IMAGE_MIME_TYPES, BEDROCK_D }) }; }, BedrockChatLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.provider = "amazon-bedrock"; this.supportedUrls = {}; @@ -216850,9 +217150,9 @@ var import_util_utf82, BEDROCK_STOP_REASONS, BEDROCK_IMAGE_MIME_TYPES, BEDROCK_D return `${this.config.baseUrl()}/model/${encodedModelId}`; } }, BedrockStopReasonSchema, BedrockAdditionalModelResponseFieldsSchema, BedrockToolUseSchema, BedrockReasoningTextSchema, BedrockRedactedReasoningSchema, BedrockResponseSchema, BedrockStreamSchema, bedrockReasoningMetadataSchema, amazonBedrockEmbeddingModelOptionsSchema, BedrockEmbeddingModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.provider = "amazon-bedrock"; this.maxEmbeddingsPerCall = 1; @@ -216938,9 +217238,9 @@ var import_util_utf82, BEDROCK_STOP_REASONS, BEDROCK_IMAGE_MIME_TYPES, BEDROCK_D }; } }, BedrockEmbeddingResponseSchema, modelMaxImagesPerCall, BedrockImageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.provider = "amazon-bedrock"; } @@ -217103,9 +217403,9 @@ var import_util_utf82, BEDROCK_STOP_REASONS, BEDROCK_IMAGE_MIME_TYPES, BEDROCK_D }; } }, bedrockImageResponseSchema, VERSION5 = "4.0.83", bedrockRerankingResponseSchema, amazonBedrockRerankingModelOptionsSchema, BedrockRerankingModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.provider = "amazon-bedrock"; } @@ -218858,12 +219158,12 @@ var VERSION6 = "3.0.64", anthropicErrorDataSchema2, anthropicFailedResponseHandl }, toolSearchRegex_20251119OutputSchema2, toolSearchRegex_20251119InputSchema2, factory92, toolSearchRegex_202511192 = (args3 = {}) => { return factory92(args3); }, AnthropicMessagesLanguageModel2 = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; var _a21; this.modelId = modelId; - this.config = config4; - this.generateId = (_a21 = config4.generateId) != null ? _a21 : generateId; + this.config = config3; + this.generateId = (_a21 = config3.generateId) != null ? _a21 : generateId; } supportsUrl(url3) { return url3.protocol === "https:"; @@ -223295,13 +223595,13 @@ function escapeJSONDelta(delta) { return JSON.stringify(delta).slice(1, -1); } var openaiErrorDataSchema, openaiFailedResponseHandler, openaiChatResponseSchema, openaiChatChunkSchema, openaiLanguageModelChatOptions, OpenAIChatLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.supportedUrls = { "image/*": [/^https?:\/\/.*$/] }; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -223762,11 +224062,11 @@ var openaiErrorDataSchema, openaiFailedResponseHandler, openaiChatResponseSchema }; } }, openaiCompletionResponseSchema, openaiCompletionChunkSchema, openaiLanguageModelCompletionOptions, OpenAICompletionLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.supportedUrls = {}; this.modelId = modelId; - this.config = config4; + this.config = config3; } get providerOptionsName() { return this.config.provider.split(".")[0].trim(); @@ -223975,12 +224275,12 @@ var openaiErrorDataSchema, openaiFailedResponseHandler, openaiChatResponseSchema }; } }, openaiEmbeddingModelOptions, openaiTextEmbeddingResponseSchema, OpenAIEmbeddingModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.maxEmbeddingsPerCall = 2048; this.supportsParallelCalls = true; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -224035,9 +224335,9 @@ var openaiErrorDataSchema, openaiFailedResponseHandler, openaiChatResponseSchema }; } }, openaiImageResponseSchema, modelMaxImagesPerCall2, defaultResponseFormatPrefixes, OpenAIImageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; } get maxImagesPerCall() { @@ -224181,9 +224481,9 @@ var openaiErrorDataSchema, openaiFailedResponseHandler, openaiChatResponseSchema }; } }, openaiTranscriptionResponseSchema, openAITranscriptionModelOptions, languageMap, OpenAITranscriptionModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; } get provider() { @@ -224278,9 +224578,9 @@ var openaiErrorDataSchema, openaiFailedResponseHandler, openaiChatResponseSchema }; } }, openaiSpeechModelOptionsSchema, OpenAISpeechModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; } get provider() { @@ -224380,14 +224680,14 @@ var openaiErrorDataSchema, openaiFailedResponseHandler, openaiChatResponseSchema }, comparisonFilterSchema, compoundFilterSchema, fileSearchArgsSchema, fileSearchOutputSchema, fileSearch, imageGenerationArgsSchema, imageGenerationInputSchema, imageGenerationOutputSchema, imageGenerationToolFactory, imageGeneration = (args3 = {}) => { return imageGenerationToolFactory(args3); }, customArgsSchema, customInputSchema, customToolFactory, jsonValueSchema22, mcpArgsSchema, mcpInputSchema, mcpOutputSchema, mcpToolFactory, webSearchArgsSchema, webSearchInputSchema, webSearchOutputSchema, webSearchToolFactory, webSearchPreviewArgsSchema, webSearchPreviewInputSchema, webSearchPreviewOutputSchema, webSearchPreview, OpenAIResponsesLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.supportedUrls = { "image/*": [/^https?:\/\/.*$/], "application/pdf": [/^https?:\/\/.*$/] }; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -227578,14 +227878,14 @@ function createAzure(options4 = {}) { description: "Azure OpenAI resource name" }); const apiVersion = (_a21 = options4.apiVersion) != null ? _a21 : "v1"; - const url3 = ({ path: path27, modelId }) => { + const url3 = ({ path: path28, modelId }) => { var _a25; const baseUrlPrefix = (_a25 = options4.baseURL) != null ? _a25 : `https://${getResourceName()}.openai.azure.com/openai`; let fullUrl; if (options4.useDeploymentBasedUrls) { - fullUrl = new URL(`${baseUrlPrefix}/deployments/${modelId}${path27}`); + fullUrl = new URL(`${baseUrlPrefix}/deployments/${modelId}${path28}`); } else { - fullUrl = new URL(`${baseUrlPrefix}/v1${path27}`); + fullUrl = new URL(`${baseUrlPrefix}/v1${path28}`); } fullUrl.searchParams.set("api-version", apiVersion); return fullUrl.toString(); @@ -228471,12 +228771,12 @@ function createGoogleGenerativeAI(options4 = {}) { return provider; } var VERSION8 = "3.0.53", googleErrorDataSchema, googleFailedResponseHandler, googleEmbeddingContentPartSchema, googleEmbeddingModelOptions, GoogleGenerativeAIEmbeddingModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.maxEmbeddingsPerCall = 2048; this.supportsParallelCalls = true; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -228571,12 +228871,12 @@ var VERSION8 = "3.0.53", googleErrorDataSchema, googleFailedResponseHandler, goo }; } }, googleGenerativeAITextEmbeddingResponseSchema, googleGenerativeAISingleEmbeddingResponseSchema, dataUrlRegex, googleLanguageModelOptions, GoogleGenerativeAILanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; var _a21; this.modelId = modelId; - this.config = config4; - this.generateId = (_a21 = config4.generateId) != null ? _a21 : generateId; + this.config = config3; + this.generateId = (_a21 = config3.generateId) != null ? _a21 : generateId; } get provider() { return this.config.provider; @@ -229157,10 +229457,10 @@ var VERSION8 = "3.0.53", googleErrorDataSchema, googleFailedResponseHandler, goo urlRetrievalStatus: exports_external.string() })).nullish() }), responseSchema, chunkSchema, codeExecution, enterpriseWebSearch, fileSearchArgsBaseSchema, fileSearchArgsSchema2, fileSearch2, googleMaps, googleSearchToolArgsBaseSchema, googleSearchToolArgsSchema, googleSearch, urlContext, vertexRagStore, googleTools, GoogleGenerativeAIImageModel = class { - constructor(modelId, settings, config4) { + constructor(modelId, settings, config3) { this.modelId = modelId; this.settings = settings; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; } get maxImagesPerCall() { @@ -229361,9 +229661,9 @@ var VERSION8 = "3.0.53", googleErrorDataSchema, googleFailedResponseHandler, goo }; } }, googleImageResponseSchema, googleImageModelOptionsSchema, GoogleGenerativeAIVideoModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; } get provider() { @@ -230074,12 +230374,12 @@ var require_common4 = __commonJS((exports) => { } return Function.prototype[Symbol.hasInstance].call(GaxiosError, instance2); } - constructor(message, config4, response, cause) { + constructor(message, config3, response, cause) { super(message, { cause }); - this.config = config4; + this.config = config3; this.response = response; this.error = cause instanceof Error ? cause : undefined; - this.config = (0, extend_1.default)(true, {}, config4); + this.config = (0, extend_1.default)(true, {}, config3); if (this.response) { this.response.config = (0, extend_1.default)(true, {}, this.response.config); } @@ -230224,65 +230524,65 @@ var require_retry2 = __commonJS((exports) => { Object.defineProperty(exports, "__esModule", { value: true }); exports.getRetryConfig = getRetryConfig; async function getRetryConfig(err2) { - let config4 = getConfig(err2); - if (!err2 || !err2.config || !config4 && !err2.config.retry) { + let config3 = getConfig(err2); + if (!err2 || !err2.config || !config3 && !err2.config.retry) { return { shouldRetry: false }; } - config4 = config4 || {}; - config4.currentRetryAttempt = config4.currentRetryAttempt || 0; - config4.retry = config4.retry === undefined || config4.retry === null ? 3 : config4.retry; - config4.httpMethodsToRetry = config4.httpMethodsToRetry || [ + config3 = config3 || {}; + config3.currentRetryAttempt = config3.currentRetryAttempt || 0; + config3.retry = config3.retry === undefined || config3.retry === null ? 3 : config3.retry; + config3.httpMethodsToRetry = config3.httpMethodsToRetry || [ "GET", "HEAD", "PUT", "OPTIONS", "DELETE" ]; - config4.noResponseRetries = config4.noResponseRetries === undefined || config4.noResponseRetries === null ? 2 : config4.noResponseRetries; - config4.retryDelayMultiplier = config4.retryDelayMultiplier ? config4.retryDelayMultiplier : 2; - config4.timeOfFirstRequest = config4.timeOfFirstRequest ? config4.timeOfFirstRequest : Date.now(); - config4.totalTimeout = config4.totalTimeout ? config4.totalTimeout : Number.MAX_SAFE_INTEGER; - config4.maxRetryDelay = config4.maxRetryDelay ? config4.maxRetryDelay : Number.MAX_SAFE_INTEGER; + config3.noResponseRetries = config3.noResponseRetries === undefined || config3.noResponseRetries === null ? 2 : config3.noResponseRetries; + config3.retryDelayMultiplier = config3.retryDelayMultiplier ? config3.retryDelayMultiplier : 2; + config3.timeOfFirstRequest = config3.timeOfFirstRequest ? config3.timeOfFirstRequest : Date.now(); + config3.totalTimeout = config3.totalTimeout ? config3.totalTimeout : Number.MAX_SAFE_INTEGER; + config3.maxRetryDelay = config3.maxRetryDelay ? config3.maxRetryDelay : Number.MAX_SAFE_INTEGER; const retryRanges = [ [100, 199], [408, 408], [429, 429], [500, 599] ]; - config4.statusCodesToRetry = config4.statusCodesToRetry || retryRanges; - err2.config.retryConfig = config4; - const shouldRetryFn = config4.shouldRetry || shouldRetryRequest; + config3.statusCodesToRetry = config3.statusCodesToRetry || retryRanges; + err2.config.retryConfig = config3; + const shouldRetryFn = config3.shouldRetry || shouldRetryRequest; if (!await shouldRetryFn(err2)) { return { shouldRetry: false, config: err2.config }; } - const delay4 = getNextRetryDelay(config4); + const delay4 = getNextRetryDelay(config3); err2.config.retryConfig.currentRetryAttempt += 1; - const backoff = config4.retryBackoff ? config4.retryBackoff(err2, delay4) : new Promise((resolve10) => { + const backoff = config3.retryBackoff ? config3.retryBackoff(err2, delay4) : new Promise((resolve10) => { setTimeout(resolve10, delay4); }); - if (config4.onRetryAttempt) { - await config4.onRetryAttempt(err2); + if (config3.onRetryAttempt) { + await config3.onRetryAttempt(err2); } await backoff; return { shouldRetry: true, config: err2.config }; } function shouldRetryRequest(err2) { - const config4 = getConfig(err2); + const config3 = getConfig(err2); if (err2.config.signal?.aborted && err2.code !== "TimeoutError" || err2.code === "AbortError") { return false; } - if (!config4 || config4.retry === 0) { + if (!config3 || config3.retry === 0) { return false; } - if (!err2.response && (config4.currentRetryAttempt || 0) >= config4.noResponseRetries) { + if (!err2.response && (config3.currentRetryAttempt || 0) >= config3.noResponseRetries) { return false; } - if (!config4.httpMethodsToRetry || !config4.httpMethodsToRetry.includes(err2.config.method?.toUpperCase() || "GET")) { + if (!config3.httpMethodsToRetry || !config3.httpMethodsToRetry.includes(err2.config.method?.toUpperCase() || "GET")) { return false; } if (err2.response && err2.response.status) { let isInRange2 = false; - for (const [min14, max14] of config4.statusCodesToRetry) { + for (const [min14, max14] of config3.statusCodesToRetry) { const status = err2.response.status; if (status >= min14 && status <= max14) { isInRange2 = true; @@ -230293,8 +230593,8 @@ var require_retry2 = __commonJS((exports) => { return false; } } - config4.currentRetryAttempt = config4.currentRetryAttempt || 0; - if (config4.currentRetryAttempt >= config4.retry) { + config3.currentRetryAttempt = config3.currentRetryAttempt || 0; + if (config3.currentRetryAttempt >= config3.retry) { return false; } return true; @@ -230305,11 +230605,11 @@ var require_retry2 = __commonJS((exports) => { } return; } - function getNextRetryDelay(config4) { - const retryDelay = config4.currentRetryAttempt ? 0 : config4.retryDelay ?? 100; - const calculatedDelay = retryDelay + (Math.pow(config4.retryDelayMultiplier, config4.currentRetryAttempt) - 1) / 2 * 1000; - const maxAllowableDelay = config4.totalTimeout - (Date.now() - config4.timeOfFirstRequest); - return Math.min(calculatedDelay, maxAllowableDelay, config4.maxRetryDelay); + function getNextRetryDelay(config3) { + const retryDelay = config3.currentRetryAttempt ? 0 : config3.retryDelay ?? 100; + const calculatedDelay = retryDelay + (Math.pow(config3.retryDelayMultiplier, config3.currentRetryAttempt) - 1) / 2 * 1000; + const maxAllowableDelay = config3.totalTimeout - (Date.now() - config3.timeOfFirstRequest); + return Math.min(calculatedDelay, maxAllowableDelay, config3.maxRetryDelay); } }); @@ -230380,12 +230680,12 @@ var require_gaxios = __commonJS((exports) => { prepared = await this.#applyRequestInterceptors(prepared); return this.#applyResponseInterceptors(this._request(prepared)); } - async _defaultAdapter(config4) { - const fetchImpl = config4.fetchImplementation || this.defaults.fetchImplementation || await _a21.#getFetch(); - const preparedOpts = { ...config4 }; + async _defaultAdapter(config3) { + const fetchImpl = config3.fetchImplementation || this.defaults.fetchImplementation || await _a21.#getFetch(); + const preparedOpts = { ...config3 }; delete preparedOpts.data; - const res = await fetchImpl(config4.url, preparedOpts); - const data2 = await this.getResponseData(config4, res); + const res = await fetchImpl(config3.url, preparedOpts); + const data2 = await this.getResponseData(config3, res); if (!Object.getOwnPropertyDescriptor(res, "data")?.configurable) { Object.defineProperties(res, { data: { @@ -230396,7 +230696,7 @@ var require_gaxios = __commonJS((exports) => { } }); } - return Object.assign(res, { config: config4, data: data2 }); + return Object.assign(res, { config: config3, data: data2 }); } async _request(opts) { try { @@ -230427,9 +230727,9 @@ var require_gaxios = __commonJS((exports) => { } else { err2 = new common_js_1.GaxiosError("Unexpected Gaxios Error", opts, undefined, e2); } - const { shouldRetry, config: config4 } = await (0, retry_js_1.getRetryConfig)(err2); - if (shouldRetry && config4) { - err2.config.retryConfig.currentRetryAttempt = config4.retryConfig.currentRetryAttempt; + const { shouldRetry, config: config3 } = await (0, retry_js_1.getRetryConfig)(err2); + if (shouldRetry && config3) { + err2.config.retryConfig.currentRetryAttempt = config3.retryConfig.currentRetryAttempt; opts.retryConfig = err2.config?.retryConfig; this.#appendTimeoutToSignal(opts); return this._request(opts); @@ -230865,12 +231165,12 @@ var require_common5 = __commonJS((exports) => { } return Function.prototype[Symbol.hasInstance].call(GaxiosError, instance2); } - constructor(message, config4, response, cause) { + constructor(message, config3, response, cause) { super(message, { cause }); - this.config = config4; + this.config = config3; this.response = response; this.error = cause instanceof Error ? cause : undefined; - this.config = (0, extend_1.default)(true, {}, config4); + this.config = (0, extend_1.default)(true, {}, config3); if (this.response) { this.response.config = (0, extend_1.default)(true, {}, this.response.config); } @@ -231015,65 +231315,65 @@ var require_retry3 = __commonJS((exports) => { Object.defineProperty(exports, "__esModule", { value: true }); exports.getRetryConfig = getRetryConfig; async function getRetryConfig(err2) { - let config4 = getConfig(err2); - if (!err2 || !err2.config || !config4 && !err2.config.retry) { + let config3 = getConfig(err2); + if (!err2 || !err2.config || !config3 && !err2.config.retry) { return { shouldRetry: false }; } - config4 = config4 || {}; - config4.currentRetryAttempt = config4.currentRetryAttempt || 0; - config4.retry = config4.retry === undefined || config4.retry === null ? 3 : config4.retry; - config4.httpMethodsToRetry = config4.httpMethodsToRetry || [ + config3 = config3 || {}; + config3.currentRetryAttempt = config3.currentRetryAttempt || 0; + config3.retry = config3.retry === undefined || config3.retry === null ? 3 : config3.retry; + config3.httpMethodsToRetry = config3.httpMethodsToRetry || [ "GET", "HEAD", "PUT", "OPTIONS", "DELETE" ]; - config4.noResponseRetries = config4.noResponseRetries === undefined || config4.noResponseRetries === null ? 2 : config4.noResponseRetries; - config4.retryDelayMultiplier = config4.retryDelayMultiplier ? config4.retryDelayMultiplier : 2; - config4.timeOfFirstRequest = config4.timeOfFirstRequest ? config4.timeOfFirstRequest : Date.now(); - config4.totalTimeout = config4.totalTimeout ? config4.totalTimeout : Number.MAX_SAFE_INTEGER; - config4.maxRetryDelay = config4.maxRetryDelay ? config4.maxRetryDelay : Number.MAX_SAFE_INTEGER; + config3.noResponseRetries = config3.noResponseRetries === undefined || config3.noResponseRetries === null ? 2 : config3.noResponseRetries; + config3.retryDelayMultiplier = config3.retryDelayMultiplier ? config3.retryDelayMultiplier : 2; + config3.timeOfFirstRequest = config3.timeOfFirstRequest ? config3.timeOfFirstRequest : Date.now(); + config3.totalTimeout = config3.totalTimeout ? config3.totalTimeout : Number.MAX_SAFE_INTEGER; + config3.maxRetryDelay = config3.maxRetryDelay ? config3.maxRetryDelay : Number.MAX_SAFE_INTEGER; const retryRanges = [ [100, 199], [408, 408], [429, 429], [500, 599] ]; - config4.statusCodesToRetry = config4.statusCodesToRetry || retryRanges; - err2.config.retryConfig = config4; - const shouldRetryFn = config4.shouldRetry || shouldRetryRequest; + config3.statusCodesToRetry = config3.statusCodesToRetry || retryRanges; + err2.config.retryConfig = config3; + const shouldRetryFn = config3.shouldRetry || shouldRetryRequest; if (!await shouldRetryFn(err2)) { return { shouldRetry: false, config: err2.config }; } - const delay4 = getNextRetryDelay(config4); + const delay4 = getNextRetryDelay(config3); err2.config.retryConfig.currentRetryAttempt += 1; - const backoff = config4.retryBackoff ? config4.retryBackoff(err2, delay4) : new Promise((resolve10) => { + const backoff = config3.retryBackoff ? config3.retryBackoff(err2, delay4) : new Promise((resolve10) => { setTimeout(resolve10, delay4); }); - if (config4.onRetryAttempt) { - await config4.onRetryAttempt(err2); + if (config3.onRetryAttempt) { + await config3.onRetryAttempt(err2); } await backoff; return { shouldRetry: true, config: err2.config }; } function shouldRetryRequest(err2) { - const config4 = getConfig(err2); + const config3 = getConfig(err2); if (err2.config.signal?.aborted && err2.code !== "TimeoutError" || err2.code === "AbortError") { return false; } - if (!config4 || config4.retry === 0) { + if (!config3 || config3.retry === 0) { return false; } - if (!err2.response && (config4.currentRetryAttempt || 0) >= config4.noResponseRetries) { + if (!err2.response && (config3.currentRetryAttempt || 0) >= config3.noResponseRetries) { return false; } - if (!config4.httpMethodsToRetry || !config4.httpMethodsToRetry.includes(err2.config.method?.toUpperCase() || "GET")) { + if (!config3.httpMethodsToRetry || !config3.httpMethodsToRetry.includes(err2.config.method?.toUpperCase() || "GET")) { return false; } if (err2.response && err2.response.status) { let isInRange2 = false; - for (const [min14, max14] of config4.statusCodesToRetry) { + for (const [min14, max14] of config3.statusCodesToRetry) { const status = err2.response.status; if (status >= min14 && status <= max14) { isInRange2 = true; @@ -231084,8 +231384,8 @@ var require_retry3 = __commonJS((exports) => { return false; } } - config4.currentRetryAttempt = config4.currentRetryAttempt || 0; - if (config4.currentRetryAttempt >= config4.retry) { + config3.currentRetryAttempt = config3.currentRetryAttempt || 0; + if (config3.currentRetryAttempt >= config3.retry) { return false; } return true; @@ -231096,11 +231396,11 @@ var require_retry3 = __commonJS((exports) => { } return; } - function getNextRetryDelay(config4) { - const retryDelay = config4.currentRetryAttempt ? 0 : config4.retryDelay ?? 100; - const calculatedDelay = retryDelay + (Math.pow(config4.retryDelayMultiplier, config4.currentRetryAttempt) - 1) / 2 * 1000; - const maxAllowableDelay = config4.totalTimeout - (Date.now() - config4.timeOfFirstRequest); - return Math.min(calculatedDelay, maxAllowableDelay, config4.maxRetryDelay); + function getNextRetryDelay(config3) { + const retryDelay = config3.currentRetryAttempt ? 0 : config3.retryDelay ?? 100; + const calculatedDelay = retryDelay + (Math.pow(config3.retryDelayMultiplier, config3.currentRetryAttempt) - 1) / 2 * 1000; + const maxAllowableDelay = config3.totalTimeout - (Date.now() - config3.timeOfFirstRequest); + return Math.min(calculatedDelay, maxAllowableDelay, config3.maxRetryDelay); } }); @@ -231171,12 +231471,12 @@ var require_gaxios2 = __commonJS((exports) => { prepared = await this.#applyRequestInterceptors(prepared); return this.#applyResponseInterceptors(this._request(prepared)); } - async _defaultAdapter(config4) { - const fetchImpl = config4.fetchImplementation || this.defaults.fetchImplementation || await _a21.#getFetch(); - const preparedOpts = { ...config4 }; + async _defaultAdapter(config3) { + const fetchImpl = config3.fetchImplementation || this.defaults.fetchImplementation || await _a21.#getFetch(); + const preparedOpts = { ...config3 }; delete preparedOpts.data; - const res = await fetchImpl(config4.url, preparedOpts); - const data2 = await this.getResponseData(config4, res); + const res = await fetchImpl(config3.url, preparedOpts); + const data2 = await this.getResponseData(config3, res); if (!Object.getOwnPropertyDescriptor(res, "data")?.configurable) { Object.defineProperties(res, { data: { @@ -231187,7 +231487,7 @@ var require_gaxios2 = __commonJS((exports) => { } }); } - return Object.assign(res, { config: config4, data: data2 }); + return Object.assign(res, { config: config3, data: data2 }); } async _request(opts) { try { @@ -231218,9 +231518,9 @@ var require_gaxios2 = __commonJS((exports) => { } else { err2 = new common_js_1.GaxiosError("Unexpected Gaxios Error", opts, undefined, e2); } - const { shouldRetry, config: config4 } = await (0, retry_js_1.getRetryConfig)(err2); - if (shouldRetry && config4) { - err2.config.retryConfig.currentRetryAttempt = config4.retryConfig.currentRetryAttempt; + const { shouldRetry, config: config3 } = await (0, retry_js_1.getRetryConfig)(err2); + if (shouldRetry && config3) { + err2.config.retryConfig.currentRetryAttempt = config3.retryConfig.currentRetryAttempt; opts.retryConfig = err2.config?.retryConfig; this.#appendTimeoutToSignal(opts); return this._request(opts); @@ -234537,7 +234837,7 @@ var require_util6 = __commonJS((exports) => { exports.getWellKnownCertificateConfigFileLocation = getWellKnownCertificateConfigFileLocation; var fs12 = __require("fs"); var os9 = __require("os"); - var path27 = __require("path"); + var path28 = __require("path"); var WELL_KNOWN_CERTIFICATE_CONFIG_FILE = "certificate_config.json"; var CLOUDSDK_CONFIG_DIRECTORY = "gcloud"; function snakeToCamel4(str2) { @@ -234605,8 +234905,8 @@ var require_util6 = __commonJS((exports) => { } } function getWellKnownCertificateConfigFileLocation() { - const configDir = process.env.CLOUDSDK_CONFIG || (_isWindows() ? path27.join(process.env.APPDATA || "", CLOUDSDK_CONFIG_DIRECTORY) : path27.join(process.env.HOME || "", ".config", CLOUDSDK_CONFIG_DIRECTORY)); - return path27.join(configDir, WELL_KNOWN_CERTIFICATE_CONFIG_FILE); + const configDir = process.env.CLOUDSDK_CONFIG || (_isWindows() ? path28.join(process.env.APPDATA || "", CLOUDSDK_CONFIG_DIRECTORY) : path28.join(process.env.HOME || "", ".config", CLOUDSDK_CONFIG_DIRECTORY)); + return path28.join(configDir, WELL_KNOWN_CERTIFICATE_CONFIG_FILE); } function _isWindows() { return os9.platform().startsWith("win"); @@ -235168,25 +235468,25 @@ var require_authclient = __commonJS((exports) => { } static log = (0, google_logging_utils_1.log)("auth"); static DEFAULT_REQUEST_INTERCEPTOR = { - resolved: async (config4) => { - if (!config4.headers.has("x-goog-api-client")) { + resolved: async (config3) => { + if (!config3.headers.has("x-goog-api-client")) { const nodeVersion2 = process.version.replace(/^v/, ""); - config4.headers.set("x-goog-api-client", `gl-node/${nodeVersion2}`); + config3.headers.set("x-goog-api-client", `gl-node/${nodeVersion2}`); } - const userAgent = config4.headers.get("User-Agent"); + const userAgent = config3.headers.get("User-Agent"); if (!userAgent) { - config4.headers.set("User-Agent", shared_cjs_1.USER_AGENT); + config3.headers.set("User-Agent", shared_cjs_1.USER_AGENT); } else if (!userAgent.includes(`${shared_cjs_1.PRODUCT_NAME}/`)) { - config4.headers.set("User-Agent", `${userAgent} ${shared_cjs_1.USER_AGENT}`); + config3.headers.set("User-Agent", `${userAgent} ${shared_cjs_1.USER_AGENT}`); } try { - const symbols = config4; + const symbols = config3; const methodName = symbols[AuthClient.RequestMethodNameSymbol]; const logId = `${Math.floor(Math.random() * 1000)}`; symbols[AuthClient.RequestLogIdSymbol] = logId; const logObject = { - url: config4.url, - headers: config4.headers + url: config3.url, + headers: config3.headers }; if (methodName) { AuthClient.log.info("%s [%s] request %j", methodName, logId, logObject); @@ -235194,7 +235494,7 @@ var require_authclient = __commonJS((exports) => { AuthClient.log.info("[%s] request %j", logId, logObject); } } catch (e2) {} - return config4; + return config3; } }; static DEFAULT_RESPONSE_INTERCEPTOR = { @@ -235225,9 +235525,9 @@ var require_authclient = __commonJS((exports) => { throw error46; } }; - static setMethodName(config4, methodName) { + static setMethodName(config3, methodName) { try { - const symbols = config4; + const symbols = config3; symbols[AuthClient.RequestMethodNameSymbol] = methodName; } catch (e2) {} } @@ -236598,7 +236898,7 @@ var require_src8 = __commonJS((exports) => { var fs12 = _interopRequireWildcard(__require("fs")); var _gaxios = require_src3(); var jws = _interopRequireWildcard(require_jws()); - var path27 = _interopRequireWildcard(__require("path")); + var path28 = _interopRequireWildcard(__require("path")); var _util = __require("util"); function _interopRequireWildcard(e2, t2) { if (typeof WeakMap == "function") @@ -236980,7 +237280,7 @@ var require_src8 = __commonJS((exports) => { while (true) switch (_context2.n) { case 0: - ext2 = path27.extname(keyFile); + ext2 = path28.extname(keyFile); _t2 = ext2; _context2.n = _t2 === ".json" ? 1 : _t2 === ".der" ? 4 : _t2 === ".crt" ? 4 : _t2 === ".pem" ? 4 : _t2 === ".p12" ? 6 : _t2 === ".pfx" ? 6 : 7; break; @@ -238412,9 +238712,9 @@ var require_certificatesubjecttokensupplier = __commonJS((exports) => { throw new CertificateSourceUnavailableError(`Failed to read certificate config file at: ${configPath}`); } try { - const config4 = JSON.parse(fileContents); - const certPath = config4?.cert_configs?.workload?.cert_path; - const keyPath = config4?.cert_configs?.workload?.key_path; + const config3 = JSON.parse(fileContents); + const certPath = config3?.cert_configs?.workload?.cert_path; + const keyPath = config3?.cert_configs?.workload?.key_path; if (!certPath || !keyPath) { throw new InvalidConfigurationError(`Certificate config file (${configPath}) is missing required "cert_path" or "key_path" in the workload config.`); } @@ -239372,7 +239672,7 @@ var require_googleauth = __commonJS((exports) => { var gaxios_1 = require_src3(); var gcpMetadata = require_src6(); var os9 = __require("os"); - var path27 = __require("path"); + var path28 = __require("path"); var crypto_1 = require_crypto4(); var computeclient_1 = require_computeclient(); var idtokenclient_1 = require_idtokenclient(); @@ -239580,11 +239880,11 @@ var require_googleauth = __commonJS((exports) => { } else { const home = process.env["HOME"]; if (home) { - location2 = path27.join(home, ".config"); + location2 = path28.join(home, ".config"); } } if (location2) { - location2 = path27.join(location2, "gcloud", "application_default_credentials.json"); + location2 = path28.join(location2, "gcloud", "application_default_credentials.json"); if (!fs12.existsSync(location2)) { location2 = null; } @@ -239833,7 +240133,7 @@ var require_googleauth = __commonJS((exports) => { if (this.jsonContent) { return this._cacheClientFromJSON(this.jsonContent, this.clientOptions); } else if (this.keyFilename) { - const filePath = path27.resolve(this.keyFilename); + const filePath = path28.resolve(this.keyFilename); const stream4 = fs12.createReadStream(filePath); return await this.fromStreamAsync(stream4, this.clientOptions); } else if (this.apiKey) { @@ -240935,12 +241235,12 @@ function extractSources2({ return sources.length > 0 ? sources : undefined; } var dataUrlRegex2, googleErrorDataSchema2, googleFailedResponseHandler2, googleLanguageModelOptions2, GoogleGenerativeAILanguageModel2 = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; var _a21; this.modelId = modelId; - this.config = config4; - this.generateId = (_a21 = config4.generateId) != null ? _a21 : generateId; + this.config = config3; + this.generateId = (_a21 = config3.generateId) != null ? _a21 : generateId; } get provider() { return this.config.provider; @@ -241873,12 +242173,12 @@ function createVertex2(options4 = {}) { }); } var import_google_auth_library, authInstance = null, authOptions = null, VERSION9 = "4.0.95", googleVertexErrorDataSchema, googleVertexFailedResponseHandler, googleVertexEmbeddingModelOptions, GoogleVertexEmbeddingModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.maxEmbeddingsPerCall = 2048; this.supportsParallelCalls = true; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -241945,9 +242245,9 @@ var import_google_auth_library, authInstance = null, authOptions = null, VERSION }; } }, googleVertexTextEmbeddingResponseSchema, GoogleVertexImageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; } get maxImagesPerCall() { @@ -242181,9 +242481,9 @@ var import_google_auth_library, authInstance = null, authOptions = null, VERSION }; } }, vertexImageResponseSchema, googleVertexImageModelOptionsSchema, googleVertexTools, GoogleVertexVideoModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; } get provider() { @@ -244098,37 +244398,37 @@ function createOpenAI(options4 = {}) { }, `ai-sdk/openai/${VERSION10}`); const createChatModel = (modelId) => new OpenAIChatLanguageModel2(modelId, { provider: `${providerName}.chat`, - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch }); const createCompletionModel = (modelId) => new OpenAICompletionLanguageModel2(modelId, { provider: `${providerName}.completion`, - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch }); const createEmbeddingModel = (modelId) => new OpenAIEmbeddingModel2(modelId, { provider: `${providerName}.embedding`, - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch }); const createImageModel = (modelId) => new OpenAIImageModel2(modelId, { provider: `${providerName}.image`, - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch }); const createTranscriptionModel = (modelId) => new OpenAITranscriptionModel2(modelId, { provider: `${providerName}.transcription`, - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch }); const createSpeechModel = (modelId) => new OpenAISpeechModel2(modelId, { provider: `${providerName}.speech`, - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch }); @@ -244141,7 +244441,7 @@ function createOpenAI(options4 = {}) { const createResponsesModel = (modelId) => { return new OpenAIResponsesLanguageModel2(modelId, { provider: `${providerName}.responses`, - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch, fileIdPrefixes: ["file-"] @@ -244169,13 +244469,13 @@ function createOpenAI(options4 = {}) { return provider; } var openaiErrorDataSchema2, openaiFailedResponseHandler2, openaiChatResponseSchema2, openaiChatChunkSchema2, openaiLanguageModelChatOptions2, OpenAIChatLanguageModel2 = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.supportedUrls = { "image/*": [/^https?:\/\/.*$/] }; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -244636,11 +244936,11 @@ var openaiErrorDataSchema2, openaiFailedResponseHandler2, openaiChatResponseSche }; } }, openaiCompletionResponseSchema2, openaiCompletionChunkSchema2, openaiLanguageModelCompletionOptions2, OpenAICompletionLanguageModel2 = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.supportedUrls = {}; this.modelId = modelId; - this.config = config4; + this.config = config3; } get providerOptionsName() { return this.config.provider.split(".")[0].trim(); @@ -244849,12 +245149,12 @@ var openaiErrorDataSchema2, openaiFailedResponseHandler2, openaiChatResponseSche }; } }, openaiEmbeddingModelOptions2, openaiTextEmbeddingResponseSchema2, OpenAIEmbeddingModel2 = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.maxEmbeddingsPerCall = 2048; this.supportsParallelCalls = true; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -244909,9 +245209,9 @@ var openaiErrorDataSchema2, openaiFailedResponseHandler2, openaiChatResponseSche }; } }, openaiImageResponseSchema2, modelMaxImagesPerCall3, defaultResponseFormatPrefixes2, OpenAIImageModel2 = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; } get maxImagesPerCall() { @@ -245059,14 +245359,14 @@ var openaiErrorDataSchema2, openaiFailedResponseHandler2, openaiChatResponseSche }, customArgsSchema2, customInputSchema2, customToolFactory2, customTool = (args3) => customToolFactory2(args3), comparisonFilterSchema2, compoundFilterSchema2, fileSearchArgsSchema4, fileSearchOutputSchema2, fileSearch4, imageGenerationArgsSchema2, imageGenerationInputSchema2, imageGenerationOutputSchema2, imageGenerationToolFactory2, imageGeneration2 = (args3 = {}) => { return imageGenerationToolFactory2(args3); }, localShellInputSchema2, localShellOutputSchema2, localShell2, shellInputSchema2, shellOutputSchema2, shellSkillsSchema2, shellArgsSchema2, shell2, toolSearchArgsSchema2, toolSearchInputSchema2, toolSearchOutputSchema2, toolSearchToolFactory2, toolSearch = (args3 = {}) => toolSearchToolFactory2(args3), webSearchArgsSchema2, webSearchInputSchema2, webSearchOutputSchema2, webSearchToolFactory2, webSearch = (args3 = {}) => webSearchToolFactory2(args3), webSearchPreviewArgsSchema2, webSearchPreviewInputSchema2, webSearchPreviewOutputSchema2, webSearchPreview2, jsonValueSchema3, mcpArgsSchema2, mcpInputSchema2, mcpOutputSchema2, mcpToolFactory2, mcp = (args3) => mcpToolFactory2(args3), openaiTools, openaiResponsesReasoningProviderOptionsSchema2, jsonValueSchema23, openaiResponsesChunkSchema2, openaiResponsesResponseSchema2, TOP_LOGPROBS_MAX2 = 20, openaiResponsesReasoningModelIds2, openaiResponsesModelIds2, openaiLanguageModelResponsesOptionsSchema2, OpenAIResponsesLanguageModel2 = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.supportedUrls = { "image/*": [/^https?:\/\/.*$/], "application/pdf": [/^https?:\/\/.*$/] }; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -246615,9 +246915,9 @@ var openaiErrorDataSchema2, openaiFailedResponseHandler2, openaiChatResponseSche }; } }, openaiSpeechModelOptionsSchema2, OpenAISpeechModel2 = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; } get provider() { @@ -246713,9 +247013,9 @@ var openaiErrorDataSchema2, openaiFailedResponseHandler2, openaiChatResponseSche }; } }, openaiTranscriptionResponseSchema2, openAITranscriptionModelOptions2, languageMap2, OpenAITranscriptionModel2 = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; } get provider() { @@ -248911,8 +249211,8 @@ function createOpenAICompatible(options4) { const getHeaders = () => withUserAgentSuffix(headers, `ai-sdk/openai-compatible/${VERSION11}`); const getCommonModelConfig = (modelType) => ({ provider: `${providerName}.${modelType}`, - url: ({ path: path27 }) => { - const url3 = new URL(`${baseURL}${path27}`); + url: ({ path: path28 }) => { + const url3 = new URL(`${baseURL}${path28}`); if (options4.queryParams) { url3.search = new URLSearchParams(options4.queryParams).toString(); } @@ -248948,15 +249248,15 @@ function createOpenAICompatible(options4) { return provider; } var openaiCompatibleErrorDataSchema, defaultOpenAICompatibleErrorStructure, openaiCompatibleLanguageModelChatOptions, OpenAICompatibleChatLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; var _a21, _b16; this.modelId = modelId; - this.config = config4; - const errorStructure = (_a21 = config4.errorStructure) != null ? _a21 : defaultOpenAICompatibleErrorStructure; + this.config = config3; + const errorStructure = (_a21 = config3.errorStructure) != null ? _a21 : defaultOpenAICompatibleErrorStructure; this.chunkSchema = createOpenAICompatibleChatChunkSchema(errorStructure.errorSchema); this.failedResponseHandler = createJsonErrorResponseHandler(errorStructure); - this.supportsStructuredOutputs = (_b16 = config4.supportsStructuredOutputs) != null ? _b16 : false; + this.supportsStructuredOutputs = (_b16 = config3.supportsStructuredOutputs) != null ? _b16 : false; } get provider() { return this.config.provider; @@ -249403,12 +249703,12 @@ var openaiCompatibleErrorDataSchema, defaultOpenAICompatibleErrorStructure, open }; } }, openaiCompatibleTokenUsageSchema, OpenAICompatibleChatResponseSchema, chunkBaseSchema, createOpenAICompatibleChatChunkSchema = (errorSchema) => exports_external.union([chunkBaseSchema, errorSchema]), openaiCompatibleLanguageModelCompletionOptions, OpenAICompatibleCompletionLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; var _a21; this.modelId = modelId; - this.config = config4; - const errorStructure = (_a21 = config4.errorStructure) != null ? _a21 : defaultOpenAICompatibleErrorStructure; + this.config = config3; + const errorStructure = (_a21 = config3.errorStructure) != null ? _a21 : defaultOpenAICompatibleErrorStructure; this.chunkSchema = createOpenAICompatibleCompletionChunkSchema(errorStructure.errorSchema); this.failedResponseHandler = createJsonErrorResponseHandler(errorStructure); } @@ -249625,10 +249925,10 @@ var openaiCompatibleErrorDataSchema, defaultOpenAICompatibleErrorStructure, open }), errorSchema ]), openaiCompatibleEmbeddingModelOptions, OpenAICompatibleEmbeddingModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -249711,9 +250011,9 @@ var openaiCompatibleErrorDataSchema, defaultOpenAICompatibleErrorStructure, open }; } }, openaiTextEmbeddingResponseSchema3, OpenAICompatibleImageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.maxImagesPerCall = 10; } @@ -251813,7 +252113,7 @@ function createOpenRouter(options4 = {}) { }), `ai-sdk/openrouter/${VERSION22}`); const createChatModel = (modelId, settings = {}) => new OpenRouterChatLanguageModel(modelId, settings, { provider: "openrouter.chat", - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, compatibility, fetch: options4.fetch, @@ -251821,7 +252121,7 @@ function createOpenRouter(options4 = {}) { }); const createCompletionModel = (modelId, settings = {}) => new OpenRouterCompletionLanguageModel(modelId, settings, { provider: "openrouter.completion", - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, compatibility, fetch: options4.fetch, @@ -251829,14 +252129,14 @@ function createOpenRouter(options4 = {}) { }); const createEmbeddingModel = (modelId, settings = {}) => new OpenRouterEmbeddingModel(modelId, settings, { provider: "openrouter.embedding", - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch, extraBody: options4.extraBody }); const createImageModel = (modelId, settings = {}) => new OpenRouterImageModel(modelId, settings, { provider: "openrouter.image", - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch, extraBody: options4.extraBody @@ -252323,7 +252623,7 @@ var __defProp3, __defProps, __getOwnPropDescs, __getOwnPropSymbols, __hasOwnProp } } }, OPENROUTER_AUDIO_FORMATS, MIME_TO_FORMAT, IMAGE_EXTENSIONS, ChatCompletionToolChoiceSchema, ImageResponseSchema, ImageResponseWithUnknownSchema, ImageResponseArraySchema, OpenRouterChatCompletionBaseResponseSchema, OpenRouterNonStreamChatCompletionResponseSchema, OpenRouterStreamChatCompletionChunkSchema, OpenRouterChatLanguageModel = class { - constructor(modelId, settings, config4) { + constructor(modelId, settings, config3) { this.specificationVersion = "v3"; this.provider = "openrouter"; this.defaultObjectGenerationMode = "tool"; @@ -252337,7 +252637,7 @@ var __defProp3, __defProps, __getOwnPropDescs, __getOwnPropSymbols, __hasOwnProp }; this.modelId = modelId; this.settings = settings; - this.config = config4; + this.config = config3; } getArgs({ prompt, @@ -253030,7 +253330,7 @@ var __defProp3, __defProps, __getOwnPropDescs, __getOwnPropSymbols, __hasOwnProp }; } }, OpenRouterCompletionChunkSchema, OpenRouterCompletionLanguageModel = class { - constructor(modelId, settings, config4) { + constructor(modelId, settings, config3) { this.specificationVersion = "v3"; this.provider = "openrouter"; this.supportsImageUrls = true; @@ -253045,7 +253345,7 @@ var __defProp3, __defProps, __getOwnPropDescs, __getOwnPropSymbols, __hasOwnProp this.defaultObjectGenerationMode = undefined; this.modelId = modelId; this.settings = settings; - this.config = config4; + this.config = config3; } getArgs({ prompt, @@ -253294,14 +253594,14 @@ var __defProp3, __defProps, __getOwnPropDescs, __getOwnPropSymbols, __hasOwnProp }; } }, openrouterEmbeddingUsageSchema, openrouterEmbeddingDataSchema, OpenRouterEmbeddingResponseSchema, OpenRouterEmbeddingModel = class { - constructor(modelId, settings, config4) { + constructor(modelId, settings, config3) { this.specificationVersion = "v3"; this.provider = "openrouter"; this.maxEmbeddingsPerCall = undefined; this.supportsParallelCalls = true; this.modelId = modelId; this.settings = settings; - this.config = config4; + this.config = config3; } async doEmbed(options4) { var _a162, _b16, _c2, _d, _e2, _f; @@ -253345,13 +253645,13 @@ var __defProp3, __defProps, __getOwnPropDescs, __getOwnPropSymbols, __hasOwnProp }; } }, OpenRouterImageResponseSchema, OpenRouterImageModel = class { - constructor(modelId, settings, config4) { + constructor(modelId, settings, config3) { this.specificationVersion = "v3"; this.provider = "openrouter"; this.maxImagesPerCall = 1; this.modelId = modelId; this.settings = settings; - this.config = config4; + this.config = config3; } async doGenerate(options4) { var _a162; @@ -254477,13 +254777,13 @@ class OpenAICompatibleChatLanguageModel2 { config; failedResponseHandler; chunkSchema; - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; - const errorStructure = config4.errorStructure ?? defaultOpenAICompatibleErrorStructure2; + this.config = config3; + const errorStructure = config3.errorStructure ?? defaultOpenAICompatibleErrorStructure2; this.chunkSchema = createOpenAICompatibleChatChunkSchema2(errorStructure.errorSchema); this.failedResponseHandler = createJsonErrorResponseHandler(errorStructure); - this.supportsStructuredOutputs = config4.supportsStructuredOutputs ?? false; + this.supportsStructuredOutputs = config3.supportsStructuredOutputs ?? false; } get provider() { return this.config.provider; @@ -255695,9 +255995,9 @@ class OpenAIResponsesLanguageModel3 { specificationVersion = "v3"; modelId; config; - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; } supportedUrls = { "image/*": [/^https?:\/\/.*$/], @@ -257095,7 +257395,7 @@ function createOpenaiCompatible(options4 = {}) { return new OpenAICompatibleChatLanguageModel2(modelId, { provider: `${options4.name ?? "openai-compatible"}.chat`, headers: getHeaders, - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, fetch: options4.fetch }); }; @@ -257103,7 +257403,7 @@ function createOpenaiCompatible(options4 = {}) { return new OpenAIResponsesLanguageModel3(modelId, { provider: `${options4.name ?? "openai-compatible"}.responses`, headers: getHeaders, - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, fetch: options4.fetch }); }; @@ -257735,13 +258035,13 @@ function createXai(options4 = {}) { return provider; } var webSourceSchema, xSourceSchema, newsSourceSchema, rssSourceSchema, searchSourceSchema, xaiLanguageModelChatOptions, xaiErrorDataSchema, xaiFailedResponseHandler, XaiChatLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.supportedUrls = { "image/*": [/^https?:\/\/.*$/] }; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -258157,9 +258457,9 @@ var webSourceSchema, xSourceSchema, newsSourceSchema, rssSourceSchema, searchSou }; } }, xaiUsageSchema, xaiChatResponseSchema, xaiChatChunkSchema, xaiStreamErrorSchema, xaiImageModelOptions, XaiImageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.maxImagesPerCall = 3; } @@ -258281,13 +258581,13 @@ var webSourceSchema, xSourceSchema, newsSourceSchema, rssSourceSchema, searchSou return value8; } }, xaiImageResponseSchema, annotationSchema, messageContentPartSchema, reasoningSummaryPartSchema, toolCallSchema, mcpCallSchema, outputItemSchema, xaiResponsesUsageSchema, xaiResponsesResponseSchema, xaiResponsesChunkSchema, xaiLanguageModelResponsesOptions, fileSearchArgsSchema6, fileSearchOutputSchema4, fileSearchToolFactory, fileSearch6 = (args3) => fileSearchToolFactory(args3), mcpServerArgsSchema, mcpServerOutputSchema, mcpServerToolFactory, mcpServer = (args3) => mcpServerToolFactory(args3), webSearchArgsSchema4, webSearchOutputSchema3, webSearchToolFactory4, webSearch2 = (args3 = {}) => webSearchToolFactory4(args3), xSearchArgsSchema, xSearchOutputSchema, xSearchToolFactory, xSearch = (args3 = {}) => xSearchToolFactory(args3), XaiResponsesLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.supportedUrls = { "image/*": [/^https?:\/\/.*$/] }; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -258969,9 +259269,9 @@ var webSourceSchema, xSourceSchema, newsSourceSchema, rssSourceSchema, searchSou }; } }, codeExecutionOutputSchema, codeExecutionToolFactory, codeExecution3 = (args3 = {}) => codeExecutionToolFactory(args3), viewImageOutputSchema, viewImageToolFactory, viewImage = (args3 = {}) => viewImageToolFactory(args3), viewXVideoOutputSchema, viewXVideoToolFactory, viewXVideo = (args3 = {}) => viewXVideoToolFactory(args3), xaiTools, VERSION14 = "3.0.75", xaiVideoModelOptionsSchema, RESOLUTION_MAP, XaiVideoModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.maxVideosPerCall = 1; } @@ -260206,15 +260506,15 @@ function createMistral(options4 = {}) { return provider; } var mistralLanguageModelOptions, mistralErrorDataSchema, mistralFailedResponseHandler, MistralChatLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.supportedUrls = { "application/pdf": [/^https:\/\/.*$/] }; var _a26; this.modelId = modelId; - this.config = config4; - this.generateId = (_a26 = config4.generateId) != null ? _a26 : generateId; + this.config = config3; + this.generateId = (_a26 = config3.generateId) != null ? _a26 : generateId; } get provider() { return this.config.provider; @@ -260510,12 +260810,12 @@ var mistralLanguageModelOptions, mistralErrorDataSchema, mistralFailedResponseHa }; } }, mistralContentSchema, mistralUsageSchema, mistralChatResponseSchema, mistralChatChunkSchema, MistralEmbeddingModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.maxEmbeddingsPerCall = 32; this.supportsParallelCalls = false; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -260937,7 +261237,7 @@ function createGroq(options4 = {}) { }, `ai-sdk/groq/${VERSION16}`); const createChatModel = (modelId) => new GroqChatLanguageModel(modelId, { provider: "groq.chat", - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch }); @@ -260950,7 +261250,7 @@ function createGroq(options4 = {}) { const createTranscriptionModel = (modelId) => { return new GroqTranscriptionModel(modelId, { provider: "groq.transcription", - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch }); @@ -260974,13 +261274,13 @@ function createGroq(options4 = {}) { return provider; } var groqLanguageModelOptions, groqErrorDataSchema, groqFailedResponseHandler, BROWSER_SEARCH_SUPPORTED_MODELS, GroqChatLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.supportedUrls = { "image/*": [/^https?:\/\/.*$/] }; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -261342,9 +261642,9 @@ var groqLanguageModelOptions, groqErrorDataSchema, groqFailedResponseHandler, BR }; } }, groqChatResponseSchema, groqChatChunkSchema, groqTranscriptionModelOptions, GroqTranscriptionModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; } get provider() { @@ -261602,7 +261902,7 @@ function createDeepInfra(options4 = {}) { }, `ai-sdk/deepinfra/${VERSION17}`); const getCommonModelConfig = (modelType) => ({ provider: `deepinfra.${modelType}`, - url: ({ path: path27 }) => `${baseURL}/openai${path27}`, + url: ({ path: path28 }) => `${baseURL}/openai${path28}`, headers: getHeaders, fetch: options4.fetch }); @@ -261627,9 +261927,9 @@ function createDeepInfra(options4 = {}) { return provider; } var DeepInfraImageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.maxImagesPerCall = 1; } @@ -261743,8 +262043,8 @@ var init_dist26 = __esm(() => { data: exports_external.array(exports_external.object({ b64_json: exports_external.string() })) }); DeepInfraChatLanguageModel = class extends OpenAICompatibleChatLanguageModel { - constructor(modelId, config4) { - super(modelId, config4); + constructor(modelId, config3) { + super(modelId, config3); } fixUsageForGeminiModels(usage2) { var _a26, _b16; @@ -261868,7 +262168,7 @@ function createCerebras(options4 = {}) { const createLanguageModel = (modelId) => { return new OpenAICompatibleChatLanguageModel(modelId, { provider: `cerebras.chat`, - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch, errorStructure: cerebrasErrorStructure, @@ -262177,11 +262477,11 @@ function createCohere(options4 = {}) { return provider; } var cohereLanguageModelOptions, cohereErrorDataSchema, cohereFailedResponseHandler, CohereChatLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.supportedUrls = {}; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -262480,12 +262780,12 @@ var cohereLanguageModelOptions, cohereErrorDataSchema, cohereFailedResponseHandl }; } }, cohereChatResponseSchema, cohereChatChunkSchema, cohereEmbeddingModelOptions, CohereEmbeddingModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.maxEmbeddingsPerCall = 96; this.supportsParallelCalls = true; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -262538,10 +262838,10 @@ var cohereLanguageModelOptions, cohereErrorDataSchema, cohereFailedResponseHandl }; } }, cohereTextEmbeddingResponseSchema, cohereRerankingResponseSchema, cohereRerankingModelOptionsSchema, CohereRerankingModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -262845,7 +263145,7 @@ function createTogetherAI(options4 = {}) { }; const getCommonModelConfig = (modelType) => ({ provider: `togetherai.${modelType}`, - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch }); @@ -262876,10 +263176,10 @@ function createTogetherAI(options4 = {}) { return provider; } var togetheraiErrorSchema, togetheraiRerankingResponseSchema, togetheraiRerankingModelOptionsSchema, TogetherAIRerankingModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -262935,9 +263235,9 @@ var togetheraiErrorSchema, togetheraiRerankingResponseSchema, togetheraiRerankin }; } }, TogetherAIImageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.maxImagesPerCall = 1; } @@ -263227,12 +263527,12 @@ function createPerplexity(options4 = {}) { return provider; } var PerplexityLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.provider = "perplexity"; this.supportedUrls = {}; this.modelId = modelId; - this.config = config4; + this.config = config3; } getArgs({ prompt, @@ -263558,7 +263858,7 @@ function createVercel(options4 = {}) { }, `ai-sdk/vercel/${VERSION23}`); const getCommonModelConfig = (modelType) => ({ provider: `vercel.${modelType}`, - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch }); @@ -263723,7 +264023,7 @@ function $constructor2(name26, initializer3, params) { Object.defineProperty(_3, "name", { value: name26 }); return _3; } -function config4(newConfig) { +function config3(newConfig) { if (newConfig) Object.assign(globalConfig2, newConfig); return globalConfig2; @@ -263831,10 +264131,10 @@ function mergeDefs2(...defs) { function cloneDef2(schema2) { return mergeDefs2(schema2._zod.def); } -function getElementAtPath2(obj, path27) { - if (!path27) +function getElementAtPath2(obj, path28) { + if (!path28) return obj; - return path27.reduce((acc, key) => acc?.[key], obj); + return path28.reduce((acc, key) => acc?.[key], obj); } function promiseAllObject2(promisesObj) { const keys12 = Object.keys(promisesObj); @@ -264145,11 +264445,11 @@ function aborted2(x3, startIndex = 0) { } return false; } -function prefixIssues2(path27, issues) { +function prefixIssues2(path28, issues) { return issues.map((iss) => { var _a26; (_a26 = iss).path ?? (_a26.path = []); - iss.path.unshift(path27); + iss.path.unshift(path28); return iss; }); } @@ -264308,7 +264608,7 @@ function formatError2(error48, mapper = (issue22) => issue22.message) { } function treeifyError2(error48, mapper = (issue22) => issue22.message) { const result6 = { errors: [] }; - const processError = (error49, path27 = []) => { + const processError = (error49, path28 = []) => { var _a26, _b16; for (const issue22 of error49.issues) { if (issue22.code === "invalid_union" && issue22.errors.length) { @@ -264318,7 +264618,7 @@ function treeifyError2(error48, mapper = (issue22) => issue22.message) { } else if (issue22.code === "invalid_element") { processError({ issues: issue22.issues }, issue22.path); } else { - const fullpath = [...path27, ...issue22.path]; + const fullpath = [...path28, ...issue22.path]; if (fullpath.length === 0) { result6.errors.push(mapper(issue22)); continue; @@ -264350,8 +264650,8 @@ function treeifyError2(error48, mapper = (issue22) => issue22.message) { } function toDotPath2(_path) { const segs = []; - const path27 = _path.map((seg) => typeof seg === "object" ? seg.key : seg); - for (const seg of path27) { + const path28 = _path.map((seg) => typeof seg === "object" ? seg.key : seg); + for (const seg of path28) { if (typeof seg === "number") segs.push(`[${seg}]`); else if (typeof seg === "symbol") @@ -264535,7 +264835,7 @@ function handleUnionResults2(results, final, inst, ctx) { code: "invalid_union", input: final.value, inst, - errors: results.map((result6) => result6.issues.map((iss) => finalizeIssue2(iss, ctx, config4()))) + errors: results.map((result6) => result6.issues.map((iss) => finalizeIssue2(iss, ctx, config3()))) }); return final; } @@ -264550,7 +264850,7 @@ function handleExclusiveUnionResults(results, final, inst, ctx) { code: "invalid_union", input: final.value, inst, - errors: results.map((result6) => result6.issues.map((iss) => finalizeIssue2(iss, ctx, config4()))) + errors: results.map((result6) => result6.issues.map((iss) => finalizeIssue2(iss, ctx, config3()))) }); } else { final.issues.push({ @@ -264662,7 +264962,7 @@ function handleMapResult2(keyResult, valueResult, final, key, input, inst, ctx) origin: "map", input, inst, - issues: keyResult.issues.map((iss) => finalizeIssue2(iss, ctx, config4())) + issues: keyResult.issues.map((iss) => finalizeIssue2(iss, ctx, config3())) }); } } @@ -264676,7 +264976,7 @@ function handleMapResult2(keyResult, valueResult, final, key, input, inst, ctx) input, inst, key, - issues: valueResult.issues.map((iss) => finalizeIssue2(iss, ctx, config4())) + issues: valueResult.issues.map((iss) => finalizeIssue2(iss, ctx, config3())) }); } } @@ -266801,12 +267101,12 @@ function preprocess2(fn3, schema2) { return pipe3(transform6(fn3), schema2); } function setErrorMap2(map210) { - config4({ + config3({ customError: map210 }); } function getErrorMap4() { - return config4().customError; + return config3().customError; } function detectVersion(schema2, defaultTarget) { const $schema = schema2.$schema; @@ -266825,13 +267125,13 @@ function resolveRef(ref, ctx) { if (!ref.startsWith("#")) { throw new Error("External $ref is not supported, only local refs (#/...) are allowed"); } - const path27 = ref.slice(1).split("/").filter(Boolean); - if (path27.length === 0) { + const path28 = ref.slice(1).split("/").filter(Boolean); + if (path28.length === 0) { return ctx.rootSchema; } const defsKey = ctx.version === "draft-2020-12" ? "$defs" : "definitions"; - if (path27[0] === defsKey) { - const key = path27[1]; + if (path28[0] === defsKey) { + const key = path28[1]; if (!key || !ctx.defs[key]) { throw new Error(`Reference not found: ${ref}`); } @@ -267576,8 +267876,8 @@ function createVenice(options4 = {}) { }, `ai-sdk/venice/${VERSION25}`); const getModelConfig = (modelType) => ({ provider: `${providerName}.${modelType}`, - url: ({ path: path27 }) => { - const url22 = new URL(`${baseURL}${path27}`); + url: ({ path: path28 }) => { + const url22 = new URL(`${baseURL}${path28}`); if (options4.queryParams) { url22.search = new URLSearchParams(options4.queryParams).toString(); } @@ -267672,7 +267972,7 @@ var __defProp4, __export3 = (target, all7) => { throw new $ZodAsyncError2; } if (result6.issues.length) { - const e2 = new (_params?.Err ?? _Err)(result6.issues.map((iss) => finalizeIssue2(iss, ctx, config4()))); + const e2 = new (_params?.Err ?? _Err)(result6.issues.map((iss) => finalizeIssue2(iss, ctx, config3()))); captureStackTrace2(e2, _params?.callee); throw e2; } @@ -267683,7 +267983,7 @@ var __defProp4, __export3 = (target, all7) => { if (result6 instanceof Promise) result6 = await result6; if (result6.issues.length) { - const e2 = new (params?.Err ?? _Err)(result6.issues.map((iss) => finalizeIssue2(iss, ctx, config4()))); + const e2 = new (params?.Err ?? _Err)(result6.issues.map((iss) => finalizeIssue2(iss, ctx, config3()))); captureStackTrace2(e2, params?.callee); throw e2; } @@ -267696,7 +267996,7 @@ var __defProp4, __export3 = (target, all7) => { } return result6.issues.length ? { success: false, - error: new (_Err ?? $ZodError2)(result6.issues.map((iss) => finalizeIssue2(iss, ctx, config4()))) + error: new (_Err ?? $ZodError2)(result6.issues.map((iss) => finalizeIssue2(iss, ctx, config3()))) } : { success: true, data: result6.value }; }, safeParse3, _safeParseAsync2 = (_Err) => async (schema2, value8, _ctx) => { const ctx = _ctx ? Object.assign(_ctx, { async: true }) : { async: true }; @@ -267705,7 +268005,7 @@ var __defProp4, __export3 = (target, all7) => { result6 = await result6; return result6.issues.length ? { success: false, - error: new _Err(result6.issues.map((iss) => finalizeIssue2(iss, ctx, config4()))) + error: new _Err(result6.issues.map((iss) => finalizeIssue2(iss, ctx, config3()))) } : { success: true, data: result6.value }; }, safeParseAsync3, _encode2 = (_Err) => (schema2, value8, _ctx) => { const ctx = _ctx ? Object.assign(_ctx, { direction: "backward" }) : { direction: "backward" }; @@ -273926,7 +274226,7 @@ var init_dist32 = __esm(() => { clone: () => clone4, codec: () => codec2, coerce: () => coerce_exports, - config: () => config4, + config: () => config3, core: () => core_exports2, cuid: () => cuid32, cuid2: () => cuid222, @@ -274304,7 +274604,7 @@ var init_dist32 = __esm(() => { _xid: () => _xid2, _xor: () => _xor, clone: () => clone4, - config: () => config4, + config: () => config3, createStandardJSONSchemaMethod: () => createStandardJSONSchemaMethod, createToJSONSchemaMethod: () => createToJSONSchemaMethod, decode: () => decode5, @@ -276178,7 +276478,7 @@ var init_dist32 = __esm(() => { payload.issues.push({ code: "invalid_key", origin: "record", - issues: keyResult.issues.map((iss) => finalizeIssue2(iss, ctx, config4())), + issues: keyResult.issues.map((iss) => finalizeIssue2(iss, ctx, config3())), input: key, path: [key], inst @@ -276474,7 +276774,7 @@ var init_dist32 = __esm(() => { payload.value = def.catchValue({ ...payload, error: { - issues: result22.issues.map((iss) => finalizeIssue2(iss, ctx, config4())) + issues: result22.issues.map((iss) => finalizeIssue2(iss, ctx, config3())) }, input: payload.value }); @@ -276488,7 +276788,7 @@ var init_dist32 = __esm(() => { payload.value = def.catchValue({ ...payload, error: { - issues: result6.issues.map((iss) => finalizeIssue2(iss, ctx, config4())) + issues: result6.issues.map((iss) => finalizeIssue2(iss, ctx, config3())) }, input: payload.value }); @@ -277787,7 +278087,7 @@ var init_dist32 = __esm(() => { number: () => number32, string: () => string32 }); - config4(en_default4()); + config3(en_default4()); veniceErrorDataSchema = external_exports.object({ error: external_exports.object({ message: external_exports.string(), @@ -277929,21 +278229,21 @@ var init_dist32 = __esm(() => { }); // node_modules/@anthropic-ai/sdk/internal/tslib.mjs -function __classPrivateFieldSet3(receiver, state2, value8, kind, f4) { +function __classPrivateFieldSet3(receiver, state, value8, kind, f4) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f4) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state2 === "function" ? receiver !== state2 || !f4 : !state2.has(receiver)) + if (typeof state === "function" ? receiver !== state || !f4 : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return kind === "a" ? f4.call(receiver, value8) : f4 ? f4.value = value8 : state2.set(receiver, value8), value8; + return kind === "a" ? f4.call(receiver, value8) : f4 ? f4.value = value8 : state.set(receiver, value8), value8; } -function __classPrivateFieldGet3(receiver, state2, kind, f4) { +function __classPrivateFieldGet3(receiver, state, kind, f4) { if (kind === "a" && !f4) throw new TypeError("Private accessor was defined without a getter"); - if (typeof state2 === "function" ? receiver !== state2 || !f4 : !state2.has(receiver)) + if (typeof state === "function" ? receiver !== state || !f4 : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f4 : kind === "a" ? f4.call(receiver) : f4 ? f4.value : state2.get(receiver); + return kind === "m" ? f4 : kind === "a" ? f4.call(receiver) : f4 ? f4.value : state.get(receiver); } var init_tslib = () => {}; @@ -279199,12 +279499,12 @@ var init_headers = __esm(() => { function encodeURIPath(str2) { return str2.replace(/[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/g, encodeURIComponent); } -var EMPTY, createPathTagFunction = (pathEncoder = encodeURIPath) => function path27(statics, ...params) { +var EMPTY, createPathTagFunction = (pathEncoder = encodeURIPath) => function path28(statics, ...params) { if (statics.length === 1) return statics[0]; let postPath = false; const invalidSegments = []; - const path28 = statics.reduce((previousValue, currentValue, index3) => { + const path29 = statics.reduce((previousValue, currentValue, index3) => { if (/[?#]/.test(currentValue)) { postPath = true; } @@ -279220,7 +279520,7 @@ var EMPTY, createPathTagFunction = (pathEncoder = encodeURIPath) => function pat } return previousValue + currentValue + (index3 === params.length ? "" : encoded); }, ""); - const pathOnly = path28.split(/[?#]/, 1)[0]; + const pathOnly = path29.split(/[?#]/, 1)[0]; const invalidSegmentPattern = /(?<=^|\/)(?:\.|%2e){1,2}(?=\/|$)/gi; let match17; while ((match17 = invalidSegmentPattern.exec(pathOnly)) !== null) { @@ -279242,15 +279542,15 @@ var EMPTY, createPathTagFunction = (pathEncoder = encodeURIPath) => function pat throw new AnthropicError(`Path parameters result in path with invalid segments: ${invalidSegments.map((e2) => e2.error).join(` `)} -${path28} +${path29} ${underline}`); } - return path28; -}, path27; -var init_path = __esm(() => { + return path29; +}, path28; +var init_path2 = __esm(() => { init_error4(); EMPTY = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.create(null)); - path27 = /* @__PURE__ */ createPathTagFunction(encodeURIPath); + path28 = /* @__PURE__ */ createPathTagFunction(encodeURIPath); }); // node_modules/@anthropic-ai/sdk/resources/beta/files.mjs @@ -279259,7 +279559,7 @@ var init_files = __esm(() => { init_pagination(); init_headers(); init_uploads(); - init_path(); + init_path2(); Files = class Files extends APIResource { list(params = {}, options4) { const { betas, ...query } = params ?? {}; @@ -279274,7 +279574,7 @@ var init_files = __esm(() => { } delete(fileID, params = {}, options4) { const { betas } = params ?? {}; - return this._client.delete(path27`/v1/files/${fileID}`, { + return this._client.delete(path28`/v1/files/${fileID}`, { ...options4, headers: buildHeaders([ { "anthropic-beta": [...betas ?? [], "files-api-2025-04-14"].toString() }, @@ -279284,7 +279584,7 @@ var init_files = __esm(() => { } download(fileID, params = {}, options4) { const { betas } = params ?? {}; - return this._client.get(path27`/v1/files/${fileID}/content`, { + return this._client.get(path28`/v1/files/${fileID}/content`, { ...options4, headers: buildHeaders([ { @@ -279298,7 +279598,7 @@ var init_files = __esm(() => { } retrieveMetadata(fileID, params = {}, options4) { const { betas } = params ?? {}; - return this._client.get(path27`/v1/files/${fileID}`, { + return this._client.get(path28`/v1/files/${fileID}`, { ...options4, headers: buildHeaders([ { "anthropic-beta": [...betas ?? [], "files-api-2025-04-14"].toString() }, @@ -279325,11 +279625,11 @@ var Models; var init_models3 = __esm(() => { init_pagination(); init_headers(); - init_path(); + init_path2(); Models = class Models extends APIResource { retrieve(modelID, params = {}, options4) { const { betas } = params ?? {}; - return this._client.get(path27`/v1/models/${modelID}?beta=true`, { + return this._client.get(path28`/v1/models/${modelID}?beta=true`, { ...options4, headers: buildHeaders([ { ...betas?.toString() != null ? { "anthropic-beta": betas?.toString() } : undefined }, @@ -280012,54 +280312,54 @@ var init_BetaMessageStream = __esm(() => { if (this.ended) { throw new AnthropicError(`stream has ended, this shouldn't happen`); } - const snapshot4 = __classPrivateFieldGet3(this, _BetaMessageStream_currentMessageSnapshot, "f"); - if (!snapshot4) { + const snapshot3 = __classPrivateFieldGet3(this, _BetaMessageStream_currentMessageSnapshot, "f"); + if (!snapshot3) { throw new AnthropicError(`request ended without sending any chunks`); } __classPrivateFieldSet3(this, _BetaMessageStream_currentMessageSnapshot, undefined, "f"); - return maybeParseBetaMessage(snapshot4, __classPrivateFieldGet3(this, _BetaMessageStream_params, "f"), { logger: __classPrivateFieldGet3(this, _BetaMessageStream_logger, "f") }); + return maybeParseBetaMessage(snapshot3, __classPrivateFieldGet3(this, _BetaMessageStream_params, "f"), { logger: __classPrivateFieldGet3(this, _BetaMessageStream_logger, "f") }); }, _BetaMessageStream_accumulateMessage = function _BetaMessageStream_accumulateMessage2(event) { - let snapshot4 = __classPrivateFieldGet3(this, _BetaMessageStream_currentMessageSnapshot, "f"); + let snapshot3 = __classPrivateFieldGet3(this, _BetaMessageStream_currentMessageSnapshot, "f"); if (event.type === "message_start") { - if (snapshot4) { + if (snapshot3) { throw new AnthropicError(`Unexpected event order, got ${event.type} before receiving "message_stop"`); } return event.message; } - if (!snapshot4) { + if (!snapshot3) { throw new AnthropicError(`Unexpected event order, got ${event.type} before "message_start"`); } switch (event.type) { case "message_stop": - return snapshot4; + return snapshot3; case "message_delta": - snapshot4.container = event.delta.container; - snapshot4.stop_reason = event.delta.stop_reason; - snapshot4.stop_sequence = event.delta.stop_sequence; - snapshot4.usage.output_tokens = event.usage.output_tokens; - snapshot4.context_management = event.context_management; + snapshot3.container = event.delta.container; + snapshot3.stop_reason = event.delta.stop_reason; + snapshot3.stop_sequence = event.delta.stop_sequence; + snapshot3.usage.output_tokens = event.usage.output_tokens; + snapshot3.context_management = event.context_management; if (event.usage.input_tokens != null) { - snapshot4.usage.input_tokens = event.usage.input_tokens; + snapshot3.usage.input_tokens = event.usage.input_tokens; } if (event.usage.cache_creation_input_tokens != null) { - snapshot4.usage.cache_creation_input_tokens = event.usage.cache_creation_input_tokens; + snapshot3.usage.cache_creation_input_tokens = event.usage.cache_creation_input_tokens; } if (event.usage.cache_read_input_tokens != null) { - snapshot4.usage.cache_read_input_tokens = event.usage.cache_read_input_tokens; + snapshot3.usage.cache_read_input_tokens = event.usage.cache_read_input_tokens; } if (event.usage.server_tool_use != null) { - snapshot4.usage.server_tool_use = event.usage.server_tool_use; + snapshot3.usage.server_tool_use = event.usage.server_tool_use; } - return snapshot4; + return snapshot3; case "content_block_start": - snapshot4.content.push(event.content_block); - return snapshot4; + snapshot3.content.push(event.content_block); + return snapshot3; case "content_block_delta": { - const snapshotContent = snapshot4.content.at(event.index); + const snapshotContent = snapshot3.content.at(event.index); switch (event.delta.type) { case "text_delta": { if (snapshotContent?.type === "text") { - snapshot4.content[event.index] = { + snapshot3.content[event.index] = { ...snapshotContent, text: (snapshotContent.text || "") + event.delta.text }; @@ -280068,7 +280368,7 @@ var init_BetaMessageStream = __esm(() => { } case "citations_delta": { if (snapshotContent?.type === "text") { - snapshot4.content[event.index] = { + snapshot3.content[event.index] = { ...snapshotContent, citations: [...snapshotContent.citations ?? [], event.delta.citation] }; @@ -280093,13 +280393,13 @@ var init_BetaMessageStream = __esm(() => { __classPrivateFieldGet3(this, _BetaMessageStream_handleError, "f").call(this, error49); } } - snapshot4.content[event.index] = newContent; + snapshot3.content[event.index] = newContent; } break; } case "thinking_delta": { if (snapshotContent?.type === "thinking") { - snapshot4.content[event.index] = { + snapshot3.content[event.index] = { ...snapshotContent, thinking: snapshotContent.thinking + event.delta.thinking }; @@ -280108,7 +280408,7 @@ var init_BetaMessageStream = __esm(() => { } case "signature_delta": { if (snapshotContent?.type === "thinking") { - snapshot4.content[event.index] = { + snapshot3.content[event.index] = { ...snapshotContent, signature: event.delta.signature }; @@ -280118,10 +280418,10 @@ var init_BetaMessageStream = __esm(() => { default: checkNever(event.delta); } - return snapshot4; + return snapshot3; } case "content_block_stop": - return snapshot4; + return snapshot3; } }, Symbol.asyncIterator)]() { const pushQueue = []; @@ -280499,7 +280799,7 @@ var init_batches = __esm(() => { init_headers(); init_jsonl(); init_error5(); - init_path(); + init_path2(); Batches = class Batches extends APIResource { create(params, options4) { const { betas, ...body3 } = params; @@ -280514,7 +280814,7 @@ var init_batches = __esm(() => { } retrieve(messageBatchID, params = {}, options4) { const { betas } = params ?? {}; - return this._client.get(path27`/v1/messages/batches/${messageBatchID}?beta=true`, { + return this._client.get(path28`/v1/messages/batches/${messageBatchID}?beta=true`, { ...options4, headers: buildHeaders([ { "anthropic-beta": [...betas ?? [], "message-batches-2024-09-24"].toString() }, @@ -280535,7 +280835,7 @@ var init_batches = __esm(() => { } delete(messageBatchID, params = {}, options4) { const { betas } = params ?? {}; - return this._client.delete(path27`/v1/messages/batches/${messageBatchID}?beta=true`, { + return this._client.delete(path28`/v1/messages/batches/${messageBatchID}?beta=true`, { ...options4, headers: buildHeaders([ { "anthropic-beta": [...betas ?? [], "message-batches-2024-09-24"].toString() }, @@ -280545,7 +280845,7 @@ var init_batches = __esm(() => { } cancel(messageBatchID, params = {}, options4) { const { betas } = params ?? {}; - return this._client.post(path27`/v1/messages/batches/${messageBatchID}/cancel?beta=true`, { + return this._client.post(path28`/v1/messages/batches/${messageBatchID}/cancel?beta=true`, { ...options4, headers: buildHeaders([ { "anthropic-beta": [...betas ?? [], "message-batches-2024-09-24"].toString() }, @@ -280664,11 +280964,11 @@ var init_versions2 = __esm(() => { init_pagination(); init_headers(); init_uploads(); - init_path(); + init_path2(); Versions = class Versions extends APIResource { create(skillID, params = {}, options4) { const { betas, ...body3 } = params ?? {}; - return this._client.post(path27`/v1/skills/${skillID}/versions?beta=true`, multipartFormRequestOptions({ + return this._client.post(path28`/v1/skills/${skillID}/versions?beta=true`, multipartFormRequestOptions({ body: body3, ...options4, headers: buildHeaders([ @@ -280679,7 +280979,7 @@ var init_versions2 = __esm(() => { } retrieve(version5, params, options4) { const { skill_id, betas } = params; - return this._client.get(path27`/v1/skills/${skill_id}/versions/${version5}?beta=true`, { + return this._client.get(path28`/v1/skills/${skill_id}/versions/${version5}?beta=true`, { ...options4, headers: buildHeaders([ { "anthropic-beta": [...betas ?? [], "skills-2025-10-02"].toString() }, @@ -280689,7 +280989,7 @@ var init_versions2 = __esm(() => { } list(skillID, params = {}, options4) { const { betas, ...query } = params ?? {}; - return this._client.getAPIList(path27`/v1/skills/${skillID}/versions?beta=true`, PageCursor, { + return this._client.getAPIList(path28`/v1/skills/${skillID}/versions?beta=true`, PageCursor, { query, ...options4, headers: buildHeaders([ @@ -280700,7 +281000,7 @@ var init_versions2 = __esm(() => { } delete(version5, params, options4) { const { skill_id, betas } = params; - return this._client.delete(path27`/v1/skills/${skill_id}/versions/${version5}?beta=true`, { + return this._client.delete(path28`/v1/skills/${skill_id}/versions/${version5}?beta=true`, { ...options4, headers: buildHeaders([ { "anthropic-beta": [...betas ?? [], "skills-2025-10-02"].toString() }, @@ -280719,7 +281019,7 @@ var init_skills = __esm(() => { init_pagination(); init_headers(); init_uploads(); - init_path(); + init_path2(); Skills2 = class Skills2 extends APIResource { constructor() { super(...arguments); @@ -280738,7 +281038,7 @@ var init_skills = __esm(() => { } retrieve(skillID, params = {}, options4) { const { betas } = params ?? {}; - return this._client.get(path27`/v1/skills/${skillID}?beta=true`, { + return this._client.get(path28`/v1/skills/${skillID}?beta=true`, { ...options4, headers: buildHeaders([ { "anthropic-beta": [...betas ?? [], "skills-2025-10-02"].toString() }, @@ -280759,7 +281059,7 @@ var init_skills = __esm(() => { } delete(skillID, params = {}, options4) { const { betas } = params ?? {}; - return this._client.delete(path27`/v1/skills/${skillID}?beta=true`, { + return this._client.delete(path28`/v1/skills/${skillID}?beta=true`, { ...options4, headers: buildHeaders([ { "anthropic-beta": [...betas ?? [], "skills-2025-10-02"].toString() }, @@ -281160,52 +281460,52 @@ var init_MessageStream = __esm(() => { if (this.ended) { throw new AnthropicError(`stream has ended, this shouldn't happen`); } - const snapshot4 = __classPrivateFieldGet3(this, _MessageStream_currentMessageSnapshot, "f"); - if (!snapshot4) { + const snapshot3 = __classPrivateFieldGet3(this, _MessageStream_currentMessageSnapshot, "f"); + if (!snapshot3) { throw new AnthropicError(`request ended without sending any chunks`); } __classPrivateFieldSet3(this, _MessageStream_currentMessageSnapshot, undefined, "f"); - return snapshot4; + return snapshot3; }, _MessageStream_accumulateMessage = function _MessageStream_accumulateMessage2(event) { - let snapshot4 = __classPrivateFieldGet3(this, _MessageStream_currentMessageSnapshot, "f"); + let snapshot3 = __classPrivateFieldGet3(this, _MessageStream_currentMessageSnapshot, "f"); if (event.type === "message_start") { - if (snapshot4) { + if (snapshot3) { throw new AnthropicError(`Unexpected event order, got ${event.type} before receiving "message_stop"`); } return event.message; } - if (!snapshot4) { + if (!snapshot3) { throw new AnthropicError(`Unexpected event order, got ${event.type} before "message_start"`); } switch (event.type) { case "message_stop": - return snapshot4; + return snapshot3; case "message_delta": - snapshot4.stop_reason = event.delta.stop_reason; - snapshot4.stop_sequence = event.delta.stop_sequence; - snapshot4.usage.output_tokens = event.usage.output_tokens; + snapshot3.stop_reason = event.delta.stop_reason; + snapshot3.stop_sequence = event.delta.stop_sequence; + snapshot3.usage.output_tokens = event.usage.output_tokens; if (event.usage.input_tokens != null) { - snapshot4.usage.input_tokens = event.usage.input_tokens; + snapshot3.usage.input_tokens = event.usage.input_tokens; } if (event.usage.cache_creation_input_tokens != null) { - snapshot4.usage.cache_creation_input_tokens = event.usage.cache_creation_input_tokens; + snapshot3.usage.cache_creation_input_tokens = event.usage.cache_creation_input_tokens; } if (event.usage.cache_read_input_tokens != null) { - snapshot4.usage.cache_read_input_tokens = event.usage.cache_read_input_tokens; + snapshot3.usage.cache_read_input_tokens = event.usage.cache_read_input_tokens; } if (event.usage.server_tool_use != null) { - snapshot4.usage.server_tool_use = event.usage.server_tool_use; + snapshot3.usage.server_tool_use = event.usage.server_tool_use; } - return snapshot4; + return snapshot3; case "content_block_start": - snapshot4.content.push({ ...event.content_block }); - return snapshot4; + snapshot3.content.push({ ...event.content_block }); + return snapshot3; case "content_block_delta": { - const snapshotContent = snapshot4.content.at(event.index); + const snapshotContent = snapshot3.content.at(event.index); switch (event.delta.type) { case "text_delta": { if (snapshotContent?.type === "text") { - snapshot4.content[event.index] = { + snapshot3.content[event.index] = { ...snapshotContent, text: (snapshotContent.text || "") + event.delta.text }; @@ -281214,7 +281514,7 @@ var init_MessageStream = __esm(() => { } case "citations_delta": { if (snapshotContent?.type === "text") { - snapshot4.content[event.index] = { + snapshot3.content[event.index] = { ...snapshotContent, citations: [...snapshotContent.citations ?? [], event.delta.citation] }; @@ -281234,13 +281534,13 @@ var init_MessageStream = __esm(() => { if (jsonBuf) { newContent.input = partialParse(jsonBuf); } - snapshot4.content[event.index] = newContent; + snapshot3.content[event.index] = newContent; } break; } case "thinking_delta": { if (snapshotContent?.type === "thinking") { - snapshot4.content[event.index] = { + snapshot3.content[event.index] = { ...snapshotContent, thinking: snapshotContent.thinking + event.delta.thinking }; @@ -281249,7 +281549,7 @@ var init_MessageStream = __esm(() => { } case "signature_delta": { if (snapshotContent?.type === "thinking") { - snapshot4.content[event.index] = { + snapshot3.content[event.index] = { ...snapshotContent, signature: event.delta.signature }; @@ -281259,10 +281559,10 @@ var init_MessageStream = __esm(() => { default: checkNever2(event.delta); } - return snapshot4; + return snapshot3; } case "content_block_stop": - return snapshot4; + return snapshot3; } }, Symbol.asyncIterator)]() { const pushQueue = []; @@ -281328,22 +281628,22 @@ var init_batches2 = __esm(() => { init_headers(); init_jsonl(); init_error5(); - init_path(); + init_path2(); Batches2 = class Batches2 extends APIResource { create(body3, options4) { return this._client.post("/v1/messages/batches", { body: body3, ...options4 }); } retrieve(messageBatchID, options4) { - return this._client.get(path27`/v1/messages/batches/${messageBatchID}`, options4); + return this._client.get(path28`/v1/messages/batches/${messageBatchID}`, options4); } list(query = {}, options4) { return this._client.getAPIList("/v1/messages/batches", Page, { query, ...options4 }); } delete(messageBatchID, options4) { - return this._client.delete(path27`/v1/messages/batches/${messageBatchID}`, options4); + return this._client.delete(path28`/v1/messages/batches/${messageBatchID}`, options4); } cancel(messageBatchID, options4) { - return this._client.post(path27`/v1/messages/batches/${messageBatchID}/cancel`, options4); + return this._client.post(path28`/v1/messages/batches/${messageBatchID}/cancel`, options4); } async results(messageBatchID, options4) { const batch = await this.retrieve(messageBatchID); @@ -281417,11 +281717,11 @@ var Models2; var init_models4 = __esm(() => { init_pagination(); init_headers(); - init_path(); + init_path2(); Models2 = class Models2 extends APIResource { retrieve(modelID, params = {}, options4) { const { betas } = params ?? {}; - return this._client.get(path27`/v1/models/${modelID}`, { + return this._client.get(path28`/v1/models/${modelID}`, { ...options4, headers: buildHeaders([ { ...betas?.toString() != null ? { "anthropic-beta": betas?.toString() } : undefined }, @@ -281570,9 +281870,9 @@ new Anthropic({ apiKey, dangerouslyAllowBrowser: true }); makeStatusError(status, error49, message, headers) { return APIError.generate(status, error49, message, headers); } - buildURL(path28, query, defaultBaseURL) { + buildURL(path29, query, defaultBaseURL) { const baseURL = !__classPrivateFieldGet3(this, _BaseAnthropic_instances, "m", _BaseAnthropic_baseURLOverridden).call(this) && defaultBaseURL || this.baseURL; - const url4 = isAbsoluteURL(path28) ? new URL(path28) : new URL(baseURL + (baseURL.endsWith("/") && path28.startsWith("/") ? path28.slice(1) : path28)); + const url4 = isAbsoluteURL(path29) ? new URL(path29) : new URL(baseURL + (baseURL.endsWith("/") && path29.startsWith("/") ? path29.slice(1) : path29)); const defaultQuery = this.defaultQuery(); if (!isEmptyObj(defaultQuery)) { query = { ...defaultQuery, ...query }; @@ -281592,24 +281892,24 @@ new Anthropic({ apiKey, dangerouslyAllowBrowser: true }); } async prepareOptions(options4) {} async prepareRequest(request3, { url: url4, options: options4 }) {} - get(path28, opts) { - return this.methodRequest("get", path28, opts); + get(path29, opts) { + return this.methodRequest("get", path29, opts); } - post(path28, opts) { - return this.methodRequest("post", path28, opts); + post(path29, opts) { + return this.methodRequest("post", path29, opts); } - patch(path28, opts) { - return this.methodRequest("patch", path28, opts); + patch(path29, opts) { + return this.methodRequest("patch", path29, opts); } - put(path28, opts) { - return this.methodRequest("put", path28, opts); + put(path29, opts) { + return this.methodRequest("put", path29, opts); } - delete(path28, opts) { - return this.methodRequest("delete", path28, opts); + delete(path29, opts) { + return this.methodRequest("delete", path29, opts); } - methodRequest(method, path28, opts) { + methodRequest(method, path29, opts) { return this.request(Promise.resolve(opts).then((opts2) => { - return { method, path: path28, ...opts2 }; + return { method, path: path29, ...opts2 }; })); } request(options4, remainingRetries = null) { @@ -281713,8 +282013,8 @@ new Anthropic({ apiKey, dangerouslyAllowBrowser: true }); })); return { response, options: options4, controller, requestLogID, retryOfRequestLogID, startTime }; } - getAPIList(path28, Page2, opts) { - return this.requestAPIList(Page2, { method: "get", path: path28, ...opts }); + getAPIList(path29, Page2, opts) { + return this.requestAPIList(Page2, { method: "get", path: path29, ...opts }); } requestAPIList(Page2, options4) { const request3 = this.makeRequest(options4, null, undefined); @@ -281801,8 +282101,8 @@ new Anthropic({ apiKey, dangerouslyAllowBrowser: true }); } async buildRequest(inputOptions, { retryCount = 0 } = {}) { const options4 = { ...inputOptions }; - const { method, path: path28, query, defaultBaseURL } = options4; - const url4 = this.buildURL(path28, query, defaultBaseURL); + const { method, path: path29, query, defaultBaseURL } = options4; + const url4 = this.buildURL(path29, query, defaultBaseURL); if ("timeout" in options4) validatePositiveInteger("timeout", options4.timeout); options4.timeout = options4.timeout ?? this.timeout; @@ -282367,8 +282667,8 @@ class ParseStatus3 { } } var makeIssue3 = (params) => { - const { data: data2, path: path28, errorMaps, issueData } = params; - const fullPath = [...path28, ...issueData.path || []]; + const { data: data2, path: path29, errorMaps, issueData } = params; + const fullPath = [...path29, ...issueData.path || []]; const fullIssue = { ...issueData, path: fullPath @@ -282414,11 +282714,11 @@ var init_errorUtil3 = __esm(() => { // node_modules/gitlab-ai-provider/node_modules/zod/v3/types.js class ParseInputLazyPath3 { - constructor(parent, value8, path28, key) { + constructor(parent, value8, path29, key) { this._cachedPath = []; this.parent = parent; this.data = value8; - this._path = path28; + this._path = path29; this._key = key; } get path() { @@ -285890,21 +286190,21 @@ var init_zod3 = __esm(() => { }); // node_modules/gitlab-ai-provider/node_modules/openai/internal/tslib.mjs -function __classPrivateFieldSet4(receiver, state2, value8, kind, f4) { +function __classPrivateFieldSet4(receiver, state, value8, kind, f4) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f4) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state2 === "function" ? receiver !== state2 || !f4 : !state2.has(receiver)) + if (typeof state === "function" ? receiver !== state || !f4 : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return kind === "a" ? f4.call(receiver, value8) : f4 ? f4.value = value8 : state2.set(receiver, value8), value8; + return kind === "a" ? f4.call(receiver, value8) : f4 ? f4.value = value8 : state.set(receiver, value8), value8; } -function __classPrivateFieldGet4(receiver, state2, kind, f4) { +function __classPrivateFieldGet4(receiver, state, kind, f4) { if (kind === "a" && !f4) throw new TypeError("Private accessor was defined without a getter"); - if (typeof state2 === "function" ? receiver !== state2 || !f4 : !state2.has(receiver)) + if (typeof state === "function" ? receiver !== state || !f4 : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f4 : kind === "a" ? f4.call(receiver) : f4 ? f4.value : state2.get(receiver); + return kind === "m" ? f4 : kind === "a" ? f4.call(receiver) : f4 ? f4.value : state.get(receiver); } var init_tslib2 = () => {}; @@ -287388,11 +287688,11 @@ var init_pagination2 = __esm(() => { // node_modules/gitlab-ai-provider/node_modules/openai/auth/workload-identity-auth.mjs class WorkloadIdentityAuth { - constructor(config5, fetch3) { + constructor(config4, fetch3) { this.cachedToken = null; this.refreshPromise = null; this.tokenExchangeUrl = "https://auth.openai.com/oauth/token"; - this.config = config5; + this.config = config4; this.fetch = fetch3 ?? getDefaultFetch2(); } async getToken() { @@ -287845,12 +288145,12 @@ class APIResource2 { function encodeURIPath2(str2) { return str2.replace(/[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/g, encodeURIComponent); } -var EMPTY2, createPathTagFunction2 = (pathEncoder = encodeURIPath2) => function path28(statics, ...params) { +var EMPTY2, createPathTagFunction2 = (pathEncoder = encodeURIPath2) => function path29(statics, ...params) { if (statics.length === 1) return statics[0]; let postPath = false; const invalidSegments = []; - const path29 = statics.reduce((previousValue, currentValue, index3) => { + const path30 = statics.reduce((previousValue, currentValue, index3) => { if (/[?#]/.test(currentValue)) { postPath = true; } @@ -287866,7 +288166,7 @@ var EMPTY2, createPathTagFunction2 = (pathEncoder = encodeURIPath2) => function } return previousValue + currentValue + (index3 === params.length ? "" : encoded); }, ""); - const pathOnly = path29.split(/[?#]/, 1)[0]; + const pathOnly = path30.split(/[?#]/, 1)[0]; const invalidSegmentPattern = /(?<=^|\/)(?:\.|%2e){1,2}(?=\/|$)/gi; let match17; while ((match17 = invalidSegmentPattern.exec(pathOnly)) !== null) { @@ -287888,25 +288188,25 @@ var EMPTY2, createPathTagFunction2 = (pathEncoder = encodeURIPath2) => function throw new OpenAIError(`Path parameters result in path with invalid segments: ${invalidSegments.map((e2) => e2.error).join(` `)} -${path29} +${path30} ${underline}`); } - return path29; -}, path28; -var init_path2 = __esm(() => { + return path30; +}, path29; +var init_path3 = __esm(() => { init_error6(); EMPTY2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.create(null)); - path28 = /* @__PURE__ */ createPathTagFunction2(encodeURIPath2); + path29 = /* @__PURE__ */ createPathTagFunction2(encodeURIPath2); }); // node_modules/gitlab-ai-provider/node_modules/openai/resources/chat/completions/messages.mjs var Messages3; var init_messages3 = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Messages3 = class Messages3 extends APIResource2 { list(completionID, query = {}, options4) { - return this._client.getAPIList(path28`/chat/completions/${completionID}/messages`, CursorPage, { query, ...options4, __security: { bearerAuth: true } }); + return this._client.getAPIList(path29`/chat/completions/${completionID}/messages`, CursorPage, { query, ...options4, __security: { bearerAuth: true } }); } }; }); @@ -288869,8 +289169,8 @@ function getChatCompletionReadableStreamMessage(item) { } return JSON.parse(item.object.slice(CHAT_COMPLETION_READABLE_STREAM_MESSAGE_PREFIX.length)); } -function finalizeChatCompletion(snapshot4, params, audioDoneChoiceIndexes) { - const { id: id2, choices, created, model, system_fingerprint, ...rest } = snapshot4; +function finalizeChatCompletion(snapshot3, params, audioDoneChoiceIndexes) { + const { id: id2, choices, created, model, system_fingerprint, ...rest } = snapshot3; const completion2 = { ...rest, id: id2, @@ -288924,15 +289224,15 @@ function finalizeChatCompletion(snapshot4, params, audioDoneChoiceIndexes) { const { arguments: args3, name: name26, ...fnRest } = fn3 || {}; if (type3 == null) { throw new OpenAIError(`missing choices[${index3}].tool_calls[${i6}].type -${str2(snapshot4)}`); +${str2(snapshot3)}`); } if (name26 == null) { throw new OpenAIError(`missing choices[${index3}].tool_calls[${i6}].function.name -${str2(snapshot4)}`); +${str2(snapshot3)}`); } if (args3 == null) { throw new OpenAIError(`missing choices[${index3}].tool_calls[${i6}].function.arguments -${str2(snapshot4)}`); +${str2(snapshot3)}`); } return { ...toolRest, @@ -289065,11 +289365,11 @@ var init_ChatCompletionStream = __esm(() => { __classPrivateFieldSet4(this, _ChatCompletionStream_audioDoneChoiceIndexes, new Set, "f"); __classPrivateFieldSet4(this, _ChatCompletionStream_currentChatCompletionSnapshot, undefined, "f"); }, _ChatCompletionStream_getChoiceEventState = function _ChatCompletionStream_getChoiceEventState2(choice2) { - let state2 = __classPrivateFieldGet4(this, _ChatCompletionStream_choiceEventStates, "f")[choice2.index]; - if (state2) { - return state2; + let state = __classPrivateFieldGet4(this, _ChatCompletionStream_choiceEventStates, "f")[choice2.index]; + if (state) { + return state; } - state2 = { + state = { content_done: false, refusal_done: false, logprobs_content_done: false, @@ -289077,8 +289377,8 @@ var init_ChatCompletionStream = __esm(() => { done_tool_calls: new Set, current_tool_call_index: null }; - __classPrivateFieldGet4(this, _ChatCompletionStream_choiceEventStates, "f")[choice2.index] = state2; - return state2; + __classPrivateFieldGet4(this, _ChatCompletionStream_choiceEventStates, "f")[choice2.index] = state; + return state; }, _ChatCompletionStream_addChunk = function _ChatCompletionStream_addChunk2(chunk) { if (this.ended) return; @@ -289113,21 +289413,21 @@ var init_ChatCompletionStream = __esm(() => { snapshot: choiceSnapshot.logprobs?.refusal ?? [] }); } - const state2 = __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_getChoiceEventState).call(this, choiceSnapshot); + const state = __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_getChoiceEventState).call(this, choiceSnapshot); if (choiceSnapshot.finish_reason) { __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_emitContentDoneEvents).call(this, choiceSnapshot); - if (state2.current_tool_call_index != null) { - __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_emitToolCallDoneEvent).call(this, choiceSnapshot, state2.current_tool_call_index); + if (state.current_tool_call_index != null) { + __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_emitToolCallDoneEvent).call(this, choiceSnapshot, state.current_tool_call_index); } } for (const toolCall of delta?.tool_calls ?? []) { - if (state2.current_tool_call_index !== toolCall.index) { + if (state.current_tool_call_index !== toolCall.index) { __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_emitContentDoneEvents).call(this, choiceSnapshot); - if (state2.current_tool_call_index != null) { - __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_emitToolCallDoneEvent).call(this, choiceSnapshot, state2.current_tool_call_index); + if (state.current_tool_call_index != null) { + __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_emitToolCallDoneEvent).call(this, choiceSnapshot, state.current_tool_call_index); } } - state2.current_tool_call_index = toolCall.index; + state.current_tool_call_index = toolCall.index; } for (const toolCallDelta of delta?.tool_calls ?? []) { const toolCallSnapshot = choiceSnapshot.message.tool_calls?.[toolCallDelta.index]; @@ -289148,8 +289448,8 @@ var init_ChatCompletionStream = __esm(() => { } } }, _ChatCompletionStream_emitToolCallDoneEvent = function _ChatCompletionStream_emitToolCallDoneEvent2(choiceSnapshot, toolCallIndex) { - const state2 = __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_getChoiceEventState).call(this, choiceSnapshot); - if (state2.done_tool_calls.has(toolCallIndex)) { + const state = __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_getChoiceEventState).call(this, choiceSnapshot); + if (state.done_tool_calls.has(toolCallIndex)) { return; } const toolCallSnapshot = choiceSnapshot.message.tool_calls?.[toolCallIndex]; @@ -289171,40 +289471,40 @@ var init_ChatCompletionStream = __esm(() => { assertNever3(toolCallSnapshot.type); } }, _ChatCompletionStream_emitContentDoneEvents = function _ChatCompletionStream_emitContentDoneEvents2(choiceSnapshot) { - const state2 = __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_getChoiceEventState).call(this, choiceSnapshot); - if (choiceSnapshot.message.content && !state2.content_done) { - state2.content_done = true; + const state = __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_getChoiceEventState).call(this, choiceSnapshot); + if (choiceSnapshot.message.content && !state.content_done) { + state.content_done = true; const responseFormat = __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_getAutoParseableResponseFormat).call(this); this._emit("content.done", { content: choiceSnapshot.message.content, parsed: responseFormat ? responseFormat.$parseRaw(choiceSnapshot.message.content) : null }); } - if (choiceSnapshot.message.refusal && !state2.refusal_done) { - state2.refusal_done = true; + if (choiceSnapshot.message.refusal && !state.refusal_done) { + state.refusal_done = true; this._emit("refusal.done", { refusal: choiceSnapshot.message.refusal }); } - if (choiceSnapshot.logprobs?.content && !state2.logprobs_content_done) { - state2.logprobs_content_done = true; + if (choiceSnapshot.logprobs?.content && !state.logprobs_content_done) { + state.logprobs_content_done = true; this._emit("logprobs.content.done", { content: choiceSnapshot.logprobs.content }); } - if (choiceSnapshot.logprobs?.refusal && !state2.logprobs_refusal_done) { - state2.logprobs_refusal_done = true; + if (choiceSnapshot.logprobs?.refusal && !state.logprobs_refusal_done) { + state.logprobs_refusal_done = true; this._emit("logprobs.refusal.done", { refusal: choiceSnapshot.logprobs.refusal }); } }, _ChatCompletionStream_endRequest = function _ChatCompletionStream_endRequest2() { if (this.ended) { throw new OpenAIError(`stream has ended, this shouldn't happen`); } - const snapshot4 = __classPrivateFieldGet4(this, _ChatCompletionStream_currentChatCompletionSnapshot, "f"); - if (!snapshot4) { + const snapshot3 = __classPrivateFieldGet4(this, _ChatCompletionStream_currentChatCompletionSnapshot, "f"); + if (!snapshot3) { throw new OpenAIError(`request ended without sending any chunks`); } const audioDoneChoiceIndexes = __classPrivateFieldGet4(this, _ChatCompletionStream_audioDoneChoiceIndexes, "f"); __classPrivateFieldSet4(this, _ChatCompletionStream_audioDoneChoiceIndexes, new Set, "f"); __classPrivateFieldSet4(this, _ChatCompletionStream_currentChatCompletionSnapshot, undefined, "f"); __classPrivateFieldSet4(this, _ChatCompletionStream_choiceEventStates, [], "f"); - return finalizeChatCompletion(snapshot4, __classPrivateFieldGet4(this, _ChatCompletionStream_params, "f"), audioDoneChoiceIndexes); + return finalizeChatCompletion(snapshot3, __classPrivateFieldGet4(this, _ChatCompletionStream_params, "f"), audioDoneChoiceIndexes); }, _ChatCompletionStream_getAutoParseableResponseFormat = function _ChatCompletionStream_getAutoParseableResponseFormat2() { const responseFormat = __classPrivateFieldGet4(this, _ChatCompletionStream_params, "f")?.response_format; if (isAutoParsableResponseFormat(responseFormat)) { @@ -289213,20 +289513,20 @@ var init_ChatCompletionStream = __esm(() => { return null; }, _ChatCompletionStream_accumulateChatCompletion = function _ChatCompletionStream_accumulateChatCompletion2(chunk) { var _a27, _b16, _c2, _d, _e2; - let snapshot4 = __classPrivateFieldGet4(this, _ChatCompletionStream_currentChatCompletionSnapshot, "f"); + let snapshot3 = __classPrivateFieldGet4(this, _ChatCompletionStream_currentChatCompletionSnapshot, "f"); const { choices, ...rest } = chunk; - if (!snapshot4) { - snapshot4 = __classPrivateFieldSet4(this, _ChatCompletionStream_currentChatCompletionSnapshot, { + if (!snapshot3) { + snapshot3 = __classPrivateFieldSet4(this, _ChatCompletionStream_currentChatCompletionSnapshot, { ...rest, choices: [] }, "f"); } else if (chunk.id) { - Object.assign(snapshot4, rest); + Object.assign(snapshot3, rest); } for (const { delta, finish_reason, index: index3, logprobs = null, ...other } of chunk.choices) { - let choice2 = snapshot4.choices[index3]; + let choice2 = snapshot3.choices[index3]; if (!choice2) { - choice2 = snapshot4.choices[index3] = { finish_reason, index: index3, message: {}, logprobs, ...other }; + choice2 = snapshot3.choices[index3] = { finish_reason, index: index3, message: {}, logprobs, ...other }; } if (logprobs) { if (!choice2.logprobs) { @@ -289324,7 +289624,7 @@ var init_ChatCompletionStream = __esm(() => { } } } - return snapshot4; + return snapshot3; }, Symbol.asyncIterator)]() { const pushQueue = []; const readQueue = []; @@ -289485,7 +289785,7 @@ var init_completions2 = __esm(() => { init_messages3(); init_messages3(); init_pagination2(); - init_path2(); + init_path3(); init_ChatCompletionRunner(); init_ChatCompletionStreamingRunner(); init_ChatCompletionStream(); @@ -289507,13 +289807,13 @@ var init_completions2 = __esm(() => { }); } retrieve(completionID, options4) { - return this._client.get(path28`/chat/completions/${completionID}`, { + return this._client.get(path29`/chat/completions/${completionID}`, { ...options4, __security: { bearerAuth: true } }); } update(completionID, body3, options4) { - return this._client.post(path28`/chat/completions/${completionID}`, { + return this._client.post(path29`/chat/completions/${completionID}`, { body: body3, ...options4, __security: { bearerAuth: true } @@ -289527,7 +289827,7 @@ var init_completions2 = __esm(() => { }); } delete(completionID, options4) { - return this._client.delete(path28`/chat/completions/${completionID}`, { + return this._client.delete(path29`/chat/completions/${completionID}`, { ...options4, __security: { bearerAuth: true } }); @@ -289589,7 +289889,7 @@ var init_shared3 = () => {}; var AdminAPIKeys; var init_admin_api_keys = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); AdminAPIKeys = class AdminAPIKeys extends APIResource2 { create(body3, options4) { return this._client.post("/organization/admin_api_keys", { @@ -289599,7 +289899,7 @@ var init_admin_api_keys = __esm(() => { }); } retrieve(keyID, options4) { - return this._client.get(path28`/organization/admin_api_keys/${keyID}`, { + return this._client.get(path29`/organization/admin_api_keys/${keyID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -289612,7 +289912,7 @@ var init_admin_api_keys = __esm(() => { }); } delete(keyID, options4) { - return this._client.delete(path28`/organization/admin_api_keys/${keyID}`, { + return this._client.delete(path29`/organization/admin_api_keys/${keyID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -289639,7 +289939,7 @@ var init_audit_logs = __esm(() => { var Certificates; var init_certificates = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Certificates = class Certificates extends APIResource2 { create(body3, options4) { return this._client.post("/organization/certificates", { @@ -289649,14 +289949,14 @@ var init_certificates = __esm(() => { }); } retrieve(certificateID, query = {}, options4) { - return this._client.get(path28`/organization/certificates/${certificateID}`, { + return this._client.get(path29`/organization/certificates/${certificateID}`, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } update(certificateID, body3, options4) { - return this._client.post(path28`/organization/certificates/${certificateID}`, { + return this._client.post(path29`/organization/certificates/${certificateID}`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -289666,7 +289966,7 @@ var init_certificates = __esm(() => { return this._client.getAPIList("/organization/certificates", ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(certificateID, options4) { - return this._client.delete(path28`/organization/certificates/${certificateID}`, { + return this._client.delete(path29`/organization/certificates/${certificateID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -289709,7 +290009,7 @@ var init_data_retention = __esm(() => { var Invites; var init_invites = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Invites = class Invites extends APIResource2 { create(body3, options4) { return this._client.post("/organization/invites", { @@ -289719,7 +290019,7 @@ var init_invites = __esm(() => { }); } retrieve(inviteID, options4) { - return this._client.get(path28`/organization/invites/${inviteID}`, { + return this._client.get(path29`/organization/invites/${inviteID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -289732,7 +290032,7 @@ var init_invites = __esm(() => { }); } delete(inviteID, options4) { - return this._client.delete(path28`/organization/invites/${inviteID}`, { + return this._client.delete(path29`/organization/invites/${inviteID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -289744,7 +290044,7 @@ var init_invites = __esm(() => { var Roles; var init_roles = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Roles = class Roles extends APIResource2 { create(body3, options4) { return this._client.post("/organization/roles", { @@ -289754,13 +290054,13 @@ var init_roles = __esm(() => { }); } retrieve(roleID, options4) { - return this._client.get(path28`/organization/roles/${roleID}`, { + return this._client.get(path29`/organization/roles/${roleID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(roleID, body3, options4) { - return this._client.post(path28`/organization/roles/${roleID}`, { + return this._client.post(path29`/organization/roles/${roleID}`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -289774,7 +290074,7 @@ var init_roles = __esm(() => { }); } delete(roleID, options4) { - return this._client.delete(path28`/organization/roles/${roleID}`, { + return this._client.delete(path29`/organization/roles/${roleID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -289786,7 +290086,7 @@ var init_roles = __esm(() => { var SpendAlerts; var init_spend_alerts = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); SpendAlerts = class SpendAlerts extends APIResource2 { create(body3, options4) { return this._client.post("/organization/spend_alerts", { @@ -289796,13 +290096,13 @@ var init_spend_alerts = __esm(() => { }); } retrieve(alertID, options4) { - return this._client.get(path28`/organization/spend_alerts/${alertID}`, { + return this._client.get(path29`/organization/spend_alerts/${alertID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(alertID, body3, options4) { - return this._client.post(path28`/organization/spend_alerts/${alertID}`, { + return this._client.post(path29`/organization/spend_alerts/${alertID}`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -289812,7 +290112,7 @@ var init_spend_alerts = __esm(() => { return this._client.getAPIList("/organization/spend_alerts", ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(alertID, options4) { - return this._client.delete(path28`/organization/spend_alerts/${alertID}`, { + return this._client.delete(path29`/organization/spend_alerts/${alertID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -289934,10 +290234,10 @@ var init_usage = __esm(() => { var Roles2; var init_roles2 = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Roles2 = class Roles2 extends APIResource2 { create(groupID, body3, options4) { - return this._client.post(path28`/organization/groups/${groupID}/roles`, { + return this._client.post(path29`/organization/groups/${groupID}/roles`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -289945,17 +290245,17 @@ var init_roles2 = __esm(() => { } retrieve(roleID, params, options4) { const { group_id } = params; - return this._client.get(path28`/organization/groups/${group_id}/roles/${roleID}`, { + return this._client.get(path29`/organization/groups/${group_id}/roles/${roleID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } list(groupID, query = {}, options4) { - return this._client.getAPIList(path28`/organization/groups/${groupID}/roles`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/organization/groups/${groupID}/roles`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(roleID, params, options4) { const { group_id } = params; - return this._client.delete(path28`/organization/groups/${group_id}/roles/${roleID}`, { + return this._client.delete(path29`/organization/groups/${group_id}/roles/${roleID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -289967,10 +290267,10 @@ var init_roles2 = __esm(() => { var Users; var init_users = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Users = class Users extends APIResource2 { create(groupID, body3, options4) { - return this._client.post(path28`/organization/groups/${groupID}/users`, { + return this._client.post(path29`/organization/groups/${groupID}/users`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -289978,17 +290278,17 @@ var init_users = __esm(() => { } retrieve(userID, params, options4) { const { group_id } = params; - return this._client.get(path28`/organization/groups/${group_id}/users/${userID}`, { + return this._client.get(path29`/organization/groups/${group_id}/users/${userID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } list(groupID, query = {}, options4) { - return this._client.getAPIList(path28`/organization/groups/${groupID}/users`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/organization/groups/${groupID}/users`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(userID, params, options4) { const { group_id } = params; - return this._client.delete(path28`/organization/groups/${group_id}/users/${userID}`, { + return this._client.delete(path29`/organization/groups/${group_id}/users/${userID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290004,7 +290304,7 @@ var init_groups = __esm(() => { init_users(); init_users(); init_pagination2(); - init_path2(); + init_path3(); Groups = class Groups extends APIResource2 { constructor() { super(...arguments); @@ -290019,13 +290319,13 @@ var init_groups = __esm(() => { }); } retrieve(groupID, options4) { - return this._client.get(path28`/organization/groups/${groupID}`, { + return this._client.get(path29`/organization/groups/${groupID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(groupID, body3, options4) { - return this._client.post(path28`/organization/groups/${groupID}`, { + return this._client.post(path29`/organization/groups/${groupID}`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290039,7 +290339,7 @@ var init_groups = __esm(() => { }); } delete(groupID, options4) { - return this._client.delete(path28`/organization/groups/${groupID}`, { + return this._client.delete(path29`/organization/groups/${groupID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290053,21 +290353,21 @@ var init_groups = __esm(() => { var APIKeys; var init_api_keys = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); APIKeys = class APIKeys extends APIResource2 { retrieve(apiKeyID, params, options4) { const { project_id } = params; - return this._client.get(path28`/organization/projects/${project_id}/api_keys/${apiKeyID}`, { + return this._client.get(path29`/organization/projects/${project_id}/api_keys/${apiKeyID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } list(projectID, query = {}, options4) { - return this._client.getAPIList(path28`/organization/projects/${projectID}/api_keys`, ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/organization/projects/${projectID}/api_keys`, ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(apiKeyID, params, options4) { const { project_id } = params; - return this._client.delete(path28`/organization/projects/${project_id}/api_keys/${apiKeyID}`, { + return this._client.delete(path29`/organization/projects/${project_id}/api_keys/${apiKeyID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290079,16 +290379,16 @@ var init_api_keys = __esm(() => { var Certificates2; var init_certificates2 = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Certificates2 = class Certificates2 extends APIResource2 { list(projectID, query = {}, options4) { - return this._client.getAPIList(path28`/organization/projects/${projectID}/certificates`, ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/organization/projects/${projectID}/certificates`, ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } activate(projectID, body3, options4) { - return this._client.getAPIList(path28`/organization/projects/${projectID}/certificates/activate`, Page2, { body: body3, method: "post", ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/organization/projects/${projectID}/certificates/activate`, Page2, { body: body3, method: "post", ...options4, __security: { adminAPIKeyAuth: true } }); } deactivate(projectID, body3, options4) { - return this._client.getAPIList(path28`/organization/projects/${projectID}/certificates/deactivate`, Page2, { body: body3, method: "post", ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/organization/projects/${projectID}/certificates/deactivate`, Page2, { body: body3, method: "post", ...options4, __security: { adminAPIKeyAuth: true } }); } }; }); @@ -290096,16 +290396,16 @@ var init_certificates2 = __esm(() => { // node_modules/gitlab-ai-provider/node_modules/openai/resources/admin/organization/projects/data-retention.mjs var DataRetention2; var init_data_retention2 = __esm(() => { - init_path2(); + init_path3(); DataRetention2 = class DataRetention2 extends APIResource2 { retrieve(projectID, options4) { - return this._client.get(path28`/organization/projects/${projectID}/data_retention`, { + return this._client.get(path29`/organization/projects/${projectID}/data_retention`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(projectID, body3, options4) { - return this._client.post(path28`/organization/projects/${projectID}/data_retention`, { + return this._client.post(path29`/organization/projects/${projectID}/data_retention`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290117,16 +290417,16 @@ var init_data_retention2 = __esm(() => { // node_modules/gitlab-ai-provider/node_modules/openai/resources/admin/organization/projects/hosted-tool-permissions.mjs var HostedToolPermissions; var init_hosted_tool_permissions = __esm(() => { - init_path2(); + init_path3(); HostedToolPermissions = class HostedToolPermissions extends APIResource2 { retrieve(projectID, options4) { - return this._client.get(path28`/organization/projects/${projectID}/hosted_tool_permissions`, { + return this._client.get(path29`/organization/projects/${projectID}/hosted_tool_permissions`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(projectID, body3, options4) { - return this._client.post(path28`/organization/projects/${projectID}/hosted_tool_permissions`, { + return this._client.post(path29`/organization/projects/${projectID}/hosted_tool_permissions`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290138,23 +290438,23 @@ var init_hosted_tool_permissions = __esm(() => { // node_modules/gitlab-ai-provider/node_modules/openai/resources/admin/organization/projects/model-permissions.mjs var ModelPermissions; var init_model_permissions = __esm(() => { - init_path2(); + init_path3(); ModelPermissions = class ModelPermissions extends APIResource2 { retrieve(projectID, options4) { - return this._client.get(path28`/organization/projects/${projectID}/model_permissions`, { + return this._client.get(path29`/organization/projects/${projectID}/model_permissions`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(projectID, body3, options4) { - return this._client.post(path28`/organization/projects/${projectID}/model_permissions`, { + return this._client.post(path29`/organization/projects/${projectID}/model_permissions`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(projectID, options4) { - return this._client.delete(path28`/organization/projects/${projectID}/model_permissions`, { + return this._client.delete(path29`/organization/projects/${projectID}/model_permissions`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290166,14 +290466,14 @@ var init_model_permissions = __esm(() => { var RateLimits; var init_rate_limits = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); RateLimits = class RateLimits extends APIResource2 { listRateLimits(projectID, query = {}, options4) { - return this._client.getAPIList(path28`/organization/projects/${projectID}/rate_limits`, ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/organization/projects/${projectID}/rate_limits`, ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } updateRateLimit(rateLimitID, params, options4) { const { project_id, ...body3 } = params; - return this._client.post(path28`/organization/projects/${project_id}/rate_limits/${rateLimitID}`, { + return this._client.post(path29`/organization/projects/${project_id}/rate_limits/${rateLimitID}`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290186,10 +290486,10 @@ var init_rate_limits = __esm(() => { var Roles3; var init_roles3 = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Roles3 = class Roles3 extends APIResource2 { create(projectID, body3, options4) { - return this._client.post(path28`/projects/${projectID}/roles`, { + return this._client.post(path29`/projects/${projectID}/roles`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290197,21 +290497,21 @@ var init_roles3 = __esm(() => { } retrieve(roleID, params, options4) { const { project_id } = params; - return this._client.get(path28`/projects/${project_id}/roles/${roleID}`, { + return this._client.get(path29`/projects/${project_id}/roles/${roleID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(roleID, params, options4) { const { project_id, ...body3 } = params; - return this._client.post(path28`/projects/${project_id}/roles/${roleID}`, { + return this._client.post(path29`/projects/${project_id}/roles/${roleID}`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } }); } list(projectID, query = {}, options4) { - return this._client.getAPIList(path28`/projects/${projectID}/roles`, NextCursorPage, { + return this._client.getAPIList(path29`/projects/${projectID}/roles`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } @@ -290219,7 +290519,7 @@ var init_roles3 = __esm(() => { } delete(roleID, params, options4) { const { project_id } = params; - return this._client.delete(path28`/projects/${project_id}/roles/${roleID}`, { + return this._client.delete(path29`/projects/${project_id}/roles/${roleID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290231,10 +290531,10 @@ var init_roles3 = __esm(() => { var SpendAlerts2; var init_spend_alerts2 = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); SpendAlerts2 = class SpendAlerts2 extends APIResource2 { create(projectID, body3, options4) { - return this._client.post(path28`/organization/projects/${projectID}/spend_alerts`, { + return this._client.post(path29`/organization/projects/${projectID}/spend_alerts`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290242,25 +290542,25 @@ var init_spend_alerts2 = __esm(() => { } retrieve(alertID, params, options4) { const { project_id } = params; - return this._client.get(path28`/organization/projects/${project_id}/spend_alerts/${alertID}`, { + return this._client.get(path29`/organization/projects/${project_id}/spend_alerts/${alertID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(alertID, params, options4) { const { project_id, ...body3 } = params; - return this._client.post(path28`/organization/projects/${project_id}/spend_alerts/${alertID}`, { + return this._client.post(path29`/organization/projects/${project_id}/spend_alerts/${alertID}`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } }); } list(projectID, query = {}, options4) { - return this._client.getAPIList(path28`/organization/projects/${projectID}/spend_alerts`, ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/organization/projects/${projectID}/spend_alerts`, ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(alertID, params, options4) { const { project_id } = params; - return this._client.delete(path28`/organization/projects/${project_id}/spend_alerts/${alertID}`, { + return this._client.delete(path29`/organization/projects/${project_id}/spend_alerts/${alertID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290271,23 +290571,23 @@ var init_spend_alerts2 = __esm(() => { // node_modules/gitlab-ai-provider/node_modules/openai/resources/admin/organization/projects/spend-limit.mjs var SpendLimit2; var init_spend_limit2 = __esm(() => { - init_path2(); + init_path3(); SpendLimit2 = class SpendLimit2 extends APIResource2 { retrieve(projectID, options4) { - return this._client.get(path28`/organization/projects/${projectID}/spend_limit`, { + return this._client.get(path29`/organization/projects/${projectID}/spend_limit`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(projectID, body3, options4) { - return this._client.post(path28`/organization/projects/${projectID}/spend_limit`, { + return this._client.post(path29`/organization/projects/${projectID}/spend_limit`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(projectID, options4) { - return this._client.delete(path28`/organization/projects/${projectID}/spend_limit`, { + return this._client.delete(path29`/organization/projects/${projectID}/spend_limit`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290299,11 +290599,11 @@ var init_spend_limit2 = __esm(() => { var Roles4; var init_roles4 = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Roles4 = class Roles4 extends APIResource2 { create(groupID, params, options4) { const { project_id, ...body3 } = params; - return this._client.post(path28`/projects/${project_id}/groups/${groupID}/roles`, { + return this._client.post(path29`/projects/${project_id}/groups/${groupID}/roles`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290311,18 +290611,18 @@ var init_roles4 = __esm(() => { } retrieve(roleID, params, options4) { const { project_id, group_id } = params; - return this._client.get(path28`/projects/${project_id}/groups/${group_id}/roles/${roleID}`, { + return this._client.get(path29`/projects/${project_id}/groups/${group_id}/roles/${roleID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } list(groupID, params, options4) { const { project_id, ...query } = params; - return this._client.getAPIList(path28`/projects/${project_id}/groups/${groupID}/roles`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/projects/${project_id}/groups/${groupID}/roles`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(roleID, params, options4) { const { project_id, group_id } = params; - return this._client.delete(path28`/projects/${project_id}/groups/${group_id}/roles/${roleID}`, { + return this._client.delete(path29`/projects/${project_id}/groups/${group_id}/roles/${roleID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290336,14 +290636,14 @@ var init_groups2 = __esm(() => { init_roles4(); init_roles4(); init_pagination2(); - init_path2(); + init_path3(); Groups2 = class Groups2 extends APIResource2 { constructor() { super(...arguments); this.roles = new Roles4(this._client); } create(projectID, body3, options4) { - return this._client.post(path28`/organization/projects/${projectID}/groups`, { + return this._client.post(path29`/organization/projects/${projectID}/groups`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290351,18 +290651,18 @@ var init_groups2 = __esm(() => { } retrieve(groupID, params, options4) { const { project_id, ...query } = params; - return this._client.get(path28`/organization/projects/${project_id}/groups/${groupID}`, { + return this._client.get(path29`/organization/projects/${project_id}/groups/${groupID}`, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } list(projectID, query = {}, options4) { - return this._client.getAPIList(path28`/organization/projects/${projectID}/groups`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/organization/projects/${projectID}/groups`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(groupID, params, options4) { const { project_id } = params; - return this._client.delete(path28`/organization/projects/${project_id}/groups/${groupID}`, { + return this._client.delete(path29`/organization/projects/${project_id}/groups/${groupID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290374,11 +290674,11 @@ var init_groups2 = __esm(() => { // node_modules/gitlab-ai-provider/node_modules/openai/resources/admin/organization/projects/service-accounts/api-keys.mjs var APIKeys2; var init_api_keys2 = __esm(() => { - init_path2(); + init_path3(); APIKeys2 = class APIKeys2 extends APIResource2 { create(serviceAccountID, params, options4) { const { project_id, ...body3 } = params; - return this._client.post(path28`/organization/projects/${project_id}/service_accounts/${serviceAccountID}/api_keys`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.post(path29`/organization/projects/${project_id}/service_accounts/${serviceAccountID}/api_keys`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } }); } }; }); @@ -290389,14 +290689,14 @@ var init_service_accounts = __esm(() => { init_api_keys2(); init_api_keys2(); init_pagination2(); - init_path2(); + init_path3(); ServiceAccounts = class ServiceAccounts extends APIResource2 { constructor() { super(...arguments); this.apiKeys = new APIKeys2(this._client); } create(projectID, body3, options4) { - return this._client.post(path28`/organization/projects/${projectID}/service_accounts`, { + return this._client.post(path29`/organization/projects/${projectID}/service_accounts`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290404,21 +290704,21 @@ var init_service_accounts = __esm(() => { } retrieve(serviceAccountID, params, options4) { const { project_id } = params; - return this._client.get(path28`/organization/projects/${project_id}/service_accounts/${serviceAccountID}`, { + return this._client.get(path29`/organization/projects/${project_id}/service_accounts/${serviceAccountID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(serviceAccountID, params, options4) { const { project_id, ...body3 } = params; - return this._client.post(path28`/organization/projects/${project_id}/service_accounts/${serviceAccountID}`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.post(path29`/organization/projects/${project_id}/service_accounts/${serviceAccountID}`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } }); } list(projectID, query = {}, options4) { - return this._client.getAPIList(path28`/organization/projects/${projectID}/service_accounts`, ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/organization/projects/${projectID}/service_accounts`, ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(serviceAccountID, params, options4) { const { project_id } = params; - return this._client.delete(path28`/organization/projects/${project_id}/service_accounts/${serviceAccountID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.delete(path29`/organization/projects/${project_id}/service_accounts/${serviceAccountID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } }; ServiceAccounts.APIKeys = APIKeys2; @@ -290428,11 +290728,11 @@ var init_service_accounts = __esm(() => { var Roles5; var init_roles5 = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Roles5 = class Roles5 extends APIResource2 { create(userID, params, options4) { const { project_id, ...body3 } = params; - return this._client.post(path28`/projects/${project_id}/users/${userID}/roles`, { + return this._client.post(path29`/projects/${project_id}/users/${userID}/roles`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290440,18 +290740,18 @@ var init_roles5 = __esm(() => { } retrieve(roleID, params, options4) { const { project_id, user_id } = params; - return this._client.get(path28`/projects/${project_id}/users/${user_id}/roles/${roleID}`, { + return this._client.get(path29`/projects/${project_id}/users/${user_id}/roles/${roleID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } list(userID, params, options4) { const { project_id, ...query } = params; - return this._client.getAPIList(path28`/projects/${project_id}/users/${userID}/roles`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/projects/${project_id}/users/${userID}/roles`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(roleID, params, options4) { const { project_id, user_id } = params; - return this._client.delete(path28`/projects/${project_id}/users/${user_id}/roles/${roleID}`, { + return this._client.delete(path29`/projects/${project_id}/users/${user_id}/roles/${roleID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290465,14 +290765,14 @@ var init_users2 = __esm(() => { init_roles5(); init_roles5(); init_pagination2(); - init_path2(); + init_path3(); Users2 = class Users2 extends APIResource2 { constructor() { super(...arguments); this.roles = new Roles5(this._client); } create(projectID, body3, options4) { - return this._client.post(path28`/organization/projects/${projectID}/users`, { + return this._client.post(path29`/organization/projects/${projectID}/users`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290480,25 +290780,25 @@ var init_users2 = __esm(() => { } retrieve(userID, params, options4) { const { project_id } = params; - return this._client.get(path28`/organization/projects/${project_id}/users/${userID}`, { + return this._client.get(path29`/organization/projects/${project_id}/users/${userID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(userID, params, options4) { const { project_id, ...body3 } = params; - return this._client.post(path28`/organization/projects/${project_id}/users/${userID}`, { + return this._client.post(path29`/organization/projects/${project_id}/users/${userID}`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } }); } list(projectID, query = {}, options4) { - return this._client.getAPIList(path28`/organization/projects/${projectID}/users`, ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/organization/projects/${projectID}/users`, ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(userID, params, options4) { const { project_id } = params; - return this._client.delete(path28`/organization/projects/${project_id}/users/${userID}`, { + return this._client.delete(path29`/organization/projects/${project_id}/users/${userID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290535,7 +290835,7 @@ var init_projects = __esm(() => { init_users2(); init_users2(); init_pagination2(); - init_path2(); + init_path3(); Projects = class Projects extends APIResource2 { constructor() { super(...arguments); @@ -290560,13 +290860,13 @@ var init_projects = __esm(() => { }); } retrieve(projectID, options4) { - return this._client.get(path28`/organization/projects/${projectID}`, { + return this._client.get(path29`/organization/projects/${projectID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(projectID, body3, options4) { - return this._client.post(path28`/organization/projects/${projectID}`, { + return this._client.post(path29`/organization/projects/${projectID}`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290580,7 +290880,7 @@ var init_projects = __esm(() => { }); } archive(projectID, options4) { - return this._client.post(path28`/organization/projects/${projectID}/archive`, { + return this._client.post(path29`/organization/projects/${projectID}/archive`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290604,10 +290904,10 @@ var init_projects = __esm(() => { var Roles6; var init_roles6 = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Roles6 = class Roles6 extends APIResource2 { create(userID, body3, options4) { - return this._client.post(path28`/organization/users/${userID}/roles`, { + return this._client.post(path29`/organization/users/${userID}/roles`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290615,17 +290915,17 @@ var init_roles6 = __esm(() => { } retrieve(roleID, params, options4) { const { user_id } = params; - return this._client.get(path28`/organization/users/${user_id}/roles/${roleID}`, { + return this._client.get(path29`/organization/users/${user_id}/roles/${roleID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } list(userID, query = {}, options4) { - return this._client.getAPIList(path28`/organization/users/${userID}/roles`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/organization/users/${userID}/roles`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(roleID, params, options4) { const { user_id } = params; - return this._client.delete(path28`/organization/users/${user_id}/roles/${roleID}`, { + return this._client.delete(path29`/organization/users/${user_id}/roles/${roleID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290639,20 +290939,20 @@ var init_users3 = __esm(() => { init_roles6(); init_roles6(); init_pagination2(); - init_path2(); + init_path3(); Users3 = class Users3 extends APIResource2 { constructor() { super(...arguments); this.roles = new Roles6(this._client); } retrieve(userID, options4) { - return this._client.get(path28`/organization/users/${userID}`, { + return this._client.get(path29`/organization/users/${userID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(userID, body3, options4) { - return this._client.post(path28`/organization/users/${userID}`, { + return this._client.post(path29`/organization/users/${userID}`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290666,7 +290966,7 @@ var init_users3 = __esm(() => { }); } delete(userID, options4) { - return this._client.delete(path28`/organization/users/${userID}`, { + return this._client.delete(path29`/organization/users/${userID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290818,13 +291118,13 @@ var init_audio = __esm(() => { var Batches3; var init_batches3 = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Batches3 = class Batches3 extends APIResource2 { create(body3, options4) { return this._client.post("/batches", { body: body3, ...options4, __security: { bearerAuth: true } }); } retrieve(batchID, options4) { - return this._client.get(path28`/batches/${batchID}`, { ...options4, __security: { bearerAuth: true } }); + return this._client.get(path29`/batches/${batchID}`, { ...options4, __security: { bearerAuth: true } }); } list(query = {}, options4) { return this._client.getAPIList("/batches", CursorPage, { @@ -290834,7 +291134,7 @@ var init_batches3 = __esm(() => { }); } cancel(batchID, options4) { - return this._client.post(path28`/batches/${batchID}/cancel`, { + return this._client.post(path29`/batches/${batchID}/cancel`, { ...options4, __security: { bearerAuth: true } }); @@ -290847,7 +291147,7 @@ var Assistants; var init_assistants = __esm(() => { init_pagination2(); init_headers2(); - init_path2(); + init_path3(); Assistants = class Assistants extends APIResource2 { create(body3, options4) { return this._client.post("/assistants", { @@ -290858,14 +291158,14 @@ var init_assistants = __esm(() => { }); } retrieve(assistantID, options4) { - return this._client.get(path28`/assistants/${assistantID}`, { + return this._client.get(path29`/assistants/${assistantID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } }); } update(assistantID, body3, options4) { - return this._client.post(path28`/assistants/${assistantID}`, { + return this._client.post(path29`/assistants/${assistantID}`, { body: body3, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -290881,7 +291181,7 @@ var init_assistants = __esm(() => { }); } delete(assistantID, options4) { - return this._client.delete(path28`/assistants/${assistantID}`, { + return this._client.delete(path29`/assistants/${assistantID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } @@ -290944,7 +291244,7 @@ var init_realtime = __esm(() => { var Sessions2; var init_sessions2 = __esm(() => { init_headers2(); - init_path2(); + init_path3(); Sessions2 = class Sessions2 extends APIResource2 { create(body3, options4) { return this._client.post("/chatkit/sessions", { @@ -290955,7 +291255,7 @@ var init_sessions2 = __esm(() => { }); } cancel(sessionID, options4) { - return this._client.post(path28`/chatkit/sessions/${sessionID}/cancel`, { + return this._client.post(path29`/chatkit/sessions/${sessionID}/cancel`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "chatkit_beta=v1" }, options4?.headers]), __security: { bearerAuth: true } @@ -290969,10 +291269,10 @@ var Threads; var init_threads = __esm(() => { init_pagination2(); init_headers2(); - init_path2(); + init_path3(); Threads = class Threads extends APIResource2 { retrieve(threadID, options4) { - return this._client.get(path28`/chatkit/threads/${threadID}`, { + return this._client.get(path29`/chatkit/threads/${threadID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "chatkit_beta=v1" }, options4?.headers]), __security: { bearerAuth: true } @@ -290987,14 +291287,14 @@ var init_threads = __esm(() => { }); } delete(threadID, options4) { - return this._client.delete(path28`/chatkit/threads/${threadID}`, { + return this._client.delete(path29`/chatkit/threads/${threadID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "chatkit_beta=v1" }, options4?.headers]), __security: { bearerAuth: true } }); } listItems(threadID, query = {}, options4) { - return this._client.getAPIList(path28`/chatkit/threads/${threadID}/items`, ConversationCursorPage, { + return this._client.getAPIList(path29`/chatkit/threads/${threadID}/items`, ConversationCursorPage, { query, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "chatkit_beta=v1" }, options4?.headers]), @@ -291027,11 +291327,11 @@ var InputItems; var init_input_items = __esm(() => { init_pagination2(); init_headers2(); - init_path2(); + init_path3(); InputItems = class InputItems extends APIResource2 { list(responseID, params = {}, options4) { const { betas, ...query } = params ?? {}; - return this._client.getAPIList(path28`/responses/${responseID}/input_items?beta=true`, CursorPage, { + return this._client.getAPIList(path29`/responses/${responseID}/input_items?beta=true`, CursorPage, { query, ...options4, headers: buildHeaders2([ @@ -291072,7 +291372,7 @@ var init_responses = __esm(() => { init_input_tokens(); init_input_tokens(); init_headers2(); - init_path2(); + init_path3(); Responses = class Responses extends APIResource2 { constructor() { super(...arguments); @@ -291094,7 +291394,7 @@ var init_responses = __esm(() => { } retrieve(responseID, params = {}, options4) { const { betas, ...query } = params ?? {}; - return this._client.get(path28`/responses/${responseID}?beta=true`, { + return this._client.get(path29`/responses/${responseID}?beta=true`, { query, ...options4, headers: buildHeaders2([ @@ -291107,7 +291407,7 @@ var init_responses = __esm(() => { } delete(responseID, params = {}, options4) { const { betas } = params ?? {}; - return this._client.delete(path28`/responses/${responseID}?beta=true`, { + return this._client.delete(path29`/responses/${responseID}?beta=true`, { ...options4, headers: buildHeaders2([ { Accept: "*/*", ...betas?.toString() != null ? { "openai-beta": betas?.toString() } : undefined }, @@ -291118,7 +291418,7 @@ var init_responses = __esm(() => { } cancel(responseID, params = {}, options4) { const { betas } = params ?? {}; - return this._client.post(path28`/responses/${responseID}/cancel?beta=true`, { + return this._client.post(path29`/responses/${responseID}/cancel?beta=true`, { ...options4, headers: buildHeaders2([ { ...betas?.toString() != null ? { "openai-beta": betas?.toString() } : undefined }, @@ -291149,10 +291449,10 @@ var Messages4; var init_messages4 = __esm(() => { init_pagination2(); init_headers2(); - init_path2(); + init_path3(); Messages4 = class Messages4 extends APIResource2 { create(threadID, body3, options4) { - return this._client.post(path28`/threads/${threadID}/messages`, { + return this._client.post(path29`/threads/${threadID}/messages`, { body: body3, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -291161,7 +291461,7 @@ var init_messages4 = __esm(() => { } retrieve(messageID, params, options4) { const { thread_id } = params; - return this._client.get(path28`/threads/${thread_id}/messages/${messageID}`, { + return this._client.get(path29`/threads/${thread_id}/messages/${messageID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } @@ -291169,7 +291469,7 @@ var init_messages4 = __esm(() => { } update(messageID, params, options4) { const { thread_id, ...body3 } = params; - return this._client.post(path28`/threads/${thread_id}/messages/${messageID}`, { + return this._client.post(path29`/threads/${thread_id}/messages/${messageID}`, { body: body3, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -291177,7 +291477,7 @@ var init_messages4 = __esm(() => { }); } list(threadID, query = {}, options4) { - return this._client.getAPIList(path28`/threads/${threadID}/messages`, CursorPage, { + return this._client.getAPIList(path29`/threads/${threadID}/messages`, CursorPage, { query, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -291186,7 +291486,7 @@ var init_messages4 = __esm(() => { } delete(messageID, params, options4) { const { thread_id } = params; - return this._client.delete(path28`/threads/${thread_id}/messages/${messageID}`, { + return this._client.delete(path29`/threads/${thread_id}/messages/${messageID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } @@ -291200,11 +291500,11 @@ var Steps; var init_steps = __esm(() => { init_pagination2(); init_headers2(); - init_path2(); + init_path3(); Steps = class Steps extends APIResource2 { retrieve(stepID, params, options4) { const { thread_id, run_id, ...query } = params; - return this._client.get(path28`/threads/${thread_id}/runs/${run_id}/steps/${stepID}`, { + return this._client.get(path29`/threads/${thread_id}/runs/${run_id}/steps/${stepID}`, { query, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -291213,7 +291513,7 @@ var init_steps = __esm(() => { } list(runID, params, options4) { const { thread_id, ...query } = params; - return this._client.getAPIList(path28`/threads/${thread_id}/runs/${runID}/steps`, CursorPage, { + return this._client.getAPIList(path29`/threads/${thread_id}/runs/${runID}/steps`, CursorPage, { query, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -291587,9 +291887,9 @@ var init_AssistantStream = __esm(() => { for (const content of event.data.delta.content) { if (content.type == "text" && content.text) { let textDelta = content.text; - let snapshot4 = accumulatedMessage.content[content.index]; - if (snapshot4 && snapshot4.type == "text") { - this._emit("textDelta", textDelta, snapshot4.text); + let snapshot3 = accumulatedMessage.content[content.index]; + if (snapshot3 && snapshot3.type == "text") { + this._emit("textDelta", textDelta, snapshot3.text); } else { throw Error("The snapshot associated with this text delta is not text or missing"); } @@ -291683,13 +291983,13 @@ var init_AssistantStream = __esm(() => { __classPrivateFieldGet4(this, _AssistantStream_runStepSnapshots, "f")[event.data.id] = event.data; return event.data; case "thread.run.step.delta": - let snapshot4 = __classPrivateFieldGet4(this, _AssistantStream_runStepSnapshots, "f")[event.data.id]; - if (!snapshot4) { + let snapshot3 = __classPrivateFieldGet4(this, _AssistantStream_runStepSnapshots, "f")[event.data.id]; + if (!snapshot3) { throw Error("Received a RunStepDelta before creation of a snapshot"); } let data2 = event.data; if (data2.delta) { - const accumulated = _a29.accumulateDelta(snapshot4, data2.delta); + const accumulated = _a29.accumulateDelta(snapshot3, data2.delta); __classPrivateFieldGet4(this, _AssistantStream_runStepSnapshots, "f")[event.data.id] = accumulated; } return __classPrivateFieldGet4(this, _AssistantStream_runStepSnapshots, "f")[event.data.id]; @@ -291704,33 +292004,33 @@ var init_AssistantStream = __esm(() => { if (__classPrivateFieldGet4(this, _AssistantStream_runStepSnapshots, "f")[event.data.id]) return __classPrivateFieldGet4(this, _AssistantStream_runStepSnapshots, "f")[event.data.id]; throw new Error("No snapshot available"); - }, _AssistantStream_accumulateMessage = function _AssistantStream_accumulateMessage2(event, snapshot4) { + }, _AssistantStream_accumulateMessage = function _AssistantStream_accumulateMessage2(event, snapshot3) { let newContent = []; switch (event.event) { case "thread.message.created": return [event.data, newContent]; case "thread.message.delta": - if (!snapshot4) { + if (!snapshot3) { throw Error("Received a delta with no existing snapshot (there should be one from message creation)"); } let data2 = event.data; if (data2.delta.content) { for (const contentElement of data2.delta.content) { - if (contentElement.index in snapshot4.content) { - let currentContent = snapshot4.content[contentElement.index]; - snapshot4.content[contentElement.index] = __classPrivateFieldGet4(this, _AssistantStream_instances, "m", _AssistantStream_accumulateContent).call(this, contentElement, currentContent); + if (contentElement.index in snapshot3.content) { + let currentContent = snapshot3.content[contentElement.index]; + snapshot3.content[contentElement.index] = __classPrivateFieldGet4(this, _AssistantStream_instances, "m", _AssistantStream_accumulateContent).call(this, contentElement, currentContent); } else { - snapshot4.content[contentElement.index] = contentElement; + snapshot3.content[contentElement.index] = contentElement; newContent.push(contentElement); } } } - return [snapshot4, newContent]; + return [snapshot3, newContent]; case "thread.message.in_progress": case "thread.message.completed": case "thread.message.incomplete": - if (snapshot4) { - return [snapshot4, newContent]; + if (snapshot3) { + return [snapshot3, newContent]; } else { throw Error("Received thread message event with no existing snapshot"); } @@ -291773,7 +292073,7 @@ var init_runs = __esm(() => { init_pagination2(); init_headers2(); init_AssistantStream(); - init_path2(); + init_path3(); Runs = class Runs extends APIResource2 { constructor() { super(...arguments); @@ -291781,7 +292081,7 @@ var init_runs = __esm(() => { } create(threadID, params, options4) { const { include, ...body3 } = params; - return this._client.post(path28`/threads/${threadID}/runs`, { + return this._client.post(path29`/threads/${threadID}/runs`, { query: { include }, body: body3, ...options4, @@ -291793,7 +292093,7 @@ var init_runs = __esm(() => { } retrieve(runID, params, options4) { const { thread_id } = params; - return this._client.get(path28`/threads/${thread_id}/runs/${runID}`, { + return this._client.get(path29`/threads/${thread_id}/runs/${runID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } @@ -291801,7 +292101,7 @@ var init_runs = __esm(() => { } update(runID, params, options4) { const { thread_id, ...body3 } = params; - return this._client.post(path28`/threads/${thread_id}/runs/${runID}`, { + return this._client.post(path29`/threads/${thread_id}/runs/${runID}`, { body: body3, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -291809,7 +292109,7 @@ var init_runs = __esm(() => { }); } list(threadID, query2 = {}, options4) { - return this._client.getAPIList(path28`/threads/${threadID}/runs`, CursorPage, { + return this._client.getAPIList(path29`/threads/${threadID}/runs`, CursorPage, { query: query2, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -291818,7 +292118,7 @@ var init_runs = __esm(() => { } cancel(runID, params, options4) { const { thread_id } = params; - return this._client.post(path28`/threads/${thread_id}/runs/${runID}/cancel`, { + return this._client.post(path29`/threads/${thread_id}/runs/${runID}/cancel`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } @@ -291877,7 +292177,7 @@ var init_runs = __esm(() => { } submitToolOutputs(runID, params, options4) { const { thread_id, ...body3 } = params; - return this._client.post(path28`/threads/${thread_id}/runs/${runID}/submit_tool_outputs`, { + return this._client.post(path29`/threads/${thread_id}/runs/${runID}/submit_tool_outputs`, { body: body3, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -291906,7 +292206,7 @@ var init_threads2 = __esm(() => { init_runs(); init_headers2(); init_AssistantStream(); - init_path2(); + init_path3(); Threads2 = class Threads2 extends APIResource2 { constructor() { super(...arguments); @@ -291922,14 +292222,14 @@ var init_threads2 = __esm(() => { }); } retrieve(threadID, options4) { - return this._client.get(path28`/threads/${threadID}`, { + return this._client.get(path29`/threads/${threadID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } }); } update(threadID, body3, options4) { - return this._client.post(path28`/threads/${threadID}`, { + return this._client.post(path29`/threads/${threadID}`, { body: body3, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -291937,7 +292237,7 @@ var init_threads2 = __esm(() => { }); } delete(threadID, options4) { - return this._client.delete(path28`/threads/${threadID}`, { + return this._client.delete(path29`/threads/${threadID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } @@ -292014,11 +292314,11 @@ var init_completions4 = __esm(() => { var Content; var init_content = __esm(() => { init_headers2(); - init_path2(); + init_path3(); Content = class Content extends APIResource2 { retrieve(fileID, params, options4) { const { container_id } = params; - return this._client.get(path28`/containers/${container_id}/files/${fileID}/content`, { + return this._client.get(path29`/containers/${container_id}/files/${fileID}/content`, { ...options4, headers: buildHeaders2([{ Accept: "application/binary" }, options4?.headers]), __security: { bearerAuth: true }, @@ -292036,24 +292336,24 @@ var init_files2 = __esm(() => { init_pagination2(); init_headers2(); init_uploads3(); - init_path2(); + init_path3(); Files2 = class Files2 extends APIResource2 { constructor() { super(...arguments); this.content = new Content(this._client); } create(containerID, body3, options4) { - return this._client.post(path28`/containers/${containerID}/files`, maybeMultipartFormRequestOptions({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); + return this._client.post(path29`/containers/${containerID}/files`, maybeMultipartFormRequestOptions({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); } retrieve(fileID, params, options4) { const { container_id } = params; - return this._client.get(path28`/containers/${container_id}/files/${fileID}`, { + return this._client.get(path29`/containers/${container_id}/files/${fileID}`, { ...options4, __security: { bearerAuth: true } }); } list(containerID, query2 = {}, options4) { - return this._client.getAPIList(path28`/containers/${containerID}/files`, CursorPage, { + return this._client.getAPIList(path29`/containers/${containerID}/files`, CursorPage, { query: query2, ...options4, __security: { bearerAuth: true } @@ -292061,7 +292361,7 @@ var init_files2 = __esm(() => { } delete(fileID, params, options4) { const { container_id } = params; - return this._client.delete(path28`/containers/${container_id}/files/${fileID}`, { + return this._client.delete(path29`/containers/${container_id}/files/${fileID}`, { ...options4, headers: buildHeaders2([{ Accept: "*/*" }, options4?.headers]), __security: { bearerAuth: true } @@ -292078,7 +292378,7 @@ var init_containers = __esm(() => { init_files2(); init_pagination2(); init_headers2(); - init_path2(); + init_path3(); Containers = class Containers extends APIResource2 { constructor() { super(...arguments); @@ -292088,7 +292388,7 @@ var init_containers = __esm(() => { return this._client.post("/containers", { body: body3, ...options4, __security: { bearerAuth: true } }); } retrieve(containerID, options4) { - return this._client.get(path28`/containers/${containerID}`, { + return this._client.get(path29`/containers/${containerID}`, { ...options4, __security: { bearerAuth: true } }); @@ -292101,7 +292401,7 @@ var init_containers = __esm(() => { }); } delete(containerID, options4) { - return this._client.delete(path28`/containers/${containerID}`, { + return this._client.delete(path29`/containers/${containerID}`, { ...options4, headers: buildHeaders2([{ Accept: "*/*" }, options4?.headers]), __security: { bearerAuth: true } @@ -292115,11 +292415,11 @@ var init_containers = __esm(() => { var Items; var init_items = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Items = class Items extends APIResource2 { create(conversationID, params, options4) { const { include, ...body3 } = params; - return this._client.post(path28`/conversations/${conversationID}/items`, { + return this._client.post(path29`/conversations/${conversationID}/items`, { query: { include }, body: body3, ...options4, @@ -292128,18 +292428,18 @@ var init_items = __esm(() => { } retrieve(itemID, params, options4) { const { conversation_id, ...query2 } = params; - return this._client.get(path28`/conversations/${conversation_id}/items/${itemID}`, { + return this._client.get(path29`/conversations/${conversation_id}/items/${itemID}`, { query: query2, ...options4, __security: { bearerAuth: true } }); } list(conversationID, query2 = {}, options4) { - return this._client.getAPIList(path28`/conversations/${conversationID}/items`, ConversationCursorPage, { query: query2, ...options4, __security: { bearerAuth: true } }); + return this._client.getAPIList(path29`/conversations/${conversationID}/items`, ConversationCursorPage, { query: query2, ...options4, __security: { bearerAuth: true } }); } delete(itemID, params, options4) { const { conversation_id } = params; - return this._client.delete(path28`/conversations/${conversation_id}/items/${itemID}`, { + return this._client.delete(path29`/conversations/${conversation_id}/items/${itemID}`, { ...options4, __security: { bearerAuth: true } }); @@ -292152,7 +292452,7 @@ var Conversations; var init_conversations = __esm(() => { init_items(); init_items(); - init_path2(); + init_path3(); Conversations = class Conversations extends APIResource2 { constructor() { super(...arguments); @@ -292162,20 +292462,20 @@ var init_conversations = __esm(() => { return this._client.post("/conversations", { body: body3, ...options4, __security: { bearerAuth: true } }); } retrieve(conversationID, options4) { - return this._client.get(path28`/conversations/${conversationID}`, { + return this._client.get(path29`/conversations/${conversationID}`, { ...options4, __security: { bearerAuth: true } }); } update(conversationID, body3, options4) { - return this._client.post(path28`/conversations/${conversationID}`, { + return this._client.post(path29`/conversations/${conversationID}`, { body: body3, ...options4, __security: { bearerAuth: true } }); } delete(conversationID, options4) { - return this._client.delete(path28`/conversations/${conversationID}`, { + return this._client.delete(path29`/conversations/${conversationID}`, { ...options4, __security: { bearerAuth: true } }); @@ -292224,18 +292524,18 @@ var init_embeddings = __esm(() => { var OutputItems; var init_output_items = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); OutputItems = class OutputItems extends APIResource2 { retrieve(outputItemID, params, options4) { const { eval_id, run_id } = params; - return this._client.get(path28`/evals/${eval_id}/runs/${run_id}/output_items/${outputItemID}`, { + return this._client.get(path29`/evals/${eval_id}/runs/${run_id}/output_items/${outputItemID}`, { ...options4, __security: { bearerAuth: true } }); } list(runID, params, options4) { const { eval_id, ...query2 } = params; - return this._client.getAPIList(path28`/evals/${eval_id}/runs/${runID}/output_items`, CursorPage, { query: query2, ...options4, __security: { bearerAuth: true } }); + return this._client.getAPIList(path29`/evals/${eval_id}/runs/${runID}/output_items`, CursorPage, { query: query2, ...options4, __security: { bearerAuth: true } }); } }; }); @@ -292246,14 +292546,14 @@ var init_runs2 = __esm(() => { init_output_items(); init_output_items(); init_pagination2(); - init_path2(); + init_path3(); Runs2 = class Runs2 extends APIResource2 { constructor() { super(...arguments); this.outputItems = new OutputItems(this._client); } create(evalID, body3, options4) { - return this._client.post(path28`/evals/${evalID}/runs`, { + return this._client.post(path29`/evals/${evalID}/runs`, { body: body3, ...options4, __security: { bearerAuth: true } @@ -292261,13 +292561,13 @@ var init_runs2 = __esm(() => { } retrieve(runID, params, options4) { const { eval_id } = params; - return this._client.get(path28`/evals/${eval_id}/runs/${runID}`, { + return this._client.get(path29`/evals/${eval_id}/runs/${runID}`, { ...options4, __security: { bearerAuth: true } }); } list(evalID, query2 = {}, options4) { - return this._client.getAPIList(path28`/evals/${evalID}/runs`, CursorPage, { + return this._client.getAPIList(path29`/evals/${evalID}/runs`, CursorPage, { query: query2, ...options4, __security: { bearerAuth: true } @@ -292275,14 +292575,14 @@ var init_runs2 = __esm(() => { } delete(runID, params, options4) { const { eval_id } = params; - return this._client.delete(path28`/evals/${eval_id}/runs/${runID}`, { + return this._client.delete(path29`/evals/${eval_id}/runs/${runID}`, { ...options4, __security: { bearerAuth: true } }); } cancel(runID, params, options4) { const { eval_id } = params; - return this._client.post(path28`/evals/${eval_id}/runs/${runID}`, { + return this._client.post(path29`/evals/${eval_id}/runs/${runID}`, { ...options4, __security: { bearerAuth: true } }); @@ -292297,7 +292597,7 @@ var init_evals = __esm(() => { init_runs2(); init_runs2(); init_pagination2(); - init_path2(); + init_path3(); Evals = class Evals extends APIResource2 { constructor() { super(...arguments); @@ -292307,10 +292607,10 @@ var init_evals = __esm(() => { return this._client.post("/evals", { body: body3, ...options4, __security: { bearerAuth: true } }); } retrieve(evalID, options4) { - return this._client.get(path28`/evals/${evalID}`, { ...options4, __security: { bearerAuth: true } }); + return this._client.get(path29`/evals/${evalID}`, { ...options4, __security: { bearerAuth: true } }); } update(evalID, body3, options4) { - return this._client.post(path28`/evals/${evalID}`, { body: body3, ...options4, __security: { bearerAuth: true } }); + return this._client.post(path29`/evals/${evalID}`, { body: body3, ...options4, __security: { bearerAuth: true } }); } list(query2 = {}, options4) { return this._client.getAPIList("/evals", CursorPage, { @@ -292320,7 +292620,7 @@ var init_evals = __esm(() => { }); } delete(evalID, options4) { - return this._client.delete(path28`/evals/${evalID}`, { ...options4, __security: { bearerAuth: true } }); + return this._client.delete(path29`/evals/${evalID}`, { ...options4, __security: { bearerAuth: true } }); } }; Evals.Runs = Runs2; @@ -292333,13 +292633,13 @@ var init_files3 = __esm(() => { init_headers2(); init_error7(); init_uploads3(); - init_path2(); + init_path3(); Files3 = class Files3 extends APIResource2 { create(body3, options4) { return this._client.post("/files", multipartFormRequestOptions2({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); } retrieve(fileID, options4) { - return this._client.get(path28`/files/${fileID}`, { ...options4, __security: { bearerAuth: true } }); + return this._client.get(path29`/files/${fileID}`, { ...options4, __security: { bearerAuth: true } }); } list(query2 = {}, options4) { return this._client.getAPIList("/files", CursorPage, { @@ -292349,10 +292649,10 @@ var init_files3 = __esm(() => { }); } delete(fileID, options4) { - return this._client.delete(path28`/files/${fileID}`, { ...options4, __security: { bearerAuth: true } }); + return this._client.delete(path29`/files/${fileID}`, { ...options4, __security: { bearerAuth: true } }); } content(fileID, options4) { - return this._client.get(path28`/files/${fileID}/content`, { + return this._client.get(path29`/files/${fileID}/content`, { ...options4, headers: buildHeaders2([{ Accept: "application/binary" }, options4?.headers]), __security: { bearerAuth: true }, @@ -292423,24 +292723,24 @@ var init_alpha = __esm(() => { var Permissions; var init_permissions = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Permissions = class Permissions extends APIResource2 { create(fineTunedModelCheckpoint, body3, options4) { - return this._client.getAPIList(path28`/fine_tuning/checkpoints/${fineTunedModelCheckpoint}/permissions`, Page2, { body: body3, method: "post", ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/fine_tuning/checkpoints/${fineTunedModelCheckpoint}/permissions`, Page2, { body: body3, method: "post", ...options4, __security: { adminAPIKeyAuth: true } }); } retrieve(fineTunedModelCheckpoint, query2 = {}, options4) { - return this._client.get(path28`/fine_tuning/checkpoints/${fineTunedModelCheckpoint}/permissions`, { + return this._client.get(path29`/fine_tuning/checkpoints/${fineTunedModelCheckpoint}/permissions`, { query: query2, ...options4, __security: { adminAPIKeyAuth: true } }); } list(fineTunedModelCheckpoint, query2 = {}, options4) { - return this._client.getAPIList(path28`/fine_tuning/checkpoints/${fineTunedModelCheckpoint}/permissions`, ConversationCursorPage, { query: query2, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/fine_tuning/checkpoints/${fineTunedModelCheckpoint}/permissions`, ConversationCursorPage, { query: query2, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(permissionID, params, options4) { const { fine_tuned_model_checkpoint } = params; - return this._client.delete(path28`/fine_tuning/checkpoints/${fine_tuned_model_checkpoint}/permissions/${permissionID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.delete(path29`/fine_tuning/checkpoints/${fine_tuned_model_checkpoint}/permissions/${permissionID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } }; }); @@ -292463,10 +292763,10 @@ var init_checkpoints = __esm(() => { var Checkpoints2; var init_checkpoints2 = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Checkpoints2 = class Checkpoints2 extends APIResource2 { list(fineTuningJobID, query2 = {}, options4) { - return this._client.getAPIList(path28`/fine_tuning/jobs/${fineTuningJobID}/checkpoints`, CursorPage, { query: query2, ...options4, __security: { bearerAuth: true } }); + return this._client.getAPIList(path29`/fine_tuning/jobs/${fineTuningJobID}/checkpoints`, CursorPage, { query: query2, ...options4, __security: { bearerAuth: true } }); } }; }); @@ -292477,7 +292777,7 @@ var init_jobs = __esm(() => { init_checkpoints2(); init_checkpoints2(); init_pagination2(); - init_path2(); + init_path3(); Jobs = class Jobs extends APIResource2 { constructor() { super(...arguments); @@ -292487,7 +292787,7 @@ var init_jobs = __esm(() => { return this._client.post("/fine_tuning/jobs", { body: body3, ...options4, __security: { bearerAuth: true } }); } retrieve(fineTuningJobID, options4) { - return this._client.get(path28`/fine_tuning/jobs/${fineTuningJobID}`, { + return this._client.get(path29`/fine_tuning/jobs/${fineTuningJobID}`, { ...options4, __security: { bearerAuth: true } }); @@ -292500,22 +292800,22 @@ var init_jobs = __esm(() => { }); } cancel(fineTuningJobID, options4) { - return this._client.post(path28`/fine_tuning/jobs/${fineTuningJobID}/cancel`, { + return this._client.post(path29`/fine_tuning/jobs/${fineTuningJobID}/cancel`, { ...options4, __security: { bearerAuth: true } }); } listEvents(fineTuningJobID, query2 = {}, options4) { - return this._client.getAPIList(path28`/fine_tuning/jobs/${fineTuningJobID}/events`, CursorPage, { query: query2, ...options4, __security: { bearerAuth: true } }); + return this._client.getAPIList(path29`/fine_tuning/jobs/${fineTuningJobID}/events`, CursorPage, { query: query2, ...options4, __security: { bearerAuth: true } }); } pause(fineTuningJobID, options4) { - return this._client.post(path28`/fine_tuning/jobs/${fineTuningJobID}/pause`, { + return this._client.post(path29`/fine_tuning/jobs/${fineTuningJobID}/pause`, { ...options4, __security: { bearerAuth: true } }); } resume(fineTuningJobID, options4) { - return this._client.post(path28`/fine_tuning/jobs/${fineTuningJobID}/resume`, { + return this._client.post(path29`/fine_tuning/jobs/${fineTuningJobID}/resume`, { ...options4, __security: { bearerAuth: true } }); @@ -292597,16 +292897,16 @@ var init_images = __esm(() => { var Models3; var init_models5 = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Models3 = class Models3 extends APIResource2 { retrieve(model, options4) { - return this._client.get(path28`/models/${model}`, { ...options4, __security: { bearerAuth: true } }); + return this._client.get(path29`/models/${model}`, { ...options4, __security: { bearerAuth: true } }); } list(options4) { return this._client.getAPIList("/models", Page2, { ...options4, __security: { bearerAuth: true } }); } delete(model, options4) { - return this._client.delete(path28`/models/${model}`, { ...options4, __security: { bearerAuth: true } }); + return this._client.delete(path29`/models/${model}`, { ...options4, __security: { bearerAuth: true } }); } }; }); @@ -292625,10 +292925,10 @@ var init_moderations = __esm(() => { var Calls; var init_calls = __esm(() => { init_headers2(); - init_path2(); + init_path3(); Calls = class Calls extends APIResource2 { accept(callID, body3, options4) { - return this._client.post(path28`/realtime/calls/${callID}/accept`, { + return this._client.post(path29`/realtime/calls/${callID}/accept`, { body: body3, ...options4, headers: buildHeaders2([{ Accept: "*/*" }, options4?.headers]), @@ -292636,14 +292936,14 @@ var init_calls = __esm(() => { }); } hangup(callID, options4) { - return this._client.post(path28`/realtime/calls/${callID}/hangup`, { + return this._client.post(path29`/realtime/calls/${callID}/hangup`, { ...options4, headers: buildHeaders2([{ Accept: "*/*" }, options4?.headers]), __security: { bearerAuth: true } }); } refer(callID, body3, options4) { - return this._client.post(path28`/realtime/calls/${callID}/refer`, { + return this._client.post(path29`/realtime/calls/${callID}/refer`, { body: body3, ...options4, headers: buildHeaders2([{ Accept: "*/*" }, options4?.headers]), @@ -292651,7 +292951,7 @@ var init_calls = __esm(() => { }); } reject(callID, body3 = {}, options4) { - return this._client.post(path28`/realtime/calls/${callID}/reject`, { + return this._client.post(path29`/realtime/calls/${callID}/reject`, { body: body3, ...options4, headers: buildHeaders2([{ Accept: "*/*" }, options4?.headers]), @@ -292824,8 +293124,8 @@ var init_ResponsesParser = __esm(() => { }); // node_modules/gitlab-ai-provider/node_modules/openai/lib/responses/ResponseAccumulator.mjs -function accumulateResponse(event, snapshot4) { - if (!snapshot4) { +function accumulateResponse(event, snapshot3) { + if (!snapshot3) { if (event.type !== "response.created") { throw new OpenAIError(`When snapshot hasn't been set yet, expected 'response.created' event, got ${event.type}`); } @@ -292833,28 +293133,28 @@ function accumulateResponse(event, snapshot4) { } switch (event.type) { case "response.output_item.added": { - snapshot4.output.push(structuredClone(event.item)); + snapshot3.output.push(structuredClone(event.item)); if (event.item.type === "message") { - addOutputText(snapshot4); + addOutputText(snapshot3); } break; } case "response.output_item.done": { - getOutput(snapshot4, event.output_index); - snapshot4.output[event.output_index] = structuredClone(event.item); + getOutput(snapshot3, event.output_index); + snapshot3.output[event.output_index] = structuredClone(event.item); if (event.item.type === "message") { - addOutputText(snapshot4); + addOutputText(snapshot3); } break; } case "response.content_part.added": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); const type3 = output2.type; const part = event.part; if (type3 === "message" && part.type !== "reasoning_text") { output2.content.push(structuredClone(part)); if (part.type === "output_text") { - addOutputText(snapshot4); + addOutputText(snapshot3); } } else if (type3 === "reasoning" && part.type === "reasoning_text") { if (!output2.content) { @@ -292865,13 +293165,13 @@ function accumulateResponse(event, snapshot4) { break; } case "response.content_part.done": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); const part = event.part; if (output2.type === "message" && part.type !== "reasoning_text") { getContent(output2.content, event.content_index); output2.content[event.content_index] = structuredClone(part); if (part.type === "output_text") { - addOutputText(snapshot4); + addOutputText(snapshot3); } } else if (output2.type === "reasoning" && part.type === "reasoning_text") { const content = output2.content; @@ -292884,31 +293184,31 @@ function accumulateResponse(event, snapshot4) { break; } case "response.output_text.delta": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "message") { const content = getContent(output2.content, event.content_index); if (content.type !== "output_text") { throw new OpenAIError(`expected content to be 'output_text', got ${content.type}`); } content.text += event.delta; - snapshot4.output_text += event.delta; + snapshot3.output_text += event.delta; } break; } case "response.output_text.done": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "message") { const content = getContent(output2.content, event.content_index); if (content.type !== "output_text") { throw new OpenAIError(`expected content to be 'output_text', got ${content.type}`); } content.text = event.text; - addOutputText(snapshot4); + addOutputText(snapshot3); } break; } case "response.output_text.annotation.added": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "message") { const content = getContent(output2.content, event.content_index); if (content.type !== "output_text") { @@ -292919,7 +293219,7 @@ function accumulateResponse(event, snapshot4) { break; } case "response.refusal.delta": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "message") { const content = getContent(output2.content, event.content_index); if (content.type !== "refusal") { @@ -292930,7 +293230,7 @@ function accumulateResponse(event, snapshot4) { break; } case "response.refusal.done": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "message") { const content = getContent(output2.content, event.content_index); if (content.type !== "refusal") { @@ -292941,21 +293241,21 @@ function accumulateResponse(event, snapshot4) { break; } case "response.function_call_arguments.delta": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "function_call") { output2.arguments += event.delta; } break; } case "response.function_call_arguments.done": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "function_call") { output2.arguments = event.arguments; } break; } case "response.reasoning_text.delta": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "reasoning") { if (!output2.content) { throw new OpenAIError(`missing content at index ${event.content_index}`); @@ -292969,7 +293269,7 @@ function accumulateResponse(event, snapshot4) { break; } case "response.reasoning_text.done": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "reasoning") { if (!output2.content) { throw new OpenAIError(`missing content at index ${event.content_index}`); @@ -292983,14 +293283,14 @@ function accumulateResponse(event, snapshot4) { break; } case "response.reasoning_summary_part.added": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "reasoning") { output2.summary.push(structuredClone(event.part)); } break; } case "response.reasoning_summary_part.done": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "reasoning") { getContent(output2.summary, event.summary_index); output2.summary[event.summary_index] = structuredClone(event.part); @@ -292998,7 +293298,7 @@ function accumulateResponse(event, snapshot4) { break; } case "response.reasoning_summary_text.delta": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "reasoning") { const part = getContent(output2.summary, event.summary_index); part.text += event.delta; @@ -293006,7 +293306,7 @@ function accumulateResponse(event, snapshot4) { break; } case "response.reasoning_summary_text.done": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "reasoning") { const part = getContent(output2.summary, event.summary_index); part.text = event.text; @@ -293014,147 +293314,147 @@ function accumulateResponse(event, snapshot4) { break; } case "response.custom_tool_call_input.delta": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "custom_tool_call") { output2.input += event.delta; } break; } case "response.custom_tool_call_input.done": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "custom_tool_call") { output2.input = event.input; } break; } case "response.mcp_call_arguments.delta": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "mcp_call") { output2.arguments += event.delta; } break; } case "response.mcp_call_arguments.done": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "mcp_call") { output2.arguments = event.arguments; } break; } case "response.code_interpreter_call_code.delta": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "code_interpreter_call") { output2.code = (output2.code ?? "") + event.delta; } break; } case "response.code_interpreter_call_code.done": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "code_interpreter_call") { output2.code = event.code; } break; } case "response.code_interpreter_call.in_progress": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "code_interpreter_call") { output2.status = "in_progress"; } break; } case "response.code_interpreter_call.interpreting": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "code_interpreter_call") { output2.status = "interpreting"; } break; } case "response.code_interpreter_call.completed": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "code_interpreter_call") { output2.status = "completed"; } break; } case "response.file_search_call.in_progress": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "file_search_call") { output2.status = "in_progress"; } break; } case "response.file_search_call.searching": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "file_search_call") { output2.status = "searching"; } break; } case "response.file_search_call.completed": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "file_search_call") { output2.status = "completed"; } break; } case "response.web_search_call.in_progress": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "web_search_call") { output2.status = "in_progress"; } break; } case "response.web_search_call.searching": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "web_search_call") { output2.status = "searching"; } break; } case "response.web_search_call.completed": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "web_search_call") { output2.status = "completed"; } break; } case "response.image_generation_call.in_progress": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "image_generation_call") { output2.status = "in_progress"; } break; } case "response.image_generation_call.generating": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "image_generation_call") { output2.status = "generating"; } break; } case "response.image_generation_call.completed": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "image_generation_call") { output2.status = "completed"; } break; } case "response.mcp_call.in_progress": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "mcp_call") { output2.status = "in_progress"; } break; } case "response.mcp_call.completed": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "mcp_call") { output2.status = "completed"; } break; } case "response.mcp_call.failed": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "mcp_call") { output2.status = "failed"; } @@ -293166,7 +293466,7 @@ function accumulateResponse(event, snapshot4) { case "response.completed": case "response.failed": case "response.incomplete": { - snapshot4 = cloneResponse(event.response); + snapshot3 = cloneResponse(event.response); break; } case "response.audio.delta": @@ -293185,17 +293485,17 @@ function accumulateResponse(event, snapshot4) { assertNever5(event); } } - return snapshot4; + return snapshot3; } function cloneResponse(response) { - const snapshot4 = structuredClone(response); - if (!Object.getOwnPropertyDescriptor(snapshot4, "output_text") || snapshot4.output_text == null) { - addOutputText(snapshot4); + const snapshot3 = structuredClone(response); + if (!Object.getOwnPropertyDescriptor(snapshot3, "output_text") || snapshot3.output_text == null) { + addOutputText(snapshot3); } - return snapshot4; + return snapshot3; } -function getOutput(snapshot4, outputIndex) { - const output2 = snapshot4.output[outputIndex]; +function getOutput(snapshot3, outputIndex) { + const output2 = snapshot3.output[outputIndex]; if (!output2) { throw new OpenAIError(`missing output at index ${outputIndex}`); } @@ -293217,8 +293517,8 @@ var init_ResponseAccumulator = __esm(() => { }); // node_modules/gitlab-ai-provider/node_modules/openai/lib/responses/ResponseStream.mjs -function finalizeResponse(snapshot4, params) { - return maybeParseResponse(snapshot4, params); +function finalizeResponse(snapshot3, params) { + return maybeParseResponse(snapshot3, params); } var _ResponseStream_instances, _ResponseStream_params, _ResponseStream_currentResponseSnapshot, _ResponseStream_finalResponse, _ResponseStream_beginRequest, _ResponseStream_addEvent, _ResponseStream_endRequest, ResponseStream; var init_ResponseStream = __esm(() => { @@ -293340,12 +293640,12 @@ var init_ResponseStream = __esm(() => { if (this.ended) { throw new OpenAIError(`stream has ended, this shouldn't happen`); } - const snapshot4 = __classPrivateFieldGet4(this, _ResponseStream_currentResponseSnapshot, "f"); - if (!snapshot4) { + const snapshot3 = __classPrivateFieldGet4(this, _ResponseStream_currentResponseSnapshot, "f"); + if (!snapshot3) { throw new OpenAIError(`request ended without sending any events`); } __classPrivateFieldSet4(this, _ResponseStream_currentResponseSnapshot, undefined, "f"); - const parsedResponse = finalizeResponse(snapshot4, __classPrivateFieldGet4(this, _ResponseStream_params, "f")); + const parsedResponse = finalizeResponse(snapshot3, __classPrivateFieldGet4(this, _ResponseStream_params, "f")); __classPrivateFieldSet4(this, _ResponseStream_finalResponse, parsedResponse, "f"); return parsedResponse; }, Symbol.asyncIterator)]() { @@ -293412,10 +293712,10 @@ var init_ResponseStream = __esm(() => { var InputItems2; var init_input_items2 = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); InputItems2 = class InputItems2 extends APIResource2 { list(responseID, query2 = {}, options4) { - return this._client.getAPIList(path28`/responses/${responseID}/input_items`, CursorPage, { query: query2, ...options4, __security: { bearerAuth: true } }); + return this._client.getAPIList(path29`/responses/${responseID}/input_items`, CursorPage, { query: query2, ...options4, __security: { bearerAuth: true } }); } }; }); @@ -293444,7 +293744,7 @@ var init_responses2 = __esm(() => { init_input_tokens2(); init_input_tokens2(); init_headers2(); - init_path2(); + init_path3(); Responses2 = class Responses2 extends APIResource2 { constructor() { super(...arguments); @@ -293465,7 +293765,7 @@ var init_responses2 = __esm(() => { }); } retrieve(responseID, query2 = {}, options4) { - return this._client.get(path28`/responses/${responseID}`, { + return this._client.get(path29`/responses/${responseID}`, { query: query2, ...options4, stream: query2?.stream ?? false, @@ -293478,7 +293778,7 @@ var init_responses2 = __esm(() => { }); } delete(responseID, options4) { - return this._client.delete(path28`/responses/${responseID}`, { + return this._client.delete(path29`/responses/${responseID}`, { ...options4, headers: buildHeaders2([{ Accept: "*/*" }, options4?.headers]), __security: { bearerAuth: true } @@ -293491,7 +293791,7 @@ var init_responses2 = __esm(() => { return ResponseStream.createResponse(this._client, body3, options4); } cancel(responseID, options4) { - return this._client.post(path28`/responses/${responseID}/cancel`, { + return this._client.post(path29`/responses/${responseID}/cancel`, { ...options4, __security: { bearerAuth: true } }); @@ -293508,10 +293808,10 @@ var init_responses2 = __esm(() => { var Content2; var init_content2 = __esm(() => { init_headers2(); - init_path2(); + init_path3(); Content2 = class Content2 extends APIResource2 { retrieve(skillID, options4) { - return this._client.get(path28`/skills/${skillID}/content`, { + return this._client.get(path29`/skills/${skillID}/content`, { ...options4, headers: buildHeaders2([{ Accept: "application/binary" }, options4?.headers]), __security: { bearerAuth: true }, @@ -293525,11 +293825,11 @@ var init_content2 = __esm(() => { var Content3; var init_content3 = __esm(() => { init_headers2(); - init_path2(); + init_path3(); Content3 = class Content3 extends APIResource2 { retrieve(version5, params, options4) { const { skill_id } = params; - return this._client.get(path28`/skills/${skill_id}/versions/${version5}/content`, { + return this._client.get(path29`/skills/${skill_id}/versions/${version5}/content`, { ...options4, headers: buildHeaders2([{ Accept: "application/binary" }, options4?.headers]), __security: { bearerAuth: true }, @@ -293546,24 +293846,24 @@ var init_versions3 = __esm(() => { init_content3(); init_pagination2(); init_uploads3(); - init_path2(); + init_path3(); Versions2 = class Versions2 extends APIResource2 { constructor() { super(...arguments); this.content = new Content3(this._client); } create(skillID, body3 = {}, options4) { - return this._client.post(path28`/skills/${skillID}/versions`, maybeMultipartFormRequestOptions({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); + return this._client.post(path29`/skills/${skillID}/versions`, maybeMultipartFormRequestOptions({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); } retrieve(version5, params, options4) { const { skill_id } = params; - return this._client.get(path28`/skills/${skill_id}/versions/${version5}`, { + return this._client.get(path29`/skills/${skill_id}/versions/${version5}`, { ...options4, __security: { bearerAuth: true } }); } list(skillID, query2 = {}, options4) { - return this._client.getAPIList(path28`/skills/${skillID}/versions`, CursorPage, { + return this._client.getAPIList(path29`/skills/${skillID}/versions`, CursorPage, { query: query2, ...options4, __security: { bearerAuth: true } @@ -293571,7 +293871,7 @@ var init_versions3 = __esm(() => { } delete(version5, params, options4) { const { skill_id } = params; - return this._client.delete(path28`/skills/${skill_id}/versions/${version5}`, { + return this._client.delete(path29`/skills/${skill_id}/versions/${version5}`, { ...options4, __security: { bearerAuth: true } }); @@ -293589,7 +293889,7 @@ var init_skills2 = __esm(() => { init_versions3(); init_pagination2(); init_uploads3(); - init_path2(); + init_path3(); Skills3 = class Skills3 extends APIResource2 { constructor() { super(...arguments); @@ -293600,10 +293900,10 @@ var init_skills2 = __esm(() => { return this._client.post("/skills", maybeMultipartFormRequestOptions({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); } retrieve(skillID, options4) { - return this._client.get(path28`/skills/${skillID}`, { ...options4, __security: { bearerAuth: true } }); + return this._client.get(path29`/skills/${skillID}`, { ...options4, __security: { bearerAuth: true } }); } update(skillID, body3, options4) { - return this._client.post(path28`/skills/${skillID}`, { + return this._client.post(path29`/skills/${skillID}`, { body: body3, ...options4, __security: { bearerAuth: true } @@ -293617,7 +293917,7 @@ var init_skills2 = __esm(() => { }); } delete(skillID, options4) { - return this._client.delete(path28`/skills/${skillID}`, { ...options4, __security: { bearerAuth: true } }); + return this._client.delete(path29`/skills/${skillID}`, { ...options4, __security: { bearerAuth: true } }); } }; Skills3.Content = Content2; @@ -293628,10 +293928,10 @@ var init_skills2 = __esm(() => { var Parts; var init_parts = __esm(() => { init_uploads3(); - init_path2(); + init_path3(); Parts = class Parts extends APIResource2 { create(uploadID, body3, options4) { - return this._client.post(path28`/uploads/${uploadID}/parts`, multipartFormRequestOptions2({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); + return this._client.post(path29`/uploads/${uploadID}/parts`, multipartFormRequestOptions2({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); } }; }); @@ -293641,7 +293941,7 @@ var Uploads; var init_uploads5 = __esm(() => { init_parts(); init_parts(); - init_path2(); + init_path3(); Uploads = class Uploads extends APIResource2 { constructor() { super(...arguments); @@ -293651,13 +293951,13 @@ var init_uploads5 = __esm(() => { return this._client.post("/uploads", { body: body3, ...options4, __security: { bearerAuth: true } }); } cancel(uploadID, options4) { - return this._client.post(path28`/uploads/${uploadID}/cancel`, { + return this._client.post(path29`/uploads/${uploadID}/cancel`, { ...options4, __security: { bearerAuth: true } }); } complete(uploadID, body3, options4) { - return this._client.post(path28`/uploads/${uploadID}/complete`, { + return this._client.post(path29`/uploads/${uploadID}/complete`, { body: body3, ...options4, __security: { bearerAuth: true } @@ -293691,10 +293991,10 @@ var FileBatches; var init_file_batches = __esm(() => { init_pagination2(); init_headers2(); - init_path2(); + init_path3(); FileBatches = class FileBatches extends APIResource2 { create(vectorStoreID, body3, options4) { - return this._client.post(path28`/vector_stores/${vectorStoreID}/file_batches`, { + return this._client.post(path29`/vector_stores/${vectorStoreID}/file_batches`, { body: body3, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -293703,7 +294003,7 @@ var init_file_batches = __esm(() => { } retrieve(batchID, params, options4) { const { vector_store_id } = params; - return this._client.get(path28`/vector_stores/${vector_store_id}/file_batches/${batchID}`, { + return this._client.get(path29`/vector_stores/${vector_store_id}/file_batches/${batchID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } @@ -293711,7 +294011,7 @@ var init_file_batches = __esm(() => { } cancel(batchID, params, options4) { const { vector_store_id } = params; - return this._client.post(path28`/vector_stores/${vector_store_id}/file_batches/${batchID}/cancel`, { + return this._client.post(path29`/vector_stores/${vector_store_id}/file_batches/${batchID}/cancel`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } @@ -293723,7 +294023,7 @@ var init_file_batches = __esm(() => { } listFiles(batchID, params, options4) { const { vector_store_id, ...query2 } = params; - return this._client.getAPIList(path28`/vector_stores/${vector_store_id}/file_batches/${batchID}/files`, CursorPage, { + return this._client.getAPIList(path29`/vector_stores/${vector_store_id}/file_batches/${batchID}/files`, CursorPage, { query: query2, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -293796,10 +294096,10 @@ var init_files4 = __esm(() => { init_pagination2(); init_headers2(); init_utils6(); - init_path2(); + init_path3(); Files4 = class Files4 extends APIResource2 { create(vectorStoreID, body3, options4) { - return this._client.post(path28`/vector_stores/${vectorStoreID}/files`, { + return this._client.post(path29`/vector_stores/${vectorStoreID}/files`, { body: body3, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -293808,7 +294108,7 @@ var init_files4 = __esm(() => { } retrieve(fileID, params, options4) { const { vector_store_id } = params; - return this._client.get(path28`/vector_stores/${vector_store_id}/files/${fileID}`, { + return this._client.get(path29`/vector_stores/${vector_store_id}/files/${fileID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } @@ -293816,7 +294116,7 @@ var init_files4 = __esm(() => { } update(fileID, params, options4) { const { vector_store_id, ...body3 } = params; - return this._client.post(path28`/vector_stores/${vector_store_id}/files/${fileID}`, { + return this._client.post(path29`/vector_stores/${vector_store_id}/files/${fileID}`, { body: body3, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -293824,7 +294124,7 @@ var init_files4 = __esm(() => { }); } list(vectorStoreID, query2 = {}, options4) { - return this._client.getAPIList(path28`/vector_stores/${vectorStoreID}/files`, CursorPage, { + return this._client.getAPIList(path29`/vector_stores/${vectorStoreID}/files`, CursorPage, { query: query2, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -293833,7 +294133,7 @@ var init_files4 = __esm(() => { } delete(fileID, params, options4) { const { vector_store_id } = params; - return this._client.delete(path28`/vector_stores/${vector_store_id}/files/${fileID}`, { + return this._client.delete(path29`/vector_stores/${vector_store_id}/files/${fileID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } @@ -293888,7 +294188,7 @@ var init_files4 = __esm(() => { } content(fileID, params, options4) { const { vector_store_id } = params; - return this._client.getAPIList(path28`/vector_stores/${vector_store_id}/files/${fileID}/content`, Page2, { + return this._client.getAPIList(path29`/vector_stores/${vector_store_id}/files/${fileID}/content`, Page2, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } @@ -293906,7 +294206,7 @@ var init_vector_stores = __esm(() => { init_files4(); init_pagination2(); init_headers2(); - init_path2(); + init_path3(); VectorStores = class VectorStores extends APIResource2 { constructor() { super(...arguments); @@ -293922,14 +294222,14 @@ var init_vector_stores = __esm(() => { }); } retrieve(vectorStoreID, options4) { - return this._client.get(path28`/vector_stores/${vectorStoreID}`, { + return this._client.get(path29`/vector_stores/${vectorStoreID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } }); } update(vectorStoreID, body3, options4) { - return this._client.post(path28`/vector_stores/${vectorStoreID}`, { + return this._client.post(path29`/vector_stores/${vectorStoreID}`, { body: body3, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -293945,14 +294245,14 @@ var init_vector_stores = __esm(() => { }); } delete(vectorStoreID, options4) { - return this._client.delete(path28`/vector_stores/${vectorStoreID}`, { + return this._client.delete(path29`/vector_stores/${vectorStoreID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } }); } search(vectorStoreID, body3, options4) { - return this._client.getAPIList(path28`/vector_stores/${vectorStoreID}/search`, Page2, { + return this._client.getAPIList(path29`/vector_stores/${vectorStoreID}/search`, Page2, { body: body3, method: "post", ...options4, @@ -293971,13 +294271,13 @@ var init_videos = __esm(() => { init_pagination2(); init_headers2(); init_uploads3(); - init_path2(); + init_path3(); Videos = class Videos extends APIResource2 { create(body3, options4) { return this._client.post("/videos", multipartFormRequestOptions2({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); } retrieve(videoID, options4) { - return this._client.get(path28`/videos/${videoID}`, { ...options4, __security: { bearerAuth: true } }); + return this._client.get(path29`/videos/${videoID}`, { ...options4, __security: { bearerAuth: true } }); } list(query2 = {}, options4) { return this._client.getAPIList("/videos", ConversationCursorPage, { @@ -293987,13 +294287,13 @@ var init_videos = __esm(() => { }); } delete(videoID, options4) { - return this._client.delete(path28`/videos/${videoID}`, { ...options4, __security: { bearerAuth: true } }); + return this._client.delete(path29`/videos/${videoID}`, { ...options4, __security: { bearerAuth: true } }); } createCharacter(body3, options4) { return this._client.post("/videos/characters", multipartFormRequestOptions2({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); } downloadContent(videoID, query2 = {}, options4) { - return this._client.get(path28`/videos/${videoID}/content`, { + return this._client.get(path29`/videos/${videoID}/content`, { query: query2, ...options4, headers: buildHeaders2([{ Accept: "application/binary" }, options4?.headers]), @@ -294008,13 +294308,13 @@ var init_videos = __esm(() => { return this._client.post("/videos/extensions", multipartFormRequestOptions2({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); } getCharacter(characterID, options4) { - return this._client.get(path28`/videos/characters/${characterID}`, { + return this._client.get(path29`/videos/characters/${characterID}`, { ...options4, __security: { bearerAuth: true } }); } remix(videoID, body3, options4) { - return this._client.post(path28`/videos/${videoID}/remix`, maybeMultipartFormRequestOptions({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); + return this._client.post(path29`/videos/${videoID}/remix`, maybeMultipartFormRequestOptions({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); } }; }); @@ -294355,9 +294655,9 @@ https://help.openai.com/en/articles/5112595-best-practices-for-api-key-safety this.apiKey = token; return true; } - buildURL(path29, query2, defaultBaseURL) { + buildURL(path30, query2, defaultBaseURL) { const baseURL = !__classPrivateFieldGet4(this, _OpenAI_instances, "m", _OpenAI_baseURLOverridden).call(this) && defaultBaseURL || this.baseURL; - const url4 = isAbsoluteURL2(path29) ? new URL(path29) : new URL(baseURL + (baseURL.endsWith("/") && path29.startsWith("/") ? path29.slice(1) : path29)); + const url4 = isAbsoluteURL2(path30) ? new URL(path30) : new URL(baseURL + (baseURL.endsWith("/") && path30.startsWith("/") ? path30.slice(1) : path30)); const defaultQuery = this.defaultQuery(); const pathQuery = Object.fromEntries(url4.searchParams); if (!isEmptyObj2(defaultQuery) || !isEmptyObj2(pathQuery)) { @@ -294377,24 +294677,24 @@ https://help.openai.com/en/articles/5112595-best-practices-for-api-key-safety } } async prepareRequest(request3, { url: url4, options: options4 }) {} - get(path29, opts) { - return this.methodRequest("get", path29, opts); + get(path30, opts) { + return this.methodRequest("get", path30, opts); } - post(path29, opts) { - return this.methodRequest("post", path29, opts); + post(path30, opts) { + return this.methodRequest("post", path30, opts); } - patch(path29, opts) { - return this.methodRequest("patch", path29, opts); + patch(path30, opts) { + return this.methodRequest("patch", path30, opts); } - put(path29, opts) { - return this.methodRequest("put", path29, opts); + put(path30, opts) { + return this.methodRequest("put", path30, opts); } - delete(path29, opts) { - return this.methodRequest("delete", path29, opts); + delete(path30, opts) { + return this.methodRequest("delete", path30, opts); } - methodRequest(method, path29, opts) { + methodRequest(method, path30, opts) { return this.request(Promise.resolve(opts).then((opts2) => { - return { method, path: path29, ...opts2 }; + return { method, path: path30, ...opts2 }; })); } request(options4, remainingRetries = null) { @@ -294519,8 +294819,8 @@ https://help.openai.com/en/articles/5112595-best-practices-for-api-key-safety })); return { response, options: options4, controller, requestLogID, retryOfRequestLogID, startTime }; } - getAPIList(path29, Page3, opts) { - return this.requestAPIList(Page3, opts && "then" in opts ? opts.then((opts2) => ({ method: "get", path: path29, ...opts2 })) : { method: "get", path: path29, ...opts }); + getAPIList(path30, Page3, opts) { + return this.requestAPIList(Page3, opts && "then" in opts ? opts.then((opts2) => ({ method: "get", path: path30, ...opts2 })) : { method: "get", path: path30, ...opts }); } requestAPIList(Page3, options4) { const request3 = this.makeRequest(options4, null, undefined); @@ -294614,8 +294914,8 @@ https://help.openai.com/en/articles/5112595-best-practices-for-api-key-safety } async buildRequest(inputOptions, { retryCount = 0 } = {}) { const options4 = { ...inputOptions }; - const { method, path: path29, query: query2, defaultBaseURL } = options4; - const url4 = this.buildURL(path29, query2, defaultBaseURL); + const { method, path: path30, query: query2, defaultBaseURL } = options4; + const url4 = this.buildURL(path30, query2, defaultBaseURL); if ("timeout" in options4) validatePositiveInteger2("timeout", options4.timeout); options4.timeout = options4.timeout ?? this.timeout; @@ -294848,7 +295148,7 @@ var init_openai = __esm(() => { // node_modules/gitlab-ai-provider/dist/index.mjs import WebSocket from "ws" with { type: "jsx" }; import { spawn as spawn2 } from "child_process"; -import * as path29 from "path"; +import * as path30 from "path"; import * as fs12 from "fs"; import * as path210 from "path"; import * as os9 from "os"; @@ -295577,16 +295877,16 @@ async function buildModels(discovered, project) { } return { models, project }; } -async function discoverWorkflowModels(config5, options4) { - const cache4 = new GitLabModelCache(options4.workingDirectory, config5.instanceUrl); +async function discoverWorkflowModels(config4, options4) { + const cache4 = new GitLabModelCache(options4.workingDirectory, config4.instanceUrl); if (!cache4.isDiscoveryExpired()) { const entry = cache4.load(); return buildModels(entry.discovery, entry.project); } const detector = new GitLabProjectDetector({ - instanceUrl: config5.instanceUrl, - getHeaders: config5.getHeaders, - fetch: config5.fetch + instanceUrl: config4.instanceUrl, + getHeaders: config4.getHeaders, + fetch: config4.fetch }); let project = null; try { @@ -295598,9 +295898,9 @@ async function discoverWorkflowModels(config5, options4) { if (!namespaceId) return { models: [], project }; const discovery = new GitLabModelDiscovery({ - instanceUrl: config5.instanceUrl, - getHeaders: config5.getHeaders, - fetch: config5.fetch + instanceUrl: config4.instanceUrl, + getHeaders: config4.getHeaders, + fetch: config4.fetch }); const discovered = await discovery.discover(`gid://gitlab/Group/${namespaceId}`); cache4.saveDiscovery(discovered, project); @@ -295617,10 +295917,10 @@ var __require2, GitLabError, directAccessTokenSchema, DEFAULT_AI_GATEWAY_URL = " aiGatewayUrl; cachedToken = null; tokenExpiresAt = 0; - constructor(config5) { - this.config = config5; - this.fetchFn = config5.fetch ?? fetch; - this.aiGatewayUrl = config5.aiGatewayUrl || process.env["GITLAB_AI_GATEWAY_URL"] || DEFAULT_AI_GATEWAY_URL; + constructor(config4) { + this.config = config4; + this.fetchFn = config4.fetch ?? fetch; + this.aiGatewayUrl = config4.aiGatewayUrl || process.env["GITLAB_AI_GATEWAY_URL"] || DEFAULT_AI_GATEWAY_URL; } async getDirectAccessToken(forceRefresh = false) { const now4 = Date.now(); @@ -295705,16 +296005,16 @@ var __require2, GitLabError, directAccessTokenSchema, DEFAULT_AI_GATEWAY_URL = " config; directAccessClient; anthropicClient = null; - constructor(modelId, config5) { + constructor(modelId, config4) { this.modelId = modelId; - this.config = config5; + this.config = config4; this.directAccessClient = new GitLabDirectAccessClient({ - instanceUrl: config5.instanceUrl, - getHeaders: config5.getHeaders, - refreshApiKey: config5.refreshApiKey, - fetch: config5.fetch, - featureFlags: config5.featureFlags, - aiGatewayUrl: config5.aiGatewayUrl + instanceUrl: config4.instanceUrl, + getHeaders: config4.getHeaders, + refreshApiKey: config4.refreshApiKey, + fetch: config4.fetch, + featureFlags: config4.featureFlags, + aiGatewayUrl: config4.aiGatewayUrl }); } get provider() { @@ -296218,17 +296518,17 @@ ${message.content}` : message.content; directAccessClient; useResponsesApi; openaiClient = null; - constructor(modelId, config5) { + constructor(modelId, config4) { this.modelId = modelId; - this.config = config5; - this.useResponsesApi = config5.useResponsesApi ?? isResponsesApiModel(modelId); + this.config = config4; + this.useResponsesApi = config4.useResponsesApi ?? isResponsesApiModel(modelId); this.directAccessClient = new GitLabDirectAccessClient({ - instanceUrl: config5.instanceUrl, - getHeaders: config5.getHeaders, - refreshApiKey: config5.refreshApiKey, - fetch: config5.fetch, - featureFlags: config5.featureFlags, - aiGatewayUrl: config5.aiGatewayUrl + instanceUrl: config4.instanceUrl, + getHeaders: config4.getHeaders, + refreshApiKey: config4.refreshApiKey, + fetch: config4.fetch, + featureFlags: config4.featureFlags, + aiGatewayUrl: config4.aiGatewayUrl }); } get provider() { @@ -297224,9 +297524,9 @@ ${message.content}` : message.content; config; fetchFn; tokenCache = /* @__PURE__ */ new Map; - constructor(config5) { - this.config = config5; - this.fetchFn = config5.fetch ?? fetch; + constructor(config4) { + this.config = config4; + this.fetchFn = config4.fetch ?? fetch; } getCacheKey(workflowDefinition, rootNamespaceId) { const base3 = workflowDefinition === "chat" ? CHAT_SHARED_TOKEN_KEY : workflowDefinition; @@ -297404,16 +297704,16 @@ ${message.content}` : message.content; config; fetchFn; cache; - constructor(config5) { + constructor(config4) { this.config = { gitTimeout: 5000, - ...config5 + ...config4 }; - this.fetchFn = config5.fetch ?? fetch; - this.cache = config5.cache ?? new GitLabProjectCache; + this.fetchFn = config4.fetch ?? fetch; + this.cache = config4.cache ?? new GitLabProjectCache; } async detectProject(workingDirectory, remoteName = "origin") { - const cacheKey = path29.resolve(workingDirectory); + const cacheKey = path30.resolve(workingDirectory); const cached6 = this.cache.get(cacheKey); if (cached6) { return cached6; @@ -297554,9 +297854,9 @@ ${message.content}` : message.content; config; fetchFn; cache = /* @__PURE__ */ new Map; - constructor(config5) { - this.config = config5; - this.fetchFn = config5.fetch ?? fetch; + constructor(config4) { + this.config = config4; + this.fetchFn = config4.fetch ?? fetch; } async discover(rootNamespaceId) { const cached6 = this.cache.get(rootNamespaceId); @@ -298077,12 +298377,12 @@ var init_dist33 = __esm(() => { this._toolExecutor = null; } } - constructor(modelId, config5, workflowOptions = {}) { + constructor(modelId, config4, workflowOptions = {}) { this.modelId = modelId; - this.config = config5; + this.config = config4; this.workflowOptions = workflowOptions; const workDir = workflowOptions.workingDirectory ?? process.cwd(); - this.modelCache = new GitLabModelCache(workDir, config5.instanceUrl); + this.modelCache = new GitLabModelCache(workDir, config4.instanceUrl); const cached6 = this.modelCache.load(); if (cached6?.selectedModelRef) { this._selectedModelRef = cached6.selectedModelRef; @@ -298091,21 +298391,21 @@ var init_dist33 = __esm(() => { this._selectedModelName = cached6.selectedModelName; } this.tokenClient = new GitLabWorkflowTokenClient({ - instanceUrl: config5.instanceUrl, - getHeaders: config5.getHeaders, - refreshApiKey: config5.refreshApiKey, - fetch: config5.fetch, - featureFlags: config5.featureFlags + instanceUrl: config4.instanceUrl, + getHeaders: config4.getHeaders, + refreshApiKey: config4.refreshApiKey, + fetch: config4.fetch, + featureFlags: config4.featureFlags }); this.projectDetector = new GitLabProjectDetector({ - instanceUrl: config5.instanceUrl, - getHeaders: config5.getHeaders, - fetch: config5.fetch + instanceUrl: config4.instanceUrl, + getHeaders: config4.getHeaders, + fetch: config4.fetch }); this.modelDiscovery = new GitLabModelDiscovery({ - instanceUrl: config5.instanceUrl, - getHeaders: config5.getHeaders, - fetch: config5.fetch + instanceUrl: config4.instanceUrl, + getHeaders: config4.getHeaders, + fetch: config4.fetch }); } get provider() { @@ -300272,7 +300572,7 @@ var require_checksum = __commonJS((exports) => { } } async digest() { - const state2 = Uint32Array.from(this.state); + const state = Uint32Array.from(this.state); const buf = new DataView(this.writeBuffer.buffer.slice(0)); let bufLen = this.bufferLength; const bits = this.bytesHashed * 8; @@ -300281,7 +300581,7 @@ var require_checksum = __commonJS((exports) => { for (let i6 = bufLen;i6 < 64; ++i6) { buf.setUint8(i6, 0); } - compress2(state2, buf); + compress2(state, buf); bufLen = 0; } for (let i6 = bufLen;i6 < 56; ++i6) { @@ -300289,11 +300589,11 @@ var require_checksum = __commonJS((exports) => { } buf.setUint32(56, bits >>> 0, true); buf.setUint32(60, Math.floor(bits / 2 ** 32), true); - compress2(state2, buf); + compress2(state, buf); const out2 = new Uint8Array(16); const view2 = new DataView(out2.buffer); for (let i6 = 0;i6 < 4; ++i6) { - view2.setUint32(i6 * 4, state2[i6], true); + view2.setUint32(i6 * 4, state[i6], true); } return out2; } @@ -300308,8 +300608,8 @@ var require_checksum = __commonJS((exports) => { var M4 = 4294967295; var S3 = Uint8Array.of(7, 12, 17, 22, 5, 9, 14, 20, 4, 11, 16, 23, 6, 10, 15, 21); var T5 = Array.from({ length: 64 }, (_3, i6) => Math.abs(Math.sin(i6 + 1)) * 2 ** 32 >>> 0); - function compress2(state2, block) { - let a4 = state2[0], b2 = state2[1], c2 = state2[2], d4 = state2[3]; + function compress2(state, block) { + let a4 = state[0], b2 = state[1], c2 = state[2], d4 = state[3]; for (let i6 = 0;i6 < 64; ++i6) { let f4, g2; if (i6 < 16) { @@ -300334,10 +300634,10 @@ var require_checksum = __commonJS((exports) => { b2 = b2 + ((sum9 << s5 | sum9 >>> 32 - s5) >>> 0) & M4; a4 = tmp; } - state2[0] = state2[0] + a4 & M4; - state2[1] = state2[1] + b2 & M4; - state2[2] = state2[2] + c2 & M4; - state2[3] = state2[3] + d4 & M4; + state[0] = state[0] + a4 & M4; + state[1] = state[1] + b2 & M4; + state[2] = state[2] + c2 & M4; + state[3] = state[3] + d4 & M4; } var hasNativeCrypto$1 = (() => { try { @@ -300490,7 +300790,7 @@ var require_checksum = __commonJS((exports) => { this.bytesHashed = 0; } digestSync() { - const state2 = this.state.slice(); + const state = this.state.slice(); const buffer4 = this.buffer.slice(); let bufferLength = this.bufferLength; const bitsHashed = this.bytesHashed * 8; @@ -300500,7 +300800,7 @@ var require_checksum = __commonJS((exports) => { for (let i6 = bufferLength;i6 < BLOCK; ++i6) { bufferView.setUint8(i6, 0); } - this.hashBufferWith(state2, buffer4); + this.hashBufferWith(state, buffer4); bufferLength = 0; } for (let i6 = bufferLength;i6 < BLOCK - 8; ++i6) { @@ -300508,13 +300808,13 @@ var require_checksum = __commonJS((exports) => { } bufferView.setUint32(BLOCK - 8, Math.floor(bitsHashed / 4294967296), false); bufferView.setUint32(BLOCK - 4, bitsHashed, false); - this.hashBufferWith(state2, buffer4); + this.hashBufferWith(state, buffer4); const out2 = new Uint8Array(DIGEST_LENGTH); for (let i6 = 0;i6 < 8; ++i6) { - out2[i6 * 4] = state2[i6] >>> 24 & 255; - out2[i6 * 4 + 1] = state2[i6] >>> 16 & 255; - out2[i6 * 4 + 2] = state2[i6] >>> 8 & 255; - out2[i6 * 4 + 3] = state2[i6] >>> 0 & 255; + out2[i6 * 4] = state[i6] >>> 24 & 255; + out2[i6 * 4 + 1] = state[i6] >>> 16 & 255; + out2[i6 * 4 + 2] = state[i6] >>> 8 & 255; + out2[i6 * 4 + 3] = state[i6] >>> 0 & 255; } return out2; } @@ -300538,9 +300838,9 @@ var require_checksum = __commonJS((exports) => { hashBuffer() { this.hashBufferWith(this.state, this.buffer); } - hashBufferWith(state2, buffer4) { + hashBufferWith(state, buffer4) { const w2 = this.w ??= new Int32Array(64); - let s0 = state2[0], s1 = state2[1], s22 = state2[2], s32 = state2[3], s42 = state2[4], s5 = state2[5], s6 = state2[6], s7 = state2[7]; + let s0 = state[0], s1 = state[1], s22 = state[2], s32 = state[3], s42 = state[4], s5 = state[5], s6 = state[6], s7 = state[7]; for (let i6 = 0;i6 < BLOCK; ++i6) { if (i6 < 16) { w2[i6] = (buffer4[i6 * 4] & 255) << 24 | (buffer4[i6 * 4 + 1] & 255) << 16 | (buffer4[i6 * 4 + 2] & 255) << 8 | buffer4[i6 * 4 + 3] & 255; @@ -300562,14 +300862,14 @@ var require_checksum = __commonJS((exports) => { s1 = s0; s0 = t1 + t2 | 0; } - state2[0] += s0; - state2[1] += s1; - state2[2] += s22; - state2[3] += s32; - state2[4] += s42; - state2[5] += s5; - state2[6] += s6; - state2[7] += s7; + state[0] += s0; + state[1] += s1; + state[2] += s22; + state[3] += s32; + state[4] += s42; + state[5] += s5; + state[6] += s6; + state[7] += s7; } } var INIT = new Int32Array([ @@ -301879,11 +302179,11 @@ var require_protocols = __commonJS((exports) => { const opTraits = translateTraits(operationSchema.traits); if (opTraits.http) { request3.method = opTraits.http[0]; - const [path30, search2] = opTraits.http[1].split("?"); + const [path31, search2] = opTraits.http[1].split("?"); if (request3.path == "/") { - request3.path = path30; + request3.path = path31; } else { - request3.path += path30; + request3.path += path31; } const traitSearchParams = new URLSearchParams(search2 ?? ""); for (const [key, value8] of traitSearchParams) { @@ -302258,8 +302558,8 @@ var require_protocols = __commonJS((exports) => { return this; } p(memberName, labelValueProvider, uriLabel, isGreedyLabel) { - this.resolvePathStack.push((path30) => { - this.path = resolvedPath(path30, this.input, memberName, labelValueProvider, uriLabel, isGreedyLabel); + this.resolvePathStack.push((path31) => { + this.path = resolvedPath(path31, this.input, memberName, labelValueProvider, uriLabel, isGreedyLabel); }); return this; } @@ -303868,11 +304168,11 @@ var require_dist_cjs4 = __commonJS((exports) => { } return map33; } - var httpAuthSchemeMiddleware = (config5, mwOptions) => (next3, context4) => async (args3) => { - const options4 = config5.httpAuthSchemeProvider(await mwOptions.httpAuthSchemeParametersProvider(config5, context4, args3.input)); - const authSchemePreference = config5.authSchemePreference ? await config5.authSchemePreference() : []; + var httpAuthSchemeMiddleware = (config4, mwOptions) => (next3, context4) => async (args3) => { + const options4 = config4.httpAuthSchemeProvider(await mwOptions.httpAuthSchemeParametersProvider(config4, context4, args3.input)); + const authSchemePreference = config4.authSchemePreference ? await config4.authSchemePreference() : []; const resolvedOptions = resolveAuthOptions(options4, authSchemePreference); - const authSchemes = convertHttpAuthSchemesToMap(config5.httpAuthSchemes); + const authSchemes = convertHttpAuthSchemesToMap(config4.httpAuthSchemes); const smithyContext = getSmithyContext(context4); const failureReasons = []; for (const option7 of resolvedOptions) { @@ -303881,12 +304181,12 @@ var require_dist_cjs4 = __commonJS((exports) => { failureReasons.push(`HttpAuthScheme \`${option7.schemeId}\` was not enabled for this service.`); continue; } - const identityProvider = scheme.identityProvider(await mwOptions.identityProviderConfigProvider(config5)); + const identityProvider = scheme.identityProvider(await mwOptions.identityProviderConfigProvider(config4)); if (!identityProvider) { failureReasons.push(`HttpAuthScheme \`${option7.schemeId}\` did not have an IdentityProvider configured.`); continue; } - const { identityProperties = {}, signingProperties = {} } = option7.propertiesExtractor?.(config5, context4) || {}; + const { identityProperties = {}, signingProperties = {} } = option7.propertiesExtractor?.(config4, context4) || {}; option7.identityProperties = Object.assign(option7.identityProperties || {}, identityProperties); option7.signingProperties = Object.assign(option7.signingProperties || {}, signingProperties); smithyContext.selectedHttpAuthScheme = { @@ -303910,9 +304210,9 @@ var require_dist_cjs4 = __commonJS((exports) => { relation: "before", toMiddleware: "endpointV2Middleware" }; - var getHttpAuthSchemeEndpointRuleSetPlugin = (config5, { httpAuthSchemeParametersProvider, identityProviderConfigProvider }) => ({ + var getHttpAuthSchemeEndpointRuleSetPlugin = (config4, { httpAuthSchemeParametersProvider, identityProviderConfigProvider }) => ({ applyToStack: (clientStack) => { - clientStack.addRelativeTo(httpAuthSchemeMiddleware(config5, { + clientStack.addRelativeTo(httpAuthSchemeMiddleware(config4, { httpAuthSchemeParametersProvider, identityProviderConfigProvider }), httpAuthSchemeEndpointRuleSetMiddlewareOptions); @@ -303926,9 +304226,9 @@ var require_dist_cjs4 = __commonJS((exports) => { relation: "before", toMiddleware: "serializerMiddleware" }; - var getHttpAuthSchemePlugin = (config5, { httpAuthSchemeParametersProvider, identityProviderConfigProvider }) => ({ + var getHttpAuthSchemePlugin = (config4, { httpAuthSchemeParametersProvider, identityProviderConfigProvider }) => ({ applyToStack: (clientStack) => { - clientStack.addRelativeTo(httpAuthSchemeMiddleware(config5, { + clientStack.addRelativeTo(httpAuthSchemeMiddleware(config4, { httpAuthSchemeParametersProvider, identityProviderConfigProvider }), httpAuthSchemeMiddlewareOptions); @@ -303938,7 +304238,7 @@ var require_dist_cjs4 = __commonJS((exports) => { throw error49; }; var defaultSuccessHandler = (httpResponse, signingProperties) => {}; - var httpSigningMiddleware = (config5) => (next3, context4) => async (args3) => { + var httpSigningMiddleware = (config4) => (next3, context4) => async (args3) => { if (!HttpRequest.isInstance(args3.request)) { return next3(args3); } @@ -303964,7 +304264,7 @@ var require_dist_cjs4 = __commonJS((exports) => { relation: "after", toMiddleware: "retryMiddleware" }; - var getHttpSigningPlugin = (config5) => ({ + var getHttpSigningPlugin = (config4) => ({ applyToStack: (clientStack) => { clientStack.addRelativeTo(httpSigningMiddleware(), httpSigningMiddlewareOptions); } @@ -303981,32 +304281,32 @@ var require_dist_cjs4 = __commonJS((exports) => { return await client3.send(command2, ...args3); }; function createPaginator(ClientCtor, CommandCtor, inputTokenName, outputTokenName, pageSizeTokenName) { - return async function* paginateOperation(config5, input, ...additionalArguments) { + return async function* paginateOperation(config4, input, ...additionalArguments) { const _input = input; - let token = config5.startingToken ?? _input[inputTokenName]; + let token = config4.startingToken ?? _input[inputTokenName]; let hasNext = true; let page; while (hasNext) { _input[inputTokenName] = token; if (pageSizeTokenName) { - _input[pageSizeTokenName] = _input[pageSizeTokenName] ?? config5.pageSize; + _input[pageSizeTokenName] = _input[pageSizeTokenName] ?? config4.pageSize; } - if (config5.client instanceof ClientCtor) { - page = await makePagedClientRequest(CommandCtor, config5.client, input, config5.withCommand, ...additionalArguments); + if (config4.client instanceof ClientCtor) { + page = await makePagedClientRequest(CommandCtor, config4.client, input, config4.withCommand, ...additionalArguments); } else { throw new Error(`Invalid client, expected instance of ${ClientCtor.name}`); } yield page; const prevToken = token; token = get34(page, outputTokenName); - hasNext = !!(token && (!config5.stopOnSameToken || token !== prevToken)); + hasNext = !!(token && (!config4.stopOnSameToken || token !== prevToken)); } return; }; } - var get34 = (fromObject2, path30) => { + var get34 = (fromObject2, path31) => { let cursor = fromObject2; - const pathComponents = path30.split("."); + const pathComponents = path31.split("."); for (const step of pathComponents) { if (!cursor || typeof cursor !== "object") { return; @@ -304028,9 +304328,9 @@ var require_dist_cjs4 = __commonJS((exports) => { class DefaultIdentityProviderConfig { authSchemes = new Map; - constructor(config5) { - for (const key in config5) { - const value8 = config5[key]; + constructor(config4) { + for (const key in config4) { + const value8 = config4[key]; if (value8 !== undefined) { this.authSchemes.set(key, value8); } @@ -305566,19 +305866,19 @@ var require_client6 = __commonJS((exports) => { exports.REGION_ENV_NAME = REGION_ENV_NAME2; exports.REGION_INI_NAME = REGION_INI_NAME2; exports.resolveRegionConfig = resolveRegionConfig2; - var state2 = { + var state = { warningEmitted: false }; var emitWarningIfUnsupportedVersion = (version5) => { - if (version5 && !state2.warningEmitted) { + if (version5 && !state.warningEmitted) { if (process.env.AWS_SDK_JS_NODE_VERSION_SUPPORT_WARNING_DISABLED === "true") { - state2.warningEmitted = true; + state.warningEmitted = true; return; } const userMajorVersion = parseInt(version5.substring(1, version5.indexOf("."))); const vv = 22; if (userMajorVersion < vv) { - state2.warningEmitted = true; + state.warningEmitted = true; process.emitWarning(`NodeVersionSupportWarning: The AWS SDK for JavaScript (v3) versions published after the first week of January 2027 will require node >=${vv}. You are running node ${version5}. @@ -306111,13 +306411,13 @@ More information can be found at: https://a.co/c895JFp`); }; var getUserAgentPrefix = () => selectedUserAgentPrefix; var ACCOUNT_ID_ENDPOINT_REGEX = /\d{12}\.ddb/; - async function checkFeatures(context4, config5, args3) { + async function checkFeatures(context4, config4, args3) { const request3 = args3.request; if (request3?.headers?.["smithy-protocol"] === "rpc-v2-cbor") { setFeature(context4, "PROTOCOL_RPC_V2_CBOR", "M"); } - if (typeof config5.retryStrategy === "function") { - const retryStrategy = await config5.retryStrategy(); + if (typeof config4.retryStrategy === "function") { + const retryStrategy = await config4.retryStrategy(); if (typeof retryStrategy.mode === "string") { switch (retryStrategy.mode) { case RETRY_MODES2.ADAPTIVE: @@ -306129,12 +306429,12 @@ More information can be found at: https://a.co/c895JFp`); } } } - if (typeof config5.accountIdEndpointMode === "function") { + if (typeof config4.accountIdEndpointMode === "function") { const endpointV2 = context4.endpointV2; if (String(endpointV2?.url?.hostname).match(ACCOUNT_ID_ENDPOINT_REGEX)) { setFeature(context4, "ACCOUNT_ID_ENDPOINT", "O"); } - switch (await config5.accountIdEndpointMode?.()) { + switch (await config4.accountIdEndpointMode?.()) { case "disabled": setFeature(context4, "ACCOUNT_ID_MODE_DISABLED", "Q"); break; @@ -306243,9 +306543,9 @@ More information can be found at: https://a.co/c895JFp`); tags: ["SET_USER_AGENT", "USER_AGENT"], override: true }; - var getUserAgentPlugin = (config5) => ({ + var getUserAgentPlugin = (config4) => ({ applyToStack: (clientStack) => { - clientStack.add(userAgentMiddleware(config5), getUserAgentMiddlewareOptions); + clientStack.add(userAgentMiddleware(config4), getUserAgentMiddlewareOptions); } }); var getRuntimeUserAgentPair = () => { @@ -306268,7 +306568,7 @@ More information can be found at: https://a.co/c895JFp`); }; var createDefaultUserAgentProvider = ({ serviceId, clientVersion }) => { const runtimeUserAgentPair = getRuntimeUserAgentPair(); - return async (config5) => { + return async (config4) => { const sections = [ ["aws-sdk-js", clientVersion], ["ua", "2.1"], @@ -306286,7 +306586,7 @@ More information can be found at: https://a.co/c895JFp`); if (env5.AWS_EXECUTION_ENV) { sections.push([`exec-env/${env5.AWS_EXECUTION_ENV}`]); } - const appId = await config5?.userAgentAppId?.(); + const appId = await config4?.userAgentAppId?.(); const resolvedUserAgent = appId ? [...sections, [`app/${appId}`]] : [...sections]; return resolvedUserAgent; }; @@ -306300,7 +306600,7 @@ More information can be found at: https://a.co/c895JFp`); configFileSelector: (profile) => profile[UA_APP_ID_INI_NAME] ?? profile[UA_APP_ID_INI_NAME_DEPRECATED], default: DEFAULT_UA_APP_ID }; - var createUserAgentStringParsingProvider = ({ serviceId, clientVersion }) => async (config5) => { + var createUserAgentStringParsingProvider = ({ serviceId, clientVersion }) => async (config4) => { const module3 = require_es5(); const parse12 = module3.parse ?? module3.default.parse ?? (() => ""); const parsedUA = typeof window !== "undefined" && window?.navigator?.userAgent ? parse12(window.navigator.userAgent) : undefined; @@ -306314,7 +306614,7 @@ More information can be found at: https://a.co/c895JFp`); if (serviceId) { sections.push([`api/${serviceId}`, clientVersion]); } - const appId = await config5?.userAgentAppId?.(); + const appId = await config4?.userAgentAppId?.(); if (appId) { sections.push([`app/${appId}`]); } @@ -306476,7 +306776,7 @@ More information can be found at: https://a.co/c895JFp`); exports.setFeature = setFeature; exports.setPartitionInfo = setPartitionInfo; exports.setTokenFeature = setTokenFeature; - exports.state = state2; + exports.state = state; exports.stsRegionDefaultResolver = stsRegionDefaultResolver; exports.stsRegionWarning = warning; exports.toEndpointV1 = toEndpointV1; @@ -307231,7 +307531,7 @@ or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler conf if (!this.config) { this.config = await this.configProvider; } - const config5 = this.config; + const config4 = this.config; const isSSL = request3.protocol === "https:"; if (!isSSL && !this.config.httpAgent) { this.config.httpAgent = await this.config.httpAgentProvider(); @@ -307267,7 +307567,7 @@ or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler conf } const headers = request3.headers; const expectContinue = headers ? (headers.Expect ?? headers.expect) === "100-continue" : false; - let agent = isSSL ? config5.httpsAgent : config5.httpAgent; + let agent = isSSL ? config4.httpsAgent : config4.httpAgent; if (expectContinue && !this.externalAgent) { agent = new (isSSL ? node_https.Agent : hAgent)({ keepAlive: false, @@ -307275,8 +307575,8 @@ or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler conf }); } socketWarningTimeoutId = timing.setTimeout(() => { - this.socketWarningTimestamp = NodeHttpHandler.checkSocketUsage(agent, this.socketWarningTimestamp, config5.logger); - }, config5.socketAcquisitionWarningTimeout ?? (config5.requestTimeout ?? 2000) + (config5.connectionTimeout ?? 1000)); + this.socketWarningTimestamp = NodeHttpHandler.checkSocketUsage(agent, this.socketWarningTimestamp, config4.logger); + }, config4.socketAcquisitionWarningTimeout ?? (config4.requestTimeout ?? 2000) + (config4.connectionTimeout ?? 1000)); const queryString = request3.query ? buildQueryString(request3.query) : ""; let auth = undefined; if (request3.username != null || request3.password != null) { @@ -307284,12 +307584,12 @@ or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler conf const password = request3.password ?? ""; auth = `${username}:${password}`; } - let path30 = request3.path; + let path31 = request3.path; if (queryString) { - path30 += `?${queryString}`; + path31 += `?${queryString}`; } if (request3.fragment) { - path30 += `#${request3.fragment}`; + path31 += `#${request3.fragment}`; } let hostname4 = request3.hostname ?? ""; if (hostname4[0] === "[" && hostname4.endsWith("]")) { @@ -307301,7 +307601,7 @@ or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler conf headers: request3.headers, host: hostname4, method: request3.method, - path: path30, + path: path31, port: request3.port, agent, auth @@ -307337,10 +307637,10 @@ or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler conf abortSignal.onabort = onAbort; } } - const effectiveRequestTimeout = requestTimeout ?? config5.requestTimeout; - connectionTimeoutId = setConnectionTimeout(req, reject, config5.connectionTimeout); - requestTimeoutId = setRequestTimeout(req, reject, effectiveRequestTimeout, config5.throwOnRequestTimeout, config5.logger ?? console); - socketTimeoutId = setSocketTimeout(req, reject, config5.socketTimeout); + const effectiveRequestTimeout = requestTimeout ?? config4.requestTimeout; + connectionTimeoutId = setConnectionTimeout(req, reject, config4.connectionTimeout); + requestTimeoutId = setRequestTimeout(req, reject, effectiveRequestTimeout, config4.throwOnRequestTimeout, config4.logger ?? console); + socketTimeoutId = setSocketTimeout(req, reject, config4.socketTimeout); const httpAgent = nodeHttpsOptions.agent; if (typeof httpAgent === "object" && "keepAlive" in httpAgent) { keepAliveTimeoutId = setSocketKeepAlive(req, { @@ -307356,9 +307656,9 @@ or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler conf } updateHttpClientConfig(key, value8) { this.config = undefined; - this.configProvider = this.configProvider.then((config5) => { + this.configProvider = this.configProvider.then((config4) => { return { - ...config5, + ...config4, [key]: value8 }; }); @@ -307500,8 +307800,8 @@ or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler conf config; connectOptions; connectionPools = new Map; - constructor(config5) { - this.config = config5; + constructor(config4) { + this.config = config4; if (this.config.maxConcurrency && this.config.maxConcurrency <= 0) { throw new RangeError("maxConcurrency must be greater than zero."); } @@ -307708,16 +308008,16 @@ or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler conf reject(err2); }; const queryString = query2 ? buildQueryString(query2) : ""; - let path30 = request3.path; + let path31 = request3.path; if (queryString) { - path30 += `?${queryString}`; + path31 += `?${queryString}`; } if (request3.fragment) { - path30 += `#${request3.fragment}`; + path31 += `#${request3.fragment}`; } const clientHttp2Stream = session.request({ ...request3.headers, - [constants2.HTTP2_HEADER_PATH]: path30, + [constants2.HTTP2_HEADER_PATH]: path31, [constants2.HTTP2_HEADER_METHOD]: method }); if (effectiveRequestTimeout) { @@ -307776,9 +308076,9 @@ or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler conf } updateHttpClientConfig(key, value8) { this.config = undefined; - this.configProvider = this.configProvider.then((config5) => { + this.configProvider = this.configProvider.then((config4) => { return { - ...config5, + ...config4, [key]: value8 }; }); @@ -308236,10 +308536,10 @@ ${longDate} ${credentialScope} ${toHex2(hashedRequest)}`; } - getCanonicalPath({ path: path30 }) { + getCanonicalPath({ path: path31 }) { if (this.uriEscapePath) { const normalizedPathSegments = []; - for (const pathSegment of path30.split("/")) { + for (const pathSegment of path31.split("/")) { if (pathSegment?.length === 0) continue; if (pathSegment === ".") @@ -308250,11 +308550,11 @@ ${toHex2(hashedRequest)}`; normalizedPathSegments.push(pathSegment); } } - const normalizedPath = `${path30?.startsWith("/") ? "/" : ""}${normalizedPathSegments.join("/")}${normalizedPathSegments.length > 0 && path30?.endsWith("/") ? "/" : ""}`; + const normalizedPath = `${path31?.startsWith("/") ? "/" : ""}${normalizedPathSegments.join("/")}${normalizedPathSegments.length > 0 && path31?.endsWith("/") ? "/" : ""}`; const doubleEncoded = escapeUri(normalizedPath); return doubleEncoded.replace(/%2F/g, "/"); } - return path30; + return path31; } validateResolvedCredentials(credentials) { if (typeof credentials !== "object" || typeof credentials.accessKeyId !== "string" || typeof credentials.secretAccessKey !== "string") { @@ -308565,15 +308865,15 @@ var require_httpAuthSchemes = __commonJS((exports) => { }; var validateSigningProperties = async (signingProperties) => { const context4 = throwSigningPropertyError("context", signingProperties.context); - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const authScheme = context4.endpointV2?.properties?.authSchemes?.[0]; - const signerFunction = throwSigningPropertyError("signer", config5.signer); + const signerFunction = throwSigningPropertyError("signer", config4.signer); const signer = await signerFunction(authScheme); const signingRegion = signingProperties?.signingRegion; const signingRegionSet = signingProperties?.signingRegionSet; const signingName = signingProperties?.signingName; return { - config: config5, + config: config4, signer, signingRegion, signingRegionSet, @@ -308587,7 +308887,7 @@ var require_httpAuthSchemes = __commonJS((exports) => { throw new Error("The request is not an instance of `HttpRequest` and cannot be signed"); } const validatedProps = await validateSigningProperties(signingProperties); - const { config: config5, signer } = validatedProps; + const { config: config4, signer } = validatedProps; let { signingRegion, signingName } = validatedProps; const handlerExecutionContext = signingProperties.context; if (handlerExecutionContext?.authSchemes?.length ?? 0 > 1) { @@ -308597,14 +308897,14 @@ var require_httpAuthSchemes = __commonJS((exports) => { signingName = second?.signingName ?? signingName; } } - const noSkewCorrection = await config5.disableClockSkewCorrection?.() === true; + const noSkewCorrection = await config4.disableClockSkewCorrection?.() === true; signingProperties._disableClockSkewCorrection = noSkewCorrection; if (!noSkewCorrection) { - signingProperties._preRequestSystemClockOffset = config5.systemClockOffset; + signingProperties._preRequestSystemClockOffset = config4.systemClockOffset; signingProperties._requestSentAt = Date.now(); } const signedRequest = await signer.sign(httpRequest2, { - signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config5.systemClockOffset), + signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config4.systemClockOffset), signingRegion, signingService: signingName }); @@ -308616,12 +308916,12 @@ var require_httpAuthSchemes = __commonJS((exports) => { if (!signingProperties._disableClockSkewCorrection) { const serverTime = errorException.ServerTime ?? getDateHeader(errorException.$response); if (serverTime) { - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const preRequestOffset = signingProperties._preRequestSystemClockOffset; const timeRequestSent = signingProperties._requestSentAt; const ageHeader = getAgeHeader(errorException.$response); - const newOffset = getUpdatedSystemClockOffset(serverTime, config5.systemClockOffset, timeRequestSent, ageHeader); - config5.systemClockOffset = newOffset; + const newOffset = getUpdatedSystemClockOffset(serverTime, config4.systemClockOffset, timeRequestSent, ageHeader); + config4.systemClockOffset = newOffset; const skewExceedsThreshold = Math.abs(newOffset) >= 240000; const isLocalCorrection = newOffset !== preRequestOffset; const isConcurrentCorrection = preRequestOffset !== undefined && preRequestOffset !== newOffset; @@ -308639,10 +308939,10 @@ var require_httpAuthSchemes = __commonJS((exports) => { } const dateHeader = getDateHeader(httpResponse); if (dateHeader) { - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const timeRequestSent = signingProperties._requestSentAt; const ageHeader = getAgeHeader(httpResponse); - config5.systemClockOffset = getUpdatedSystemClockOffset(dateHeader, config5.systemClockOffset, timeRequestSent, ageHeader); + config4.systemClockOffset = getUpdatedSystemClockOffset(dateHeader, config4.systemClockOffset, timeRequestSent, ageHeader); } } } @@ -308653,17 +308953,17 @@ var require_httpAuthSchemes = __commonJS((exports) => { if (!HttpRequest4.isInstance(httpRequest2)) { throw new Error("The request is not an instance of `HttpRequest` and cannot be signed"); } - const { config: config5, signer, signingRegion, signingRegionSet, signingName } = await validateSigningProperties(signingProperties); - const configResolvedSigningRegionSet = await config5.sigv4aSigningRegionSet?.(); + const { config: config4, signer, signingRegion, signingRegionSet, signingName } = await validateSigningProperties(signingProperties); + const configResolvedSigningRegionSet = await config4.sigv4aSigningRegionSet?.(); const multiRegionOverride = (configResolvedSigningRegionSet ?? signingRegionSet ?? [signingRegion]).join(","); - const noSkewCorrection = await config5.disableClockSkewCorrection?.() === true; + const noSkewCorrection = await config4.disableClockSkewCorrection?.() === true; signingProperties._disableClockSkewCorrection = noSkewCorrection; if (!noSkewCorrection) { - signingProperties._preRequestSystemClockOffset = config5.systemClockOffset; + signingProperties._preRequestSystemClockOffset = config4.systemClockOffset; signingProperties._requestSentAt = Date.now(); } const signedRequest = await signer.sign(httpRequest2, { - signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config5.systemClockOffset), + signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config4.systemClockOffset), signingRegion: multiRegionOverride, signingService: signingName }); @@ -308692,9 +308992,9 @@ var require_httpAuthSchemes = __commonJS((exports) => { }, default: [] }; - var resolveAwsSdkSigV4AConfig = (config5) => { - config5.sigv4aSigningRegionSet = normalizeProvider3(config5.sigv4aSigningRegionSet); - return config5; + var resolveAwsSdkSigV4AConfig = (config4) => { + config4.sigv4aSigningRegionSet = normalizeProvider3(config4.sigv4aSigningRegionSet); + return config4; }; var NODE_SIGV4A_CONFIG_OPTIONS = { environmentVariableSelector(env6) { @@ -308715,21 +309015,21 @@ var require_httpAuthSchemes = __commonJS((exports) => { }, default: undefined }; - var bindResolveAwsSdkSigV4Config = (defaultDisableClockSkewCorrection) => (config5) => { - let inputCredentials = config5.credentials; - let isUserSupplied = !!config5.credentials; + var bindResolveAwsSdkSigV4Config = (defaultDisableClockSkewCorrection) => (config4) => { + let inputCredentials = config4.credentials; + let isUserSupplied = !!config4.credentials; let resolvedCredentials = undefined; - Object.defineProperty(config5, "credentials", { + Object.defineProperty(config4, "credentials", { set(credentials) { if (credentials && credentials !== inputCredentials && credentials !== resolvedCredentials) { isUserSupplied = true; } inputCredentials = credentials; - const memoizedProvider = normalizeCredentialProvider(config5, { + const memoizedProvider = normalizeCredentialProvider(config4, { credentials: inputCredentials, - credentialDefaultProvider: config5.credentialDefaultProvider + credentialDefaultProvider: config4.credentialDefaultProvider }); - const boundProvider = bindCallerConfig(config5, memoizedProvider); + const boundProvider = bindCallerConfig(config4, memoizedProvider); if (isUserSupplied && !boundProvider.attributed) { const isCredentialObject = typeof inputCredentials === "object" && inputCredentials !== null; resolvedCredentials = async (options4) => { @@ -308753,66 +309053,66 @@ var require_httpAuthSchemes = __commonJS((exports) => { enumerable: true, configurable: true }); - config5.credentials = inputCredentials; - const { signingEscapePath = true, systemClockOffset = config5.systemClockOffset || 0, sha256: sha2562 } = config5; + config4.credentials = inputCredentials; + const { signingEscapePath = true, systemClockOffset = config4.systemClockOffset || 0, sha256: sha2562 } = config4; let signer; - if (config5.signer) { - signer = normalizeProvider3(config5.signer); - } else if (config5.regionInfoProvider) { - signer = () => normalizeProvider3(config5.region)().then(async (region) => [ - await config5.regionInfoProvider(region, { - useFipsEndpoint: await config5.useFipsEndpoint(), - useDualstackEndpoint: await config5.useDualstackEndpoint() + if (config4.signer) { + signer = normalizeProvider3(config4.signer); + } else if (config4.regionInfoProvider) { + signer = () => normalizeProvider3(config4.region)().then(async (region) => [ + await config4.regionInfoProvider(region, { + useFipsEndpoint: await config4.useFipsEndpoint(), + useDualstackEndpoint: await config4.useDualstackEndpoint() }) || {}, region ]).then(([regionInfo, region]) => { const { signingRegion, signingService } = regionInfo; - config5.signingRegion = config5.signingRegion || signingRegion || region; - config5.signingName = config5.signingName || signingService || config5.serviceId; + config4.signingRegion = config4.signingRegion || signingRegion || region; + config4.signingName = config4.signingName || signingService || config4.serviceId; const params = { - ...config5, - credentials: config5.credentials, - region: config5.signingRegion, - service: config5.signingName, + ...config4, + credentials: config4.credentials, + region: config4.signingRegion, + service: config4.signingName, sha256: sha2562, uriEscapePath: signingEscapePath }; - const SignerCtor = config5.signerConstructor || SignatureV4; + const SignerCtor = config4.signerConstructor || SignatureV4; return new SignerCtor(params); }); } else { signer = async (authScheme) => { authScheme = Object.assign({}, { name: "sigv4", - signingName: config5.signingName || config5.defaultSigningName, - signingRegion: await normalizeProvider3(config5.region)(), + signingName: config4.signingName || config4.defaultSigningName, + signingRegion: await normalizeProvider3(config4.region)(), properties: {} }, authScheme); const signingRegion = authScheme.signingRegion; const signingService = authScheme.signingName; - config5.signingRegion = config5.signingRegion || signingRegion; - config5.signingName = config5.signingName || signingService || config5.serviceId; + config4.signingRegion = config4.signingRegion || signingRegion; + config4.signingName = config4.signingName || signingService || config4.serviceId; const params = { - ...config5, - credentials: config5.credentials, - region: config5.signingRegion, - service: config5.signingName, + ...config4, + credentials: config4.credentials, + region: config4.signingRegion, + service: config4.signingName, sha256: sha2562, uriEscapePath: signingEscapePath }; - const SignerCtor = config5.signerConstructor || SignatureV4; + const SignerCtor = config4.signerConstructor || SignatureV4; return new SignerCtor(params); }; } - const resolvedConfig = Object.assign(config5, { + const resolvedConfig = Object.assign(config4, { systemClockOffset, signingEscapePath, signer, - disableClockSkewCorrection: normalizeProvider3(config5.disableClockSkewCorrection ?? defaultDisableClockSkewCorrection) + disableClockSkewCorrection: normalizeProvider3(config4.disableClockSkewCorrection ?? defaultDisableClockSkewCorrection) }); return resolvedConfig; }; - function normalizeCredentialProvider(config5, { credentials, credentialDefaultProvider }) { + function normalizeCredentialProvider(config4, { credentials, credentialDefaultProvider }) { let credentialsProvider; if (credentials) { if (!credentials?.memoized) { @@ -308822,8 +309122,8 @@ var require_httpAuthSchemes = __commonJS((exports) => { } } else { if (credentialDefaultProvider) { - credentialsProvider = normalizeProvider3(credentialDefaultProvider(Object.assign({}, config5, { - parentClientConfig: config5 + credentialsProvider = normalizeProvider3(credentialDefaultProvider(Object.assign({}, config4, { + parentClientConfig: config4 }))); } else { credentialsProvider = async () => { @@ -308834,11 +309134,11 @@ var require_httpAuthSchemes = __commonJS((exports) => { credentialsProvider.memoized = true; return credentialsProvider; } - function bindCallerConfig(config5, credentialsProvider) { + function bindCallerConfig(config4, credentialsProvider) { if (credentialsProvider.configBound) { return credentialsProvider; } - const fn3 = async (options4) => credentialsProvider({ ...options4, callerClientConfig: config5 }); + const fn3 = async (options4) => credentialsProvider({ ...options4, callerClientConfig: config4 }); fn3.memoized = credentialsProvider.memoized; fn3.configBound = true; return fn3; @@ -309852,7 +310152,7 @@ var require_cbor = __commonJS((exports) => { throw new Error("Malformed RPCv2 CBOR response, status: " + response.statusCode); } }; - var buildHttpRpcRequest = async (context4, headers, path30, resolvedHostname, body3) => { + var buildHttpRpcRequest = async (context4, headers, path31, resolvedHostname, body3) => { const endpoint = await context4.endpoint(); const { hostname: hostname4, protocol = "https", port: port2, path: basePath } = endpoint; const contents = { @@ -309860,7 +310160,7 @@ var require_cbor = __commonJS((exports) => { hostname: hostname4, port: port2, method: "POST", - path: basePath.endsWith("/") ? basePath.slice(0, -1) + path30 : basePath + path30, + path: basePath.endsWith("/") ? basePath.slice(0, -1) + path31 : basePath + path31, headers: { ...headers } @@ -310465,7 +310765,7 @@ var require_cbor = __commonJS((exports) => { } } var USE_BUFFER = typeof Buffer !== "undefined"; - var textDecoder3 = new TextDecoder; + var textDecoder2 = new TextDecoder; var payload = new Uint8Array(0); var isBuffer = false; var dataView = new DataView(new ArrayBuffer(0)); @@ -310653,7 +310953,7 @@ var require_cbor = __commonJS((exports) => { if (USE_BUFFER) { return Buffer.from(combined.buffer, combined.byteOffset, combined.byteLength).toString("utf-8"); } - return textDecoder3.decode(combined); + return textDecoder2.decode(combined); } const bytes = readByteString(); chunks2.push(bytes); @@ -310863,7 +311163,7 @@ var require_cbor = __commonJS((exports) => { if (isBuffer) { return payload.toString("utf-8", start2, start2 + length3); } - return textDecoder3.decode(payload.subarray(start2, start2 + length3)); + return textDecoder2.decode(payload.subarray(start2, start2 + length3)); } function decodeUtf8Cached(at3, length3) { let h3 = length3; @@ -310885,7 +311185,7 @@ var require_cbor = __commonJS((exports) => { return cached6; } } - const result6 = isBuffer ? payload.toString("utf-8", at3, at3 + length3) : textDecoder3.decode(payload.subarray(at3, at3 + length3)); + const result6 = isBuffer ? payload.toString("utf-8", at3, at3 + length3) : textDecoder2.decode(payload.subarray(at3, at3 + length3)); if (stringCacheEpochs[slot] !== cacheEpoch) { stringCache[slot] = result6; stringCacheEpochs[slot] = cacheEpoch; @@ -311096,11 +311396,11 @@ var require_cbor = __commonJS((exports) => { } catch (ignored) {} } const { service: service3, operation } = getSmithyContext(context4); - const path30 = `/service/${service3}/operation/${operation}`; + const path31 = `/service/${service3}/operation/${operation}`; if (request3.path.endsWith("/")) { - request3.path += path30.slice(1); + request3.path += path31.slice(1); } else { - request3.path += path30; + request3.path += path31; } return request3; } @@ -311493,8 +311793,8 @@ var require_dist_cjs8 = __commonJS((exports) => { Object.defineProperty(obj, "__proto__", { value: undefined, writable: true, enumerable: true, configurable: true }); } function parseXML(xml2) { - const state2 = new AwsXmlParser(xml2); - return state2.parse(); + const state = new AwsXmlParser(xml2); + return state.parse(); } class AwsXmlParser { @@ -314765,22 +315065,22 @@ var require_sts = __commonJS((exports) => { })); }; customEndpointFunctions3.aws = awsEndpointFunctions3; - var createEndpointRuleSetHttpAuthSchemeParametersProvider = (defaultHttpAuthSchemeParametersProvider) => async (config5, context4, input) => { + var createEndpointRuleSetHttpAuthSchemeParametersProvider = (defaultHttpAuthSchemeParametersProvider) => async (config4, context4, input) => { if (!input) { throw new Error("Could not find `input` for `defaultEndpointRuleSetHttpAuthSchemeParametersProvider`"); } - const defaultParameters = await defaultHttpAuthSchemeParametersProvider(config5, context4, input); + const defaultParameters = await defaultHttpAuthSchemeParametersProvider(config4, context4, input); const instructionsFn = getSmithyContext(context4)?.commandInstance?.constructor?.getEndpointParameterInstructions; if (!instructionsFn) { throw new Error(`getEndpointParameterInstructions() is not defined on '${context4.commandName}'`); } - const endpointParameters = await resolveParams(input, { getEndpointParameterInstructions: instructionsFn }, config5); + const endpointParameters = await resolveParams(input, { getEndpointParameterInstructions: instructionsFn }, config4); return Object.assign(defaultParameters, endpointParameters); }; - var _defaultSTSHttpAuthSchemeParametersProvider = async (config5, context4, input) => { + var _defaultSTSHttpAuthSchemeParametersProvider = async (config4, context4, input) => { return { operation: getSmithyContext(context4).operation, - region: await normalizeProvider3(config5.region)() || (() => { + region: await normalizeProvider3(config4.region)() || (() => { throw new Error("expected `region` to be configured for `aws.auth#sigv4`"); })() }; @@ -314793,9 +315093,9 @@ var require_sts = __commonJS((exports) => { name: "sts", region: authParameters.region }, - propertiesExtractor: (config5, context4) => ({ + propertiesExtractor: (config4, context4) => ({ signingProperties: { - config: config5, + config: config4, context: context4 } }) @@ -314808,9 +315108,9 @@ var require_sts = __commonJS((exports) => { name: "sts", region: authParameters.region }, - propertiesExtractor: (config5, context4) => ({ + propertiesExtractor: (config4, context4) => ({ signingProperties: { - config: config5, + config: config4, context: context4 } }) @@ -314883,11 +315183,11 @@ var require_sts = __commonJS((exports) => { "aws.auth#sigv4a": createAwsAuthSigv4aHttpAuthOption, "smithy.api#noAuth": createSmithyApiNoAuthHttpAuthOption }); - var resolveHttpAuthSchemeConfig = (config5) => { - const config_0 = resolveAwsSdkSigV4Config(config5); + var resolveHttpAuthSchemeConfig = (config4) => { + const config_0 = resolveAwsSdkSigV4Config(config4); const config_1 = resolveAwsSdkSigV4AConfig(config_0); return Object.assign(config_1, { - authSchemePreference: normalizeProvider3(config5.authSchemePreference ?? []) + authSchemePreference: normalizeProvider3(config4.authSchemePreference ?? []) }); }; var resolveClientEndpointParameters = (options4) => { @@ -315254,16 +315554,16 @@ var require_sts = __commonJS((exports) => { () => AssumeRoleWithWebIdentityRequest$, () => AssumeRoleWithWebIdentityResponse$ ]; - var getRuntimeConfig$1 = (config5) => { + var getRuntimeConfig$1 = (config4) => { return { apiVersion: "2011-06-15", - base64Decoder: config5?.base64Decoder ?? fromBase64, - base64Encoder: config5?.base64Encoder ?? toBase64, - disableHostPrefix: config5?.disableHostPrefix ?? false, - endpointProvider: config5?.endpointProvider ?? defaultEndpointResolver, - extensions: config5?.extensions ?? [], - httpAuthSchemeProvider: config5?.httpAuthSchemeProvider ?? defaultSTSHttpAuthSchemeProvider, - httpAuthSchemes: config5?.httpAuthSchemes ?? [ + base64Decoder: config4?.base64Decoder ?? fromBase64, + base64Encoder: config4?.base64Encoder ?? toBase64, + disableHostPrefix: config4?.disableHostPrefix ?? false, + endpointProvider: config4?.endpointProvider ?? defaultEndpointResolver, + extensions: config4?.extensions ?? [], + httpAuthSchemeProvider: config4?.httpAuthSchemeProvider ?? defaultSTSHttpAuthSchemeProvider, + httpAuthSchemes: config4?.httpAuthSchemes ?? [ { schemeId: "aws.auth#sigv4", identityProvider: (ipc) => ipc.getIdentityProvider("aws.auth#sigv4"), @@ -315280,45 +315580,45 @@ var require_sts = __commonJS((exports) => { signer: new NoAuthSigner } ], - logger: config5?.logger ?? new NoOpLogger, - protocol: config5?.protocol ?? AwsQueryProtocol, - protocolSettings: config5?.protocolSettings ?? { + logger: config4?.logger ?? new NoOpLogger, + protocol: config4?.protocol ?? AwsQueryProtocol, + protocolSettings: config4?.protocolSettings ?? { defaultNamespace: "com.amazonaws.sts", errorTypeRegistries, xmlNamespace: "https://sts.amazonaws.com/doc/2011-06-15/", version: "2011-06-15", serviceTarget: "AWSSecurityTokenServiceV20110615" }, - serviceId: config5?.serviceId ?? "STS", - sha256: config5?.sha256 ?? Sha256, - signerConstructor: config5?.signerConstructor ?? SignatureV4MultiRegion, - urlParser: config5?.urlParser ?? parseUrl4, - utf8Decoder: config5?.utf8Decoder ?? fromUtf85, - utf8Encoder: config5?.utf8Encoder ?? toUtf83 + serviceId: config4?.serviceId ?? "STS", + sha256: config4?.sha256 ?? Sha256, + signerConstructor: config4?.signerConstructor ?? SignatureV4MultiRegion, + urlParser: config4?.urlParser ?? parseUrl4, + utf8Decoder: config4?.utf8Decoder ?? fromUtf85, + utf8Encoder: config4?.utf8Encoder ?? toUtf83 }; }; - var getRuntimeConfig = (config5) => { + var getRuntimeConfig = (config4) => { emitWarningIfUnsupportedVersion(process.version); - const defaultsMode = resolveDefaultsModeConfig(config5); + const defaultsMode = resolveDefaultsModeConfig(config4); const defaultConfigProvider = () => defaultsMode().then(loadConfigsForDefaultMode); - const clientSharedValues = getRuntimeConfig$1(config5); + const clientSharedValues = getRuntimeConfig$1(config4); emitWarningIfUnsupportedVersion$1(process.version); const loaderConfig = { - profile: config5?.profile, + profile: config4?.profile, logger: clientSharedValues.logger }; return { ...clientSharedValues, - ...config5, + ...config4, runtime: "node", defaultsMode, - authSchemePreference: config5?.authSchemePreference ?? loadConfig5(NODE_AUTH_SCHEME_PREFERENCE_OPTIONS, loaderConfig), - bodyLengthChecker: config5?.bodyLengthChecker ?? calculateBodyLength, - defaultUserAgentProvider: config5?.defaultUserAgentProvider ?? createDefaultUserAgentProvider({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo.version }), - httpAuthSchemes: config5?.httpAuthSchemes ?? [ + authSchemePreference: config4?.authSchemePreference ?? loadConfig5(NODE_AUTH_SCHEME_PREFERENCE_OPTIONS, loaderConfig), + bodyLengthChecker: config4?.bodyLengthChecker ?? calculateBodyLength, + defaultUserAgentProvider: config4?.defaultUserAgentProvider ?? createDefaultUserAgentProvider({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo.version }), + httpAuthSchemes: config4?.httpAuthSchemes ?? [ { schemeId: "aws.auth#sigv4", - identityProvider: (ipc) => ipc.getIdentityProvider("aws.auth#sigv4") || (async (idProps) => await config5.credentialDefaultProvider(idProps?.__config || {})()), + identityProvider: (ipc) => ipc.getIdentityProvider("aws.auth#sigv4") || (async (idProps) => await config4.credentialDefaultProvider(idProps?.__config || {})()), signer: new AwsSdkSigV4Signer }, { @@ -315332,18 +315632,18 @@ var require_sts = __commonJS((exports) => { signer: new NoAuthSigner } ], - maxAttempts: config5?.maxAttempts ?? loadConfig5(NODE_MAX_ATTEMPT_CONFIG_OPTIONS, config5), - region: config5?.region ?? loadConfig5(NODE_REGION_CONFIG_OPTIONS3, { ...NODE_REGION_CONFIG_FILE_OPTIONS3, ...loaderConfig }), - requestHandler: NodeHttpHandler2.create(config5?.requestHandler ?? defaultConfigProvider), - retryMode: config5?.retryMode ?? loadConfig5({ + maxAttempts: config4?.maxAttempts ?? loadConfig5(NODE_MAX_ATTEMPT_CONFIG_OPTIONS, config4), + region: config4?.region ?? loadConfig5(NODE_REGION_CONFIG_OPTIONS3, { ...NODE_REGION_CONFIG_FILE_OPTIONS3, ...loaderConfig }), + requestHandler: NodeHttpHandler2.create(config4?.requestHandler ?? defaultConfigProvider), + retryMode: config4?.retryMode ?? loadConfig5({ ...NODE_RETRY_MODE_CONFIG_OPTIONS, default: async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE - }, config5), - sigv4aSigningRegionSet: config5?.sigv4aSigningRegionSet ?? loadConfig5(NODE_SIGV4A_CONFIG_OPTIONS, loaderConfig), - streamCollector: config5?.streamCollector ?? streamCollector, - useDualstackEndpoint: config5?.useDualstackEndpoint ?? loadConfig5(NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, loaderConfig), - useFipsEndpoint: config5?.useFipsEndpoint ?? loadConfig5(NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, loaderConfig), - userAgentAppId: config5?.userAgentAppId ?? loadConfig5(NODE_APP_ID_CONFIG_OPTIONS, loaderConfig) + }, config4), + sigv4aSigningRegionSet: config4?.sigv4aSigningRegionSet ?? loadConfig5(NODE_SIGV4A_CONFIG_OPTIONS, loaderConfig), + streamCollector: config4?.streamCollector ?? streamCollector, + useDualstackEndpoint: config4?.useDualstackEndpoint ?? loadConfig5(NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, loaderConfig), + useFipsEndpoint: config4?.useFipsEndpoint ?? loadConfig5(NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, loaderConfig), + userAgentAppId: config4?.userAgentAppId ?? loadConfig5(NODE_APP_ID_CONFIG_OPTIONS, loaderConfig) }; }; var getHttpAuthExtensionConfiguration = (runtimeConfig) => { @@ -315376,11 +315676,11 @@ var require_sts = __commonJS((exports) => { } }; }; - var resolveHttpAuthRuntimeConfig = (config5) => { + var resolveHttpAuthRuntimeConfig = (config4) => { return { - httpAuthSchemes: config5.httpAuthSchemes(), - httpAuthSchemeProvider: config5.httpAuthSchemeProvider(), - credentials: config5.credentials() + httpAuthSchemes: config4.httpAuthSchemes(), + httpAuthSchemeProvider: config4.httpAuthSchemeProvider(), + credentials: config4.credentials() }; }; var resolveRuntimeExtensions = (runtimeConfig, extensions) => { @@ -315413,9 +315713,9 @@ var require_sts = __commonJS((exports) => { this.middlewareStack.use(getRecursionDetectionPlugin(this.config)); this.middlewareStack.use(getHttpAuthSchemeEndpointRuleSetPlugin(this.config, { httpAuthSchemeParametersProvider: defaultSTSHttpAuthSchemeParametersProvider, - identityProviderConfigProvider: async (config5) => new DefaultIdentityProviderConfig({ - "aws.auth#sigv4": config5.credentials, - "aws.auth#sigv4a": config5.credentials + identityProviderConfigProvider: async (config4) => new DefaultIdentityProviderConfig({ + "aws.auth#sigv4": config4.credentials, + "aws.auth#sigv4a": config4.credentials }) })); this.middlewareStack.use(getHttpSigningPlugin(this.config)); @@ -315426,7 +315726,7 @@ var require_sts = __commonJS((exports) => { } var command2 = makeBuilder(commonParams, "AWSSecurityTokenServiceV20110615", "STSClient", getEndpointPlugin); var _ep0 = {}; - var _mw0 = (Command3, cs2, config5, o4) => []; + var _mw0 = (Command3, cs2, config4, o4) => []; class AssumeRoleCommand extends command2(_ep0, _mw0, "AssumeRole", AssumeRole$) { } @@ -315544,8 +315844,8 @@ var require_sts = __commonJS((exports) => { return baseCtor; else return class CustomizableSTSClient extends baseCtor { - constructor(config5) { - super(config5); + constructor(config4) { + super(config4); for (const customization of customizations) { this.middlewareStack.use(customization); } @@ -315813,19 +316113,19 @@ var require_client7 = __commonJS((exports) => { exports.REGION_ENV_NAME = REGION_ENV_NAME3; exports.REGION_INI_NAME = REGION_INI_NAME3; exports.resolveRegionConfig = resolveRegionConfig3; - var state2 = { + var state = { warningEmitted: false }; var emitWarningIfUnsupportedVersion = (version5) => { - if (version5 && !state2.warningEmitted) { + if (version5 && !state.warningEmitted) { if (process.env.AWS_SDK_JS_NODE_VERSION_SUPPORT_WARNING_DISABLED === "true") { - state2.warningEmitted = true; + state.warningEmitted = true; return; } const userMajorVersion = parseInt(version5.substring(1, version5.indexOf("."))); const vv = 22; if (userMajorVersion < vv) { - state2.warningEmitted = true; + state.warningEmitted = true; process.emitWarning(`NodeVersionSupportWarning: The AWS SDK for JavaScript (v3) versions published after the first week of January 2027 will require node >=${vv}. You are running node ${version5}. @@ -316358,13 +316658,13 @@ More information can be found at: https://a.co/c895JFp`); }; var getUserAgentPrefix = () => selectedUserAgentPrefix; var ACCOUNT_ID_ENDPOINT_REGEX = /\d{12}\.ddb/; - async function checkFeatures(context4, config5, args3) { + async function checkFeatures(context4, config4, args3) { const request3 = args3.request; if (request3?.headers?.["smithy-protocol"] === "rpc-v2-cbor") { setFeature(context4, "PROTOCOL_RPC_V2_CBOR", "M"); } - if (typeof config5.retryStrategy === "function") { - const retryStrategy = await config5.retryStrategy(); + if (typeof config4.retryStrategy === "function") { + const retryStrategy = await config4.retryStrategy(); if (typeof retryStrategy.mode === "string") { switch (retryStrategy.mode) { case RETRY_MODES3.ADAPTIVE: @@ -316376,12 +316676,12 @@ More information can be found at: https://a.co/c895JFp`); } } } - if (typeof config5.accountIdEndpointMode === "function") { + if (typeof config4.accountIdEndpointMode === "function") { const endpointV2 = context4.endpointV2; if (String(endpointV2?.url?.hostname).match(ACCOUNT_ID_ENDPOINT_REGEX)) { setFeature(context4, "ACCOUNT_ID_ENDPOINT", "O"); } - switch (await config5.accountIdEndpointMode?.()) { + switch (await config4.accountIdEndpointMode?.()) { case "disabled": setFeature(context4, "ACCOUNT_ID_MODE_DISABLED", "Q"); break; @@ -316490,9 +316790,9 @@ More information can be found at: https://a.co/c895JFp`); tags: ["SET_USER_AGENT", "USER_AGENT"], override: true }; - var getUserAgentPlugin = (config5) => ({ + var getUserAgentPlugin = (config4) => ({ applyToStack: (clientStack) => { - clientStack.add(userAgentMiddleware(config5), getUserAgentMiddlewareOptions); + clientStack.add(userAgentMiddleware(config4), getUserAgentMiddlewareOptions); } }); var getRuntimeUserAgentPair = () => { @@ -316515,7 +316815,7 @@ More information can be found at: https://a.co/c895JFp`); }; var createDefaultUserAgentProvider = ({ serviceId, clientVersion }) => { const runtimeUserAgentPair = getRuntimeUserAgentPair(); - return async (config5) => { + return async (config4) => { const sections = [ ["aws-sdk-js", clientVersion], ["ua", "2.1"], @@ -316533,7 +316833,7 @@ More information can be found at: https://a.co/c895JFp`); if (env6.AWS_EXECUTION_ENV) { sections.push([`exec-env/${env6.AWS_EXECUTION_ENV}`]); } - const appId = await config5?.userAgentAppId?.(); + const appId = await config4?.userAgentAppId?.(); const resolvedUserAgent = appId ? [...sections, [`app/${appId}`]] : [...sections]; return resolvedUserAgent; }; @@ -316547,7 +316847,7 @@ More information can be found at: https://a.co/c895JFp`); configFileSelector: (profile) => profile[UA_APP_ID_INI_NAME] ?? profile[UA_APP_ID_INI_NAME_DEPRECATED], default: DEFAULT_UA_APP_ID }; - var createUserAgentStringParsingProvider = ({ serviceId, clientVersion }) => async (config5) => { + var createUserAgentStringParsingProvider = ({ serviceId, clientVersion }) => async (config4) => { const module3 = require_es5(); const parse12 = module3.parse ?? module3.default.parse ?? (() => ""); const parsedUA = typeof window !== "undefined" && window?.navigator?.userAgent ? parse12(window.navigator.userAgent) : undefined; @@ -316561,7 +316861,7 @@ More information can be found at: https://a.co/c895JFp`); if (serviceId) { sections.push([`api/${serviceId}`, clientVersion]); } - const appId = await config5?.userAgentAppId?.(); + const appId = await config4?.userAgentAppId?.(); if (appId) { sections.push([`app/${appId}`]); } @@ -316723,7 +317023,7 @@ More information can be found at: https://a.co/c895JFp`); exports.setFeature = setFeature; exports.setPartitionInfo = setPartitionInfo; exports.setTokenFeature = setTokenFeature; - exports.state = state2; + exports.state = state; exports.stsRegionDefaultResolver = stsRegionDefaultResolver; exports.stsRegionWarning = warning; exports.toEndpointV1 = toEndpointV1; @@ -316761,15 +317061,15 @@ var require_httpAuthSchemes2 = __commonJS((exports) => { }; var validateSigningProperties = async (signingProperties) => { const context4 = throwSigningPropertyError("context", signingProperties.context); - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const authScheme = context4.endpointV2?.properties?.authSchemes?.[0]; - const signerFunction = throwSigningPropertyError("signer", config5.signer); + const signerFunction = throwSigningPropertyError("signer", config4.signer); const signer = await signerFunction(authScheme); const signingRegion = signingProperties?.signingRegion; const signingRegionSet = signingProperties?.signingRegionSet; const signingName = signingProperties?.signingName; return { - config: config5, + config: config4, signer, signingRegion, signingRegionSet, @@ -316783,7 +317083,7 @@ var require_httpAuthSchemes2 = __commonJS((exports) => { throw new Error("The request is not an instance of `HttpRequest` and cannot be signed"); } const validatedProps = await validateSigningProperties(signingProperties); - const { config: config5, signer } = validatedProps; + const { config: config4, signer } = validatedProps; let { signingRegion, signingName } = validatedProps; const handlerExecutionContext = signingProperties.context; if (handlerExecutionContext?.authSchemes?.length ?? 0 > 1) { @@ -316793,14 +317093,14 @@ var require_httpAuthSchemes2 = __commonJS((exports) => { signingName = second?.signingName ?? signingName; } } - const noSkewCorrection = await config5.disableClockSkewCorrection?.() === true; + const noSkewCorrection = await config4.disableClockSkewCorrection?.() === true; signingProperties._disableClockSkewCorrection = noSkewCorrection; if (!noSkewCorrection) { - signingProperties._preRequestSystemClockOffset = config5.systemClockOffset; + signingProperties._preRequestSystemClockOffset = config4.systemClockOffset; signingProperties._requestSentAt = Date.now(); } const signedRequest = await signer.sign(httpRequest2, { - signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config5.systemClockOffset), + signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config4.systemClockOffset), signingRegion, signingService: signingName }); @@ -316812,12 +317112,12 @@ var require_httpAuthSchemes2 = __commonJS((exports) => { if (!signingProperties._disableClockSkewCorrection) { const serverTime = errorException.ServerTime ?? getDateHeader(errorException.$response); if (serverTime) { - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const preRequestOffset = signingProperties._preRequestSystemClockOffset; const timeRequestSent = signingProperties._requestSentAt; const ageHeader = getAgeHeader(errorException.$response); - const newOffset = getUpdatedSystemClockOffset(serverTime, config5.systemClockOffset, timeRequestSent, ageHeader); - config5.systemClockOffset = newOffset; + const newOffset = getUpdatedSystemClockOffset(serverTime, config4.systemClockOffset, timeRequestSent, ageHeader); + config4.systemClockOffset = newOffset; const skewExceedsThreshold = Math.abs(newOffset) >= 240000; const isLocalCorrection = newOffset !== preRequestOffset; const isConcurrentCorrection = preRequestOffset !== undefined && preRequestOffset !== newOffset; @@ -316835,10 +317135,10 @@ var require_httpAuthSchemes2 = __commonJS((exports) => { } const dateHeader = getDateHeader(httpResponse); if (dateHeader) { - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const timeRequestSent = signingProperties._requestSentAt; const ageHeader = getAgeHeader(httpResponse); - config5.systemClockOffset = getUpdatedSystemClockOffset(dateHeader, config5.systemClockOffset, timeRequestSent, ageHeader); + config4.systemClockOffset = getUpdatedSystemClockOffset(dateHeader, config4.systemClockOffset, timeRequestSent, ageHeader); } } } @@ -316849,17 +317149,17 @@ var require_httpAuthSchemes2 = __commonJS((exports) => { if (!HttpRequest4.isInstance(httpRequest2)) { throw new Error("The request is not an instance of `HttpRequest` and cannot be signed"); } - const { config: config5, signer, signingRegion, signingRegionSet, signingName } = await validateSigningProperties(signingProperties); - const configResolvedSigningRegionSet = await config5.sigv4aSigningRegionSet?.(); + const { config: config4, signer, signingRegion, signingRegionSet, signingName } = await validateSigningProperties(signingProperties); + const configResolvedSigningRegionSet = await config4.sigv4aSigningRegionSet?.(); const multiRegionOverride = (configResolvedSigningRegionSet ?? signingRegionSet ?? [signingRegion]).join(","); - const noSkewCorrection = await config5.disableClockSkewCorrection?.() === true; + const noSkewCorrection = await config4.disableClockSkewCorrection?.() === true; signingProperties._disableClockSkewCorrection = noSkewCorrection; if (!noSkewCorrection) { - signingProperties._preRequestSystemClockOffset = config5.systemClockOffset; + signingProperties._preRequestSystemClockOffset = config4.systemClockOffset; signingProperties._requestSentAt = Date.now(); } const signedRequest = await signer.sign(httpRequest2, { - signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config5.systemClockOffset), + signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config4.systemClockOffset), signingRegion: multiRegionOverride, signingService: signingName }); @@ -316888,9 +317188,9 @@ var require_httpAuthSchemes2 = __commonJS((exports) => { }, default: [] }; - var resolveAwsSdkSigV4AConfig = (config5) => { - config5.sigv4aSigningRegionSet = normalizeProvider3(config5.sigv4aSigningRegionSet); - return config5; + var resolveAwsSdkSigV4AConfig = (config4) => { + config4.sigv4aSigningRegionSet = normalizeProvider3(config4.sigv4aSigningRegionSet); + return config4; }; var NODE_SIGV4A_CONFIG_OPTIONS = { environmentVariableSelector(env6) { @@ -316911,21 +317211,21 @@ var require_httpAuthSchemes2 = __commonJS((exports) => { }, default: undefined }; - var bindResolveAwsSdkSigV4Config = (defaultDisableClockSkewCorrection) => (config5) => { - let inputCredentials = config5.credentials; - let isUserSupplied = !!config5.credentials; + var bindResolveAwsSdkSigV4Config = (defaultDisableClockSkewCorrection) => (config4) => { + let inputCredentials = config4.credentials; + let isUserSupplied = !!config4.credentials; let resolvedCredentials = undefined; - Object.defineProperty(config5, "credentials", { + Object.defineProperty(config4, "credentials", { set(credentials) { if (credentials && credentials !== inputCredentials && credentials !== resolvedCredentials) { isUserSupplied = true; } inputCredentials = credentials; - const memoizedProvider = normalizeCredentialProvider(config5, { + const memoizedProvider = normalizeCredentialProvider(config4, { credentials: inputCredentials, - credentialDefaultProvider: config5.credentialDefaultProvider + credentialDefaultProvider: config4.credentialDefaultProvider }); - const boundProvider = bindCallerConfig(config5, memoizedProvider); + const boundProvider = bindCallerConfig(config4, memoizedProvider); if (isUserSupplied && !boundProvider.attributed) { const isCredentialObject = typeof inputCredentials === "object" && inputCredentials !== null; resolvedCredentials = async (options4) => { @@ -316949,66 +317249,66 @@ var require_httpAuthSchemes2 = __commonJS((exports) => { enumerable: true, configurable: true }); - config5.credentials = inputCredentials; - const { signingEscapePath = true, systemClockOffset = config5.systemClockOffset || 0, sha256: sha2562 } = config5; + config4.credentials = inputCredentials; + const { signingEscapePath = true, systemClockOffset = config4.systemClockOffset || 0, sha256: sha2562 } = config4; let signer; - if (config5.signer) { - signer = normalizeProvider3(config5.signer); - } else if (config5.regionInfoProvider) { - signer = () => normalizeProvider3(config5.region)().then(async (region) => [ - await config5.regionInfoProvider(region, { - useFipsEndpoint: await config5.useFipsEndpoint(), - useDualstackEndpoint: await config5.useDualstackEndpoint() + if (config4.signer) { + signer = normalizeProvider3(config4.signer); + } else if (config4.regionInfoProvider) { + signer = () => normalizeProvider3(config4.region)().then(async (region) => [ + await config4.regionInfoProvider(region, { + useFipsEndpoint: await config4.useFipsEndpoint(), + useDualstackEndpoint: await config4.useDualstackEndpoint() }) || {}, region ]).then(([regionInfo, region]) => { const { signingRegion, signingService } = regionInfo; - config5.signingRegion = config5.signingRegion || signingRegion || region; - config5.signingName = config5.signingName || signingService || config5.serviceId; + config4.signingRegion = config4.signingRegion || signingRegion || region; + config4.signingName = config4.signingName || signingService || config4.serviceId; const params = { - ...config5, - credentials: config5.credentials, - region: config5.signingRegion, - service: config5.signingName, + ...config4, + credentials: config4.credentials, + region: config4.signingRegion, + service: config4.signingName, sha256: sha2562, uriEscapePath: signingEscapePath }; - const SignerCtor = config5.signerConstructor || SignatureV4; + const SignerCtor = config4.signerConstructor || SignatureV4; return new SignerCtor(params); }); } else { signer = async (authScheme) => { authScheme = Object.assign({}, { name: "sigv4", - signingName: config5.signingName || config5.defaultSigningName, - signingRegion: await normalizeProvider3(config5.region)(), + signingName: config4.signingName || config4.defaultSigningName, + signingRegion: await normalizeProvider3(config4.region)(), properties: {} }, authScheme); const signingRegion = authScheme.signingRegion; const signingService = authScheme.signingName; - config5.signingRegion = config5.signingRegion || signingRegion; - config5.signingName = config5.signingName || signingService || config5.serviceId; + config4.signingRegion = config4.signingRegion || signingRegion; + config4.signingName = config4.signingName || signingService || config4.serviceId; const params = { - ...config5, - credentials: config5.credentials, - region: config5.signingRegion, - service: config5.signingName, + ...config4, + credentials: config4.credentials, + region: config4.signingRegion, + service: config4.signingName, sha256: sha2562, uriEscapePath: signingEscapePath }; - const SignerCtor = config5.signerConstructor || SignatureV4; + const SignerCtor = config4.signerConstructor || SignatureV4; return new SignerCtor(params); }; } - const resolvedConfig = Object.assign(config5, { + const resolvedConfig = Object.assign(config4, { systemClockOffset, signingEscapePath, signer, - disableClockSkewCorrection: normalizeProvider3(config5.disableClockSkewCorrection ?? defaultDisableClockSkewCorrection) + disableClockSkewCorrection: normalizeProvider3(config4.disableClockSkewCorrection ?? defaultDisableClockSkewCorrection) }); return resolvedConfig; }; - function normalizeCredentialProvider(config5, { credentials, credentialDefaultProvider }) { + function normalizeCredentialProvider(config4, { credentials, credentialDefaultProvider }) { let credentialsProvider; if (credentials) { if (!credentials?.memoized) { @@ -317018,8 +317318,8 @@ var require_httpAuthSchemes2 = __commonJS((exports) => { } } else { if (credentialDefaultProvider) { - credentialsProvider = normalizeProvider3(credentialDefaultProvider(Object.assign({}, config5, { - parentClientConfig: config5 + credentialsProvider = normalizeProvider3(credentialDefaultProvider(Object.assign({}, config4, { + parentClientConfig: config4 }))); } else { credentialsProvider = async () => { @@ -317030,11 +317330,11 @@ var require_httpAuthSchemes2 = __commonJS((exports) => { credentialsProvider.memoized = true; return credentialsProvider; } - function bindCallerConfig(config5, credentialsProvider) { + function bindCallerConfig(config4, credentialsProvider) { if (credentialsProvider.configBound) { return credentialsProvider; } - const fn3 = async (options4) => credentialsProvider({ ...options4, callerClientConfig: config5 }); + const fn3 = async (options4) => credentialsProvider({ ...options4, callerClientConfig: config4 }); fn3.memoized = credentialsProvider.memoized; fn3.configBound = true; return fn3; @@ -317189,8 +317489,8 @@ var require_dist_cjs9 = __commonJS((exports) => { Object.defineProperty(obj, "__proto__", { value: undefined, writable: true, enumerable: true, configurable: true }); } function parseXML(xml2) { - const state2 = new AwsXmlParser(xml2); - return state2.parse(); + const state = new AwsXmlParser(xml2); + return state.parse(); } class AwsXmlParser { @@ -320288,10 +320588,10 @@ var require_signin = __commonJS((exports) => { var { streamCollector, NodeHttpHandler: NodeHttpHandler2 } = require_dist_cjs5(); var { AwsRestJsonProtocol } = require_protocols3(); var { Sha256 } = require_checksum(); - var defaultSigninHttpAuthSchemeParametersProvider = async (config5, context4, input) => { + var defaultSigninHttpAuthSchemeParametersProvider = async (config4, context4, input) => { return { operation: getSmithyContext(context4).operation, - region: await normalizeProvider3(config5.region)() || (() => { + region: await normalizeProvider3(config4.region)() || (() => { throw new Error("expected `region` to be configured for `aws.auth#sigv4`"); })() }; @@ -320303,9 +320603,9 @@ var require_signin = __commonJS((exports) => { name: "signin", region: authParameters.region }, - propertiesExtractor: (config5, context4) => ({ + propertiesExtractor: (config4, context4) => ({ signingProperties: { - config: config5, + config: config4, context: context4 } }) @@ -320329,10 +320629,10 @@ var require_signin = __commonJS((exports) => { } return options4; }; - var resolveHttpAuthSchemeConfig = (config5) => { - const config_0 = resolveAwsSdkSigV4Config(config5); + var resolveHttpAuthSchemeConfig = (config4) => { + const config_0 = resolveAwsSdkSigV4Config(config4); return Object.assign(config_0, { - authSchemePreference: normalizeProvider3(config5.authSchemePreference ?? []) + authSchemePreference: normalizeProvider3(config4.authSchemePreference ?? []) }); }; var resolveClientEndpointParameters = (options4) => { @@ -320798,16 +321098,16 @@ var require_signin = __commonJS((exports) => { () => CreateOAuth2TokenWithIAMRequest$, () => CreateOAuth2TokenWithIAMResponse$ ]; - var getRuntimeConfig$1 = (config5) => { + var getRuntimeConfig$1 = (config4) => { return { apiVersion: "2023-01-01", - base64Decoder: config5?.base64Decoder ?? fromBase64, - base64Encoder: config5?.base64Encoder ?? toBase64, - disableHostPrefix: config5?.disableHostPrefix ?? false, - endpointProvider: config5?.endpointProvider ?? defaultEndpointResolver, - extensions: config5?.extensions ?? [], - httpAuthSchemeProvider: config5?.httpAuthSchemeProvider ?? defaultSigninHttpAuthSchemeProvider, - httpAuthSchemes: config5?.httpAuthSchemes ?? [ + base64Decoder: config4?.base64Decoder ?? fromBase64, + base64Encoder: config4?.base64Encoder ?? toBase64, + disableHostPrefix: config4?.disableHostPrefix ?? false, + endpointProvider: config4?.endpointProvider ?? defaultEndpointResolver, + extensions: config4?.extensions ?? [], + httpAuthSchemeProvider: config4?.httpAuthSchemeProvider ?? defaultSigninHttpAuthSchemeProvider, + httpAuthSchemes: config4?.httpAuthSchemes ?? [ { schemeId: "aws.auth#sigv4", identityProvider: (ipc) => ipc.getIdentityProvider("aws.auth#sigv4"), @@ -320819,50 +321119,50 @@ var require_signin = __commonJS((exports) => { signer: new NoAuthSigner } ], - logger: config5?.logger ?? new NoOpLogger, - protocol: config5?.protocol ?? AwsRestJsonProtocol, - protocolSettings: config5?.protocolSettings ?? { + logger: config4?.logger ?? new NoOpLogger, + protocol: config4?.protocol ?? AwsRestJsonProtocol, + protocolSettings: config4?.protocolSettings ?? { defaultNamespace: "com.amazonaws.signin", errorTypeRegistries, version: "2023-01-01", serviceTarget: "Signin" }, - serviceId: config5?.serviceId ?? "Signin", - sha256: config5?.sha256 ?? Sha256, - urlParser: config5?.urlParser ?? parseUrl4, - utf8Decoder: config5?.utf8Decoder ?? fromUtf85, - utf8Encoder: config5?.utf8Encoder ?? toUtf83 + serviceId: config4?.serviceId ?? "Signin", + sha256: config4?.sha256 ?? Sha256, + urlParser: config4?.urlParser ?? parseUrl4, + utf8Decoder: config4?.utf8Decoder ?? fromUtf85, + utf8Encoder: config4?.utf8Encoder ?? toUtf83 }; }; - var getRuntimeConfig = (config5) => { + var getRuntimeConfig = (config4) => { emitWarningIfUnsupportedVersion(process.version); - const defaultsMode = resolveDefaultsModeConfig(config5); + const defaultsMode = resolveDefaultsModeConfig(config4); const defaultConfigProvider = () => defaultsMode().then(loadConfigsForDefaultMode); - const clientSharedValues = getRuntimeConfig$1(config5); + const clientSharedValues = getRuntimeConfig$1(config4); emitWarningIfUnsupportedVersion$1(process.version); const loaderConfig = { - profile: config5?.profile, + profile: config4?.profile, logger: clientSharedValues.logger }; return { ...clientSharedValues, - ...config5, + ...config4, runtime: "node", defaultsMode, - authSchemePreference: config5?.authSchemePreference ?? loadConfig5(NODE_AUTH_SCHEME_PREFERENCE_OPTIONS, loaderConfig), - bodyLengthChecker: config5?.bodyLengthChecker ?? calculateBodyLength, - defaultUserAgentProvider: config5?.defaultUserAgentProvider ?? createDefaultUserAgentProvider({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo.version }), - maxAttempts: config5?.maxAttempts ?? loadConfig5(NODE_MAX_ATTEMPT_CONFIG_OPTIONS, config5), - region: config5?.region ?? loadConfig5(NODE_REGION_CONFIG_OPTIONS3, { ...NODE_REGION_CONFIG_FILE_OPTIONS3, ...loaderConfig }), - requestHandler: NodeHttpHandler2.create(config5?.requestHandler ?? defaultConfigProvider), - retryMode: config5?.retryMode ?? loadConfig5({ + authSchemePreference: config4?.authSchemePreference ?? loadConfig5(NODE_AUTH_SCHEME_PREFERENCE_OPTIONS, loaderConfig), + bodyLengthChecker: config4?.bodyLengthChecker ?? calculateBodyLength, + defaultUserAgentProvider: config4?.defaultUserAgentProvider ?? createDefaultUserAgentProvider({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo.version }), + maxAttempts: config4?.maxAttempts ?? loadConfig5(NODE_MAX_ATTEMPT_CONFIG_OPTIONS, config4), + region: config4?.region ?? loadConfig5(NODE_REGION_CONFIG_OPTIONS3, { ...NODE_REGION_CONFIG_FILE_OPTIONS3, ...loaderConfig }), + requestHandler: NodeHttpHandler2.create(config4?.requestHandler ?? defaultConfigProvider), + retryMode: config4?.retryMode ?? loadConfig5({ ...NODE_RETRY_MODE_CONFIG_OPTIONS, default: async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE - }, config5), - streamCollector: config5?.streamCollector ?? streamCollector, - useDualstackEndpoint: config5?.useDualstackEndpoint ?? loadConfig5(NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, loaderConfig), - useFipsEndpoint: config5?.useFipsEndpoint ?? loadConfig5(NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, loaderConfig), - userAgentAppId: config5?.userAgentAppId ?? loadConfig5(NODE_APP_ID_CONFIG_OPTIONS, loaderConfig) + }, config4), + streamCollector: config4?.streamCollector ?? streamCollector, + useDualstackEndpoint: config4?.useDualstackEndpoint ?? loadConfig5(NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, loaderConfig), + useFipsEndpoint: config4?.useFipsEndpoint ?? loadConfig5(NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, loaderConfig), + userAgentAppId: config4?.userAgentAppId ?? loadConfig5(NODE_APP_ID_CONFIG_OPTIONS, loaderConfig) }; }; var getHttpAuthExtensionConfiguration = (runtimeConfig) => { @@ -320895,11 +321195,11 @@ var require_signin = __commonJS((exports) => { } }; }; - var resolveHttpAuthRuntimeConfig = (config5) => { + var resolveHttpAuthRuntimeConfig = (config4) => { return { - httpAuthSchemes: config5.httpAuthSchemes(), - httpAuthSchemeProvider: config5.httpAuthSchemeProvider(), - credentials: config5.credentials() + httpAuthSchemes: config4.httpAuthSchemes(), + httpAuthSchemeProvider: config4.httpAuthSchemeProvider(), + credentials: config4.credentials() }; }; var resolveRuntimeExtensions = (runtimeConfig, extensions) => { @@ -320932,8 +321232,8 @@ var require_signin = __commonJS((exports) => { this.middlewareStack.use(getRecursionDetectionPlugin(this.config)); this.middlewareStack.use(getHttpAuthSchemeEndpointRuleSetPlugin(this.config, { httpAuthSchemeParametersProvider: defaultSigninHttpAuthSchemeParametersProvider, - identityProviderConfigProvider: async (config5) => new DefaultIdentityProviderConfig({ - "aws.auth#sigv4": config5.credentials + identityProviderConfigProvider: async (config4) => new DefaultIdentityProviderConfig({ + "aws.auth#sigv4": config4.credentials }) })); this.middlewareStack.use(getHttpSigningPlugin(this.config)); @@ -320949,7 +321249,7 @@ var require_signin = __commonJS((exports) => { var _ep1 = { IsOAuthEndpoint: { type: "staticContextParams", value: true } }; - var _mw0 = (Command3, cs2, config5, o4) => []; + var _mw0 = (Command3, cs2, config4, o4) => []; class CreateOAuth2TokenCommand extends command2(_ep0, _mw0, "CreateOAuth2Token", CreateOAuth2Token$) { } @@ -322071,19 +322371,19 @@ var require_client8 = __commonJS((exports) => { exports.REGION_ENV_NAME = REGION_ENV_NAME4; exports.REGION_INI_NAME = REGION_INI_NAME4; exports.resolveRegionConfig = resolveRegionConfig4; - var state2 = { + var state = { warningEmitted: false }; var emitWarningIfUnsupportedVersion = (version5) => { - if (version5 && !state2.warningEmitted) { + if (version5 && !state.warningEmitted) { if (process.env.AWS_SDK_JS_NODE_VERSION_SUPPORT_WARNING_DISABLED === "true") { - state2.warningEmitted = true; + state.warningEmitted = true; return; } const userMajorVersion = parseInt(version5.substring(1, version5.indexOf("."))); const vv = 22; if (userMajorVersion < vv) { - state2.warningEmitted = true; + state.warningEmitted = true; process.emitWarning(`NodeVersionSupportWarning: The AWS SDK for JavaScript (v3) versions published after the first week of January 2027 will require node >=${vv}. You are running node ${version5}. @@ -322616,13 +322916,13 @@ More information can be found at: https://a.co/c895JFp`); }; var getUserAgentPrefix = () => selectedUserAgentPrefix; var ACCOUNT_ID_ENDPOINT_REGEX = /\d{12}\.ddb/; - async function checkFeatures(context4, config5, args3) { + async function checkFeatures(context4, config4, args3) { const request3 = args3.request; if (request3?.headers?.["smithy-protocol"] === "rpc-v2-cbor") { setFeature(context4, "PROTOCOL_RPC_V2_CBOR", "M"); } - if (typeof config5.retryStrategy === "function") { - const retryStrategy = await config5.retryStrategy(); + if (typeof config4.retryStrategy === "function") { + const retryStrategy = await config4.retryStrategy(); if (typeof retryStrategy.mode === "string") { switch (retryStrategy.mode) { case RETRY_MODES4.ADAPTIVE: @@ -322634,12 +322934,12 @@ More information can be found at: https://a.co/c895JFp`); } } } - if (typeof config5.accountIdEndpointMode === "function") { + if (typeof config4.accountIdEndpointMode === "function") { const endpointV2 = context4.endpointV2; if (String(endpointV2?.url?.hostname).match(ACCOUNT_ID_ENDPOINT_REGEX)) { setFeature(context4, "ACCOUNT_ID_ENDPOINT", "O"); } - switch (await config5.accountIdEndpointMode?.()) { + switch (await config4.accountIdEndpointMode?.()) { case "disabled": setFeature(context4, "ACCOUNT_ID_MODE_DISABLED", "Q"); break; @@ -322748,9 +323048,9 @@ More information can be found at: https://a.co/c895JFp`); tags: ["SET_USER_AGENT", "USER_AGENT"], override: true }; - var getUserAgentPlugin = (config5) => ({ + var getUserAgentPlugin = (config4) => ({ applyToStack: (clientStack) => { - clientStack.add(userAgentMiddleware(config5), getUserAgentMiddlewareOptions); + clientStack.add(userAgentMiddleware(config4), getUserAgentMiddlewareOptions); } }); var getRuntimeUserAgentPair = () => { @@ -322773,7 +323073,7 @@ More information can be found at: https://a.co/c895JFp`); }; var createDefaultUserAgentProvider = ({ serviceId, clientVersion }) => { const runtimeUserAgentPair = getRuntimeUserAgentPair(); - return async (config5) => { + return async (config4) => { const sections = [ ["aws-sdk-js", clientVersion], ["ua", "2.1"], @@ -322791,7 +323091,7 @@ More information can be found at: https://a.co/c895JFp`); if (env7.AWS_EXECUTION_ENV) { sections.push([`exec-env/${env7.AWS_EXECUTION_ENV}`]); } - const appId = await config5?.userAgentAppId?.(); + const appId = await config4?.userAgentAppId?.(); const resolvedUserAgent = appId ? [...sections, [`app/${appId}`]] : [...sections]; return resolvedUserAgent; }; @@ -322805,7 +323105,7 @@ More information can be found at: https://a.co/c895JFp`); configFileSelector: (profile) => profile[UA_APP_ID_INI_NAME] ?? profile[UA_APP_ID_INI_NAME_DEPRECATED], default: DEFAULT_UA_APP_ID }; - var createUserAgentStringParsingProvider = ({ serviceId, clientVersion }) => async (config5) => { + var createUserAgentStringParsingProvider = ({ serviceId, clientVersion }) => async (config4) => { const module3 = require_es5(); const parse12 = module3.parse ?? module3.default.parse ?? (() => ""); const parsedUA = typeof window !== "undefined" && window?.navigator?.userAgent ? parse12(window.navigator.userAgent) : undefined; @@ -322819,7 +323119,7 @@ More information can be found at: https://a.co/c895JFp`); if (serviceId) { sections.push([`api/${serviceId}`, clientVersion]); } - const appId = await config5?.userAgentAppId?.(); + const appId = await config4?.userAgentAppId?.(); if (appId) { sections.push([`app/${appId}`]); } @@ -322981,7 +323281,7 @@ More information can be found at: https://a.co/c895JFp`); exports.setFeature = setFeature; exports.setPartitionInfo = setPartitionInfo; exports.setTokenFeature = setTokenFeature; - exports.state = state2; + exports.state = state; exports.stsRegionDefaultResolver = stsRegionDefaultResolver; exports.stsRegionWarning = warning; exports.toEndpointV1 = toEndpointV1; @@ -323144,19 +323444,19 @@ var require_client9 = __commonJS((exports) => { exports.REGION_ENV_NAME = REGION_ENV_NAME4; exports.REGION_INI_NAME = REGION_INI_NAME4; exports.resolveRegionConfig = resolveRegionConfig4; - var state2 = { + var state = { warningEmitted: false }; var emitWarningIfUnsupportedVersion = (version5) => { - if (version5 && !state2.warningEmitted) { + if (version5 && !state.warningEmitted) { if (process.env.AWS_SDK_JS_NODE_VERSION_SUPPORT_WARNING_DISABLED === "true") { - state2.warningEmitted = true; + state.warningEmitted = true; return; } const userMajorVersion = parseInt(version5.substring(1, version5.indexOf("."))); const vv = 22; if (userMajorVersion < vv) { - state2.warningEmitted = true; + state.warningEmitted = true; process.emitWarning(`NodeVersionSupportWarning: The AWS SDK for JavaScript (v3) versions published after the first week of January 2027 will require node >=${vv}. You are running node ${version5}. @@ -323689,13 +323989,13 @@ More information can be found at: https://a.co/c895JFp`); }; var getUserAgentPrefix = () => selectedUserAgentPrefix; var ACCOUNT_ID_ENDPOINT_REGEX = /\d{12}\.ddb/; - async function checkFeatures(context4, config5, args3) { + async function checkFeatures(context4, config4, args3) { const request3 = args3.request; if (request3?.headers?.["smithy-protocol"] === "rpc-v2-cbor") { setFeature(context4, "PROTOCOL_RPC_V2_CBOR", "M"); } - if (typeof config5.retryStrategy === "function") { - const retryStrategy = await config5.retryStrategy(); + if (typeof config4.retryStrategy === "function") { + const retryStrategy = await config4.retryStrategy(); if (typeof retryStrategy.mode === "string") { switch (retryStrategy.mode) { case RETRY_MODES4.ADAPTIVE: @@ -323707,12 +324007,12 @@ More information can be found at: https://a.co/c895JFp`); } } } - if (typeof config5.accountIdEndpointMode === "function") { + if (typeof config4.accountIdEndpointMode === "function") { const endpointV2 = context4.endpointV2; if (String(endpointV2?.url?.hostname).match(ACCOUNT_ID_ENDPOINT_REGEX)) { setFeature(context4, "ACCOUNT_ID_ENDPOINT", "O"); } - switch (await config5.accountIdEndpointMode?.()) { + switch (await config4.accountIdEndpointMode?.()) { case "disabled": setFeature(context4, "ACCOUNT_ID_MODE_DISABLED", "Q"); break; @@ -323821,9 +324121,9 @@ More information can be found at: https://a.co/c895JFp`); tags: ["SET_USER_AGENT", "USER_AGENT"], override: true }; - var getUserAgentPlugin = (config5) => ({ + var getUserAgentPlugin = (config4) => ({ applyToStack: (clientStack) => { - clientStack.add(userAgentMiddleware(config5), getUserAgentMiddlewareOptions); + clientStack.add(userAgentMiddleware(config4), getUserAgentMiddlewareOptions); } }); var getRuntimeUserAgentPair = () => { @@ -323846,7 +324146,7 @@ More information can be found at: https://a.co/c895JFp`); }; var createDefaultUserAgentProvider = ({ serviceId, clientVersion }) => { const runtimeUserAgentPair = getRuntimeUserAgentPair(); - return async (config5) => { + return async (config4) => { const sections = [ ["aws-sdk-js", clientVersion], ["ua", "2.1"], @@ -323864,7 +324164,7 @@ More information can be found at: https://a.co/c895JFp`); if (env7.AWS_EXECUTION_ENV) { sections.push([`exec-env/${env7.AWS_EXECUTION_ENV}`]); } - const appId = await config5?.userAgentAppId?.(); + const appId = await config4?.userAgentAppId?.(); const resolvedUserAgent = appId ? [...sections, [`app/${appId}`]] : [...sections]; return resolvedUserAgent; }; @@ -323878,7 +324178,7 @@ More information can be found at: https://a.co/c895JFp`); configFileSelector: (profile) => profile[UA_APP_ID_INI_NAME] ?? profile[UA_APP_ID_INI_NAME_DEPRECATED], default: DEFAULT_UA_APP_ID }; - var createUserAgentStringParsingProvider = ({ serviceId, clientVersion }) => async (config5) => { + var createUserAgentStringParsingProvider = ({ serviceId, clientVersion }) => async (config4) => { const module3 = require_es5(); const parse12 = module3.parse ?? module3.default.parse ?? (() => ""); const parsedUA = typeof window !== "undefined" && window?.navigator?.userAgent ? parse12(window.navigator.userAgent) : undefined; @@ -323892,7 +324192,7 @@ More information can be found at: https://a.co/c895JFp`); if (serviceId) { sections.push([`api/${serviceId}`, clientVersion]); } - const appId = await config5?.userAgentAppId?.(); + const appId = await config4?.userAgentAppId?.(); if (appId) { sections.push([`app/${appId}`]); } @@ -324054,7 +324354,7 @@ More information can be found at: https://a.co/c895JFp`); exports.setFeature = setFeature; exports.setPartitionInfo = setPartitionInfo; exports.setTokenFeature = setTokenFeature; - exports.state = state2; + exports.state = state; exports.stsRegionDefaultResolver = stsRegionDefaultResolver; exports.stsRegionWarning = warning; exports.toEndpointV1 = toEndpointV1; @@ -324092,15 +324392,15 @@ var require_httpAuthSchemes3 = __commonJS((exports) => { }; var validateSigningProperties = async (signingProperties) => { const context4 = throwSigningPropertyError("context", signingProperties.context); - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const authScheme = context4.endpointV2?.properties?.authSchemes?.[0]; - const signerFunction = throwSigningPropertyError("signer", config5.signer); + const signerFunction = throwSigningPropertyError("signer", config4.signer); const signer = await signerFunction(authScheme); const signingRegion = signingProperties?.signingRegion; const signingRegionSet = signingProperties?.signingRegionSet; const signingName = signingProperties?.signingName; return { - config: config5, + config: config4, signer, signingRegion, signingRegionSet, @@ -324114,7 +324414,7 @@ var require_httpAuthSchemes3 = __commonJS((exports) => { throw new Error("The request is not an instance of `HttpRequest` and cannot be signed"); } const validatedProps = await validateSigningProperties(signingProperties); - const { config: config5, signer } = validatedProps; + const { config: config4, signer } = validatedProps; let { signingRegion, signingName } = validatedProps; const handlerExecutionContext = signingProperties.context; if (handlerExecutionContext?.authSchemes?.length ?? 0 > 1) { @@ -324124,14 +324424,14 @@ var require_httpAuthSchemes3 = __commonJS((exports) => { signingName = second?.signingName ?? signingName; } } - const noSkewCorrection = await config5.disableClockSkewCorrection?.() === true; + const noSkewCorrection = await config4.disableClockSkewCorrection?.() === true; signingProperties._disableClockSkewCorrection = noSkewCorrection; if (!noSkewCorrection) { - signingProperties._preRequestSystemClockOffset = config5.systemClockOffset; + signingProperties._preRequestSystemClockOffset = config4.systemClockOffset; signingProperties._requestSentAt = Date.now(); } const signedRequest = await signer.sign(httpRequest2, { - signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config5.systemClockOffset), + signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config4.systemClockOffset), signingRegion, signingService: signingName }); @@ -324143,12 +324443,12 @@ var require_httpAuthSchemes3 = __commonJS((exports) => { if (!signingProperties._disableClockSkewCorrection) { const serverTime = errorException.ServerTime ?? getDateHeader(errorException.$response); if (serverTime) { - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const preRequestOffset = signingProperties._preRequestSystemClockOffset; const timeRequestSent = signingProperties._requestSentAt; const ageHeader = getAgeHeader(errorException.$response); - const newOffset = getUpdatedSystemClockOffset(serverTime, config5.systemClockOffset, timeRequestSent, ageHeader); - config5.systemClockOffset = newOffset; + const newOffset = getUpdatedSystemClockOffset(serverTime, config4.systemClockOffset, timeRequestSent, ageHeader); + config4.systemClockOffset = newOffset; const skewExceedsThreshold = Math.abs(newOffset) >= 240000; const isLocalCorrection = newOffset !== preRequestOffset; const isConcurrentCorrection = preRequestOffset !== undefined && preRequestOffset !== newOffset; @@ -324166,10 +324466,10 @@ var require_httpAuthSchemes3 = __commonJS((exports) => { } const dateHeader = getDateHeader(httpResponse); if (dateHeader) { - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const timeRequestSent = signingProperties._requestSentAt; const ageHeader = getAgeHeader(httpResponse); - config5.systemClockOffset = getUpdatedSystemClockOffset(dateHeader, config5.systemClockOffset, timeRequestSent, ageHeader); + config4.systemClockOffset = getUpdatedSystemClockOffset(dateHeader, config4.systemClockOffset, timeRequestSent, ageHeader); } } } @@ -324180,17 +324480,17 @@ var require_httpAuthSchemes3 = __commonJS((exports) => { if (!HttpRequest6.isInstance(httpRequest2)) { throw new Error("The request is not an instance of `HttpRequest` and cannot be signed"); } - const { config: config5, signer, signingRegion, signingRegionSet, signingName } = await validateSigningProperties(signingProperties); - const configResolvedSigningRegionSet = await config5.sigv4aSigningRegionSet?.(); + const { config: config4, signer, signingRegion, signingRegionSet, signingName } = await validateSigningProperties(signingProperties); + const configResolvedSigningRegionSet = await config4.sigv4aSigningRegionSet?.(); const multiRegionOverride = (configResolvedSigningRegionSet ?? signingRegionSet ?? [signingRegion]).join(","); - const noSkewCorrection = await config5.disableClockSkewCorrection?.() === true; + const noSkewCorrection = await config4.disableClockSkewCorrection?.() === true; signingProperties._disableClockSkewCorrection = noSkewCorrection; if (!noSkewCorrection) { - signingProperties._preRequestSystemClockOffset = config5.systemClockOffset; + signingProperties._preRequestSystemClockOffset = config4.systemClockOffset; signingProperties._requestSentAt = Date.now(); } const signedRequest = await signer.sign(httpRequest2, { - signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config5.systemClockOffset), + signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config4.systemClockOffset), signingRegion: multiRegionOverride, signingService: signingName }); @@ -324219,9 +324519,9 @@ var require_httpAuthSchemes3 = __commonJS((exports) => { }, default: [] }; - var resolveAwsSdkSigV4AConfig = (config5) => { - config5.sigv4aSigningRegionSet = normalizeProvider4(config5.sigv4aSigningRegionSet); - return config5; + var resolveAwsSdkSigV4AConfig = (config4) => { + config4.sigv4aSigningRegionSet = normalizeProvider4(config4.sigv4aSigningRegionSet); + return config4; }; var NODE_SIGV4A_CONFIG_OPTIONS = { environmentVariableSelector(env7) { @@ -324242,21 +324542,21 @@ var require_httpAuthSchemes3 = __commonJS((exports) => { }, default: undefined }; - var bindResolveAwsSdkSigV4Config = (defaultDisableClockSkewCorrection) => (config5) => { - let inputCredentials = config5.credentials; - let isUserSupplied = !!config5.credentials; + var bindResolveAwsSdkSigV4Config = (defaultDisableClockSkewCorrection) => (config4) => { + let inputCredentials = config4.credentials; + let isUserSupplied = !!config4.credentials; let resolvedCredentials = undefined; - Object.defineProperty(config5, "credentials", { + Object.defineProperty(config4, "credentials", { set(credentials) { if (credentials && credentials !== inputCredentials && credentials !== resolvedCredentials) { isUserSupplied = true; } inputCredentials = credentials; - const memoizedProvider = normalizeCredentialProvider(config5, { + const memoizedProvider = normalizeCredentialProvider(config4, { credentials: inputCredentials, - credentialDefaultProvider: config5.credentialDefaultProvider + credentialDefaultProvider: config4.credentialDefaultProvider }); - const boundProvider = bindCallerConfig(config5, memoizedProvider); + const boundProvider = bindCallerConfig(config4, memoizedProvider); if (isUserSupplied && !boundProvider.attributed) { const isCredentialObject = typeof inputCredentials === "object" && inputCredentials !== null; resolvedCredentials = async (options4) => { @@ -324280,66 +324580,66 @@ var require_httpAuthSchemes3 = __commonJS((exports) => { enumerable: true, configurable: true }); - config5.credentials = inputCredentials; - const { signingEscapePath = true, systemClockOffset = config5.systemClockOffset || 0, sha256: sha2562 } = config5; + config4.credentials = inputCredentials; + const { signingEscapePath = true, systemClockOffset = config4.systemClockOffset || 0, sha256: sha2562 } = config4; let signer; - if (config5.signer) { - signer = normalizeProvider4(config5.signer); - } else if (config5.regionInfoProvider) { - signer = () => normalizeProvider4(config5.region)().then(async (region) => [ - await config5.regionInfoProvider(region, { - useFipsEndpoint: await config5.useFipsEndpoint(), - useDualstackEndpoint: await config5.useDualstackEndpoint() + if (config4.signer) { + signer = normalizeProvider4(config4.signer); + } else if (config4.regionInfoProvider) { + signer = () => normalizeProvider4(config4.region)().then(async (region) => [ + await config4.regionInfoProvider(region, { + useFipsEndpoint: await config4.useFipsEndpoint(), + useDualstackEndpoint: await config4.useDualstackEndpoint() }) || {}, region ]).then(([regionInfo, region]) => { const { signingRegion, signingService } = regionInfo; - config5.signingRegion = config5.signingRegion || signingRegion || region; - config5.signingName = config5.signingName || signingService || config5.serviceId; + config4.signingRegion = config4.signingRegion || signingRegion || region; + config4.signingName = config4.signingName || signingService || config4.serviceId; const params = { - ...config5, - credentials: config5.credentials, - region: config5.signingRegion, - service: config5.signingName, + ...config4, + credentials: config4.credentials, + region: config4.signingRegion, + service: config4.signingName, sha256: sha2562, uriEscapePath: signingEscapePath }; - const SignerCtor = config5.signerConstructor || SignatureV4; + const SignerCtor = config4.signerConstructor || SignatureV4; return new SignerCtor(params); }); } else { signer = async (authScheme) => { authScheme = Object.assign({}, { name: "sigv4", - signingName: config5.signingName || config5.defaultSigningName, - signingRegion: await normalizeProvider4(config5.region)(), + signingName: config4.signingName || config4.defaultSigningName, + signingRegion: await normalizeProvider4(config4.region)(), properties: {} }, authScheme); const signingRegion = authScheme.signingRegion; const signingService = authScheme.signingName; - config5.signingRegion = config5.signingRegion || signingRegion; - config5.signingName = config5.signingName || signingService || config5.serviceId; + config4.signingRegion = config4.signingRegion || signingRegion; + config4.signingName = config4.signingName || signingService || config4.serviceId; const params = { - ...config5, - credentials: config5.credentials, - region: config5.signingRegion, - service: config5.signingName, + ...config4, + credentials: config4.credentials, + region: config4.signingRegion, + service: config4.signingName, sha256: sha2562, uriEscapePath: signingEscapePath }; - const SignerCtor = config5.signerConstructor || SignatureV4; + const SignerCtor = config4.signerConstructor || SignatureV4; return new SignerCtor(params); }; } - const resolvedConfig = Object.assign(config5, { + const resolvedConfig = Object.assign(config4, { systemClockOffset, signingEscapePath, signer, - disableClockSkewCorrection: normalizeProvider4(config5.disableClockSkewCorrection ?? defaultDisableClockSkewCorrection) + disableClockSkewCorrection: normalizeProvider4(config4.disableClockSkewCorrection ?? defaultDisableClockSkewCorrection) }); return resolvedConfig; }; - function normalizeCredentialProvider(config5, { credentials, credentialDefaultProvider }) { + function normalizeCredentialProvider(config4, { credentials, credentialDefaultProvider }) { let credentialsProvider; if (credentials) { if (!credentials?.memoized) { @@ -324349,8 +324649,8 @@ var require_httpAuthSchemes3 = __commonJS((exports) => { } } else { if (credentialDefaultProvider) { - credentialsProvider = normalizeProvider4(credentialDefaultProvider(Object.assign({}, config5, { - parentClientConfig: config5 + credentialsProvider = normalizeProvider4(credentialDefaultProvider(Object.assign({}, config4, { + parentClientConfig: config4 }))); } else { credentialsProvider = async () => { @@ -324361,11 +324661,11 @@ var require_httpAuthSchemes3 = __commonJS((exports) => { credentialsProvider.memoized = true; return credentialsProvider; } - function bindCallerConfig(config5, credentialsProvider) { + function bindCallerConfig(config4, credentialsProvider) { if (credentialsProvider.configBound) { return credentialsProvider; } - const fn3 = async (options4) => credentialsProvider({ ...options4, callerClientConfig: config5 }); + const fn3 = async (options4) => credentialsProvider({ ...options4, callerClientConfig: config4 }); fn3.memoized = credentialsProvider.memoized; fn3.configBound = true; return fn3; @@ -324520,8 +324820,8 @@ var require_dist_cjs10 = __commonJS((exports) => { Object.defineProperty(obj, "__proto__", { value: undefined, writable: true, enumerable: true, configurable: true }); } function parseXML(xml2) { - const state2 = new AwsXmlParser(xml2); - return state2.parse(); + const state = new AwsXmlParser(xml2); + return state.parse(); } class AwsXmlParser { @@ -327619,10 +327919,10 @@ var require_sso_oidc = __commonJS((exports) => { var { streamCollector, NodeHttpHandler: NodeHttpHandler2 } = require_dist_cjs5(); var { AwsRestJsonProtocol } = require_protocols4(); var { Sha256 } = require_checksum(); - var defaultSSOOIDCHttpAuthSchemeParametersProvider = async (config5, context4, input) => { + var defaultSSOOIDCHttpAuthSchemeParametersProvider = async (config4, context4, input) => { return { operation: getSmithyContext(context4).operation, - region: await normalizeProvider4(config5.region)() || (() => { + region: await normalizeProvider4(config4.region)() || (() => { throw new Error("expected `region` to be configured for `aws.auth#sigv4`"); })() }; @@ -327634,9 +327934,9 @@ var require_sso_oidc = __commonJS((exports) => { name: "sso-oauth", region: authParameters.region }, - propertiesExtractor: (config5, context4) => ({ + propertiesExtractor: (config4, context4) => ({ signingProperties: { - config: config5, + config: config4, context: context4 } }) @@ -327660,10 +327960,10 @@ var require_sso_oidc = __commonJS((exports) => { } return options4; }; - var resolveHttpAuthSchemeConfig = (config5) => { - const config_0 = resolveAwsSdkSigV4Config(config5); + var resolveHttpAuthSchemeConfig = (config4) => { + const config_0 = resolveAwsSdkSigV4Config(config4); return Object.assign(config_0, { - authSchemePreference: normalizeProvider4(config5.authSchemePreference ?? []) + authSchemePreference: normalizeProvider4(config4.authSchemePreference ?? []) }); }; var resolveClientEndpointParameters = (options4) => { @@ -328155,16 +328455,16 @@ var require_sso_oidc = __commonJS((exports) => { () => CreateTokenRequest$, () => CreateTokenResponse$ ]; - var getRuntimeConfig$1 = (config5) => { + var getRuntimeConfig$1 = (config4) => { return { apiVersion: "2019-06-10", - base64Decoder: config5?.base64Decoder ?? fromBase64, - base64Encoder: config5?.base64Encoder ?? toBase64, - disableHostPrefix: config5?.disableHostPrefix ?? false, - endpointProvider: config5?.endpointProvider ?? defaultEndpointResolver, - extensions: config5?.extensions ?? [], - httpAuthSchemeProvider: config5?.httpAuthSchemeProvider ?? defaultSSOOIDCHttpAuthSchemeProvider, - httpAuthSchemes: config5?.httpAuthSchemes ?? [ + base64Decoder: config4?.base64Decoder ?? fromBase64, + base64Encoder: config4?.base64Encoder ?? toBase64, + disableHostPrefix: config4?.disableHostPrefix ?? false, + endpointProvider: config4?.endpointProvider ?? defaultEndpointResolver, + extensions: config4?.extensions ?? [], + httpAuthSchemeProvider: config4?.httpAuthSchemeProvider ?? defaultSSOOIDCHttpAuthSchemeProvider, + httpAuthSchemes: config4?.httpAuthSchemes ?? [ { schemeId: "aws.auth#sigv4", identityProvider: (ipc) => ipc.getIdentityProvider("aws.auth#sigv4"), @@ -328176,50 +328476,50 @@ var require_sso_oidc = __commonJS((exports) => { signer: new NoAuthSigner } ], - logger: config5?.logger ?? new NoOpLogger, - protocol: config5?.protocol ?? AwsRestJsonProtocol, - protocolSettings: config5?.protocolSettings ?? { + logger: config4?.logger ?? new NoOpLogger, + protocol: config4?.protocol ?? AwsRestJsonProtocol, + protocolSettings: config4?.protocolSettings ?? { defaultNamespace: "com.amazonaws.ssooidc", errorTypeRegistries, version: "2019-06-10", serviceTarget: "AWSSSOOIDCService" }, - serviceId: config5?.serviceId ?? "SSO OIDC", - sha256: config5?.sha256 ?? Sha256, - urlParser: config5?.urlParser ?? parseUrl5, - utf8Decoder: config5?.utf8Decoder ?? fromUtf85, - utf8Encoder: config5?.utf8Encoder ?? toUtf83 + serviceId: config4?.serviceId ?? "SSO OIDC", + sha256: config4?.sha256 ?? Sha256, + urlParser: config4?.urlParser ?? parseUrl5, + utf8Decoder: config4?.utf8Decoder ?? fromUtf85, + utf8Encoder: config4?.utf8Encoder ?? toUtf83 }; }; - var getRuntimeConfig = (config5) => { + var getRuntimeConfig = (config4) => { emitWarningIfUnsupportedVersion(process.version); - const defaultsMode = resolveDefaultsModeConfig(config5); + const defaultsMode = resolveDefaultsModeConfig(config4); const defaultConfigProvider = () => defaultsMode().then(loadConfigsForDefaultMode); - const clientSharedValues = getRuntimeConfig$1(config5); + const clientSharedValues = getRuntimeConfig$1(config4); emitWarningIfUnsupportedVersion$1(process.version); const loaderConfig = { - profile: config5?.profile, + profile: config4?.profile, logger: clientSharedValues.logger }; return { ...clientSharedValues, - ...config5, + ...config4, runtime: "node", defaultsMode, - authSchemePreference: config5?.authSchemePreference ?? loadConfig6(NODE_AUTH_SCHEME_PREFERENCE_OPTIONS, loaderConfig), - bodyLengthChecker: config5?.bodyLengthChecker ?? calculateBodyLength, - defaultUserAgentProvider: config5?.defaultUserAgentProvider ?? createDefaultUserAgentProvider({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo.version }), - maxAttempts: config5?.maxAttempts ?? loadConfig6(NODE_MAX_ATTEMPT_CONFIG_OPTIONS, config5), - region: config5?.region ?? loadConfig6(NODE_REGION_CONFIG_OPTIONS4, { ...NODE_REGION_CONFIG_FILE_OPTIONS4, ...loaderConfig }), - requestHandler: NodeHttpHandler2.create(config5?.requestHandler ?? defaultConfigProvider), - retryMode: config5?.retryMode ?? loadConfig6({ + authSchemePreference: config4?.authSchemePreference ?? loadConfig6(NODE_AUTH_SCHEME_PREFERENCE_OPTIONS, loaderConfig), + bodyLengthChecker: config4?.bodyLengthChecker ?? calculateBodyLength, + defaultUserAgentProvider: config4?.defaultUserAgentProvider ?? createDefaultUserAgentProvider({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo.version }), + maxAttempts: config4?.maxAttempts ?? loadConfig6(NODE_MAX_ATTEMPT_CONFIG_OPTIONS, config4), + region: config4?.region ?? loadConfig6(NODE_REGION_CONFIG_OPTIONS4, { ...NODE_REGION_CONFIG_FILE_OPTIONS4, ...loaderConfig }), + requestHandler: NodeHttpHandler2.create(config4?.requestHandler ?? defaultConfigProvider), + retryMode: config4?.retryMode ?? loadConfig6({ ...NODE_RETRY_MODE_CONFIG_OPTIONS, default: async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE - }, config5), - streamCollector: config5?.streamCollector ?? streamCollector, - useDualstackEndpoint: config5?.useDualstackEndpoint ?? loadConfig6(NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, loaderConfig), - useFipsEndpoint: config5?.useFipsEndpoint ?? loadConfig6(NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, loaderConfig), - userAgentAppId: config5?.userAgentAppId ?? loadConfig6(NODE_APP_ID_CONFIG_OPTIONS, loaderConfig) + }, config4), + streamCollector: config4?.streamCollector ?? streamCollector, + useDualstackEndpoint: config4?.useDualstackEndpoint ?? loadConfig6(NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, loaderConfig), + useFipsEndpoint: config4?.useFipsEndpoint ?? loadConfig6(NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, loaderConfig), + userAgentAppId: config4?.userAgentAppId ?? loadConfig6(NODE_APP_ID_CONFIG_OPTIONS, loaderConfig) }; }; var getHttpAuthExtensionConfiguration = (runtimeConfig) => { @@ -328252,11 +328552,11 @@ var require_sso_oidc = __commonJS((exports) => { } }; }; - var resolveHttpAuthRuntimeConfig = (config5) => { + var resolveHttpAuthRuntimeConfig = (config4) => { return { - httpAuthSchemes: config5.httpAuthSchemes(), - httpAuthSchemeProvider: config5.httpAuthSchemeProvider(), - credentials: config5.credentials() + httpAuthSchemes: config4.httpAuthSchemes(), + httpAuthSchemeProvider: config4.httpAuthSchemeProvider(), + credentials: config4.credentials() }; }; var resolveRuntimeExtensions = (runtimeConfig, extensions) => { @@ -328289,8 +328589,8 @@ var require_sso_oidc = __commonJS((exports) => { this.middlewareStack.use(getRecursionDetectionPlugin(this.config)); this.middlewareStack.use(getHttpAuthSchemeEndpointRuleSetPlugin(this.config, { httpAuthSchemeParametersProvider: defaultSSOOIDCHttpAuthSchemeParametersProvider, - identityProviderConfigProvider: async (config5) => new DefaultIdentityProviderConfig({ - "aws.auth#sigv4": config5.credentials + identityProviderConfigProvider: async (config4) => new DefaultIdentityProviderConfig({ + "aws.auth#sigv4": config4.credentials }) })); this.middlewareStack.use(getHttpSigningPlugin(this.config)); @@ -328301,7 +328601,7 @@ var require_sso_oidc = __commonJS((exports) => { } var command2 = makeBuilder(commonParams, "AWSSSOOIDCService", "SSOOIDCClient", getEndpointPlugin); var _ep0 = {}; - var _mw0 = (Command3, cs2, config5, o3) => []; + var _mw0 = (Command3, cs2, config4, o3) => []; class CreateTokenCommand extends command2(_ep0, _mw0, "CreateToken", CreateToken$) { } @@ -328529,15 +328829,15 @@ var require_httpAuthSchemes4 = __commonJS((exports) => { }; var validateSigningProperties = async (signingProperties) => { const context4 = throwSigningPropertyError("context", signingProperties.context); - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const authScheme = context4.endpointV2?.properties?.authSchemes?.[0]; - const signerFunction = throwSigningPropertyError("signer", config5.signer); + const signerFunction = throwSigningPropertyError("signer", config4.signer); const signer = await signerFunction(authScheme); const signingRegion = signingProperties?.signingRegion; const signingRegionSet = signingProperties?.signingRegionSet; const signingName = signingProperties?.signingName; return { - config: config5, + config: config4, signer, signingRegion, signingRegionSet, @@ -328551,7 +328851,7 @@ var require_httpAuthSchemes4 = __commonJS((exports) => { throw new Error("The request is not an instance of `HttpRequest` and cannot be signed"); } const validatedProps = await validateSigningProperties(signingProperties); - const { config: config5, signer } = validatedProps; + const { config: config4, signer } = validatedProps; let { signingRegion, signingName } = validatedProps; const handlerExecutionContext = signingProperties.context; if (handlerExecutionContext?.authSchemes?.length ?? 0 > 1) { @@ -328561,14 +328861,14 @@ var require_httpAuthSchemes4 = __commonJS((exports) => { signingName = second?.signingName ?? signingName; } } - const noSkewCorrection = await config5.disableClockSkewCorrection?.() === true; + const noSkewCorrection = await config4.disableClockSkewCorrection?.() === true; signingProperties._disableClockSkewCorrection = noSkewCorrection; if (!noSkewCorrection) { - signingProperties._preRequestSystemClockOffset = config5.systemClockOffset; + signingProperties._preRequestSystemClockOffset = config4.systemClockOffset; signingProperties._requestSentAt = Date.now(); } const signedRequest = await signer.sign(httpRequest2, { - signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config5.systemClockOffset), + signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config4.systemClockOffset), signingRegion, signingService: signingName }); @@ -328580,12 +328880,12 @@ var require_httpAuthSchemes4 = __commonJS((exports) => { if (!signingProperties._disableClockSkewCorrection) { const serverTime = errorException.ServerTime ?? getDateHeader(errorException.$response); if (serverTime) { - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const preRequestOffset = signingProperties._preRequestSystemClockOffset; const timeRequestSent = signingProperties._requestSentAt; const ageHeader = getAgeHeader(errorException.$response); - const newOffset = getUpdatedSystemClockOffset(serverTime, config5.systemClockOffset, timeRequestSent, ageHeader); - config5.systemClockOffset = newOffset; + const newOffset = getUpdatedSystemClockOffset(serverTime, config4.systemClockOffset, timeRequestSent, ageHeader); + config4.systemClockOffset = newOffset; const skewExceedsThreshold = Math.abs(newOffset) >= 240000; const isLocalCorrection = newOffset !== preRequestOffset; const isConcurrentCorrection = preRequestOffset !== undefined && preRequestOffset !== newOffset; @@ -328603,10 +328903,10 @@ var require_httpAuthSchemes4 = __commonJS((exports) => { } const dateHeader = getDateHeader(httpResponse); if (dateHeader) { - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const timeRequestSent = signingProperties._requestSentAt; const ageHeader = getAgeHeader(httpResponse); - config5.systemClockOffset = getUpdatedSystemClockOffset(dateHeader, config5.systemClockOffset, timeRequestSent, ageHeader); + config4.systemClockOffset = getUpdatedSystemClockOffset(dateHeader, config4.systemClockOffset, timeRequestSent, ageHeader); } } } @@ -328617,17 +328917,17 @@ var require_httpAuthSchemes4 = __commonJS((exports) => { if (!HttpRequest6.isInstance(httpRequest2)) { throw new Error("The request is not an instance of `HttpRequest` and cannot be signed"); } - const { config: config5, signer, signingRegion, signingRegionSet, signingName } = await validateSigningProperties(signingProperties); - const configResolvedSigningRegionSet = await config5.sigv4aSigningRegionSet?.(); + const { config: config4, signer, signingRegion, signingRegionSet, signingName } = await validateSigningProperties(signingProperties); + const configResolvedSigningRegionSet = await config4.sigv4aSigningRegionSet?.(); const multiRegionOverride = (configResolvedSigningRegionSet ?? signingRegionSet ?? [signingRegion]).join(","); - const noSkewCorrection = await config5.disableClockSkewCorrection?.() === true; + const noSkewCorrection = await config4.disableClockSkewCorrection?.() === true; signingProperties._disableClockSkewCorrection = noSkewCorrection; if (!noSkewCorrection) { - signingProperties._preRequestSystemClockOffset = config5.systemClockOffset; + signingProperties._preRequestSystemClockOffset = config4.systemClockOffset; signingProperties._requestSentAt = Date.now(); } const signedRequest = await signer.sign(httpRequest2, { - signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config5.systemClockOffset), + signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config4.systemClockOffset), signingRegion: multiRegionOverride, signingService: signingName }); @@ -328656,9 +328956,9 @@ var require_httpAuthSchemes4 = __commonJS((exports) => { }, default: [] }; - var resolveAwsSdkSigV4AConfig = (config5) => { - config5.sigv4aSigningRegionSet = normalizeProvider4(config5.sigv4aSigningRegionSet); - return config5; + var resolveAwsSdkSigV4AConfig = (config4) => { + config4.sigv4aSigningRegionSet = normalizeProvider4(config4.sigv4aSigningRegionSet); + return config4; }; var NODE_SIGV4A_CONFIG_OPTIONS = { environmentVariableSelector(env7) { @@ -328679,21 +328979,21 @@ var require_httpAuthSchemes4 = __commonJS((exports) => { }, default: undefined }; - var bindResolveAwsSdkSigV4Config = (defaultDisableClockSkewCorrection) => (config5) => { - let inputCredentials = config5.credentials; - let isUserSupplied = !!config5.credentials; + var bindResolveAwsSdkSigV4Config = (defaultDisableClockSkewCorrection) => (config4) => { + let inputCredentials = config4.credentials; + let isUserSupplied = !!config4.credentials; let resolvedCredentials = undefined; - Object.defineProperty(config5, "credentials", { + Object.defineProperty(config4, "credentials", { set(credentials) { if (credentials && credentials !== inputCredentials && credentials !== resolvedCredentials) { isUserSupplied = true; } inputCredentials = credentials; - const memoizedProvider = normalizeCredentialProvider(config5, { + const memoizedProvider = normalizeCredentialProvider(config4, { credentials: inputCredentials, - credentialDefaultProvider: config5.credentialDefaultProvider + credentialDefaultProvider: config4.credentialDefaultProvider }); - const boundProvider = bindCallerConfig(config5, memoizedProvider); + const boundProvider = bindCallerConfig(config4, memoizedProvider); if (isUserSupplied && !boundProvider.attributed) { const isCredentialObject = typeof inputCredentials === "object" && inputCredentials !== null; resolvedCredentials = async (options4) => { @@ -328717,66 +329017,66 @@ var require_httpAuthSchemes4 = __commonJS((exports) => { enumerable: true, configurable: true }); - config5.credentials = inputCredentials; - const { signingEscapePath = true, systemClockOffset = config5.systemClockOffset || 0, sha256: sha2562 } = config5; + config4.credentials = inputCredentials; + const { signingEscapePath = true, systemClockOffset = config4.systemClockOffset || 0, sha256: sha2562 } = config4; let signer; - if (config5.signer) { - signer = normalizeProvider4(config5.signer); - } else if (config5.regionInfoProvider) { - signer = () => normalizeProvider4(config5.region)().then(async (region) => [ - await config5.regionInfoProvider(region, { - useFipsEndpoint: await config5.useFipsEndpoint(), - useDualstackEndpoint: await config5.useDualstackEndpoint() + if (config4.signer) { + signer = normalizeProvider4(config4.signer); + } else if (config4.regionInfoProvider) { + signer = () => normalizeProvider4(config4.region)().then(async (region) => [ + await config4.regionInfoProvider(region, { + useFipsEndpoint: await config4.useFipsEndpoint(), + useDualstackEndpoint: await config4.useDualstackEndpoint() }) || {}, region ]).then(([regionInfo, region]) => { const { signingRegion, signingService } = regionInfo; - config5.signingRegion = config5.signingRegion || signingRegion || region; - config5.signingName = config5.signingName || signingService || config5.serviceId; + config4.signingRegion = config4.signingRegion || signingRegion || region; + config4.signingName = config4.signingName || signingService || config4.serviceId; const params = { - ...config5, - credentials: config5.credentials, - region: config5.signingRegion, - service: config5.signingName, + ...config4, + credentials: config4.credentials, + region: config4.signingRegion, + service: config4.signingName, sha256: sha2562, uriEscapePath: signingEscapePath }; - const SignerCtor = config5.signerConstructor || SignatureV4; + const SignerCtor = config4.signerConstructor || SignatureV4; return new SignerCtor(params); }); } else { signer = async (authScheme) => { authScheme = Object.assign({}, { name: "sigv4", - signingName: config5.signingName || config5.defaultSigningName, - signingRegion: await normalizeProvider4(config5.region)(), + signingName: config4.signingName || config4.defaultSigningName, + signingRegion: await normalizeProvider4(config4.region)(), properties: {} }, authScheme); const signingRegion = authScheme.signingRegion; const signingService = authScheme.signingName; - config5.signingRegion = config5.signingRegion || signingRegion; - config5.signingName = config5.signingName || signingService || config5.serviceId; + config4.signingRegion = config4.signingRegion || signingRegion; + config4.signingName = config4.signingName || signingService || config4.serviceId; const params = { - ...config5, - credentials: config5.credentials, - region: config5.signingRegion, - service: config5.signingName, + ...config4, + credentials: config4.credentials, + region: config4.signingRegion, + service: config4.signingName, sha256: sha2562, uriEscapePath: signingEscapePath }; - const SignerCtor = config5.signerConstructor || SignatureV4; + const SignerCtor = config4.signerConstructor || SignatureV4; return new SignerCtor(params); }; } - const resolvedConfig = Object.assign(config5, { + const resolvedConfig = Object.assign(config4, { systemClockOffset, signingEscapePath, signer, - disableClockSkewCorrection: normalizeProvider4(config5.disableClockSkewCorrection ?? defaultDisableClockSkewCorrection) + disableClockSkewCorrection: normalizeProvider4(config4.disableClockSkewCorrection ?? defaultDisableClockSkewCorrection) }); return resolvedConfig; }; - function normalizeCredentialProvider(config5, { credentials, credentialDefaultProvider }) { + function normalizeCredentialProvider(config4, { credentials, credentialDefaultProvider }) { let credentialsProvider; if (credentials) { if (!credentials?.memoized) { @@ -328786,8 +329086,8 @@ var require_httpAuthSchemes4 = __commonJS((exports) => { } } else { if (credentialDefaultProvider) { - credentialsProvider = normalizeProvider4(credentialDefaultProvider(Object.assign({}, config5, { - parentClientConfig: config5 + credentialsProvider = normalizeProvider4(credentialDefaultProvider(Object.assign({}, config4, { + parentClientConfig: config4 }))); } else { credentialsProvider = async () => { @@ -328798,11 +329098,11 @@ var require_httpAuthSchemes4 = __commonJS((exports) => { credentialsProvider.memoized = true; return credentialsProvider; } - function bindCallerConfig(config5, credentialsProvider) { + function bindCallerConfig(config4, credentialsProvider) { if (credentialsProvider.configBound) { return credentialsProvider; } - const fn3 = async (options4) => credentialsProvider({ ...options4, callerClientConfig: config5 }); + const fn3 = async (options4) => credentialsProvider({ ...options4, callerClientConfig: config4 }); fn3.memoized = credentialsProvider.memoized; fn3.configBound = true; return fn3; @@ -328957,8 +329257,8 @@ var require_dist_cjs11 = __commonJS((exports) => { Object.defineProperty(obj, "__proto__", { value: undefined, writable: true, enumerable: true, configurable: true }); } function parseXML(xml2) { - const state2 = new AwsXmlParser(xml2); - return state2.parse(); + const state = new AwsXmlParser(xml2); + return state.parse(); } class AwsXmlParser { @@ -332046,9 +332346,9 @@ function createAwsAuthSigv4HttpAuthOption(authParameters) { name: "awsssoportal", region: authParameters.region }, - propertiesExtractor: (config5, context4) => ({ + propertiesExtractor: (config4, context4) => ({ signingProperties: { - config: config5, + config: config4, context: context4 } }) @@ -332059,10 +332359,10 @@ function createSmithyApiNoAuthHttpAuthOption(authParameters) { schemeId: "smithy.api#noAuth" }; } -var awsEndpointFunctions4, emitWarningIfUnsupportedVersion$1, createDefaultUserAgentProvider, NODE_APP_ID_CONFIG_OPTIONS, getAwsRegionExtensionConfiguration, resolveAwsRegionExtensionConfiguration, resolveUserAgentConfig, resolveHostHeaderConfig, getUserAgentPlugin, getHostHeaderPlugin, getLoggerPlugin, getRecursionDetectionPlugin, NoAuthSigner, getHttpAuthSchemeEndpointRuleSetPlugin, DefaultIdentityProviderConfig, getHttpSigningPlugin, normalizeProvider4, getSmithyContext, ServiceException, NoOpLogger, emitWarningIfUnsupportedVersion, loadConfigsForDefaultMode, getDefaultExtensionConfiguration, resolveDefaultRuntimeConfig, Client, makeBuilder, createAggregatedClient, $Command, resolveDefaultsModeConfig, loadConfig6, NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, NODE_REGION_CONFIG_OPTIONS4, NODE_REGION_CONFIG_FILE_OPTIONS4, resolveRegionConfig4, BinaryDecisionDiagram, EndpointCache, decideEndpoint, customEndpointFunctions4, resolveEndpointConfig, getEndpointPlugin, parseUrl5, getHttpHandlerExtensionConfiguration, resolveHttpHandlerRuntimeConfig, getContentLengthPlugin, DEFAULT_RETRY_MODE, NODE_RETRY_MODE_CONFIG_OPTIONS, NODE_MAX_ATTEMPT_CONFIG_OPTIONS, resolveRetryConfig, getRetryPlugin, TypeRegistry, getSchemaSerdePlugin, resolveAwsSdkSigV4Config, AwsSdkSigV4Signer, NODE_AUTH_SCHEME_PREFERENCE_OPTIONS, toUtf83, fromUtf85, toBase64, fromBase64, calculateBodyLength, streamCollector, NodeHttpHandler2, AwsRestJsonProtocol, Sha256, defaultSSOHttpAuthSchemeParametersProvider = async (config5, context4, input) => { +var awsEndpointFunctions4, emitWarningIfUnsupportedVersion$1, createDefaultUserAgentProvider, NODE_APP_ID_CONFIG_OPTIONS, getAwsRegionExtensionConfiguration, resolveAwsRegionExtensionConfiguration, resolveUserAgentConfig, resolveHostHeaderConfig, getUserAgentPlugin, getHostHeaderPlugin, getLoggerPlugin, getRecursionDetectionPlugin, NoAuthSigner, getHttpAuthSchemeEndpointRuleSetPlugin, DefaultIdentityProviderConfig, getHttpSigningPlugin, normalizeProvider4, getSmithyContext, ServiceException, NoOpLogger, emitWarningIfUnsupportedVersion, loadConfigsForDefaultMode, getDefaultExtensionConfiguration, resolveDefaultRuntimeConfig, Client, makeBuilder, createAggregatedClient, $Command, resolveDefaultsModeConfig, loadConfig6, NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, NODE_REGION_CONFIG_OPTIONS4, NODE_REGION_CONFIG_FILE_OPTIONS4, resolveRegionConfig4, BinaryDecisionDiagram, EndpointCache, decideEndpoint, customEndpointFunctions4, resolveEndpointConfig, getEndpointPlugin, parseUrl5, getHttpHandlerExtensionConfiguration, resolveHttpHandlerRuntimeConfig, getContentLengthPlugin, DEFAULT_RETRY_MODE, NODE_RETRY_MODE_CONFIG_OPTIONS, NODE_MAX_ATTEMPT_CONFIG_OPTIONS, resolveRetryConfig, getRetryPlugin, TypeRegistry, getSchemaSerdePlugin, resolveAwsSdkSigV4Config, AwsSdkSigV4Signer, NODE_AUTH_SCHEME_PREFERENCE_OPTIONS, toUtf83, fromUtf85, toBase64, fromBase64, calculateBodyLength, streamCollector, NodeHttpHandler2, AwsRestJsonProtocol, Sha256, defaultSSOHttpAuthSchemeParametersProvider = async (config4, context4, input) => { return { operation: getSmithyContext(context4).operation, - region: await normalizeProvider4(config5.region)() || (() => { + region: await normalizeProvider4(config4.region)() || (() => { throw new Error("expected `region` to be configured for `aws.auth#sigv4`"); })() }; @@ -332078,10 +332378,10 @@ var awsEndpointFunctions4, emitWarningIfUnsupportedVersion$1, createDefaultUserA } } return options4; -}, resolveHttpAuthSchemeConfig = (config5) => { - const config_0 = resolveAwsSdkSigV4Config(config5); +}, resolveHttpAuthSchemeConfig = (config4) => { + const config_0 = resolveAwsSdkSigV4Config(config4); return Object.assign(config_0, { - authSchemePreference: normalizeProvider4(config5.authSchemePreference ?? []) + authSchemePreference: normalizeProvider4(config4.authSchemePreference ?? []) }); }, resolveClientEndpointParameters = (options4) => { return Object.assign(options4, { @@ -332094,16 +332394,16 @@ var awsEndpointFunctions4, emitWarningIfUnsupportedVersion$1, createDefaultUserA endpointParams, logger: context4.logger })); -}, SSOServiceException, InvalidRequestException, ResourceNotFoundException, TooManyRequestsException, UnauthorizedException, _ATT = "AccessTokenType", _GRC = "GetRoleCredentials", _GRCR = "GetRoleCredentialsRequest", _GRCRe = "GetRoleCredentialsResponse", _IRE = "InvalidRequestException", _RC = "RoleCredentials", _RNFE = "ResourceNotFoundException", _SAKT = "SecretAccessKeyType", _STT = "SessionTokenType", _TMRE = "TooManyRequestsException", _UE = "UnauthorizedException", _aI = "accountId", _aKI = "accessKeyId", _aT = "accessToken", _ai = "account_id", _c2 = "client", _e2 = "error", _ex = "expiration", _h = "http", _hE = "httpError", _hH = "httpHeader", _hQ = "httpQuery", _m = "message", _rC = "roleCredentials", _rN = "roleName", _rn = "role_name", _s2 = "smithy.ts.sdk.synthetic.com.amazonaws.sso", _sAK = "secretAccessKey", _sT = "sessionToken", _xasbt = "x-amz-sso_bearer_token", n0 = "com.amazonaws.sso", _s_registry, SSOServiceException$, n0_registry, InvalidRequestException$, ResourceNotFoundException$, TooManyRequestsException$, UnauthorizedException$, errorTypeRegistries, AccessTokenType, SecretAccessKeyType, SessionTokenType, GetRoleCredentialsRequest$, GetRoleCredentialsResponse$, RoleCredentials$, GetRoleCredentials$, getRuntimeConfig$1 = (config5) => { +}, SSOServiceException, InvalidRequestException, ResourceNotFoundException, TooManyRequestsException, UnauthorizedException, _ATT = "AccessTokenType", _GRC = "GetRoleCredentials", _GRCR = "GetRoleCredentialsRequest", _GRCRe = "GetRoleCredentialsResponse", _IRE = "InvalidRequestException", _RC = "RoleCredentials", _RNFE = "ResourceNotFoundException", _SAKT = "SecretAccessKeyType", _STT = "SessionTokenType", _TMRE = "TooManyRequestsException", _UE = "UnauthorizedException", _aI = "accountId", _aKI = "accessKeyId", _aT = "accessToken", _ai = "account_id", _c2 = "client", _e2 = "error", _ex = "expiration", _h = "http", _hE = "httpError", _hH = "httpHeader", _hQ = "httpQuery", _m = "message", _rC = "roleCredentials", _rN = "roleName", _rn = "role_name", _s2 = "smithy.ts.sdk.synthetic.com.amazonaws.sso", _sAK = "secretAccessKey", _sT = "sessionToken", _xasbt = "x-amz-sso_bearer_token", n0 = "com.amazonaws.sso", _s_registry, SSOServiceException$, n0_registry, InvalidRequestException$, ResourceNotFoundException$, TooManyRequestsException$, UnauthorizedException$, errorTypeRegistries, AccessTokenType, SecretAccessKeyType, SessionTokenType, GetRoleCredentialsRequest$, GetRoleCredentialsResponse$, RoleCredentials$, GetRoleCredentials$, getRuntimeConfig$1 = (config4) => { return { apiVersion: "2019-06-10", - base64Decoder: config5?.base64Decoder ?? fromBase64, - base64Encoder: config5?.base64Encoder ?? toBase64, - disableHostPrefix: config5?.disableHostPrefix ?? false, - endpointProvider: config5?.endpointProvider ?? defaultEndpointResolver, - extensions: config5?.extensions ?? [], - httpAuthSchemeProvider: config5?.httpAuthSchemeProvider ?? defaultSSOHttpAuthSchemeProvider, - httpAuthSchemes: config5?.httpAuthSchemes ?? [ + base64Decoder: config4?.base64Decoder ?? fromBase64, + base64Encoder: config4?.base64Encoder ?? toBase64, + disableHostPrefix: config4?.disableHostPrefix ?? false, + endpointProvider: config4?.endpointProvider ?? defaultEndpointResolver, + extensions: config4?.extensions ?? [], + httpAuthSchemeProvider: config4?.httpAuthSchemeProvider ?? defaultSSOHttpAuthSchemeProvider, + httpAuthSchemes: config4?.httpAuthSchemes ?? [ { schemeId: "aws.auth#sigv4", identityProvider: (ipc) => ipc.getIdentityProvider("aws.auth#sigv4"), @@ -332115,49 +332415,49 @@ var awsEndpointFunctions4, emitWarningIfUnsupportedVersion$1, createDefaultUserA signer: new NoAuthSigner } ], - logger: config5?.logger ?? new NoOpLogger, - protocol: config5?.protocol ?? AwsRestJsonProtocol, - protocolSettings: config5?.protocolSettings ?? { + logger: config4?.logger ?? new NoOpLogger, + protocol: config4?.protocol ?? AwsRestJsonProtocol, + protocolSettings: config4?.protocolSettings ?? { defaultNamespace: "com.amazonaws.sso", errorTypeRegistries, version: "2019-06-10", serviceTarget: "SWBPortalService" }, - serviceId: config5?.serviceId ?? "SSO", - sha256: config5?.sha256 ?? Sha256, - urlParser: config5?.urlParser ?? parseUrl5, - utf8Decoder: config5?.utf8Decoder ?? fromUtf85, - utf8Encoder: config5?.utf8Encoder ?? toUtf83 + serviceId: config4?.serviceId ?? "SSO", + sha256: config4?.sha256 ?? Sha256, + urlParser: config4?.urlParser ?? parseUrl5, + utf8Decoder: config4?.utf8Decoder ?? fromUtf85, + utf8Encoder: config4?.utf8Encoder ?? toUtf83 }; -}, getRuntimeConfig = (config5) => { +}, getRuntimeConfig = (config4) => { emitWarningIfUnsupportedVersion(process.version); - const defaultsMode = resolveDefaultsModeConfig(config5); + const defaultsMode = resolveDefaultsModeConfig(config4); const defaultConfigProvider = () => defaultsMode().then(loadConfigsForDefaultMode); - const clientSharedValues = getRuntimeConfig$1(config5); + const clientSharedValues = getRuntimeConfig$1(config4); emitWarningIfUnsupportedVersion$1(process.version); const loaderConfig = { - profile: config5?.profile, + profile: config4?.profile, logger: clientSharedValues.logger }; return { ...clientSharedValues, - ...config5, + ...config4, runtime: "node", defaultsMode, - authSchemePreference: config5?.authSchemePreference ?? loadConfig6(NODE_AUTH_SCHEME_PREFERENCE_OPTIONS, loaderConfig), - bodyLengthChecker: config5?.bodyLengthChecker ?? calculateBodyLength, - defaultUserAgentProvider: config5?.defaultUserAgentProvider ?? createDefaultUserAgentProvider({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo.version }), - maxAttempts: config5?.maxAttempts ?? loadConfig6(NODE_MAX_ATTEMPT_CONFIG_OPTIONS, config5), - region: config5?.region ?? loadConfig6(NODE_REGION_CONFIG_OPTIONS4, { ...NODE_REGION_CONFIG_FILE_OPTIONS4, ...loaderConfig }), - requestHandler: NodeHttpHandler2.create(config5?.requestHandler ?? defaultConfigProvider), - retryMode: config5?.retryMode ?? loadConfig6({ + authSchemePreference: config4?.authSchemePreference ?? loadConfig6(NODE_AUTH_SCHEME_PREFERENCE_OPTIONS, loaderConfig), + bodyLengthChecker: config4?.bodyLengthChecker ?? calculateBodyLength, + defaultUserAgentProvider: config4?.defaultUserAgentProvider ?? createDefaultUserAgentProvider({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo.version }), + maxAttempts: config4?.maxAttempts ?? loadConfig6(NODE_MAX_ATTEMPT_CONFIG_OPTIONS, config4), + region: config4?.region ?? loadConfig6(NODE_REGION_CONFIG_OPTIONS4, { ...NODE_REGION_CONFIG_FILE_OPTIONS4, ...loaderConfig }), + requestHandler: NodeHttpHandler2.create(config4?.requestHandler ?? defaultConfigProvider), + retryMode: config4?.retryMode ?? loadConfig6({ ...NODE_RETRY_MODE_CONFIG_OPTIONS, default: async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE - }, config5), - streamCollector: config5?.streamCollector ?? streamCollector, - useDualstackEndpoint: config5?.useDualstackEndpoint ?? loadConfig6(NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, loaderConfig), - useFipsEndpoint: config5?.useFipsEndpoint ?? loadConfig6(NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, loaderConfig), - userAgentAppId: config5?.userAgentAppId ?? loadConfig6(NODE_APP_ID_CONFIG_OPTIONS, loaderConfig) + }, config4), + streamCollector: config4?.streamCollector ?? streamCollector, + useDualstackEndpoint: config4?.useDualstackEndpoint ?? loadConfig6(NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, loaderConfig), + useFipsEndpoint: config4?.useFipsEndpoint ?? loadConfig6(NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, loaderConfig), + userAgentAppId: config4?.userAgentAppId ?? loadConfig6(NODE_APP_ID_CONFIG_OPTIONS, loaderConfig) }; }, getHttpAuthExtensionConfiguration = (runtimeConfig) => { const _httpAuthSchemes = runtimeConfig.httpAuthSchemes; @@ -332188,17 +332488,17 @@ var awsEndpointFunctions4, emitWarningIfUnsupportedVersion$1, createDefaultUserA return _credentials; } }; -}, resolveHttpAuthRuntimeConfig = (config5) => { +}, resolveHttpAuthRuntimeConfig = (config4) => { return { - httpAuthSchemes: config5.httpAuthSchemes(), - httpAuthSchemeProvider: config5.httpAuthSchemeProvider(), - credentials: config5.credentials() + httpAuthSchemes: config4.httpAuthSchemes(), + httpAuthSchemeProvider: config4.httpAuthSchemeProvider(), + credentials: config4.credentials() }; }, resolveRuntimeExtensions = (runtimeConfig, extensions) => { const extensionConfiguration = Object.assign(getAwsRegionExtensionConfiguration(runtimeConfig), getDefaultExtensionConfiguration(runtimeConfig), getHttpHandlerExtensionConfiguration(runtimeConfig), getHttpAuthExtensionConfiguration(runtimeConfig)); extensions.forEach((extension2) => extension2.configure(extensionConfiguration)); return Object.assign(runtimeConfig, resolveAwsRegionExtensionConfiguration(extensionConfiguration), resolveDefaultRuntimeConfig(extensionConfiguration), resolveHttpHandlerRuntimeConfig(extensionConfiguration), resolveHttpAuthRuntimeConfig(extensionConfiguration)); -}, SSOClient, command2, _ep0, _mw0 = (Command3, cs2, config5, o3) => [], GetRoleCredentialsCommand, commands2, SSO, $GetRoleCredentialsCommand, $SSOClient; +}, SSOClient, command2, _ep0, _mw0 = (Command3, cs2, config4, o3) => [], GetRoleCredentialsCommand, commands2, SSO, $GetRoleCredentialsCommand, $SSOClient; var init_sso = __esm(() => { ({ awsEndpointFunctions: awsEndpointFunctions4, emitWarningIfUnsupportedVersion: emitWarningIfUnsupportedVersion$1, createDefaultUserAgentProvider, NODE_APP_ID_CONFIG_OPTIONS, getAwsRegionExtensionConfiguration, resolveAwsRegionExtensionConfiguration, resolveUserAgentConfig, resolveHostHeaderConfig, getUserAgentPlugin, getHostHeaderPlugin, getLoggerPlugin, getRecursionDetectionPlugin } = require_client8()); ({ NoAuthSigner, getHttpAuthSchemeEndpointRuleSetPlugin, DefaultIdentityProviderConfig, getHttpSigningPlugin } = require_dist_cjs4()); @@ -332462,8 +332762,8 @@ var init_sso = __esm(() => { this.middlewareStack.use(getRecursionDetectionPlugin(this.config)); this.middlewareStack.use(getHttpAuthSchemeEndpointRuleSetPlugin(this.config, { httpAuthSchemeParametersProvider: defaultSSOHttpAuthSchemeParametersProvider, - identityProviderConfigProvider: async (config5) => new DefaultIdentityProviderConfig({ - "aws.auth#sigv4": config5.credentials + identityProviderConfigProvider: async (config4) => new DefaultIdentityProviderConfig({ + "aws.auth#sigv4": config4.credentials }) })); this.middlewareStack.use(getHttpSigningPlugin(this.config)); @@ -332879,19 +333179,19 @@ var require_client10 = __commonJS((exports) => { exports.REGION_ENV_NAME = REGION_ENV_NAME4; exports.REGION_INI_NAME = REGION_INI_NAME4; exports.resolveRegionConfig = resolveRegionConfig5; - var state2 = { + var state = { warningEmitted: false }; var emitWarningIfUnsupportedVersion2 = (version6) => { - if (version6 && !state2.warningEmitted) { + if (version6 && !state.warningEmitted) { if (process.env.AWS_SDK_JS_NODE_VERSION_SUPPORT_WARNING_DISABLED === "true") { - state2.warningEmitted = true; + state.warningEmitted = true; return; } const userMajorVersion = parseInt(version6.substring(1, version6.indexOf("."))); const vv = 22; if (userMajorVersion < vv) { - state2.warningEmitted = true; + state.warningEmitted = true; process.emitWarning(`NodeVersionSupportWarning: The AWS SDK for JavaScript (v3) versions published after the first week of January 2027 will require node >=${vv}. You are running node ${version6}. @@ -333424,13 +333724,13 @@ More information can be found at: https://a.co/c895JFp`); }; var getUserAgentPrefix = () => selectedUserAgentPrefix; var ACCOUNT_ID_ENDPOINT_REGEX = /\d{12}\.ddb/; - async function checkFeatures(context4, config5, args3) { + async function checkFeatures(context4, config4, args3) { const request3 = args3.request; if (request3?.headers?.["smithy-protocol"] === "rpc-v2-cbor") { setFeature(context4, "PROTOCOL_RPC_V2_CBOR", "M"); } - if (typeof config5.retryStrategy === "function") { - const retryStrategy = await config5.retryStrategy(); + if (typeof config4.retryStrategy === "function") { + const retryStrategy = await config4.retryStrategy(); if (typeof retryStrategy.mode === "string") { switch (retryStrategy.mode) { case RETRY_MODES4.ADAPTIVE: @@ -333442,12 +333742,12 @@ More information can be found at: https://a.co/c895JFp`); } } } - if (typeof config5.accountIdEndpointMode === "function") { + if (typeof config4.accountIdEndpointMode === "function") { const endpointV2 = context4.endpointV2; if (String(endpointV2?.url?.hostname).match(ACCOUNT_ID_ENDPOINT_REGEX)) { setFeature(context4, "ACCOUNT_ID_ENDPOINT", "O"); } - switch (await config5.accountIdEndpointMode?.()) { + switch (await config4.accountIdEndpointMode?.()) { case "disabled": setFeature(context4, "ACCOUNT_ID_MODE_DISABLED", "Q"); break; @@ -333556,9 +333856,9 @@ More information can be found at: https://a.co/c895JFp`); tags: ["SET_USER_AGENT", "USER_AGENT"], override: true }; - var getUserAgentPlugin2 = (config5) => ({ + var getUserAgentPlugin2 = (config4) => ({ applyToStack: (clientStack) => { - clientStack.add(userAgentMiddleware(config5), getUserAgentMiddlewareOptions); + clientStack.add(userAgentMiddleware(config4), getUserAgentMiddlewareOptions); } }); var getRuntimeUserAgentPair = () => { @@ -333581,7 +333881,7 @@ More information can be found at: https://a.co/c895JFp`); }; var createDefaultUserAgentProvider2 = ({ serviceId, clientVersion }) => { const runtimeUserAgentPair = getRuntimeUserAgentPair(); - return async (config5) => { + return async (config4) => { const sections = [ ["aws-sdk-js", clientVersion], ["ua", "2.1"], @@ -333599,7 +333899,7 @@ More information can be found at: https://a.co/c895JFp`); if (env7.AWS_EXECUTION_ENV) { sections.push([`exec-env/${env7.AWS_EXECUTION_ENV}`]); } - const appId = await config5?.userAgentAppId?.(); + const appId = await config4?.userAgentAppId?.(); const resolvedUserAgent = appId ? [...sections, [`app/${appId}`]] : [...sections]; return resolvedUserAgent; }; @@ -333613,7 +333913,7 @@ More information can be found at: https://a.co/c895JFp`); configFileSelector: (profile) => profile[UA_APP_ID_INI_NAME] ?? profile[UA_APP_ID_INI_NAME_DEPRECATED], default: DEFAULT_UA_APP_ID }; - var createUserAgentStringParsingProvider = ({ serviceId, clientVersion }) => async (config5) => { + var createUserAgentStringParsingProvider = ({ serviceId, clientVersion }) => async (config4) => { const module3 = require_es5(); const parse12 = module3.parse ?? module3.default.parse ?? (() => ""); const parsedUA = typeof window !== "undefined" && window?.navigator?.userAgent ? parse12(window.navigator.userAgent) : undefined; @@ -333627,7 +333927,7 @@ More information can be found at: https://a.co/c895JFp`); if (serviceId) { sections.push([`api/${serviceId}`, clientVersion]); } - const appId = await config5?.userAgentAppId?.(); + const appId = await config4?.userAgentAppId?.(); if (appId) { sections.push([`app/${appId}`]); } @@ -333789,7 +334089,7 @@ More information can be found at: https://a.co/c895JFp`); exports.setFeature = setFeature; exports.setPartitionInfo = setPartitionInfo; exports.setTokenFeature = setTokenFeature; - exports.state = state2; + exports.state = state; exports.stsRegionDefaultResolver = stsRegionDefaultResolver; exports.stsRegionWarning = warning; exports.toEndpointV1 = toEndpointV1; @@ -333827,15 +334127,15 @@ var require_httpAuthSchemes5 = __commonJS((exports) => { }; var validateSigningProperties = async (signingProperties) => { const context4 = throwSigningPropertyError("context", signingProperties.context); - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const authScheme = context4.endpointV2?.properties?.authSchemes?.[0]; - const signerFunction = throwSigningPropertyError("signer", config5.signer); + const signerFunction = throwSigningPropertyError("signer", config4.signer); const signer = await signerFunction(authScheme); const signingRegion = signingProperties?.signingRegion; const signingRegionSet = signingProperties?.signingRegionSet; const signingName = signingProperties?.signingName; return { - config: config5, + config: config4, signer, signingRegion, signingRegionSet, @@ -333849,7 +334149,7 @@ var require_httpAuthSchemes5 = __commonJS((exports) => { throw new Error("The request is not an instance of `HttpRequest` and cannot be signed"); } const validatedProps = await validateSigningProperties(signingProperties); - const { config: config5, signer } = validatedProps; + const { config: config4, signer } = validatedProps; let { signingRegion, signingName } = validatedProps; const handlerExecutionContext = signingProperties.context; if (handlerExecutionContext?.authSchemes?.length ?? 0 > 1) { @@ -333859,14 +334159,14 @@ var require_httpAuthSchemes5 = __commonJS((exports) => { signingName = second?.signingName ?? signingName; } } - const noSkewCorrection = await config5.disableClockSkewCorrection?.() === true; + const noSkewCorrection = await config4.disableClockSkewCorrection?.() === true; signingProperties._disableClockSkewCorrection = noSkewCorrection; if (!noSkewCorrection) { - signingProperties._preRequestSystemClockOffset = config5.systemClockOffset; + signingProperties._preRequestSystemClockOffset = config4.systemClockOffset; signingProperties._requestSentAt = Date.now(); } const signedRequest = await signer.sign(httpRequest2, { - signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config5.systemClockOffset), + signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config4.systemClockOffset), signingRegion, signingService: signingName }); @@ -333878,12 +334178,12 @@ var require_httpAuthSchemes5 = __commonJS((exports) => { if (!signingProperties._disableClockSkewCorrection) { const serverTime = errorException.ServerTime ?? getDateHeader(errorException.$response); if (serverTime) { - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const preRequestOffset = signingProperties._preRequestSystemClockOffset; const timeRequestSent = signingProperties._requestSentAt; const ageHeader = getAgeHeader(errorException.$response); - const newOffset = getUpdatedSystemClockOffset(serverTime, config5.systemClockOffset, timeRequestSent, ageHeader); - config5.systemClockOffset = newOffset; + const newOffset = getUpdatedSystemClockOffset(serverTime, config4.systemClockOffset, timeRequestSent, ageHeader); + config4.systemClockOffset = newOffset; const skewExceedsThreshold = Math.abs(newOffset) >= 240000; const isLocalCorrection = newOffset !== preRequestOffset; const isConcurrentCorrection = preRequestOffset !== undefined && preRequestOffset !== newOffset; @@ -333901,10 +334201,10 @@ var require_httpAuthSchemes5 = __commonJS((exports) => { } const dateHeader = getDateHeader(httpResponse); if (dateHeader) { - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const timeRequestSent = signingProperties._requestSentAt; const ageHeader = getAgeHeader(httpResponse); - config5.systemClockOffset = getUpdatedSystemClockOffset(dateHeader, config5.systemClockOffset, timeRequestSent, ageHeader); + config4.systemClockOffset = getUpdatedSystemClockOffset(dateHeader, config4.systemClockOffset, timeRequestSent, ageHeader); } } } @@ -333915,17 +334215,17 @@ var require_httpAuthSchemes5 = __commonJS((exports) => { if (!HttpRequest6.isInstance(httpRequest2)) { throw new Error("The request is not an instance of `HttpRequest` and cannot be signed"); } - const { config: config5, signer, signingRegion, signingRegionSet, signingName } = await validateSigningProperties(signingProperties); - const configResolvedSigningRegionSet = await config5.sigv4aSigningRegionSet?.(); + const { config: config4, signer, signingRegion, signingRegionSet, signingName } = await validateSigningProperties(signingProperties); + const configResolvedSigningRegionSet = await config4.sigv4aSigningRegionSet?.(); const multiRegionOverride = (configResolvedSigningRegionSet ?? signingRegionSet ?? [signingRegion]).join(","); - const noSkewCorrection = await config5.disableClockSkewCorrection?.() === true; + const noSkewCorrection = await config4.disableClockSkewCorrection?.() === true; signingProperties._disableClockSkewCorrection = noSkewCorrection; if (!noSkewCorrection) { - signingProperties._preRequestSystemClockOffset = config5.systemClockOffset; + signingProperties._preRequestSystemClockOffset = config4.systemClockOffset; signingProperties._requestSentAt = Date.now(); } const signedRequest = await signer.sign(httpRequest2, { - signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config5.systemClockOffset), + signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config4.systemClockOffset), signingRegion: multiRegionOverride, signingService: signingName }); @@ -333954,9 +334254,9 @@ var require_httpAuthSchemes5 = __commonJS((exports) => { }, default: [] }; - var resolveAwsSdkSigV4AConfig = (config5) => { - config5.sigv4aSigningRegionSet = normalizeProvider5(config5.sigv4aSigningRegionSet); - return config5; + var resolveAwsSdkSigV4AConfig = (config4) => { + config4.sigv4aSigningRegionSet = normalizeProvider5(config4.sigv4aSigningRegionSet); + return config4; }; var NODE_SIGV4A_CONFIG_OPTIONS = { environmentVariableSelector(env7) { @@ -333977,21 +334277,21 @@ var require_httpAuthSchemes5 = __commonJS((exports) => { }, default: undefined }; - var bindResolveAwsSdkSigV4Config = (defaultDisableClockSkewCorrection) => (config5) => { - let inputCredentials = config5.credentials; - let isUserSupplied = !!config5.credentials; + var bindResolveAwsSdkSigV4Config = (defaultDisableClockSkewCorrection) => (config4) => { + let inputCredentials = config4.credentials; + let isUserSupplied = !!config4.credentials; let resolvedCredentials = undefined; - Object.defineProperty(config5, "credentials", { + Object.defineProperty(config4, "credentials", { set(credentials) { if (credentials && credentials !== inputCredentials && credentials !== resolvedCredentials) { isUserSupplied = true; } inputCredentials = credentials; - const memoizedProvider = normalizeCredentialProvider(config5, { + const memoizedProvider = normalizeCredentialProvider(config4, { credentials: inputCredentials, - credentialDefaultProvider: config5.credentialDefaultProvider + credentialDefaultProvider: config4.credentialDefaultProvider }); - const boundProvider = bindCallerConfig(config5, memoizedProvider); + const boundProvider = bindCallerConfig(config4, memoizedProvider); if (isUserSupplied && !boundProvider.attributed) { const isCredentialObject = typeof inputCredentials === "object" && inputCredentials !== null; resolvedCredentials = async (options4) => { @@ -334015,66 +334315,66 @@ var require_httpAuthSchemes5 = __commonJS((exports) => { enumerable: true, configurable: true }); - config5.credentials = inputCredentials; - const { signingEscapePath = true, systemClockOffset = config5.systemClockOffset || 0, sha256: sha2562 } = config5; + config4.credentials = inputCredentials; + const { signingEscapePath = true, systemClockOffset = config4.systemClockOffset || 0, sha256: sha2562 } = config4; let signer; - if (config5.signer) { - signer = normalizeProvider5(config5.signer); - } else if (config5.regionInfoProvider) { - signer = () => normalizeProvider5(config5.region)().then(async (region) => [ - await config5.regionInfoProvider(region, { - useFipsEndpoint: await config5.useFipsEndpoint(), - useDualstackEndpoint: await config5.useDualstackEndpoint() + if (config4.signer) { + signer = normalizeProvider5(config4.signer); + } else if (config4.regionInfoProvider) { + signer = () => normalizeProvider5(config4.region)().then(async (region) => [ + await config4.regionInfoProvider(region, { + useFipsEndpoint: await config4.useFipsEndpoint(), + useDualstackEndpoint: await config4.useDualstackEndpoint() }) || {}, region ]).then(([regionInfo, region]) => { const { signingRegion, signingService } = regionInfo; - config5.signingRegion = config5.signingRegion || signingRegion || region; - config5.signingName = config5.signingName || signingService || config5.serviceId; + config4.signingRegion = config4.signingRegion || signingRegion || region; + config4.signingName = config4.signingName || signingService || config4.serviceId; const params = { - ...config5, - credentials: config5.credentials, - region: config5.signingRegion, - service: config5.signingName, + ...config4, + credentials: config4.credentials, + region: config4.signingRegion, + service: config4.signingName, sha256: sha2562, uriEscapePath: signingEscapePath }; - const SignerCtor = config5.signerConstructor || SignatureV4; + const SignerCtor = config4.signerConstructor || SignatureV4; return new SignerCtor(params); }); } else { signer = async (authScheme) => { authScheme = Object.assign({}, { name: "sigv4", - signingName: config5.signingName || config5.defaultSigningName, - signingRegion: await normalizeProvider5(config5.region)(), + signingName: config4.signingName || config4.defaultSigningName, + signingRegion: await normalizeProvider5(config4.region)(), properties: {} }, authScheme); const signingRegion = authScheme.signingRegion; const signingService = authScheme.signingName; - config5.signingRegion = config5.signingRegion || signingRegion; - config5.signingName = config5.signingName || signingService || config5.serviceId; + config4.signingRegion = config4.signingRegion || signingRegion; + config4.signingName = config4.signingName || signingService || config4.serviceId; const params = { - ...config5, - credentials: config5.credentials, - region: config5.signingRegion, - service: config5.signingName, + ...config4, + credentials: config4.credentials, + region: config4.signingRegion, + service: config4.signingName, sha256: sha2562, uriEscapePath: signingEscapePath }; - const SignerCtor = config5.signerConstructor || SignatureV4; + const SignerCtor = config4.signerConstructor || SignatureV4; return new SignerCtor(params); }; } - const resolvedConfig = Object.assign(config5, { + const resolvedConfig = Object.assign(config4, { systemClockOffset, signingEscapePath, signer, - disableClockSkewCorrection: normalizeProvider5(config5.disableClockSkewCorrection ?? defaultDisableClockSkewCorrection) + disableClockSkewCorrection: normalizeProvider5(config4.disableClockSkewCorrection ?? defaultDisableClockSkewCorrection) }); return resolvedConfig; }; - function normalizeCredentialProvider(config5, { credentials, credentialDefaultProvider }) { + function normalizeCredentialProvider(config4, { credentials, credentialDefaultProvider }) { let credentialsProvider; if (credentials) { if (!credentials?.memoized) { @@ -334084,8 +334384,8 @@ var require_httpAuthSchemes5 = __commonJS((exports) => { } } else { if (credentialDefaultProvider) { - credentialsProvider = normalizeProvider5(credentialDefaultProvider(Object.assign({}, config5, { - parentClientConfig: config5 + credentialsProvider = normalizeProvider5(credentialDefaultProvider(Object.assign({}, config4, { + parentClientConfig: config4 }))); } else { credentialsProvider = async () => { @@ -334096,11 +334396,11 @@ var require_httpAuthSchemes5 = __commonJS((exports) => { credentialsProvider.memoized = true; return credentialsProvider; } - function bindCallerConfig(config5, credentialsProvider) { + function bindCallerConfig(config4, credentialsProvider) { if (credentialsProvider.configBound) { return credentialsProvider; } - const fn3 = async (options4) => credentialsProvider({ ...options4, callerClientConfig: config5 }); + const fn3 = async (options4) => credentialsProvider({ ...options4, callerClientConfig: config4 }); fn3.memoized = credentialsProvider.memoized; fn3.configBound = true; return fn3; @@ -334387,8 +334687,8 @@ var require_dist_cjs13 = __commonJS((exports) => { Object.defineProperty(obj, "__proto__", { value: undefined, writable: true, enumerable: true, configurable: true }); } function parseXML(xml2) { - const state2 = new AwsXmlParser(xml2); - return state2.parse(); + const state = new AwsXmlParser(xml2); + return state.parse(); } class AwsXmlParser { @@ -337659,22 +337959,22 @@ var require_sts2 = __commonJS((exports) => { })); }; customEndpointFunctions5.aws = awsEndpointFunctions5; - var createEndpointRuleSetHttpAuthSchemeParametersProvider = (defaultHttpAuthSchemeParametersProvider) => async (config5, context4, input) => { + var createEndpointRuleSetHttpAuthSchemeParametersProvider = (defaultHttpAuthSchemeParametersProvider) => async (config4, context4, input) => { if (!input) { throw new Error("Could not find `input` for `defaultEndpointRuleSetHttpAuthSchemeParametersProvider`"); } - const defaultParameters = await defaultHttpAuthSchemeParametersProvider(config5, context4, input); + const defaultParameters = await defaultHttpAuthSchemeParametersProvider(config4, context4, input); const instructionsFn = getSmithyContext2(context4)?.commandInstance?.constructor?.getEndpointParameterInstructions; if (!instructionsFn) { throw new Error(`getEndpointParameterInstructions() is not defined on '${context4.commandName}'`); } - const endpointParameters = await resolveParams(input, { getEndpointParameterInstructions: instructionsFn }, config5); + const endpointParameters = await resolveParams(input, { getEndpointParameterInstructions: instructionsFn }, config4); return Object.assign(defaultParameters, endpointParameters); }; - var _defaultSTSHttpAuthSchemeParametersProvider = async (config5, context4, input) => { + var _defaultSTSHttpAuthSchemeParametersProvider = async (config4, context4, input) => { return { operation: getSmithyContext2(context4).operation, - region: await normalizeProvider5(config5.region)() || (() => { + region: await normalizeProvider5(config4.region)() || (() => { throw new Error("expected `region` to be configured for `aws.auth#sigv4`"); })() }; @@ -337687,9 +337987,9 @@ var require_sts2 = __commonJS((exports) => { name: "sts", region: authParameters.region }, - propertiesExtractor: (config5, context4) => ({ + propertiesExtractor: (config4, context4) => ({ signingProperties: { - config: config5, + config: config4, context: context4 } }) @@ -337702,9 +338002,9 @@ var require_sts2 = __commonJS((exports) => { name: "sts", region: authParameters.region }, - propertiesExtractor: (config5, context4) => ({ + propertiesExtractor: (config4, context4) => ({ signingProperties: { - config: config5, + config: config4, context: context4 } }) @@ -337777,11 +338077,11 @@ var require_sts2 = __commonJS((exports) => { "aws.auth#sigv4a": createAwsAuthSigv4aHttpAuthOption, "smithy.api#noAuth": createSmithyApiNoAuthHttpAuthOption2 }); - var resolveHttpAuthSchemeConfig2 = (config5) => { - const config_0 = resolveAwsSdkSigV4Config2(config5); + var resolveHttpAuthSchemeConfig2 = (config4) => { + const config_0 = resolveAwsSdkSigV4Config2(config4); const config_1 = resolveAwsSdkSigV4AConfig(config_0); return Object.assign(config_1, { - authSchemePreference: normalizeProvider5(config5.authSchemePreference ?? []) + authSchemePreference: normalizeProvider5(config4.authSchemePreference ?? []) }); }; var resolveClientEndpointParameters2 = (options4) => { @@ -338148,16 +338448,16 @@ var require_sts2 = __commonJS((exports) => { () => AssumeRoleWithWebIdentityRequest$, () => AssumeRoleWithWebIdentityResponse$ ]; - var getRuntimeConfig$12 = (config5) => { + var getRuntimeConfig$12 = (config4) => { return { apiVersion: "2011-06-15", - base64Decoder: config5?.base64Decoder ?? fromBase642, - base64Encoder: config5?.base64Encoder ?? toBase642, - disableHostPrefix: config5?.disableHostPrefix ?? false, - endpointProvider: config5?.endpointProvider ?? defaultEndpointResolver2, - extensions: config5?.extensions ?? [], - httpAuthSchemeProvider: config5?.httpAuthSchemeProvider ?? defaultSTSHttpAuthSchemeProvider, - httpAuthSchemes: config5?.httpAuthSchemes ?? [ + base64Decoder: config4?.base64Decoder ?? fromBase642, + base64Encoder: config4?.base64Encoder ?? toBase642, + disableHostPrefix: config4?.disableHostPrefix ?? false, + endpointProvider: config4?.endpointProvider ?? defaultEndpointResolver2, + extensions: config4?.extensions ?? [], + httpAuthSchemeProvider: config4?.httpAuthSchemeProvider ?? defaultSTSHttpAuthSchemeProvider, + httpAuthSchemes: config4?.httpAuthSchemes ?? [ { schemeId: "aws.auth#sigv4", identityProvider: (ipc) => ipc.getIdentityProvider("aws.auth#sigv4"), @@ -338174,45 +338474,45 @@ var require_sts2 = __commonJS((exports) => { signer: new NoAuthSigner2 } ], - logger: config5?.logger ?? new NoOpLogger2, - protocol: config5?.protocol ?? AwsQueryProtocol, - protocolSettings: config5?.protocolSettings ?? { + logger: config4?.logger ?? new NoOpLogger2, + protocol: config4?.protocol ?? AwsQueryProtocol, + protocolSettings: config4?.protocolSettings ?? { defaultNamespace: "com.amazonaws.sts", errorTypeRegistries: errorTypeRegistries2, xmlNamespace: "https://sts.amazonaws.com/doc/2011-06-15/", version: "2011-06-15", serviceTarget: "AWSSecurityTokenServiceV20110615" }, - serviceId: config5?.serviceId ?? "STS", - sha256: config5?.sha256 ?? Sha2562, - signerConstructor: config5?.signerConstructor ?? SignatureV4MultiRegion, - urlParser: config5?.urlParser ?? parseUrl6, - utf8Decoder: config5?.utf8Decoder ?? fromUtf86, - utf8Encoder: config5?.utf8Encoder ?? toUtf84 + serviceId: config4?.serviceId ?? "STS", + sha256: config4?.sha256 ?? Sha2562, + signerConstructor: config4?.signerConstructor ?? SignatureV4MultiRegion, + urlParser: config4?.urlParser ?? parseUrl6, + utf8Decoder: config4?.utf8Decoder ?? fromUtf86, + utf8Encoder: config4?.utf8Encoder ?? toUtf84 }; }; - var getRuntimeConfig2 = (config5) => { + var getRuntimeConfig2 = (config4) => { emitWarningIfUnsupportedVersion2(process.version); - const defaultsMode = resolveDefaultsModeConfig2(config5); + const defaultsMode = resolveDefaultsModeConfig2(config4); const defaultConfigProvider = () => defaultsMode().then(loadConfigsForDefaultMode2); - const clientSharedValues = getRuntimeConfig$12(config5); + const clientSharedValues = getRuntimeConfig$12(config4); emitWarningIfUnsupportedVersion$12(process.version); const loaderConfig = { - profile: config5?.profile, + profile: config4?.profile, logger: clientSharedValues.logger }; return { ...clientSharedValues, - ...config5, + ...config4, runtime: "node", defaultsMode, - authSchemePreference: config5?.authSchemePreference ?? loadConfig7(NODE_AUTH_SCHEME_PREFERENCE_OPTIONS2, loaderConfig), - bodyLengthChecker: config5?.bodyLengthChecker ?? calculateBodyLength2, - defaultUserAgentProvider: config5?.defaultUserAgentProvider ?? createDefaultUserAgentProvider2({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo2.version }), - httpAuthSchemes: config5?.httpAuthSchemes ?? [ + authSchemePreference: config4?.authSchemePreference ?? loadConfig7(NODE_AUTH_SCHEME_PREFERENCE_OPTIONS2, loaderConfig), + bodyLengthChecker: config4?.bodyLengthChecker ?? calculateBodyLength2, + defaultUserAgentProvider: config4?.defaultUserAgentProvider ?? createDefaultUserAgentProvider2({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo2.version }), + httpAuthSchemes: config4?.httpAuthSchemes ?? [ { schemeId: "aws.auth#sigv4", - identityProvider: (ipc) => ipc.getIdentityProvider("aws.auth#sigv4") || (async (idProps) => await config5.credentialDefaultProvider(idProps?.__config || {})()), + identityProvider: (ipc) => ipc.getIdentityProvider("aws.auth#sigv4") || (async (idProps) => await config4.credentialDefaultProvider(idProps?.__config || {})()), signer: new AwsSdkSigV4Signer2 }, { @@ -338226,18 +338526,18 @@ var require_sts2 = __commonJS((exports) => { signer: new NoAuthSigner2 } ], - maxAttempts: config5?.maxAttempts ?? loadConfig7(NODE_MAX_ATTEMPT_CONFIG_OPTIONS2, config5), - region: config5?.region ?? loadConfig7(NODE_REGION_CONFIG_OPTIONS5, { ...NODE_REGION_CONFIG_FILE_OPTIONS5, ...loaderConfig }), - requestHandler: NodeHttpHandler3.create(config5?.requestHandler ?? defaultConfigProvider), - retryMode: config5?.retryMode ?? loadConfig7({ + maxAttempts: config4?.maxAttempts ?? loadConfig7(NODE_MAX_ATTEMPT_CONFIG_OPTIONS2, config4), + region: config4?.region ?? loadConfig7(NODE_REGION_CONFIG_OPTIONS5, { ...NODE_REGION_CONFIG_FILE_OPTIONS5, ...loaderConfig }), + requestHandler: NodeHttpHandler3.create(config4?.requestHandler ?? defaultConfigProvider), + retryMode: config4?.retryMode ?? loadConfig7({ ...NODE_RETRY_MODE_CONFIG_OPTIONS2, default: async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE2 - }, config5), - sigv4aSigningRegionSet: config5?.sigv4aSigningRegionSet ?? loadConfig7(NODE_SIGV4A_CONFIG_OPTIONS, loaderConfig), - streamCollector: config5?.streamCollector ?? streamCollector2, - useDualstackEndpoint: config5?.useDualstackEndpoint ?? loadConfig7(NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS2, loaderConfig), - useFipsEndpoint: config5?.useFipsEndpoint ?? loadConfig7(NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS2, loaderConfig), - userAgentAppId: config5?.userAgentAppId ?? loadConfig7(NODE_APP_ID_CONFIG_OPTIONS2, loaderConfig) + }, config4), + sigv4aSigningRegionSet: config4?.sigv4aSigningRegionSet ?? loadConfig7(NODE_SIGV4A_CONFIG_OPTIONS, loaderConfig), + streamCollector: config4?.streamCollector ?? streamCollector2, + useDualstackEndpoint: config4?.useDualstackEndpoint ?? loadConfig7(NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS2, loaderConfig), + useFipsEndpoint: config4?.useFipsEndpoint ?? loadConfig7(NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS2, loaderConfig), + userAgentAppId: config4?.userAgentAppId ?? loadConfig7(NODE_APP_ID_CONFIG_OPTIONS2, loaderConfig) }; }; var getHttpAuthExtensionConfiguration2 = (runtimeConfig) => { @@ -338270,11 +338570,11 @@ var require_sts2 = __commonJS((exports) => { } }; }; - var resolveHttpAuthRuntimeConfig2 = (config5) => { + var resolveHttpAuthRuntimeConfig2 = (config4) => { return { - httpAuthSchemes: config5.httpAuthSchemes(), - httpAuthSchemeProvider: config5.httpAuthSchemeProvider(), - credentials: config5.credentials() + httpAuthSchemes: config4.httpAuthSchemes(), + httpAuthSchemeProvider: config4.httpAuthSchemeProvider(), + credentials: config4.credentials() }; }; var resolveRuntimeExtensions2 = (runtimeConfig, extensions) => { @@ -338307,9 +338607,9 @@ var require_sts2 = __commonJS((exports) => { this.middlewareStack.use(getRecursionDetectionPlugin2(this.config)); this.middlewareStack.use(getHttpAuthSchemeEndpointRuleSetPlugin2(this.config, { httpAuthSchemeParametersProvider: defaultSTSHttpAuthSchemeParametersProvider, - identityProviderConfigProvider: async (config5) => new DefaultIdentityProviderConfig2({ - "aws.auth#sigv4": config5.credentials, - "aws.auth#sigv4a": config5.credentials + identityProviderConfigProvider: async (config4) => new DefaultIdentityProviderConfig2({ + "aws.auth#sigv4": config4.credentials, + "aws.auth#sigv4a": config4.credentials }) })); this.middlewareStack.use(getHttpSigningPlugin2(this.config)); @@ -338320,7 +338620,7 @@ var require_sts2 = __commonJS((exports) => { } var command3 = makeBuilder2(commonParams2, "AWSSecurityTokenServiceV20110615", "STSClient", getEndpointPlugin2); var _ep02 = {}; - var _mw02 = (Command3, cs2, config5, o4) => []; + var _mw02 = (Command3, cs2, config4, o4) => []; class AssumeRoleCommand extends command3(_ep02, _mw02, "AssumeRole", AssumeRole$) { } @@ -338438,8 +338738,8 @@ var require_sts2 = __commonJS((exports) => { return baseCtor; else return class CustomizableSTSClient extends baseCtor { - constructor(config5) { - super(config5); + constructor(config4) { + super(config4); for (const customization of customizations) { this.middlewareStack.use(customization); } @@ -338900,14 +339200,14 @@ function parseAiGatewayOptions(options4) { return headers; } var __defProp5, __defNormalProp2 = (obj, key, value8) => (key in obj) ? __defProp5(obj, key, { enumerable: true, configurable: true, writable: true, value: value8 }) : obj[key] = value8, __publicField = (obj, key, value8) => __defNormalProp2(obj, typeof key !== "symbol" ? key + "" : key, value8), CF_TEMP_TOKEN = "CF_TEMP_TOKEN", providers, AiGatewayInternalFetchError, AiGatewayDoesNotExist, AiGatewayUnauthorizedError, AiGatewayChatLanguageModel = class { - constructor(models, config5) { + constructor(models, config4) { __publicField(this, "specificationVersion", "v3"); __publicField(this, "defaultObjectGenerationMode", "json"); __publicField(this, "supportedUrls", {}); __publicField(this, "models"); __publicField(this, "config"); this.models = models; - this.config = config5; + this.config = config4; } get modelId() { if (!this.models[0]) { @@ -339685,7 +339985,7 @@ var init_loaders = __esm(async () => { }); // packages/unifia/src/provider/provider.ts -import path30 from "path"; +import path31 from "path"; var import_fuzzysort, Provider3; var init_provider2 = __esm(async () => { init_zod(); @@ -339915,12 +340215,12 @@ var init_provider2 = __esm(async () => { } Provider.fromModelsDevProvider = fromModelsDevProvider; const layer11 = exports_Layer.effect(Service3, exports_Effect.gen(function* () { - const config5 = yield* Config.Service; + const config4 = yield* Config.Service; const auth = yield* Auth.Service; const plugin = yield* Plugin.Service; - const state2 = yield* InstanceState.make(() => exports_Effect.gen(function* () { + const state = yield* InstanceState.make(() => exports_Effect.gen(function* () { using _3 = log12.time("state"); - const cfg = yield* config5.get(); + const cfg = yield* config4.get(); const modelsDev = yield* exports_Effect.promise(() => ModelsDev.get()); const database = i4(modelsDev, fromModelsDevProvider); const providers2 = {}; @@ -339931,7 +340231,7 @@ var init_provider2 = __esm(async () => { const discoveryLoaders = {}; const dep = { auth: (id2) => auth.get(id2).pipe(exports_Effect.orDie), - config: () => config5.get() + config: () => config4.get() }; log12.info("init"); function mergeProvider(providerID, provider) { @@ -340188,10 +340488,10 @@ var init_provider2 = __esm(async () => { }; })); const unsubscribeRefresh = ModelsDev.onRefresh(async () => { - await exports_Effect.runPromise(InstanceState.invalidateAll(state2)); + await exports_Effect.runPromise(InstanceState.invalidateAll(state)); }); yield* exports_Effect.addFinalizer(() => exports_Effect.sync(unsubscribeRefresh)); - const list2 = exports_Effect.fn("Provider.list")(() => InstanceState.use(state2, (s5) => s5.providers)); + const list2 = exports_Effect.fn("Provider.list")(() => InstanceState.use(state, (s5) => s5.providers)); async function resolveSDK(model, s5) { try { using _3 = log12.time("getSDK", { @@ -340313,9 +340613,9 @@ var init_provider2 = __esm(async () => { throw new Provider.InitError({ providerID: model.providerID }, { cause: e3 }); } } - const getProvider2 = exports_Effect.fn("Provider.getProvider")((providerID) => InstanceState.use(state2, (s5) => s5.providers[providerID])); + const getProvider2 = exports_Effect.fn("Provider.getProvider")((providerID) => InstanceState.use(state, (s5) => s5.providers[providerID])); const getModel2 = exports_Effect.fn("Provider.getModel")(function* (providerID, modelID) { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); const provider = s5.providers[providerID]; if (!provider) { const available3 = Object.keys(s5.providers); @@ -340331,7 +340631,7 @@ var init_provider2 = __esm(async () => { return info3; }); const getLanguage2 = exports_Effect.fn("Provider.getLanguage")(function* (model) { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); const key = `${model.providerID}/${model.id}`; if (s5.models.has(key)) return s5.models.get(key); @@ -340366,7 +340666,7 @@ var init_provider2 = __esm(async () => { }); }); const closest2 = exports_Effect.fn("Provider.closest")(function* (providerID, query2) { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); const provider = s5.providers[providerID]; if (!provider) return; @@ -340379,12 +340679,12 @@ var init_provider2 = __esm(async () => { return; }); const getSmallModel2 = exports_Effect.fn("Provider.getSmallModel")(function* (providerID) { - const cfg = yield* config5.get(); + const cfg = yield* config4.get(); if (cfg.small_model) { const parsed = parseModel(cfg.small_model); return yield* getModel2(parsed.providerID, parsed.modelID); } - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); const provider = s5.providers[providerID]; if (!provider) return; @@ -340432,11 +340732,11 @@ var init_provider2 = __esm(async () => { return; }); const defaultModel2 = exports_Effect.fn("Provider.defaultModel")(function* () { - const cfg = yield* config5.get(); + const cfg = yield* config4.get(); if (cfg.model) return parseModel(cfg.model); - const s5 = yield* InstanceState.get(state2); - const recent = yield* exports_Effect.promise(() => Filesystem.readJson(path30.join(Global.Path.state, "model.json")).then((x3) => Array.isArray(x3.recent) ? x3.recent : []).catch(() => [])); + const s5 = yield* InstanceState.get(state); + const recent = yield* exports_Effect.promise(() => Filesystem.readJson(path31.join(Global.Path.state, "model.json")).then((x3) => Array.isArray(x3.recent) ? x3.recent : []).catch(() => [])); for (const entry of recent) { const provider2 = s5.providers[entry.providerID]; if (!provider2) @@ -340601,15 +340901,15 @@ var init_schema8 = __esm(() => { }); // packages/unifia/src/tool/truncation-dir.ts -import path31 from "path"; +import path33 from "path"; var TRUNCATION_DIR; var init_truncation_dir = __esm(async () => { await init_global(); - TRUNCATION_DIR = path31.join(Global.Path.data, "tool-output"); + TRUNCATION_DIR = path33.join(Global.Path.data, "tool-output"); }); // packages/unifia/src/tool/truncate.ts -import path33 from "path"; +import path35 from "path"; var Truncate; var init_truncate = __esm(async () => { init_dist8(); @@ -340629,7 +340929,7 @@ var init_truncate = __esm(async () => { Truncate.MAX_LINES = 2000; Truncate.MAX_BYTES = 50 * 1024; Truncate.DIR = TRUNCATION_DIR; - Truncate.GLOB = path33.join(TRUNCATION_DIR, "*"); + Truncate.GLOB = path35.join(TRUNCATION_DIR, "*"); function hasTaskTool(agent) { if (!agent?.permission) return false; @@ -340647,7 +340947,7 @@ var init_truncate = __esm(async () => { for (const entry of entries10) { if (Identifier.timestamp(entry) >= cutoff) continue; - yield* fs15.remove(path33.join(TRUNCATION_DIR, entry)).pipe(exports_Effect.catch(() => exports_Effect.void)); + yield* fs15.remove(path35.join(TRUNCATION_DIR, entry)).pipe(exports_Effect.catch(() => exports_Effect.void)); } }); const output3 = exports_Effect.fn("Truncate.output")(function* (text7, options4 = {}, agent) { @@ -340689,7 +340989,7 @@ var init_truncate = __esm(async () => { const unit = hitBytes ? "bytes" : "lines"; const preview = out2.join(` `); - const file6 = path33.join(TRUNCATION_DIR, ToolID.ascending()); + const file6 = path35.join(TRUNCATION_DIR, ToolID.ascending()); yield* fs15.ensureDir(TRUNCATION_DIR).pipe(exports_Effect.orDie); yield* fs15.writeFileString(file6, text7).pipe(exports_Effect.orDie); const hint = hasTaskTool(agent) ? `The tool call succeeded but the output was truncated. Full output saved to: ${file6} @@ -341299,22 +341599,22 @@ var init_permission = __esm(async () => { Permission.Service = Service3; Permission.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const bus = yield* Bus.Service; - const state2 = yield* InstanceState.make(exports_Effect.fn("Permission.state")(function* (ctx) { + const state = yield* InstanceState.make(exports_Effect.fn("Permission.state")(function* (ctx) { const row = Database.use((db2) => db2.select().from(PermissionTable).where(eq(PermissionTable.project_id, ctx.project.id)).get()); - const state3 = { + const state2 = { pending: new Map, approved: row?.data ?? [] }; yield* exports_Effect.addFinalizer(() => exports_Effect.gen(function* () { - for (const item of state3.pending.values()) { + for (const item of state2.pending.values()) { yield* exports_Deferred.fail(item.deferred, new RejectedError); } - state3.pending.clear(); + state2.pending.clear(); })); - return state3; + return state2; })); const ask2 = exports_Effect.fn("Permission.ask")(function* (input) { - const { approved, pending: pending2 } = yield* InstanceState.get(state2); + const { approved, pending: pending2 } = yield* InstanceState.get(state); const { ruleset, ...request3 } = input; let needsAsk = false; for (const pattern of request3.patterns) { @@ -341345,7 +341645,7 @@ var init_permission = __esm(async () => { })); }); const reply2 = exports_Effect.fn("Permission.reply")(function* (input) { - const { approved, pending: pending2 } = yield* InstanceState.get(state2); + const { approved, pending: pending2 } = yield* InstanceState.get(state); const existing = pending2.get(input.requestID); if (!existing) return; @@ -341416,7 +341716,7 @@ var init_permission = __esm(async () => { } }); const list2 = exports_Effect.fn("Permission.list")(function* () { - const pending2 = (yield* InstanceState.get(state2)).pending; + const pending2 = (yield* InstanceState.get(state)).pending; return Array.from(pending2.values(), (item) => item.info); }); return Service3.of({ ask: ask2, reply: reply2, list: list2 }); @@ -341608,7 +341908,7 @@ var init_discovery = __esm(async () => { // packages/unifia/src/skill/index.ts import fs_native from "fs/promises"; import os12 from "os"; -import path35 from "path"; +import path36 from "path"; import { pathToFileURL as pathToFileURL5 } from "url"; var import_gray_matter2, Skill; var init_skill = __esm(async () => { @@ -341652,7 +341952,7 @@ var init_skill = __esm(async () => { expected: zod_default.string(), actual: zod_default.string() })); - const add11 = exports_Effect.fnUntraced(function* (state2, match17, bus) { + const add11 = exports_Effect.fnUntraced(function* (state, match17, bus) { const md = yield* exports_Effect.tryPromise({ try: () => ConfigMarkdown.parse(match17), catch: (err2) => err2 @@ -341668,22 +341968,22 @@ var init_skill = __esm(async () => { const parsed = Skill.Info.pick({ name: true, description: true }).safeParse(md.data); if (!parsed.success) return; - if (state2.skills[parsed.data.name]) { + if (state.skills[parsed.data.name]) { log12.warn("duplicate skill name", { name: parsed.data.name, - existing: state2.skills[parsed.data.name].location, + existing: state.skills[parsed.data.name].location, duplicate: match17 }); } - state2.dirs.add(path35.dirname(match17)); - state2.skills[parsed.data.name] = { + state.dirs.add(path36.dirname(match17)); + state.skills[parsed.data.name] = { name: parsed.data.name, description: parsed.data.description, location: match17, content: md.content }; }); - const scan5 = exports_Effect.fnUntraced(function* (state2, bus, root2, pattern, opts) { + const scan5 = exports_Effect.fnUntraced(function* (state, bus, root2, pattern, opts) { const matches = yield* exports_Effect.tryPromise({ try: () => Glob.scan(pattern, { cwd: root2, @@ -341699,46 +341999,46 @@ var init_skill = __esm(async () => { log12.error(`failed to scan ${opts.scope} skills`, { dir: root2, error: error49 }); return exports_Effect.succeed([]); })); - yield* exports_Effect.forEach(matches, (match17) => add11(state2, match17, bus), { + yield* exports_Effect.forEach(matches, (match17) => add11(state, match17, bus), { concurrency: "unbounded", discard: true }); }); - const loadSkills = exports_Effect.fnUntraced(function* (state2, config5, discovery, bus, fsys, directory, worktree) { + const loadSkills = exports_Effect.fnUntraced(function* (state, config4, discovery, bus, fsys, directory, worktree) { if (!Flag.UNIFIA_DISABLE_EXTERNAL_SKILLS) { for (const dir2 of EXTERNAL_DIRS) { - const root2 = path35.join(Global.Path.home, dir2); + const root2 = path36.join(Global.Path.home, dir2); if (!(yield* fsys.isDir(root2))) continue; - yield* scan5(state2, bus, root2, EXTERNAL_SKILL_PATTERN, { dot: true, scope: "global" }); + yield* scan5(state, bus, root2, EXTERNAL_SKILL_PATTERN, { dot: true, scope: "global" }); } const upDirs = yield* fsys.up({ targets: EXTERNAL_DIRS, start: directory, stop: worktree }).pipe(exports_Effect.catch(() => exports_Effect.succeed([]))); for (const root2 of upDirs) { - yield* scan5(state2, bus, root2, EXTERNAL_SKILL_PATTERN, { dot: true, scope: "project" }); + yield* scan5(state, bus, root2, EXTERNAL_SKILL_PATTERN, { dot: true, scope: "project" }); } } - const configDirs = yield* config5.directories(); + const configDirs = yield* config4.directories(); for (const dir2 of configDirs) { - yield* scan5(state2, bus, dir2, OPENCODE_SKILL_PATTERN); + yield* scan5(state, bus, dir2, OPENCODE_SKILL_PATTERN); } - const cfg = yield* config5.get(); + const cfg = yield* config4.get(); for (const item of cfg.skills?.paths ?? []) { - const expanded = item.startsWith("~/") ? path35.join(os12.homedir(), item.slice(2)) : item; - const dir2 = path35.isAbsolute(expanded) ? expanded : path35.join(directory, expanded); + const expanded = item.startsWith("~/") ? path36.join(os12.homedir(), item.slice(2)) : item; + const dir2 = path36.isAbsolute(expanded) ? expanded : path36.join(directory, expanded); if (!(yield* fsys.isDir(dir2))) { log12.warn("skill path not found", { path: dir2 }); continue; } - yield* scan5(state2, bus, dir2, SKILL_PATTERN); + yield* scan5(state, bus, dir2, SKILL_PATTERN); } for (const url4 of cfg.skills?.urls ?? []) { const pulledDirs = yield* discovery.pull(url4); for (const dir2 of pulledDirs) { - state2.dirs.add(dir2); - yield* scan5(state2, bus, dir2, SKILL_PATTERN); + state.dirs.add(dir2); + yield* scan5(state, bus, dir2, SKILL_PATTERN); } } - log12.info("init", { count: Object.keys(state2.skills).length }); + log12.info("init", { count: Object.keys(state.skills).length }); }); class Service3 extends exports_ServiceMap.Service()("@opencode/Skill") { @@ -341746,35 +342046,35 @@ var init_skill = __esm(async () => { Skill.Service = Service3; Skill.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const discovery = yield* Discovery.Service; - const config5 = yield* Config.Service; + const config4 = yield* Config.Service; const bus = yield* Bus.Service; const fsys = yield* AppFileSystem.Service; - const state2 = yield* InstanceState.make(exports_Effect.fn("Skill.state")(function* (ctx) { + const state = yield* InstanceState.make(exports_Effect.fn("Skill.state")(function* (ctx) { const s5 = { skills: {}, dirs: new Set }; - yield* loadSkills(s5, config5, discovery, bus, fsys, ctx.directory, ctx.worktree); + yield* loadSkills(s5, config4, discovery, bus, fsys, ctx.directory, ctx.worktree); return s5; })); const get35 = exports_Effect.fn("Skill.get")(function* (name26) { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); return s5.skills[name26]; }); const all8 = exports_Effect.fn("Skill.all")(function* () { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); return Object.values(s5.skills); }); const dirs2 = exports_Effect.fn("Skill.dirs")(function* () { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); return Array.from(s5.dirs); }); const available4 = exports_Effect.fn("Skill.available")(function* (agent) { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); const list = Object.values(s5.skills).toSorted((a5, b3) => a5.name.localeCompare(b3.name)); if (!agent) return list; return list.filter((skill) => Permission2.evaluate("skill", skill.name, agent.permission).action !== "deny"); }); const install2 = exports_Effect.fn("Skill.install")(function* (url4) { - const globalSkillsDir = path35.join(Global.Path.home, ".claude", "skills"); + const globalSkillsDir = path36.join(Global.Path.home, ".claude", "skills"); const fail19 = (message) => exports_Effect.fail(new Error(`[skill install] ${message}`)); const isDirectMd = url4.endsWith(".md") || url4.toLowerCase().includes("skill.md"); if (isDirectMd) { @@ -341797,21 +342097,21 @@ var init_skill = __esm(async () => { if (!parsed.success) return yield* fail19("champs `name` ou `description` manquants dans le frontmatter"); const { name: name26, description } = parsed.data; - const dest = path35.join(globalSkillsDir, name26, "SKILL.md"); + const dest = path36.join(globalSkillsDir, name26, "SKILL.md"); const body3 = parsed_matter.content.trim(); - yield* exports_Effect.tryPromise(() => fs_native.mkdir(path35.dirname(dest), { recursive: true })); + yield* exports_Effect.tryPromise(() => fs_native.mkdir(path36.dirname(dest), { recursive: true })); yield* exports_Effect.tryPromise(() => fs_native.writeFile(dest, content, "utf8")); const info3 = { name: name26, description, location: dest, content: body3 }; - const s6 = yield* InstanceState.get(state2); + const s6 = yield* InstanceState.get(state); s6.skills[name26] = info3; - s6.dirs.add(path35.dirname(dest)); + s6.dirs.add(path36.dirname(dest)); log12.info("skill installed", { name: name26, url: url4 }); return info3; } const dirs3 = yield* discovery.pull(url4); if (dirs3.length === 0) return yield* fail19("aucun skill trouv\xE9 \xE0 cette URL"); - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); let lastInfo; for (const dir2 of dirs3) { yield* scan5(s5, bus, dir2, SKILL_PATTERN); @@ -341824,12 +342124,12 @@ var init_skill = __esm(async () => { return lastInfo; }); const uninstall2 = exports_Effect.fn("Skill.uninstall")(function* (name26) { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); const skill = s5.skills[name26]; if (!skill) return; - const globalSkillsDir = path35.join(Global.Path.home, ".claude", "skills"); - const skillDir = path35.dirname(skill.location); + const globalSkillsDir = path36.join(Global.Path.home, ".claude", "skills"); + const skillDir = path36.dirname(skill.location); if (skillDir.startsWith(globalSkillsDir)) { yield* exports_Effect.tryPromise({ try: () => fs_native.rm(skillDir, { recursive: true, force: true }), @@ -341893,7 +342193,7 @@ var init_skill = __esm(async () => { }); // packages/unifia/src/agent/agent.ts -import path36 from "path"; +import path37 from "path"; var Agent2; var init_agent = __esm(async () => { init_zod(); @@ -341960,14 +342260,14 @@ var init_agent = __esm(async () => { } Agent.Service = Service3; Agent.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { - const config5 = yield* Config.Service; + const config4 = yield* Config.Service; const auth = yield* Auth.Service; const skill = yield* Skill.Service; const provider = yield* Provider3.Service; - const state2 = yield* InstanceState.make(exports_Effect.fn("Agent.state")(function* (_ctx) { - const cfg = yield* config5.get(); + const state = yield* InstanceState.make(exports_Effect.fn("Agent.state")(function* (_ctx) { + const cfg = yield* config4.get(); const skillDirs = yield* skill.dirs(); - const whitelistedDirs = [Truncate.GLOB, ...skillDirs.map((dir2) => path36.join(dir2, "*"))]; + const whitelistedDirs = [Truncate.GLOB, ...skillDirs.map((dir2) => path37.join(dir2, "*"))]; const defaults3 = Permission2.fromConfig({ "*": "allow", doom_loop: "ask", @@ -342030,12 +342330,12 @@ var init_agent = __esm(async () => { question: "allow", plan_exit: "allow", external_directory: { - [path36.join(Global.Path.data, "plans", "*")]: "allow" + [path37.join(Global.Path.data, "plans", "*")]: "allow" }, edit: { "*": "deny", - [path36.join(".opencode", "plans", "*.md")]: "allow", - [path36.relative(Instance.worktree, path36.join(Global.Path.data, path36.join("plans", "*.md")))]: "allow" + [path37.join(".opencode", "plans", "*.md")]: "allow", + [path37.relative(Instance.worktree, path37.join(Global.Path.data, path37.join("plans", "*.md")))]: "allow" } }), user), mode: "primary", @@ -342257,11 +342557,11 @@ var init_agent = __esm(async () => { return agents[agent]; }); const list2 = exports_Effect.fnUntraced(function* () { - const cfg2 = yield* config5.get(); + const cfg2 = yield* config4.get(); return C3(agents, r(), a2([(x3) => cfg2.default_agent ? x3.name === cfg2.default_agent : x3.name === "build", "desc"], [(x3) => x3.name, "asc"])); }); const defaultAgent2 = exports_Effect.fnUntraced(function* () { - const c3 = yield* config5.get(); + const c3 = yield* config4.get(); if (c3.default_agent) { const agent = agents[c3.default_agent]; if (agent && agent.mode !== "subagent" && agent.hidden !== true) @@ -342281,22 +342581,22 @@ var init_agent = __esm(async () => { })); return Service3.of({ get: exports_Effect.fn("Agent.get")(function* (agent) { - return yield* InstanceState.useEffect(state2, (s5) => s5.get(agent)); + return yield* InstanceState.useEffect(state, (s5) => s5.get(agent)); }), list: exports_Effect.fn("Agent.list")(function* () { - return yield* InstanceState.useEffect(state2, (s5) => s5.list()); + return yield* InstanceState.useEffect(state, (s5) => s5.list()); }), defaultAgent: exports_Effect.fn("Agent.defaultAgent")(function* () { - return yield* InstanceState.useEffect(state2, (s5) => s5.defaultAgent()); + return yield* InstanceState.useEffect(state, (s5) => s5.defaultAgent()); }), generate: exports_Effect.fn("Agent.generate")(function* (input) { - const cfg = yield* config5.get(); + const cfg = yield* config4.get(); const model = input.model ?? (yield* provider.defaultModel()); const resolved = yield* provider.getModel(model.providerID, model.modelID); const language = yield* provider.getLanguage(resolved); const system = [generate_default]; yield* exports_Effect.promise(() => Plugin.trigger("experimental.chat.system.transform", { model: resolved }, { system })); - const existing = yield* InstanceState.useEffect(state2, (s5) => s5.list()); + const existing = yield* InstanceState.useEffect(state, (s5) => s5.list()); const params = { experimental_telemetry: { isEnabled: cfg.experimental?.openTelemetry, @@ -342993,7 +343293,7 @@ var init_auto_config = __esm(() => { }); // packages/unifia/src/local-llm-server/index.ts -import path37 from "path"; +import path38 from "path"; import os14 from "os"; import fs15 from "fs"; import net from "net"; @@ -343002,16 +343302,16 @@ function resolveTmpDir() { if (envTmp && envTmp.trim()) return envTmp.trim(); if (process.env.HOME) - return path37.join(process.env.HOME, ".cache", "tmp"); + return path38.join(process.env.HOME, ".cache", "tmp"); return os14.tmpdir(); } function initPaths() { if (_pathsReady) return; - BASE_DIR = path37.join(resolveTmpDir(), `opencode-llm-${PORT}`); - REF_DIR = path37.join(BASE_DIR, "refs"); - OWNER_FILE = path37.join(BASE_DIR, "owner.pid"); - LOCK_FILE = path37.join(BASE_DIR, "start.lock"); + BASE_DIR = path38.join(resolveTmpDir(), `opencode-llm-${PORT}`); + REF_DIR = path38.join(BASE_DIR, "refs"); + OWNER_FILE = path38.join(BASE_DIR, "owner.pid"); + LOCK_FILE = path38.join(BASE_DIR, "start.lock"); _pathsReady = true; } function recordRestart() { @@ -343074,21 +343374,21 @@ var init_local_llm_server = __esm(async () => { const isDev = true; const names = isDev ? ["ai.opencode.desktop.dev", "ai.opencode.desktop"] : ["ai.opencode.desktop", "ai.opencode.desktop.dev"]; if (process.platform === "win32") { - const appdata = process.env.APPDATA ?? path37.join(home, "AppData", "Roaming"); - return names.map((n10) => path37.join(appdata, n10)); + const appdata = process.env.APPDATA ?? path38.join(home, "AppData", "Roaming"); + return names.map((n10) => path38.join(appdata, n10)); } if (process.platform === "darwin") { - return names.map((n10) => path37.join(home, "Library", "Application Support", n10)); + return names.map((n10) => path38.join(home, "Library", "Application Support", n10)); } - return names.map((n10) => path37.join(home, ".local", "share", n10)); + return names.map((n10) => path38.join(home, ".local", "share", n10)); } async function findRuntimeDir() { const envDir = process.env.OPENCODE_LLAMA_RUNTIME_DIR; - if (envDir && fs15.existsSync(path37.join(envDir, exeName()))) + if (envDir && fs15.existsSync(path38.join(envDir, exeName()))) return envDir; for (const candidate of candidateDirs()) { - const runtime4 = path37.join(candidate, "llama-runtime"); - if (fs15.existsSync(path37.join(runtime4, exeName()))) + const runtime4 = path38.join(candidate, "llama-runtime"); + if (fs15.existsSync(path38.join(runtime4, exeName()))) return runtime4; } return null; @@ -343097,8 +343397,8 @@ var init_local_llm_server = __esm(async () => { const runtimeDir = await findRuntimeDir(); if (!runtimeDir) return null; - const serverExe = path37.join(runtimeDir, exeName()); - const modelsDir = process.env.OPENCODE_LLAMA_MODELS_DIR ?? path37.join(path37.dirname(runtimeDir), "models"); + const serverExe = path38.join(runtimeDir, exeName()); + const modelsDir = process.env.OPENCODE_LLAMA_MODELS_DIR ?? path38.join(path38.dirname(runtimeDir), "models"); if (!fs15.existsSync(modelsDir)) return null; const files = fs15.readdirSync(modelsDir).filter((f5) => f5.toLowerCase().endsWith(".gguf")); @@ -343113,7 +343413,7 @@ var init_local_llm_server = __esm(async () => { } if (!gguf) return null; - return { serverExe, modelPath: path37.join(modelsDir, gguf), modelFile: gguf }; + return { serverExe, modelPath: path38.join(modelsDir, gguf), modelFile: gguf }; } function isPortOpen() { return new Promise((resolve11) => { @@ -343148,7 +343448,7 @@ var init_local_llm_server = __esm(async () => { return null; const data2 = await res.json(); const raw3 = data2.default_generation_settings?.model ?? data2.model_path ?? null; - return raw3 ? path37.basename(raw3) : null; + return raw3 ? path38.basename(raw3) : null; } catch { return null; } @@ -343165,7 +343465,7 @@ var init_local_llm_server = __esm(async () => { } function refPath(pid = process.pid) { initPaths(); - return path37.join(REF_DIR, `${pid}.ref`); + return path38.join(REF_DIR, `${pid}.ref`); } function registerRef() { if (_refRegistered) @@ -343200,7 +343500,7 @@ var init_local_llm_server = __esm(async () => { const pid = parseInt(entry.replace(/\.ref$/, ""), 10); if (!Number.isInteger(pid) || pid <= 0) { try { - fs15.unlinkSync(path37.join(REF_DIR, entry)); + fs15.unlinkSync(path38.join(REF_DIR, entry)); } catch {} continue; } @@ -343208,7 +343508,7 @@ var init_local_llm_server = __esm(async () => { alive.push(entry); } else { try { - fs15.unlinkSync(path37.join(REF_DIR, entry)); + fs15.unlinkSync(path38.join(REF_DIR, entry)); } catch {} } } @@ -343353,7 +343653,7 @@ var init_local_llm_server = __esm(async () => { kv_cache_type: kvCache, context_size: ctxSize }; - fs15.writeFileSync(path37.join(BASE_DIR, "llm_config.json"), JSON.stringify(shared3)); + fs15.writeFileSync(path38.join(BASE_DIR, "llm_config.json"), JSON.stringify(shared3)); } catch (e3) { log18.warn("Failed to write shared llm_config.json", { err: String(e3) }); } @@ -343385,7 +343685,7 @@ var init_local_llm_server = __esm(async () => { "--mmap", "--slots", "--slot-save-path", - path37.join(BASE_DIR, "kv-slots"), + path38.join(BASE_DIR, "kv-slots"), "--cache-reuse", "256", "--swa-full" @@ -343393,7 +343693,7 @@ var init_local_llm_server = __esm(async () => { if (useFit) args3.push("--fit", "on", "-fitt", "512", "-fitc", "16384"); try { - fs15.mkdirSync(path37.join(BASE_DIR, "kv-slots"), { recursive: true }); + fs15.mkdirSync(path38.join(BASE_DIR, "kv-slots"), { recursive: true }); } catch (e3) { log18.warn("Failed to create kv-slots dir", { err: String(e3) }); } @@ -343402,10 +343702,10 @@ var init_local_llm_server = __esm(async () => { if (env7 && fs15.existsSync(env7)) return env7; try { - const dir2 = path37.dirname(modelPath); + const dir2 = path38.dirname(modelPath); const candidates = fs15.readdirSync(dir2).filter((f5) => f5.toLowerCase().endsWith(".gguf")).filter((f5) => /(-0\.?5b-|-draft)/i.test(f5)); if (candidates.length > 0) - return path37.join(dir2, candidates[0]); + return path38.join(dir2, candidates[0]); } catch {} return null; })(); @@ -343415,13 +343715,13 @@ var init_local_llm_server = __esm(async () => { if (vramHeadroomMb >= 4096 || force) { args3.push("--model-draft", draftPath, "--draft-max", "16", "--draft-min", "5"); log18.info("speculative decoding enabled", { - draft: path37.basename(draftPath), + draft: path38.basename(draftPath), vramHeadroomMb, forced: force }); } else { log18.warn("skipping speculative decoding: insufficient VRAM headroom", { - draft: path37.basename(draftPath), + draft: path38.basename(draftPath), modelSizeMb, vramMb: profile.vramMb, vramHeadroomMb, @@ -343596,14 +343896,14 @@ ${stderrBuf.read() || ""}`); if (!home) return null; try { - const name26 = fs15.readFileSync(path37.join(path37.dirname(home), "llm_ipc", "blocked"), "utf8").trim(); + const name26 = fs15.readFileSync(path38.join(path38.dirname(home), "llm_ipc", "blocked"), "utf8").trim(); return name26 ? { name: name26 } : null; } catch { return null; } } async function ensureRunning(modelID, signal) { - if (process.env.OPENCODE_CLIENT === "mobile-embedded") { + if (process.env.UNIFIA_CLIENT === "mobile-embedded") { const blockedMsg = (m3) => `[LocalLLMServer] Mobile JNI model load is blocked: ${m3.name} crashed the app repeatedly while loading. Select a smaller model in Settings.`; let blocked = readMobileBlockedMarker(); if (blocked) @@ -343736,7 +344036,7 @@ var init_selection = __esm(async () => { return selection; } TeamSelectionStore.set = set25; - async function snapshot4(sessionID) { + async function snapshot3(sessionID) { const existing = await getSession(sessionID); if (existing) return existing; @@ -343746,7 +344046,7 @@ var init_selection = __esm(async () => { await set25(sessionID, selection); return selection; } - TeamSelectionStore.snapshot = snapshot4; + TeamSelectionStore.snapshot = snapshot3; })(TeamSelectionStore ||= {}); }); @@ -349023,10 +349323,10 @@ var init_stream_adapter = () => {}; // node_modules/@zip.js/zip.js/lib/core/configuration.js function getConfiguration() { - return config5; + return config4; } -function getChunkSize(config6) { - return Math.max(config6.chunkSize, MINIMUM_CHUNK_SIZE); +function getChunkSize(config5) { + return Math.max(config5.chunkSize, MINIMUM_CHUNK_SIZE); } function configure(configuration) { const { @@ -349049,40 +349349,40 @@ function configure(configuration) { setIfDefined("useCompressionStream", useCompressionStream); setIfDefined("useWebWorkers", useWebWorkers); if (Deflate2) { - config5.CompressionStream = new StreamAdapter2(Deflate2); + config4.CompressionStream = new StreamAdapter2(Deflate2); } if (Inflate2) { - config5.DecompressionStream = new StreamAdapter2(Inflate2); + config4.DecompressionStream = new StreamAdapter2(Inflate2); } setIfDefined("CompressionStream", CompressionStream2); setIfDefined("DecompressionStream", DecompressionStream2); if (workerScripts !== UNDEFINED_VALUE) { const { deflate, inflate } = workerScripts; if (deflate || inflate) { - if (!config5.workerScripts) { - config5.workerScripts = {}; + if (!config4.workerScripts) { + config4.workerScripts = {}; } } if (deflate) { if (!Array.isArray(deflate)) { throw new Error("workerScripts.deflate must be an array"); } - config5.workerScripts.deflate = deflate; + config4.workerScripts.deflate = deflate; } if (inflate) { if (!Array.isArray(inflate)) { throw new Error("workerScripts.inflate must be an array"); } - config5.workerScripts.inflate = inflate; + config4.workerScripts.inflate = inflate; } } } function setIfDefined(propertyName, propertyValue) { if (propertyValue !== UNDEFINED_VALUE) { - config5[propertyName] = propertyValue; + config4[propertyName] = propertyValue; } } -var MINIMUM_CHUNK_SIZE = 64, maxWorkers = 2, DEFAULT_CONFIGURATION, config5; +var MINIMUM_CHUNK_SIZE = 64, maxWorkers = 2, DEFAULT_CONFIGURATION, config4; var init_configuration = __esm(() => { init_constants5(); init_stream_adapter(); @@ -349101,7 +349401,7 @@ var init_configuration = __esm(() => { CompressionStreamNative: typeof CompressionStream != UNDEFINED_TYPE && CompressionStream, DecompressionStreamNative: typeof DecompressionStream != UNDEFINED_TYPE && DecompressionStream }; - config5 = Object.assign({}, DEFAULT_CONFIGURATION); + config4 = Object.assign({}, DEFAULT_CONFIGURATION); }); // node_modules/@zip.js/zip.js/lib/core/util/default-mime-type.js @@ -351764,7 +352064,7 @@ var MESSAGE_EVENT_TYPE = "message", MESSAGE_START = "start", MESSAGE_PULL = "pul var init_codec_stream = __esm(() => { init_zip_entry_stream(); CodecStream = class CodecStream extends TransformStream { - constructor(options4, config6) { + constructor(options4, config5) { super({}); const codec4 = this; const { codecType } = options4; @@ -351776,7 +352076,7 @@ var init_codec_stream = __esm(() => { } let outputSize = 0; let inputSize = 0; - const stream4 = new Stream6(options4, config6); + const stream4 = new Stream6(options4, config5); const readable = super.readable; const inputSizeStream = new TransformStream({ transform(chunk, controller) { @@ -351846,11 +352146,11 @@ var init_codec_stream = __esm(() => { // node_modules/@zip.js/zip.js/lib/core/codec-worker.js class CodecWorker { - constructor(workerData, { readable, writable }, { options: options4, config: config6, streamOptions, useWebWorkers, transferStreams, scripts }, onTaskFinished) { + constructor(workerData, { readable, writable }, { options: options4, config: config5, streamOptions, useWebWorkers, transferStreams, scripts }, onTaskFinished) { const { signal } = streamOptions; Object.assign(workerData, { busy: true, - readable: readable.pipeThrough(new ChunkStream(config6.chunkSize)).pipeThrough(new ProgressWatcherStream(readable, streamOptions), { signal }), + readable: readable.pipeThrough(new ChunkStream(config5.chunkSize)).pipeThrough(new ProgressWatcherStream(readable, streamOptions), { signal }), writable, options: Object.assign({}, options4), scripts, @@ -351883,7 +352183,7 @@ class CodecWorker { onTaskFinished(workerData); } }); - return (useWebWorkers && WEB_WORKERS_SUPPORTED ? createWebWorkerInterface : createWorkerInterface)(workerData, config6); + return (useWebWorkers && WEB_WORKERS_SUPPORTED ? createWebWorkerInterface : createWorkerInterface)(workerData, config5); } } async function callHandler(handler, ...parameters) { @@ -351891,20 +352191,20 @@ async function callHandler(handler, ...parameters) { await handler(...parameters); } catch (_3) {} } -function createWorkerInterface(workerData, config6) { +function createWorkerInterface(workerData, config5) { return { - run: () => runWorker(workerData, config6) + run: () => runWorker(workerData, config5) }; } -function createWebWorkerInterface(workerData, config6) { - const { baseURL, chunkSize } = config6; +function createWebWorkerInterface(workerData, config5) { + const { baseURL, chunkSize } = config5; if (!workerData.interface) { let worker; try { worker = getWebWorker(workerData.scripts[0], baseURL, workerData); } catch (_3) { WEB_WORKERS_SUPPORTED = false; - return createWorkerInterface(workerData, config6); + return createWorkerInterface(workerData, config5); } Object.assign(workerData, { worker, @@ -351915,9 +352215,9 @@ function createWebWorkerInterface(workerData, config6) { } return workerData.interface; } -async function runWorker({ options: options4, readable, writable, onTaskFinished }, config6) { +async function runWorker({ options: options4, readable, writable, onTaskFinished }, config5) { try { - const codecStream = new CodecStream(options4, config6); + const codecStream = new CodecStream(options4, config5); await readable.pipeThrough(codecStream).pipeTo(writable, { preventClose: true, preventAbort: true }); const { signature, @@ -351933,7 +352233,7 @@ async function runWorker({ options: options4, readable, writable, onTaskFinished onTaskFinished(); } } -async function runWebWorker(workerData, config6) { +async function runWebWorker(workerData, config5) { let resolveResult, rejectResult; const result6 = new Promise((resolve11, reject) => { resolveResult = resolve11; @@ -351952,7 +352252,7 @@ async function runWebWorker(workerData, config6) { type: MESSAGE_START, scripts: scripts.slice(1), options: options4, - config: config6, + config: config5, readable, writable }, workerData); @@ -352128,14 +352428,14 @@ var init_codec_worker = __esm(() => { // node_modules/@zip.js/zip.js/lib/core/codec-pool.js async function runWorker2(stream4, workerOptions) { - const { options: options4, config: config6 } = workerOptions; + const { options: options4, config: config5 } = workerOptions; const { transferStreams, useWebWorkers, useCompressionStream, codecType, compressed, signed, encrypted } = options4; - const { workerScripts, maxWorkers: maxWorkers2 } = config6; + const { workerScripts, maxWorkers: maxWorkers2 } = config5; workerOptions.transferStreams = transferStreams || transferStreams === UNDEFINED_VALUE; const streamCopy = !compressed && !signed && !encrypted && !workerOptions.transferStreams; - workerOptions.useWebWorkers = !streamCopy && (useWebWorkers || useWebWorkers === UNDEFINED_VALUE && config6.useWebWorkers); + workerOptions.useWebWorkers = !streamCopy && (useWebWorkers || useWebWorkers === UNDEFINED_VALUE && config5.useWebWorkers); workerOptions.scripts = workerOptions.useWebWorkers && workerScripts ? workerScripts[codecType] : []; - options4.useCompressionStream = useCompressionStream || useCompressionStream === UNDEFINED_VALUE && config6.useCompressionStream; + options4.useCompressionStream = useCompressionStream || useCompressionStream === UNDEFINED_VALUE && config5.useCompressionStream; return (await getWorker()).run(); async function getWorker() { const workerData = pool.find((workerData2) => !workerData2.busy); @@ -352164,8 +352464,8 @@ async function runWorker2(stream4, workerOptions) { } } function terminateWorker(workerData, workerOptions) { - const { config: config6 } = workerOptions; - const { terminateWorkerTimeout } = config6; + const { config: config5 } = workerOptions; + const { terminateWorkerTimeout } = config5; if (Number.isFinite(terminateWorkerTimeout) && terminateWorkerTimeout >= 0) { if (workerData.terminated) { workerData.terminated = false; @@ -352536,7 +352836,7 @@ class ZipReader { async* getEntriesGenerator(options4 = {}) { const zipReader = this; let { reader } = zipReader; - const { config: config6 } = zipReader; + const { config: config5 } = zipReader; await initStream(reader); if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) { reader = new BlobReader(await new Response(reader.readable).blob()); @@ -352545,7 +352845,7 @@ class ZipReader { if (reader.size < END_OF_CENTRAL_DIR_LENGTH) { throw new Error(ERR_BAD_FORMAT); } - reader.chunkSize = getChunkSize(config6); + reader.chunkSize = getChunkSize(config5); const endOfDirectoryInfo = await seekSignature(reader, END_OF_CENTRAL_DIR_SIGNATURE, reader.size, END_OF_CENTRAL_DIR_LENGTH, MAX_16_BITS * 16); if (!endOfDirectoryInfo) { const signatureArray = await readUint8Array(reader, 0, 4); @@ -352636,7 +352936,7 @@ class ZipReader { const filenameEncoding = getOptionValue(zipReader, options4, "filenameEncoding"); const commentEncoding = getOptionValue(zipReader, options4, "commentEncoding"); for (let indexFile = 0;indexFile < filesLength; indexFile++) { - const fileEntry = new ZipEntry(reader, config6, zipReader.options); + const fileEntry = new ZipEntry(reader, config5, zipReader.options); if (getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) { throw new Error(ERR_CENTRAL_DIRECTORY_NOT_FOUND); } @@ -352730,10 +353030,10 @@ class ZipReader { } class ZipEntry { - constructor(reader, config6, options4) { + constructor(reader, config5, options4) { Object.assign(this, { reader, - config: config6, + config: config5, options: options4 }); } @@ -352745,7 +353045,7 @@ class ZipEntry { diskNumberStart, extraFieldAES, compressionMethod, - config: config6, + config: config5, bitFlag, signature, rawLastModDate, @@ -352824,7 +353124,7 @@ class ZipEntry { transferStreams: getOptionValue(zipEntry, options4, "transferStreams"), checkPasswordOnly }, - config: config6, + config: config5, streamOptions: { signal, size: size24, onstart, onprogress, onend } }; let outputSize = 0; @@ -353160,7 +353460,7 @@ var init_zip = __esm(() => { }); // packages/unifia/src/file/ripgrep.ts -import path38 from "path"; +import path39 from "path"; import fs17 from "fs/promises"; import { text as text7 } from "stream/consumers"; var Ripgrep; @@ -353262,7 +353562,7 @@ var init_ripgrep = __esm(async () => { url: zod_default.string(), status: zod_default.number() })); - const state2 = lazy2(async () => { + const state = lazy2(async () => { const system = which("rg"); if (system) { const stat4 = await fs17.stat(system).catch(() => { @@ -353272,22 +353572,22 @@ var init_ripgrep = __esm(async () => { return { filepath: system }; log12.warn("bun.which returned invalid rg path", { filepath: system }); } - const filepath2 = path38.join(Global.Path.bin, "rg" + (process.platform === "win32" ? ".exe" : "")); + const filepath2 = path39.join(Global.Path.bin, "rg" + (process.platform === "win32" ? ".exe" : "")); if (!await Filesystem.exists(filepath2)) { const platformKey = `${process.arch}-${process.platform}`; - const config6 = PLATFORM[platformKey]; - if (!config6) + const config5 = PLATFORM[platformKey]; + if (!config5) throw new Ripgrep.UnsupportedPlatformError({ platform: platformKey }); const version6 = "14.1.1"; - const filename = `ripgrep-${version6}-${config6.platform}.${config6.extension}`; + const filename = `ripgrep-${version6}-${config5.platform}.${config5.extension}`; const url4 = `https://github.com/BurntSushi/ripgrep/releases/download/${version6}/${filename}`; const response = await fetch(url4); if (!response.ok) throw new Ripgrep.DownloadFailedError({ url: url4, status: response.status }); const arrayBuffer = await response.arrayBuffer(); - const archivePath = path38.join(Global.Path.bin, filename); + const archivePath = path39.join(Global.Path.bin, filename); await Filesystem.write(archivePath, Buffer.from(arrayBuffer)); - if (config6.extension === "tar.gz") { + if (config5.extension === "tar.gz") { const args3 = ["tar", "-xzf", archivePath, "--strip-components=1"]; if (platformKey.endsWith("-darwin")) args3.push("--include=*/rg"); @@ -353307,7 +353607,7 @@ var init_ripgrep = __esm(async () => { }); } } - if (config6.extension === "zip") { + if (config5.extension === "zip") { const zipFileReader = new ZipReader(new BlobReader(new Blob([arrayBuffer]))); const entries10 = await zipFileReader.getEntries(); let rgEntry; @@ -353342,7 +353642,7 @@ var init_ripgrep = __esm(async () => { }; }); async function filepath() { - const { filepath: filepath2 } = await state2(); + const { filepath: filepath2 } = await state(); return filepath2; } Ripgrep.filepath = filepath; @@ -353409,9 +353709,9 @@ var init_ripgrep = __esm(async () => { } const root2 = { name: "", children: new Map }; for (const file6 of files2) { - if (file6.includes(".opencode")) + if (file6.includes(".opencode") || file6.includes(".unifia")) continue; - const parts3 = file6.split(path38.sep); + const parts3 = file6.split(path39.sep); if (parts3.length < 2) continue; let node = root2; @@ -353477,7 +353777,7 @@ var init_ripgrep = __esm(async () => { }); // packages/unifia/src/session/prompt/anthropic.txt -var anthropic_default = `You are OpenCode, the best coding agent on the planet. +var anthropic_default = `You are Unifia, the best coding agent on the planet. You are an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user. @@ -353486,9 +353786,9 @@ IMPORTANT: You must NEVER generate or guess URLs for the user unless you are con If the user asks for help or wants to give feedback inform them of the following: - ctrl+p to list available actions - To give feedback, users should report the issue at - https://github.com/anomalyco/opencode + https://github.com/Rwanbt/unifia/issues -When the user directly asks about OpenCode (eg. "can OpenCode do...", "does OpenCode have..."), or asks in second person (eg. "are you able...", "can you do..."), or asks how to use a specific OpenCode feature (eg. implement a hook, write a slash command, or install an MCP server), use the WebFetch tool to gather information to answer the question from OpenCode docs. The list of available docs is available at https://opencode.ai/docs +When the user directly asks about Unifia (eg. "can Unifia do...", "does Unifia have..."), or asks in second person (eg. "are you able...", "can you do..."), or asks how to use a specific Unifia feature (eg. implement a hook, write a slash command, or install an MCP server), use the WebFetch tool to gather information to answer the question from the Unifia documentation at https://github.com/Rwanbt/unifia # Tone and style - Only use emojis if the user explicitly requests it. Avoid using emojis in all communication unless asked. @@ -353497,7 +353797,7 @@ When the user directly asks about OpenCode (eg. "can OpenCode do...", "does Open - NEVER create files unless they're absolutely necessary for achieving your goal. ALWAYS prefer editing an existing file to creating a new one. This includes markdown files. # Professional objectivity -Prioritize technical accuracy and truthfulness over validating the user's beliefs. Focus on facts and problem-solving, providing direct, objective technical info without any unnecessary superlatives, praise, or emotional validation. It is best for the user if OpenCode honestly applies the same rigorous standards to all ideas and disagrees when necessary, even if it may not be what the user wants to hear. Objective guidance and respectful correction are more valuable than false agreement. Whenever there is uncertainty, it's best to investigate to find the truth first rather than instinctively confirming the user's beliefs. +Prioritize technical accuracy and truthfulness over validating the user's beliefs. Focus on facts and problem-solving, providing direct, objective technical info without any unnecessary superlatives, praise, or emotional validation. It is best for the user if Unifia honestly applies the same rigorous standards to all ideas and disagrees when necessary, even if it may not be what the user wants to hear. Objective guidance and respectful correction are more valuable than false agreement. Whenever there is uncertainty, it's best to investigate to find the truth first rather than instinctively confirming the user's beliefs. # Task Management You have access to the TodoWrite tools to help you manage and plan tasks. Use these tools VERY frequently to ensure that you are tracking your tasks and giving the user visibility into your progress. @@ -353586,15 +353886,15 @@ assistant: Clients are marked as failed in the \`connectToServer\` function in s var init_anthropic2 = () => {}; // packages/unifia/src/session/prompt/default.txt -var default_default = `You are opencode, an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user. +var default_default = `You are Unifia, an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user. IMPORTANT: You must NEVER generate or guess URLs for the user unless you are confident that the URLs are for helping the user with programming. You may use URLs provided by the user in their messages or local files. If the user asks for help or wants to give feedback inform them of the following: -- /help: Get help with using opencode -- To give feedback, users should report the issue at https://github.com/anomalyco/opencode/issues +- /help: Get help with using Unifia +- To give feedback, users should report the issue at https://github.com/Rwanbt/unifia/issues -When the user directly asks about opencode (eg 'can opencode do...', 'does opencode have...') or asks in second person (eg 'are you able...', 'can you do...'), first use the WebFetch tool to gather information to answer the question from opencode docs at https://opencode.ai +When the user directly asks about Unifia (eg 'can Unifia do...', 'does Unifia have...') or asks in second person (eg 'are you able...', 'can you do...'), first use the WebFetch tool to gather information to answer the question from the Unifia documentation at https://github.com/Rwanbt/unifia # Tone and style You should be concise, direct, and to the point. When you run a non-trivial bash command, you should explain what the command does and why you are running it, to make sure the user understands what you are doing (this is especially important when you are running a command that will make changes to the user's system). @@ -353695,7 +353995,7 @@ assistant: Clients are marked as failed in the \`connectToServer\` function in s var init_default2 = () => {}; // packages/unifia/src/session/prompt/beast.txt -var beast_default = `You are opencode, an agent - please keep going until the user\u2019s query is completely resolved, before ending your turn and yielding back to the user. +var beast_default = `You are Unifia, an agent - please keep going until the user\u2019s query is completely resolved, before ending your turn and yielding back to the user. Your thinking should be thorough and so it's fine if it's very long. However, avoid unnecessary repetition and verbosity. You should be concise, but thorough. @@ -353846,7 +354146,7 @@ You are NEVER allowed to stage and commit files automatically. var init_beast = () => {}; // packages/unifia/src/session/prompt/gemini.txt -var gemini_default = `You are opencode, an interactive CLI agent specializing in software engineering tasks. Your primary goal is to help users safely and efficiently, adhering strictly to the following instructions and utilizing your available tools. +var gemini_default = `You are Unifia, an interactive CLI agent specializing in software engineering tasks. Your primary goal is to help users safely and efficiently, adhering strictly to the following instructions and utilizing your available tools. # Core Mandates @@ -354005,7 +354305,7 @@ Your core function is efficient and safe assistance. Balance extreme conciseness var init_gemini = () => {}; // packages/unifia/src/session/prompt/gpt.txt -var gpt_default = `You are OpenCode, You and the user share the same workspace and collaborate to achieve the user's goals. +var gpt_default = `You are Unifia, You and the user share the same workspace and collaborate to achieve the user's goals. You are a deeply pragmatic, effective software engineer. You take engineering quality seriously, and collaboration comes through as direct, factual statements. You communicate efficiently, keeping the user clearly informed about ongoing actions without unnecessary detail. You build context by examining the codebase first without making assumptions or jumping to conclusions. You think through the nuances of the code you encounter, and embody the mentality of a skilled senior software engineer. @@ -354116,7 +354416,7 @@ For large or complex changes, lead with the solution, then explain what you did var init_gpt = () => {}; // packages/unifia/src/session/prompt/kimi.txt -var kimi_default = `You are OpenCode, an interactive general AI agent running on a user's computer. +var kimi_default = `You are Unifia, an interactive general AI agent running on a user's computer. Your primary goal is to help users with software engineering tasks by taking action \u2014 use the tools available to you to make real changes on the user's system. You should also answer questions when asked. Always adhere strictly to the following system instructions and the user's requirements. @@ -354215,7 +354515,7 @@ At any time, you should be HELPFUL, CONCISE, and ACCURATE. Be thorough in your a var init_kimi = () => {}; // packages/unifia/src/session/prompt/codex.txt -var codex_default = `You are OpenCode, the best coding agent on the planet. +var codex_default = `You are Unifia, the best coding agent on the planet. You are an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user. @@ -354298,7 +354598,7 @@ You are producing plain text that will later be styled by the CLI. Follow these var init_codex2 = () => {}; // packages/unifia/src/session/prompt/trinity.txt -var trinity_default = `You are opencode, an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user. +var trinity_default = `You are Unifia, an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user. # Tone and style You should be concise, direct, and to the point. When you run a non-trivial bash command, you should explain what the command does and why you are running it, to make sure the user understands what you are doing (this is especially important when you are running a command that will make changes to the user's system). @@ -354399,7 +354699,7 @@ assistant: Clients are marked as failed in the \`connectToServer\` function in s var init_trinity = () => {}; // packages/unifia/src/session/prompt/local.txt -var local_default = `You are opencode, a coding CLI tool. Be concise and direct. +var local_default = `You are Unifia, a coding CLI tool. Be concise and direct. Rules: - Run tools to complete tasks, don't just explain @@ -354655,11 +354955,11 @@ var init_lifecycle = __esm(() => { // packages/unifia/src/observability/capture-policy.ts function resolveCapturePolicy(input) { - const config6 = CapturePolicyInputSchema.parse(input ?? {}); + const config5 = CapturePolicyInputSchema.parse(input ?? {}); return { - enabled: config6.enabled === true, - level: config6.captureMode ?? "local_metadata", - userIdHmac: config6.userIdHmac, + enabled: config5.enabled === true, + level: config5.captureMode ?? "local_metadata", + userIdHmac: config5.userIdHmac, policyVersion: 3 }; } @@ -354727,10 +355027,10 @@ var init_event_sql2 = __esm(() => { }); // packages/unifia/src/observability/purge.ts -function resolveRetentionConfig(config6) { +function resolveRetentionConfig(config5) { return { - retentionDays: config6?.retentionDays && config6.retentionDays > 0 ? config6.retentionDays : undefined, - maxEvents: config6?.maxEvents && config6.maxEvents > 0 ? config6.maxEvents : DEFAULT_MAX_EVENTS + retentionDays: config5?.retentionDays && config5.retentionDays > 0 ? config5.retentionDays : undefined, + maxEvents: config5?.maxEvents && config5.maxEvents > 0 ? config5.maxEvents : DEFAULT_MAX_EVENTS }; } function changeCount(result6) { @@ -354749,8 +355049,8 @@ function deleteOldest(where, limit2) { const result6 = Database.use((db2) => db2.delete(ObservabilityEventTable).where(inArray(ObservabilityEventTable.id, ids)).run()); return changeCount(result6); } -function purgeByRetention(config6, now4 = Date.now()) { - const policy = resolveRetentionConfig(config6); +function purgeByRetention(config5, now4 = Date.now()) { + const policy = resolveRetentionConfig(config5); const expiredCutoff = policy.retentionDays === undefined ? undefined : now4 - policy.retentionDays * DAY_MS; const deletedExpired = expiredCutoff === undefined ? 0 : deleteOldest(lt2(ObservabilityEventTable.ts_ms, expiredCutoff), RETENTION_BATCH_SIZE); const total = Database.use((db2) => db2.select({ value: count3() }).from(ObservabilityEventTable).get()?.value ?? 0); @@ -355900,10 +356200,10 @@ var init_export_runner = __esm(() => { // packages/unifia/src/observability/hmac-secret.ts import { chmod as chmod4, mkdir as mkdir4, readFile as readFile5, rename as rename3, writeFile as writeFile7 } from "fs/promises"; -import path39 from "path"; +import path40 from "path"; import { randomBytes as randomBytes6 } from "crypto"; function secretPath(configDirectory = Global.Path.config) { - return path39.join(configDirectory, FILE_NAME); + return path40.join(configDirectory, FILE_NAME); } async function loadOrCreateSecret(configDirectory = Global.Path.config) { const file6 = secretPath(configDirectory); @@ -355945,8 +356245,8 @@ function boot2() { await service3.flush(); }); const purge = Instance.bind(async () => { - const config6 = await Config.get(); - const result6 = purgeByRetention(config6.experimental?.observability); + const config5 = await Config.get(); + const result6 = purgeByRetention(config5.experimental?.observability); if (result6.deletedCount > 0) log21.info("purged retained observability events", result6); if (result6.deletedCount > 0) @@ -355959,8 +356259,8 @@ function boot2() { log21.info("purged expired observability content opt-ins", { expiredOptIns }); }); const runExport = Instance.bind(async () => { - const config6 = await Config.get(); - const obsConfig = config6.experimental?.observability; + const config5 = await Config.get(); + const obsConfig = config5.experimental?.observability; const exporters = ExporterRegistry.from(obsConfig); if (!exporters.length) return; @@ -356009,7 +356309,7 @@ async function shutdown6(runtime4) { await runtime4.service.flush().catch((error49) => log21.warn("observability shutdown flush failed", { error: error49 })); Database.use((db2) => db2.run("PRAGMA wal_checkpoint(TRUNCATE)")); } -var log21, FLUSH_INTERVAL_MS = 250, RETENTION_INTERVAL_MS = 5000, EXPORT_INTERVAL_MS = 5000, EXPORT_BATCH_SIZE = 500, state2, ObservabilityRuntime; +var log21, FLUSH_INTERVAL_MS = 250, RETENTION_INTERVAL_MS = 5000, EXPORT_INTERVAL_MS = 5000, EXPORT_BATCH_SIZE = 500, state, ObservabilityRuntime; var init_runtime = __esm(async () => { init_service(); init_exporter(); @@ -356026,16 +356326,16 @@ var init_runtime = __esm(async () => { init_hmac_secret() ]); log21 = Log.create({ service: "observability" }); - state2 = Instance.state(boot2, shutdown6); + state = Instance.state(boot2, shutdown6); ObservabilityRuntime = { service() { - return state2().service; + return state().service; }, exportStats() { - return state2().lastExportRun; + return state().lastExportRun; }, runExportOnce() { - return state2().runExportOnce(); + return state().runExportOnce(); } }; }); @@ -356756,9 +357056,9 @@ var init_status = __esm(async () => { SessionStatus.Service = Service3; SessionStatus.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const bus = yield* Bus.Service; - const state3 = yield* InstanceState.make(exports_Effect.fn("SessionStatus.state")(() => exports_Effect.succeed(new Map))); + const state2 = yield* InstanceState.make(exports_Effect.fn("SessionStatus.state")(() => exports_Effect.succeed(new Map))); const get35 = exports_Effect.fn("SessionStatus.get")(function* (sessionID) { - const data2 = yield* InstanceState.get(state3); + const data2 = yield* InstanceState.get(state2); const memStatus = data2.get(sessionID); if (memStatus) return memStatus; @@ -356770,10 +357070,10 @@ var init_status = __esm(async () => { return { type: "idle" }; }); const list2 = exports_Effect.fn("SessionStatus.list")(function* () { - return new Map(yield* InstanceState.get(state3)); + return new Map(yield* InstanceState.get(state2)); }); const set26 = exports_Effect.fn("SessionStatus.set")(function* (sessionID, status) { - const data2 = yield* InstanceState.get(state3); + const data2 = yield* InstanceState.get(state2); yield* bus.publish(SessionStatus.Event.Status, { sessionID, status }); persistToDb(sessionID, status); if (status.type === "idle") { @@ -356886,20 +357186,20 @@ var init_question = __esm(async () => { Question.Service = Service3; Question.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const bus = yield* Bus.Service; - const state3 = yield* InstanceState.make(exports_Effect.fn("Question.state")(function* () { - const state4 = { + const state2 = yield* InstanceState.make(exports_Effect.fn("Question.state")(function* () { + const state3 = { pending: new Map }; yield* exports_Effect.addFinalizer(() => exports_Effect.gen(function* () { - for (const item of state4.pending.values()) { + for (const item of state3.pending.values()) { yield* exports_Deferred.fail(item.deferred, new RejectedError); } - state4.pending.clear(); + state3.pending.clear(); })); - return state4; + return state3; })); const ask2 = exports_Effect.fn("Question.ask")(function* (input) { - const pending2 = (yield* InstanceState.get(state3)).pending; + const pending2 = (yield* InstanceState.get(state2)).pending; const id2 = QuestionID.ascending(); log12.info("asking", { id: id2, questions: input.questions.length }); const deferred = yield* exports_Deferred.make(); @@ -356916,7 +357216,7 @@ var init_question = __esm(async () => { })); }); const reply2 = exports_Effect.fn("Question.reply")(function* (input) { - const pending2 = (yield* InstanceState.get(state3)).pending; + const pending2 = (yield* InstanceState.get(state2)).pending; const existing = pending2.get(input.requestID); if (!existing) { log12.warn("reply for unknown request", { requestID: input.requestID }); @@ -356932,7 +357232,7 @@ var init_question = __esm(async () => { yield* exports_Deferred.succeed(existing.deferred, input.answers); }); const reject2 = exports_Effect.fn("Question.reject")(function* (requestID) { - const pending2 = (yield* InstanceState.get(state3)).pending; + const pending2 = (yield* InstanceState.get(state2)).pending; const existing = pending2.get(requestID); if (!existing) { log12.warn("reject for unknown request", { requestID }); @@ -356947,7 +357247,7 @@ var init_question = __esm(async () => { yield* exports_Deferred.fail(existing.deferred, new RejectedError); }); const list2 = exports_Effect.fn("Question.list")(function* () { - const pending2 = (yield* InstanceState.get(state3)).pending; + const pending2 = (yield* InstanceState.get(state2)).pending; return Array.from(pending2.values(), (x3) => x3.info); }); return Service3.of({ ask: ask2, reply: reply2, reject: reject2, list: list2 }); @@ -357043,16 +357343,16 @@ var init_processor = __esm(async () => { SessionProcessor.Service = Service3; SessionProcessor.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const session = yield* Session.Service; - const config6 = yield* Config.Service; + const config5 = yield* Config.Service; const bus = yield* Bus.Service; - const snapshot4 = yield* Snapshot.Service; + const snapshot3 = yield* Snapshot.Service; const agents = yield* Agent2.Service; const llm = yield* LLM.Service; const permission = yield* Permission2.Service; const plugin = yield* Plugin.Service; const status = yield* SessionStatus.Service; const create = exports_Effect.fn("SessionProcessor.create")(function* (input) { - const initialSnapshot = yield* snapshot4.track(); + const initialSnapshot = yield* snapshot3.track(); const ctx = { assistantMessage: input.assistantMessage, sessionID: input.sessionID, @@ -357069,7 +357369,7 @@ var init_processor = __esm(async () => { toolSpans: {} }; let aborted3 = false; - const capturePolicy = resolveCapturePolicy((yield* config6.get()).experimental?.observability); + const capturePolicy = resolveCapturePolicy((yield* config5.get()).experimental?.observability); const observability = capturePolicy.enabled ? ObservabilityRuntime.service() : undefined; const sessionInfo = observability ? yield* session.get(ctx.sessionID).pipe(exports_Effect.orElseSucceed(() => { return; @@ -357358,7 +357658,7 @@ var init_processor = __esm(async () => { throw value8.error; case "start-step": if (!ctx.snapshot) - ctx.snapshot = yield* snapshot4.track(); + ctx.snapshot = yield* snapshot3.track(); yield* session.updatePart({ id: PartID.ascending(), messageID: ctx.assistantMessage.id, @@ -357379,7 +357679,7 @@ var init_processor = __esm(async () => { yield* session.updatePart({ id: PartID.ascending(), reason: value8.finishReason, - snapshot: yield* snapshot4.track(), + snapshot: yield* snapshot3.track(), messageID: ctx.assistantMessage.id, sessionID: ctx.assistantMessage.sessionID, type: "step-finish", @@ -357388,7 +357688,7 @@ var init_processor = __esm(async () => { }); yield* session.updateMessage(ctx.assistantMessage); if (ctx.snapshot) { - const patch3 = yield* snapshot4.patch(ctx.snapshot); + const patch3 = yield* snapshot3.patch(ctx.snapshot); if (patch3.files.length) { yield* session.updatePart({ id: PartID.ascending(), @@ -357405,7 +357705,7 @@ var init_processor = __esm(async () => { sessionID: ctx.sessionID, messageID: ctx.assistantMessage.parentID }); - if (!ctx.assistantMessage.summary && isOverflow({ cfg: yield* config6.get(), tokens: usage2.tokens, model: ctx.model })) { + if (!ctx.assistantMessage.summary && isOverflow({ cfg: yield* config5.get(), tokens: usage2.tokens, model: ctx.model })) { ctx.needsCompaction = true; } return; @@ -357460,7 +357760,7 @@ var init_processor = __esm(async () => { }); const cleanup = exports_Effect.fn("SessionProcessor.cleanup")(function* () { if (ctx.snapshot) { - const patch3 = yield* snapshot4.patch(ctx.snapshot); + const patch3 = yield* snapshot3.patch(ctx.snapshot); if (patch3.files.length) { yield* session.updatePart({ id: PartID.ascending(), @@ -357549,7 +357849,7 @@ var init_processor = __esm(async () => { const process3 = exports_Effect.fn("SessionProcessor.process")(function* (streamInput) { log12.info("process"); ctx.needsCompaction = false; - ctx.shouldBreak = (yield* config6.get()).experimental?.continue_loop_on_deny !== true; + ctx.shouldBreak = (yield* config5.get()).experimental?.continue_loop_on_deny !== true; return yield* exports_Effect.gen(function* () { yield* exports_Effect.gen(function* () { ctx.currentText = undefined; @@ -357664,17 +357964,17 @@ var init_compaction2 = __esm(async () => { SessionCompaction.Service = Service3; SessionCompaction.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const bus = yield* Bus.Service; - const config6 = yield* Config.Service; + const config5 = yield* Config.Service; const session = yield* Session.Service; const agents = yield* Agent2.Service; const plugin = yield* Plugin.Service; const processors = yield* SessionProcessor.Service; const provider = yield* Provider3.Service; const isOverflow3 = exports_Effect.fn("SessionCompaction.isOverflow")(function* (input) { - return isOverflow({ cfg: yield* config6.get(), tokens: input.tokens, model: input.model }); + return isOverflow({ cfg: yield* config5.get(), tokens: input.tokens, model: input.model }); }); const prune2 = exports_Effect.fn("SessionCompaction.prune")(function* (input) { - const cfg = yield* config6.get(); + const cfg = yield* config5.get(); if (cfg.compaction?.prune === false) return; const { pruneMinimum, pruneProtect } = input.model ? getPruneThresholds(input.model) : { pruneMinimum: SessionCompaction.PRUNE_MINIMUM, pruneProtect: SessionCompaction.PRUNE_PROTECT }; @@ -357956,15 +358256,15 @@ When constructing the summary, try to stick to this template: // packages/unifia/src/session/instruction.ts import os15 from "os"; -import path40 from "path"; +import path41 from "path"; function globalFiles() { const files = []; if (Flag.UNIFIA_CONFIG_DIR) { - files.push(path40.join(Flag.UNIFIA_CONFIG_DIR, "AGENTS.md")); + files.push(path41.join(Flag.UNIFIA_CONFIG_DIR, "AGENTS.md")); } - files.push(path40.join(Global.Path.config, "AGENTS.md")); + files.push(path41.join(Global.Path.config, "AGENTS.md")); if (!Flag.UNIFIA_DISABLE_CLAUDE_CODE_PROMPT) { - files.push(path40.join(os15.homedir(), ".claude", "CLAUDE.md")); + files.push(path41.join(os15.homedir(), ".claude", "CLAUDE.md")); } return files; } @@ -358017,7 +358317,7 @@ var init_instruction = __esm(async () => { const cfg = yield* Config.Service; const fs18 = yield* AppFileSystem.Service; const http = exports_HttpClient.filterStatusOk(withTransientReadRetry(yield* exports_HttpClient.HttpClient)); - const state3 = yield* InstanceState.make(exports_Effect.fn("Instruction.state")(() => exports_Effect.succeed({ + const state2 = yield* InstanceState.make(exports_Effect.fn("Instruction.state")(() => exports_Effect.succeed({ claims: new Map }))); const relative4 = exports_Effect.fnUntraced(function* (instruction) { @@ -358041,46 +358341,46 @@ var init_instruction = __esm(async () => { return new TextDecoder().decode(body3); }); const clear13 = exports_Effect.fn("Instruction.clear")(function* (messageID) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); s5.claims.delete(messageID); }); const systemPaths2 = exports_Effect.fn("Instruction.systemPaths")(function* () { - const config6 = yield* cfg.get(); + const config5 = yield* cfg.get(); const paths = new Set; if (!Flag.UNIFIA_DISABLE_PROJECT_CONFIG) { for (const file6 of FILES) { const matches = yield* fs18.findUp(file6, Instance.directory, Instance.worktree); if (matches.length > 0) { - matches.forEach((item) => paths.add(path40.resolve(item))); + matches.forEach((item) => paths.add(path41.resolve(item))); break; } } } for (const file6 of globalFiles()) { if (yield* fs18.existsSafe(file6)) { - paths.add(path40.resolve(file6)); + paths.add(path41.resolve(file6)); break; } } - if (config6.instructions) { - for (const raw3 of config6.instructions) { + if (config5.instructions) { + for (const raw3 of config5.instructions) { if (raw3.startsWith("https://") || raw3.startsWith("http://")) continue; - const instruction = raw3.startsWith("~/") ? path40.join(os15.homedir(), raw3.slice(2)) : raw3; - const matches = yield* (path40.isAbsolute(instruction) ? fs18.glob(path40.basename(instruction), { - cwd: path40.dirname(instruction), + const instruction = raw3.startsWith("~/") ? path41.join(os15.homedir(), raw3.slice(2)) : raw3; + const matches = yield* (path41.isAbsolute(instruction) ? fs18.glob(path41.basename(instruction), { + cwd: path41.dirname(instruction), absolute: true, include: "file" }) : relative4(instruction)).pipe(exports_Effect.catch(() => exports_Effect.succeed([]))); - matches.forEach((item) => paths.add(path40.resolve(item))); + matches.forEach((item) => paths.add(path41.resolve(item))); } } return paths; }); const system = exports_Effect.fn("Instruction.system")(function* () { - const config6 = yield* cfg.get(); + const config5 = yield* cfg.get(); const paths = yield* systemPaths2(); - const urls = (config6.instructions ?? []).filter((item) => item.startsWith("https://") || item.startsWith("http://")); + const urls = (config5.instructions ?? []).filter((item) => item.startsWith("https://") || item.startsWith("http://")); const files = yield* exports_Effect.forEach(Array.from(paths), read3, { concurrency: 8 }); const remote = yield* exports_Effect.forEach(urls, fetch3, { concurrency: 4 }); return [ @@ -358092,7 +358392,7 @@ ${remote[i7]}`] : []) }); const find2 = exports_Effect.fn("Instruction.find")(function* (dir2) { for (const file6 of FILES) { - const filepath = path40.resolve(path40.join(dir2, file6)); + const filepath = path41.resolve(path41.join(dir2, file6)); if (yield* fs18.existsSafe(filepath)) return filepath; } @@ -358101,14 +358401,14 @@ ${remote[i7]}`] : []) const sys = yield* systemPaths2(); const already = extract(messages); const results = []; - const s5 = yield* InstanceState.get(state3); - const target = path40.resolve(filepath); - const root2 = path40.resolve(Instance.directory); - let current = path40.dirname(target); + const s5 = yield* InstanceState.get(state2); + const target = path41.resolve(filepath); + const root2 = path41.resolve(Instance.directory); + let current = path41.dirname(target); while (current.startsWith(root2) && current !== root2) { const found = yield* find2(current); if (!found || found === target || sys.has(found) || already.has(found)) { - current = path40.dirname(current); + current = path41.dirname(current); continue; } let set25 = s5.claims.get(messageID); @@ -358117,7 +358417,7 @@ ${remote[i7]}`] : []) s5.claims.set(messageID, set25); } if (set25.has(found)) { - current = path40.dirname(current); + current = path41.dirname(current); continue; } set25.add(found); @@ -358126,7 +358426,7 @@ ${remote[i7]}`] : []) results.push({ filepath: found, content: `Instructions from: ${found} ${content}` }); } - current = path40.dirname(current); + current = path41.dirname(current); } return results; }); @@ -358282,7 +358582,7 @@ Do NOT call this tool: var init_plan_exit = () => {}; // packages/unifia/src/tool/plan.ts -import path41 from "path"; +import path43 from "path"; async function getLastModel(sessionID) { for await (const item of MessageV2.stream(sessionID)) { if (item.info.role === "user" && item.info.model) @@ -358308,7 +358608,7 @@ var init_plan2 = __esm(async () => { parameters: zod_default.object({}), async execute(_params, ctx) { const session = await Session.get(ctx.sessionID); - const plan = path41.relative(Instance.worktree, Session.plan(session)); + const plan = path43.relative(Instance.worktree, Session.plan(session)); const answers = await Question.ask({ sessionID: ctx.sessionID, questions: [ @@ -361747,7 +362047,7 @@ ${JSON.stringify(symbolNames, null, 2)}`); }); // packages/unifia/src/shell/shell.ts -import path43 from "path"; +import path45 from "path"; import { spawn as spawn3 } from "child_process"; import { setTimeout as sleep8 } from "timers/promises"; var SIGKILL_TIMEOUT_MS = 200, Shell; @@ -361793,7 +362093,7 @@ var init_shell = __esm(async () => { if (process.platform !== "win32") return file6; const shell3 = Filesystem.windowsPath(file6); - if (path43.win32.dirname(shell3) !== ".") { + if (path45.win32.dirname(shell3) !== ".") { if (shell3.startsWith("/") && name26(shell3) === "bash") return gitbash() || shell3; return shell3; @@ -361824,17 +362124,17 @@ var init_shell = __esm(async () => { function gitbash() { if (process.platform !== "win32") return; - if (Flag.OPENCODE_GIT_BASH_PATH) - return Flag.OPENCODE_GIT_BASH_PATH; + if (Flag.UNIFIA_GIT_BASH_PATH) + return Flag.UNIFIA_GIT_BASH_PATH; const git = which("git"); if (!git) return; - let dir2 = path43.dirname(git); + let dir2 = path45.dirname(git); for (let i7 = 0;i7 < 4; i7++) { - const file6 = path43.join(dir2, "bin", "bash.exe"); + const file6 = path45.join(dir2, "bin", "bash.exe"); if (Filesystem.stat(file6)?.size) return file6; - dir2 = path43.dirname(dir2); + dir2 = path45.dirname(dir2); } } Shell.gitbash = gitbash; @@ -361854,8 +362154,8 @@ var init_shell = __esm(async () => { } function name26(file6) { if (process.platform === "win32") - return path43.win32.parse(Filesystem.windowsPath(file6)).name.toLowerCase(); - return path43.basename(file6).toLowerCase(); + return path45.win32.parse(Filesystem.windowsPath(file6)).name.toLowerCase(); + return path45.basename(file6).toLowerCase(); } Shell.name = name26; function login(file6) { @@ -362161,7 +362461,7 @@ var require_tree_sitter_powershell = __commonJS((exports, module2) => { // packages/unifia/src/tool/bash.ts import os16 from "os"; -import path45 from "path"; +import path46 from "path"; import { fileURLToPath as fileURLToPath6 } from "url"; function parts3(node) { const out2 = []; @@ -362204,7 +362504,7 @@ function home(text8) { if (text8 === "~") return os16.homedir(); if (text8.startsWith("~/") || text8.startsWith("~\\")) - return path45.join(os16.homedir(), text8.slice(2)); + return path46.join(os16.homedir(), text8.slice(2)); return text8; } function envValue(key) { @@ -362220,7 +362520,7 @@ function auto2(key, cwd, shell3) { if (name26 === "PWD") return cwd; if (name26 === "PSHOME") - return path45.dirname(shell3); + return path46.dirname(shell3); } function expand3(text8, cwd, shell3) { const out2 = unquote(text8).replace(/\$\{env:([^}]+)\}/gi, (_3, key) => envValue(key) || "").replace(/\$env:([A-Za-z_][A-Za-z0-9_]*)/gi, (_3, key) => envValue(key) || "").replace(/\$(HOME|PWD|PSHOME)(?=$|[\\/])/gi, (_3, key) => auto2(key, cwd, shell3) || ""); @@ -362273,9 +362573,9 @@ async function resolvePath(text8, root2, shell3) { if (file6) return file6; } - return Filesystem.normalizePath(path45.resolve(root2, Filesystem.windowsPath(text8))); + return Filesystem.normalizePath(path46.resolve(root2, Filesystem.windowsPath(text8))); } - return path45.resolve(root2, text8); + return path46.resolve(root2, text8); } async function argPath(arg, cwd, ps2, shell3) { const text8 = ps2 ? expand3(arg, cwd, shell3) : home(unquote(arg)); @@ -362326,7 +362626,7 @@ async function collect6(root2, cwd, ps2, shell3) { log26.info("resolved path", { arg, resolved }); if (!resolved || Instance.containsPath(resolved)) continue; - const dir2 = await Filesystem.isDir(resolved) ? resolved : path45.dirname(resolved); + const dir2 = await Filesystem.isDir(resolved) ? resolved : path46.dirname(resolved); scan5.dirs.add(dir2); } } @@ -362354,8 +362654,8 @@ async function ask(ctx, scan5) { if (scan5.dirs.size > 0) { const globs = Array.from(scan5.dirs).map((dir2) => { if (process.platform === "win32") - return Filesystem.normalizePathPattern(path45.join(dir2, "*")); - return path45.join(dir2, "*"); + return Filesystem.normalizePathPattern(path46.join(dir2, "*")); + return path46.join(dir2, "*"); }); await ctx.ask({ permission: "external_directory", @@ -362389,7 +362689,7 @@ function cmd(shell3, name26, command3, cwd, env7) { detached: false }); } - if (env7["OPENCODE_CLIENT"] === "mobile-embedded" && env7["BASH_ENV"] && (shell3.endsWith("/bash") || shell3.endsWith("\\bash"))) { + if (env7["UNIFIA_CLIENT"] === "mobile-embedded" && env7["BASH_ENV"] && (shell3.endsWith("/bash") || shell3.endsWith("\\bash"))) { return exports_ChildProcess.make(shell3, ["--init-file", env7["BASH_ENV"], "-c", command3], { cwd, env: env7, @@ -362708,8 +363008,8 @@ Output: Creates directory 'foo'`), if (outsideProject) { lines.push("", "**Warning**: Working directory is outside the project root."); } - const config7 = await Config.get(); - if (config7.experimental?.sandbox?.type === "docker") { + const config6 = await Config.get(); + if (config6.experimental?.sandbox?.type === "docker") { lines.push("", "**Execution**: Would run inside Docker container"); } const output2 = lines.join(` @@ -362726,8 +363026,8 @@ Output: Creates directory 'foo'`), if (proxied) return proxied; } - const config6 = await Config.get(); - const sandbox3 = config6.experimental?.sandbox; + const config5 = await Config.get(); + const sandbox3 = config5.experimental?.sandbox; if (sandbox3?.type === "docker") { return runDocker({ command: params.command, @@ -363698,8 +363998,8 @@ var init_formatter = __esm(async () => { ], async enabled() { const configs = ["biome.json", "biome.jsonc"]; - for (const config6 of configs) { - const found = await Filesystem.findUp(config6, Instance.directory, Instance.worktree); + for (const config5 of configs) { + const found = await Filesystem.findUp(config5, Instance.directory, Instance.worktree); if (found.length > 0) { const bin = await Npm.which("@biomejs/biome"); if (bin) @@ -363749,10 +364049,10 @@ var init_formatter = __esm(async () => { if (!which("ruff")) return false; const configs = ["pyproject.toml", "ruff.toml", ".ruff.toml"]; - for (const config6 of configs) { - const found = await Filesystem.findUp(config6, Instance.directory, Instance.worktree); + for (const config5 of configs) { + const found = await Filesystem.findUp(config5, Instance.directory, Instance.worktree); if (found.length > 0) { - if (config6 === "pyproject.toml") { + if (config5 === "pyproject.toml") { const content = await Filesystem.readText(found[0]); if (content.includes("[tool.ruff]")) return ["ruff", "format", "$FILE"]; @@ -363974,7 +364274,7 @@ var init_formatter = __esm(async () => { }); // packages/unifia/src/format/index.ts -import path46 from "path"; +import path47 from "path"; var Format; var init_format2 = __esm(async () => { init_dist3(); @@ -364003,12 +364303,12 @@ var init_format2 = __esm(async () => { } Format.Service = Service3; Format.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { - const config6 = yield* Config.Service; + const config5 = yield* Config.Service; const spawner = yield* exports_ChildProcessSpawner.ChildProcessSpawner; - const state3 = yield* InstanceState.make(exports_Effect.fn("Format.state")(function* (_ctx) { + const state2 = yield* InstanceState.make(exports_Effect.fn("Format.state")(function* (_ctx) { const commands4 = {}; const formatters2 = {}; - const cfg = yield* config6.get(); + const cfg = yield* config5.get(); if (cfg.formatter !== false) { for (const item of Object.values(exports_formatter)) { formatters2[item.name] = item; @@ -364061,7 +364361,7 @@ var init_format2 = __esm(async () => { function formatFile(filepath) { return exports_Effect.gen(function* () { log12.info("formatting", { file: filepath }); - const ext2 = path46.extname(filepath); + const ext2 = path47.extname(filepath); for (const { item, cmd: cmd2 } of yield* exports_Effect.promise(() => getFormatter(ext2))) { if (cmd2 === false) continue; @@ -364098,10 +364398,10 @@ var init_format2 = __esm(async () => { }; })); const init5 = exports_Effect.fn("Format.init")(function* () { - yield* InstanceState.get(state3); + yield* InstanceState.get(state2); }); const status2 = exports_Effect.fn("Format.status")(function* () { - const { formatters: formatters2, isEnabled: isEnabled3 } = yield* InstanceState.get(state3); + const { formatters: formatters2, isEnabled: isEnabled3 } = yield* InstanceState.get(state2); const result6 = []; for (const formatter of Object.values(formatters2)) { const isOn = yield* exports_Effect.promise(() => isEnabled3(formatter)); @@ -364114,7 +364414,7 @@ var init_format2 = __esm(async () => { return result6; }); const file7 = exports_Effect.fn("Format.file")(function* (filepath) { - const { formatFile } = yield* InstanceState.get(state3); + const { formatFile } = yield* InstanceState.get(state2); yield* formatFile(filepath); }); return Service3.of({ init: init5, status: status2, file: file7 }); @@ -364137,7 +364437,7 @@ var init_format2 = __esm(async () => { }); // packages/unifia/src/file/protected.ts -import path47 from "path"; +import path48 from "path"; import os17 from "os"; var home2, DARWIN_HOME, DARWIN_LIBRARY, DARWIN_ROOT, WIN32_HOME, Protected; var init_protected = __esm(() => { @@ -364179,12 +364479,12 @@ var init_protected = __esm(() => { function paths() { if (process.platform === "darwin") return [ - ...DARWIN_HOME.map((n10) => path47.join(home2, n10)), - ...DARWIN_LIBRARY.map((n10) => path47.join(home2, "Library", n10)), + ...DARWIN_HOME.map((n10) => path48.join(home2, n10)), + ...DARWIN_LIBRARY.map((n10) => path48.join(home2, "Library", n10)), ...DARWIN_ROOT ]; if (process.platform === "win32") - return WIN32_HOME.map((n10) => path47.join(home2, n10)); + return WIN32_HOME.map((n10) => path48.join(home2, n10)); return []; } Protected.paths = paths; @@ -364228,13 +364528,13 @@ var init_time2 = __esm(async () => { size: info3 ? Number(info3.size) : undefined }; }); - const state3 = yield* InstanceState.make(exports_Effect.fn("FileTime.state")(() => exports_Effect.succeed({ + const state2 = yield* InstanceState.make(exports_Effect.fn("FileTime.state")(() => exports_Effect.succeed({ reads: new Map, locks: new Map }))); const getLock = exports_Effect.fn("FileTime.lock")(function* (filepath) { filepath = Filesystem.normalizePath(filepath); - const locks = (yield* InstanceState.get(state3)).locks; + const locks = (yield* InstanceState.get(state2)).locks; const lock = locks.get(filepath); if (lock) return lock; @@ -364244,20 +364544,20 @@ var init_time2 = __esm(async () => { }); const read4 = exports_Effect.fn("FileTime.read")(function* (sessionID, file6) { file6 = Filesystem.normalizePath(file6); - const reads = (yield* InstanceState.get(state3)).reads; + const reads = (yield* InstanceState.get(state2)).reads; log12.info("read", { sessionID, file: file6 }); session(reads, sessionID).set(file6, yield* stamp(file6)); }); const get35 = exports_Effect.fn("FileTime.get")(function* (sessionID, file6) { file6 = Filesystem.normalizePath(file6); - const reads = (yield* InstanceState.get(state3)).reads; + const reads = (yield* InstanceState.get(state2)).reads; return reads.get(sessionID)?.get(file6)?.read; }); const assert7 = exports_Effect.fn("FileTime.assert")(function* (sessionID, filepath) { if (disableCheck) return; filepath = Filesystem.normalizePath(filepath); - const reads = (yield* InstanceState.get(state3)).reads; + const reads = (yield* InstanceState.get(state2)).reads; const time6 = reads.get(sessionID)?.get(filepath); if (!time6) throw new Error(`You must read file ${filepath} before overwriting it. Use the Read tool first`); @@ -364475,31 +364775,31 @@ var require_to_regex_range = __commonJS((exports, module2) => { return `(?:${result6})`; } let isPadded2 = hasPadding(min14) || hasPadding(max14); - let state3 = { min: min14, max: max14, a: a5, b: b3 }; + let state2 = { min: min14, max: max14, a: a5, b: b3 }; let positives = []; let negatives = []; if (isPadded2) { - state3.isPadded = isPadded2; - state3.maxLen = String(state3.max).length; + state2.isPadded = isPadded2; + state2.maxLen = String(state2.max).length; } if (a5 < 0) { let newMin = b3 < 0 ? Math.abs(b3) : 1; - negatives = splitToPatterns(newMin, Math.abs(a5), state3, opts); - a5 = state3.a = 0; + negatives = splitToPatterns(newMin, Math.abs(a5), state2, opts); + a5 = state2.a = 0; } if (b3 >= 0) { - positives = splitToPatterns(a5, b3, state3, opts); + positives = splitToPatterns(a5, b3, state2, opts); } - state3.negatives = negatives; - state3.positives = positives; - state3.result = collatePatterns(negatives, positives, opts); + state2.negatives = negatives; + state2.positives = positives; + state2.result = collatePatterns(negatives, positives, opts); if (opts.capture === true) { - state3.result = `(${state3.result})`; + state2.result = `(${state2.result})`; } else if (opts.wrap !== false && positives.length + negatives.length > 1) { - state3.result = `(?:${state3.result})`; + state2.result = `(?:${state2.result})`; } - toRegexRange.cache[cacheKey] = state3; - return state3.result; + toRegexRange.cache[cacheKey] = state2; + return state2.result; }; function collatePatterns(neg, pos, options4) { let onlyNegative = filterPatterns(neg, pos, "-", false, options4) || []; @@ -365522,19 +365822,19 @@ var require_utils9 = __commonJS((exports) => { return exports.escapeLast(input, char2, idx - 1); return `${input.slice(0, idx)}\\${input.slice(idx)}`; }; - exports.removePrefix = (input, state3 = {}) => { + exports.removePrefix = (input, state2 = {}) => { let output2 = input; if (output2.startsWith("./")) { output2 = output2.slice(2); - state3.prefix = "./"; + state2.prefix = "./"; } return output2; }; - exports.wrapOutput = (input, state3 = {}, options4 = {}) => { + exports.wrapOutput = (input, state2 = {}, options4 = {}) => { const prepend7 = options4.contains ? "" : "^"; const append8 = options4.contains ? "" : "$"; let output2 = `${prepend7}(?:${input})${append8}`; - if (state3.negated === true) { + if (state2.negated === true) { output2 = `(?:^(?!${output2}).*$)`; } return output2; @@ -365797,7 +366097,7 @@ var require_scan2 = __commonJS((exports, module2) => { base3 = utils.removeBackslashes(base3); } } - const state3 = { + const state2 = { prefix: prefix4, input, start: start2, @@ -365812,11 +366112,11 @@ var require_scan2 = __commonJS((exports, module2) => { negatedExtglob }; if (opts.tokens === true) { - state3.maxDepth = 0; + state2.maxDepth = 0; if (!isPathSeparator(code)) { tokens.push(token); } - state3.tokens = tokens; + state2.tokens = tokens; } if (opts.parts === true || opts.tokens === true) { let prevIndex; @@ -365832,7 +366132,7 @@ var require_scan2 = __commonJS((exports, module2) => { tokens[idx].value = value8; } depth(tokens[idx]); - state3.maxDepth += tokens[idx].depth; + state2.maxDepth += tokens[idx].depth; } if (idx !== 0 || value8 !== "") { parts4.push(value8); @@ -365845,13 +366145,13 @@ var require_scan2 = __commonJS((exports, module2) => { if (opts.tokens) { tokens[tokens.length - 1].value = value8; depth(tokens[tokens.length - 1]); - state3.maxDepth += tokens[tokens.length - 1].depth; + state2.maxDepth += tokens[tokens.length - 1].depth; } } - state3.slashes = slashes; - state3.parts = parts4; + state2.slashes = slashes; + state2.parts = parts4; } - return state3; + return state2; }; module2.exports = scan5; }); @@ -366133,7 +366433,7 @@ var require_parse8 = __commonJS((exports, module2) => { if (typeof opts.noext === "boolean") { opts.noextglob = opts.noext; } - const state3 = { + const state2 = { input, index: -1, start: 0, @@ -366150,57 +366450,57 @@ var require_parse8 = __commonJS((exports, module2) => { globstar: false, tokens }; - input = utils.removePrefix(input, state3); + input = utils.removePrefix(input, state2); len = input.length; const extglobs = []; const braces = []; const stack = []; let prev2 = bos; let value8; - const eos = () => state3.index === len - 1; - const peek4 = state3.peek = (n10 = 1) => input[state3.index + n10]; - const advance = state3.advance = () => input[++state3.index] || ""; - const remaining2 = () => input.slice(state3.index + 1); + const eos = () => state2.index === len - 1; + const peek4 = state2.peek = (n10 = 1) => input[state2.index + n10]; + const advance = state2.advance = () => input[++state2.index] || ""; + const remaining2 = () => input.slice(state2.index + 1); const consume = (value9 = "", num = 0) => { - state3.consumed += value9; - state3.index += num; + state2.consumed += value9; + state2.index += num; }; const append8 = (token) => { - state3.output += token.output != null ? token.output : token.value; + state2.output += token.output != null ? token.output : token.value; consume(token.value); }; const negate4 = () => { let count5 = 1; while (peek4() === "!" && (peek4(2) !== "(" || peek4(3) === "?")) { advance(); - state3.start++; + state2.start++; count5++; } if (count5 % 2 === 0) { return false; } - state3.negated = true; - state3.start++; + state2.negated = true; + state2.start++; return true; }; const increment5 = (type3) => { - state3[type3]++; + state2[type3]++; stack.push(type3); }; const decrement4 = (type3) => { - state3[type3]--; + state2[type3]--; stack.pop(); }; const push = (tok) => { if (prev2.type === "globstar") { - const isBrace = state3.braces > 0 && (tok.type === "comma" || tok.type === "brace"); + const isBrace = state2.braces > 0 && (tok.type === "comma" || tok.type === "brace"); const isExtglob = tok.extglob === true || extglobs.length && (tok.type === "pipe" || tok.type === "paren"); if (tok.type !== "slash" && tok.type !== "paren" && !isBrace && !isExtglob) { - state3.output = state3.output.slice(0, -prev2.output.length); + state2.output = state2.output.slice(0, -prev2.output.length); prev2.type = "star"; prev2.value = "*"; prev2.output = star3; - state3.output += prev2.output; + state2.output += prev2.output; } } if (extglobs.length && tok.type !== "paren") { @@ -366220,19 +366520,19 @@ var require_parse8 = __commonJS((exports, module2) => { const extglobOpen = (type3, value9) => { const token = { ...EXTGLOB_CHARS[value9], conditions: 1, inner: "" }; token.prev = prev2; - token.parens = state3.parens; - token.output = state3.output; - token.startIndex = state3.index; + token.parens = state2.parens; + token.output = state2.output; + token.startIndex = state2.index; token.tokensIndex = tokens.length; const output2 = (opts.capture ? "(" : "") + token.open; increment5("parens"); - push({ type: type3, value: value9, output: state3.output ? "" : ONE_CHAR }); + push({ type: type3, value: value9, output: state2.output ? "" : ONE_CHAR }); push({ type: "paren", extglob: true, value: advance(), output: output2 }); extglobs.push(token); }; const extglobClose = (token) => { - const literal5 = input.slice(token.startIndex, state3.index + 1); - const body3 = input.slice(token.startIndex + 2, state3.index); + const literal5 = input.slice(token.startIndex, state2.index + 1); + const body3 = input.slice(token.startIndex + 2, state2.index); const analysis = analyzeRepeatedExtglob(body3, opts); if ((token.type === "plus" || token.type === "star") && analysis.risky) { const safeOutput = analysis.safeOutput ? (token.output ? "" : ONE_CHAR) + (opts.capture ? `(${analysis.safeOutput})` : analysis.safeOutput) : undefined; @@ -366245,8 +366545,8 @@ var require_parse8 = __commonJS((exports, module2) => { tokens[i7].output = ""; delete tokens[i7].suffix; } - state3.output = token.output + open4.output; - state3.backtrack = true; + state2.output = token.output + open4.output; + state2.backtrack = true; push({ type: "paren", extglob: true, value: value8, output: "" }); decrement4("parens"); return; @@ -366266,7 +366566,7 @@ var require_parse8 = __commonJS((exports, module2) => { output2 = token.close = `)${expression})${extglobStar})`; } if (token.prev.type === "bos") { - state3.negatedExtglob = true; + state2.negatedExtglob = true; } } push({ type: "paren", extglob: true, value: value8, output: output2 }); @@ -366309,11 +366609,11 @@ var require_parse8 = __commonJS((exports, module2) => { } } if (output2 === input && opts.contains === true) { - state3.output = input; - return state3; + state2.output = input; + return state2; } - state3.output = utils.wrapOutput(output2, state3, options4); - return state3; + state2.output = utils.wrapOutput(output2, state2, options4); + return state2; } while (!eos()) { value8 = advance(); @@ -366337,7 +366637,7 @@ var require_parse8 = __commonJS((exports, module2) => { let slashes = 0; if (match17 && match17[0].length > 2) { slashes = match17[0].length; - state3.index += slashes; + state2.index += slashes; if (slashes % 2 !== 0) { value8 += "\\"; } @@ -366347,12 +366647,12 @@ var require_parse8 = __commonJS((exports, module2) => { } else { value8 += advance(); } - if (state3.brackets === 0) { + if (state2.brackets === 0) { push({ type: "text", value: value8 }); continue; } } - if (state3.brackets > 0 && (value8 !== "]" || prev2.value === "[" || prev2.value === "[^")) { + if (state2.brackets > 0 && (value8 !== "]" || prev2.value === "[" || prev2.value === "[^")) { if (opts.posix !== false && value8 === ":") { const inner = prev2.value.slice(1); if (inner.includes("[")) { @@ -366364,7 +366664,7 @@ var require_parse8 = __commonJS((exports, module2) => { const posix2 = POSIX_REGEX_SOURCE[rest2]; if (posix2) { prev2.value = pre2 + posix2; - state3.backtrack = true; + state2.backtrack = true; advance(); if (!bos.output && tokens.indexOf(prev2) === 1) { bos.output = ONE_CHAR; @@ -366387,14 +366687,14 @@ var require_parse8 = __commonJS((exports, module2) => { append8({ value: value8 }); continue; } - if (state3.quotes === 1 && value8 !== '"') { + if (state2.quotes === 1 && value8 !== '"') { value8 = utils.escapeRegex(value8); prev2.value += value8; append8({ value: value8 }); continue; } if (value8 === '"') { - state3.quotes = state3.quotes === 1 ? 0 : 1; + state2.quotes = state2.quotes === 1 ? 0 : 1; if (opts.keepQuotes === true) { push({ type: "text", value: value8 }); } @@ -366406,15 +366706,15 @@ var require_parse8 = __commonJS((exports, module2) => { continue; } if (value8 === ")") { - if (state3.parens === 0 && opts.strictBrackets === true) { + if (state2.parens === 0 && opts.strictBrackets === true) { throw new SyntaxError(syntaxError("opening", "(")); } const extglob = extglobs[extglobs.length - 1]; - if (extglob && state3.parens === extglob.parens + 1) { + if (extglob && state2.parens === extglob.parens + 1) { extglobClose(extglobs.pop()); continue; } - push({ type: "paren", value: value8, output: state3.parens ? ")" : "\\)" }); + push({ type: "paren", value: value8, output: state2.parens ? ")" : "\\)" }); decrement4("parens"); continue; } @@ -366435,7 +366735,7 @@ var require_parse8 = __commonJS((exports, module2) => { push({ type: "text", value: value8, output: `\\${value8}` }); continue; } - if (state3.brackets === 0) { + if (state2.brackets === 0) { if (opts.strictBrackets === true) { throw new SyntaxError(syntaxError("opening", "[")); } @@ -366453,14 +366753,14 @@ var require_parse8 = __commonJS((exports, module2) => { continue; } const escaped = utils.escapeRegex(prev2.value); - state3.output = state3.output.slice(0, -prev2.value.length); + state2.output = state2.output.slice(0, -prev2.value.length); if (opts.literalBrackets === true) { - state3.output += escaped; + state2.output += escaped; prev2.value = escaped; continue; } prev2.value = `(${capture}${escaped}|${prev2.value})`; - state3.output += prev2.value; + state2.output += prev2.value; continue; } if (value8 === "{" && opts.nobrace !== true) { @@ -366469,8 +366769,8 @@ var require_parse8 = __commonJS((exports, module2) => { type: "brace", value: value8, output: "(", - outputIndex: state3.output.length, - tokensIndex: state3.tokens.length + outputIndex: state2.output.length, + tokensIndex: state2.tokens.length }; braces.push(open4); push(open4); @@ -366496,16 +366796,16 @@ var require_parse8 = __commonJS((exports, module2) => { } } output2 = expandRange(range6, opts); - state3.backtrack = true; + state2.backtrack = true; } if (brace.comma !== true && brace.dots !== true) { - const out2 = state3.output.slice(0, brace.outputIndex); - const toks = state3.tokens.slice(brace.tokensIndex); + const out2 = state2.output.slice(0, brace.outputIndex); + const toks = state2.tokens.slice(brace.tokensIndex); brace.value = brace.output = "\\{"; value8 = output2 = "\\}"; - state3.output = out2; + state2.output = out2; for (const t2 of toks) { - state3.output += t2.output || t2.value; + state2.output += t2.output || t2.value; } } push({ type: "brace", value: value8, output: output2 }); @@ -366531,10 +366831,10 @@ var require_parse8 = __commonJS((exports, module2) => { continue; } if (value8 === "/") { - if (prev2.type === "dot" && state3.index === state3.start + 1) { - state3.start = state3.index + 1; - state3.consumed = ""; - state3.output = ""; + if (prev2.type === "dot" && state2.index === state2.start + 1) { + state2.start = state2.index + 1; + state2.consumed = ""; + state2.output = ""; tokens.pop(); prev2 = bos; continue; @@ -366543,7 +366843,7 @@ var require_parse8 = __commonJS((exports, module2) => { continue; } if (value8 === ".") { - if (state3.braces > 0 && prev2.type === "dot") { + if (state2.braces > 0 && prev2.type === "dot") { if (prev2.value === ".") prev2.output = DOT_LITERAL; const brace = braces[braces.length - 1]; @@ -366553,7 +366853,7 @@ var require_parse8 = __commonJS((exports, module2) => { brace.dots = true; continue; } - if (state3.braces + state3.parens === 0 && prev2.type !== "bos" && prev2.type !== "slash") { + if (state2.braces + state2.parens === 0 && prev2.type !== "bos" && prev2.type !== "slash") { push({ type: "text", value: value8, output: DOT_LITERAL }); continue; } @@ -366592,7 +366892,7 @@ var require_parse8 = __commonJS((exports, module2) => { continue; } } - if (opts.nonegate !== true && state3.index === 0) { + if (opts.nonegate !== true && state2.index === 0) { negate4(); continue; } @@ -366606,7 +366906,7 @@ var require_parse8 = __commonJS((exports, module2) => { push({ type: "plus", value: value8, output: PLUS_LITERAL }); continue; } - if (prev2 && (prev2.type === "bracket" || prev2.type === "paren" || prev2.type === "brace") || state3.parens > 0) { + if (prev2 && (prev2.type === "bracket" || prev2.type === "paren" || prev2.type === "brace") || state2.parens > 0) { push({ type: "plus", value: value8 }); continue; } @@ -366628,7 +366928,7 @@ var require_parse8 = __commonJS((exports, module2) => { const match17 = REGEX_NON_SPECIAL_CHARS.exec(remaining2()); if (match17) { value8 += match17[0]; - state3.index += match17[0].length; + state2.index += match17[0].length; } push({ type: "text", value: value8 }); continue; @@ -366638,8 +366938,8 @@ var require_parse8 = __commonJS((exports, module2) => { prev2.star = true; prev2.value += value8; prev2.output = star3; - state3.backtrack = true; - state3.globstar = true; + state2.backtrack = true; + state2.globstar = true; consume(value8); continue; } @@ -366661,14 +366961,14 @@ var require_parse8 = __commonJS((exports, module2) => { push({ type: "star", value: value8, output: "" }); continue; } - const isBrace = state3.braces > 0 && (prior.type === "comma" || prior.type === "brace"); + const isBrace = state2.braces > 0 && (prior.type === "comma" || prior.type === "brace"); const isExtglob = extglobs.length && (prior.type === "pipe" || prior.type === "paren"); if (!isStart && prior.type !== "paren" && !isBrace && !isExtglob) { push({ type: "star", value: value8, output: "" }); continue; } while (rest.slice(0, 3) === "/**") { - const after = input[state3.index + 4]; + const after = input[state2.index + 4]; if (after && after !== "/") { break; } @@ -366679,31 +366979,31 @@ var require_parse8 = __commonJS((exports, module2) => { prev2.type = "globstar"; prev2.value += value8; prev2.output = globstar(opts); - state3.output = prev2.output; - state3.globstar = true; + state2.output = prev2.output; + state2.globstar = true; consume(value8); continue; } if (prior.type === "slash" && prior.prev.type !== "bos" && !afterStar && eos()) { - state3.output = state3.output.slice(0, -(prior.output + prev2.output).length); + state2.output = state2.output.slice(0, -(prior.output + prev2.output).length); prior.output = `(?:${prior.output}`; prev2.type = "globstar"; prev2.output = globstar(opts) + (opts.strictSlashes ? ")" : "|$)"); prev2.value += value8; - state3.globstar = true; - state3.output += prior.output + prev2.output; + state2.globstar = true; + state2.output += prior.output + prev2.output; consume(value8); continue; } if (prior.type === "slash" && prior.prev.type !== "bos" && rest[0] === "/") { const end4 = rest[1] !== undefined ? "|$" : ""; - state3.output = state3.output.slice(0, -(prior.output + prev2.output).length); + state2.output = state2.output.slice(0, -(prior.output + prev2.output).length); prior.output = `(?:${prior.output}`; prev2.type = "globstar"; prev2.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end4})`; prev2.value += value8; - state3.output += prior.output + prev2.output; - state3.globstar = true; + state2.output += prior.output + prev2.output; + state2.globstar = true; consume(value8 + advance()); push({ type: "slash", value: "/", output: "" }); continue; @@ -366712,18 +367012,18 @@ var require_parse8 = __commonJS((exports, module2) => { prev2.type = "globstar"; prev2.value += value8; prev2.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`; - state3.output = prev2.output; - state3.globstar = true; + state2.output = prev2.output; + state2.globstar = true; consume(value8 + advance()); push({ type: "slash", value: "/", output: "" }); continue; } - state3.output = state3.output.slice(0, -prev2.output.length); + state2.output = state2.output.slice(0, -prev2.output.length); prev2.type = "globstar"; prev2.output = globstar(opts); prev2.value += value8; - state3.output += prev2.output; - state3.globstar = true; + state2.output += prev2.output; + state2.globstar = true; consume(value8); continue; } @@ -366741,55 +367041,55 @@ var require_parse8 = __commonJS((exports, module2) => { push(token); continue; } - if (state3.index === state3.start || prev2.type === "slash" || prev2.type === "dot") { + if (state2.index === state2.start || prev2.type === "slash" || prev2.type === "dot") { if (prev2.type === "dot") { - state3.output += NO_DOT_SLASH; + state2.output += NO_DOT_SLASH; prev2.output += NO_DOT_SLASH; } else if (opts.dot === true) { - state3.output += NO_DOTS_SLASH; + state2.output += NO_DOTS_SLASH; prev2.output += NO_DOTS_SLASH; } else { - state3.output += nodot; + state2.output += nodot; prev2.output += nodot; } if (peek4() !== "*") { - state3.output += ONE_CHAR; + state2.output += ONE_CHAR; prev2.output += ONE_CHAR; } } push(token); } - while (state3.brackets > 0) { + while (state2.brackets > 0) { if (opts.strictBrackets === true) throw new SyntaxError(syntaxError("closing", "]")); - state3.output = utils.escapeLast(state3.output, "["); + state2.output = utils.escapeLast(state2.output, "["); decrement4("brackets"); } - while (state3.parens > 0) { + while (state2.parens > 0) { if (opts.strictBrackets === true) throw new SyntaxError(syntaxError("closing", ")")); - state3.output = utils.escapeLast(state3.output, "("); + state2.output = utils.escapeLast(state2.output, "("); decrement4("parens"); } - while (state3.braces > 0) { + while (state2.braces > 0) { if (opts.strictBrackets === true) throw new SyntaxError(syntaxError("closing", "}")); - state3.output = utils.escapeLast(state3.output, "{"); + state2.output = utils.escapeLast(state2.output, "{"); decrement4("braces"); } if (opts.strictSlashes !== true && (prev2.type === "star" || prev2.type === "bracket")) { push({ type: "maybe_slash", value: "", output: `${SLASH_LITERAL}?` }); } - if (state3.backtrack === true) { - state3.output = ""; - for (const token of state3.tokens) { - state3.output += token.output != null ? token.output : token.value; + if (state2.backtrack === true) { + state2.output = ""; + for (const token of state2.tokens) { + state2.output += token.output != null ? token.output : token.value; if (token.suffix) { - state3.output += token.suffix; + state2.output += token.suffix; } } } - return state3; + return state2; }; parse13.fastpaths = (input, options4) => { const opts = { ...options4 }; @@ -366814,7 +367114,7 @@ var require_parse8 = __commonJS((exports, module2) => { const nodot = opts.dot ? NO_DOTS : NO_DOT; const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT; const capture = opts.capture ? "" : "?:"; - const state3 = { negated: false, prefix: "" }; + const state2 = { negated: false, prefix: "" }; let star3 = opts.bash === true ? ".*?" : STAR; if (opts.capture) { star3 = `(${star3})`; @@ -366853,7 +367153,7 @@ var require_parse8 = __commonJS((exports, module2) => { } } }; - const output2 = utils.removePrefix(input, state3); + const output2 = utils.removePrefix(input, state2); let source2 = create(output2); if (source2 && opts.strictSlashes !== true) { source2 += `${SLASH_LITERAL}?`; @@ -366876,9 +367176,9 @@ var require_picomatch = __commonJS((exports, module2) => { const fns = glob.map((input) => picomatch(input, options4, returnState)); const arrayMatcher = (str3) => { for (const isMatch of fns) { - const state4 = isMatch(str3); - if (state4) - return state4; + const state3 = isMatch(str3); + if (state3) + return state3; } return false; }; @@ -366891,7 +367191,7 @@ var require_picomatch = __commonJS((exports, module2) => { const opts = options4 || {}; const posix2 = utils.isWindows(options4); const regex2 = isState ? picomatch.compileRe(glob, options4) : picomatch.makeRe(glob, options4, false, true); - const state3 = regex2.state; + const state2 = regex2.state; delete regex2.state; let isIgnored2 = () => false; if (opts.ignore) { @@ -366900,7 +367200,7 @@ var require_picomatch = __commonJS((exports, module2) => { } const matcher = (input, returnObject = false) => { const { isMatch, match: match17, output: output2 } = picomatch.test(input, regex2, options4, { glob, posix: posix2 }); - const result6 = { glob, state: state3, regex: regex2, posix: posix2, input, output: output2, match: match17, isMatch }; + const result6 = { glob, state: state2, regex: regex2, posix: posix2, input, output: output2, match: match17, isMatch }; if (typeof opts.onResult === "function") { opts.onResult(result6); } @@ -366921,7 +367221,7 @@ var require_picomatch = __commonJS((exports, module2) => { return returnObject ? result6 : true; }; if (returnState) { - matcher.state = state3; + matcher.state = state2; } return matcher; }; @@ -366960,20 +367260,20 @@ var require_picomatch = __commonJS((exports, module2) => { return parse13(pattern, { ...options4, fastpaths: false }); }; picomatch.scan = (input, options4) => scan5(input, options4); - picomatch.compileRe = (state3, options4, returnOutput = false, returnState = false) => { + picomatch.compileRe = (state2, options4, returnOutput = false, returnState = false) => { if (returnOutput === true) { - return state3.output; + return state2.output; } const opts = options4 || {}; const prepend7 = opts.contains ? "" : "^"; const append8 = opts.contains ? "" : "$"; - let source2 = `${prepend7}(?:${state3.output})${append8}`; - if (state3 && state3.negated === true) { + let source2 = `${prepend7}(?:${state2.output})${append8}`; + if (state2 && state2.negated === true) { source2 = `^(?!${source2}).*$`; } const regex2 = picomatch.toRegex(source2, options4); if (returnState === true) { - regex2.state = state3; + regex2.state = state2; } return regex2; }; @@ -367022,10 +367322,10 @@ var require_micromatch = __commonJS((exports, module2) => { let keep = new Set; let items2 = new Set; let negatives = 0; - let onResult = (state3) => { - items2.add(state3.output); + let onResult = (state2) => { + items2.add(state2.output); if (options4 && options4.onResult) { - options4.onResult(state3); + options4.onResult(state2); } }; for (let i7 = 0;i7 < patterns.length; i7++) { @@ -367066,10 +367366,10 @@ var require_micromatch = __commonJS((exports, module2) => { patterns = [].concat(patterns).map(String); let result6 = new Set; let items2 = []; - let onResult = (state3) => { + let onResult = (state2) => { if (options4.onResult) - options4.onResult(state3); - items2.push(state3.output); + options4.onResult(state2); + items2.push(state2.output); }; let matches = new Set(micromatch(list, patterns, { ...options4, onResult })); for (let item of items2) { @@ -367344,22 +367644,22 @@ function normalizeOptions(dir2, opts = {}) { if (!opts.ignorePaths) { opts.ignorePaths = []; } - opts.ignorePaths.push(path48.resolve(dir2, value8)); + opts.ignorePaths.push(path49.resolve(dir2, value8)); } } } return opts; } -var path48, micromatch, isGlob, $createWrapper = (binding) => { +var path49, micromatch, isGlob, $createWrapper = (binding) => { return { - writeSnapshot(dir2, snapshot4, opts) { - return binding.writeSnapshot(path48.resolve(dir2), path48.resolve(snapshot4), normalizeOptions(dir2, opts)); + writeSnapshot(dir2, snapshot3, opts) { + return binding.writeSnapshot(path49.resolve(dir2), path49.resolve(snapshot3), normalizeOptions(dir2, opts)); }, - getEventsSince(dir2, snapshot4, opts) { - return binding.getEventsSince(path48.resolve(dir2), path48.resolve(snapshot4), normalizeOptions(dir2, opts)); + getEventsSince(dir2, snapshot3, opts) { + return binding.getEventsSince(path49.resolve(dir2), path49.resolve(snapshot3), normalizeOptions(dir2, opts)); }, async subscribe(dir2, fn4, opts) { - dir2 = path48.resolve(dir2); + dir2 = path49.resolve(dir2); opts = normalizeOptions(dir2, opts); await binding.subscribe(dir2, fn4, opts); return { @@ -367369,12 +367669,12 @@ var path48, micromatch, isGlob, $createWrapper = (binding) => { }; }, unsubscribe(dir2, fn4, opts) { - return binding.unsubscribe(path48.resolve(dir2), fn4, normalizeOptions(dir2, opts)); + return binding.unsubscribe(path49.resolve(dir2), fn4, normalizeOptions(dir2, opts)); } }; }; var init_wrapper = __esm(() => { - path48 = __require("path"); + path49 = __require("path"); micromatch = require_micromatch(); isGlob = require_is_glob(); }); @@ -367561,7 +367861,7 @@ var init_ignore = __esm(() => { // packages/unifia/src/file/watcher.ts import { readdir as readdir3 } from "fs/promises"; -import path49 from "path"; +import path50 from "path"; var FileWatcher; var init_watcher = __esm(async () => { init_dist3(); @@ -367610,8 +367910,8 @@ var init_watcher = __esm(async () => { } function protecteds(dir2) { return Protected.paths().filter((item) => { - const rel = path49.relative(dir2, item); - return rel !== "" && !rel.startsWith("..") && !path49.isAbsolute(rel); + const rel = path50.relative(dir2, item); + return rel !== "" && !rel.startsWith("..") && !path50.isAbsolute(rel); }); } FileWatcher.hasNativeBinding = () => !!watcher(); @@ -367620,8 +367920,8 @@ var init_watcher = __esm(async () => { } FileWatcher.Service = Service3; FileWatcher.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { - const config6 = yield* Config.Service; - const state3 = yield* InstanceState.make(exports_Effect.fn("FileWatcher.state")(function* () { + const config5 = yield* Config.Service; + const state2 = yield* InstanceState.make(exports_Effect.fn("FileWatcher.state")(function* () { if (yield* Flag.UNIFIA_EXPERIMENTAL_DISABLE_FILEWATCHER) return; log12.info("init", { directory: Instance.directory }); @@ -367660,7 +367960,7 @@ var init_watcher = __esm(async () => { return exports_Effect.void; })); }; - const cfg = yield* config6.get(); + const cfg = yield* config5.get(); const cfgIgnores = cfg.watcher?.ignore ?? []; if (yield* Flag.UNIFIA_EXPERIMENTAL_FILEWATCHER) { yield* subscribe3(Instance.directory, [ @@ -367673,7 +367973,7 @@ var init_watcher = __esm(async () => { const result6 = yield* exports_Effect.promise(() => Git.run(["rev-parse", "--git-dir"], { cwd: Instance.project.worktree })); - const vcsDir = result6.exitCode === 0 ? path49.resolve(Instance.project.worktree, result6.text().trim()) : undefined; + const vcsDir = result6.exitCode === 0 ? path50.resolve(Instance.project.worktree, result6.text().trim()) : undefined; if (vcsDir && !cfgIgnores.includes(".git") && !cfgIgnores.includes(vcsDir)) { const ignore6 = (yield* exports_Effect.promise(() => readdir3(vcsDir).catch(() => []))).filter((entry) => entry !== "HEAD"); yield* subscribe3(vcsDir, ignore6); @@ -367685,7 +367985,7 @@ var init_watcher = __esm(async () => { }))); return Service3.of({ init: exports_Effect.fn("FileWatcher.init")(function* () { - yield* InstanceState.get(state3); + yield* InstanceState.get(state2); }) }); })); @@ -367701,7 +368001,7 @@ var init_watcher = __esm(async () => { // packages/unifia/src/file/index.ts import { createHash as createHash5 } from "crypto"; import { mkdir as fsMkdir, open as fsOpen, rename as fsRename, rm as fsRm } from "fs/promises"; -import path50 from "path"; +import path51 from "path"; var import_fuzzysort2, import_ignore2, File4; var init_file = __esm(async () => { init_bus_event(); @@ -367968,8 +368268,8 @@ var init_file = __esm(async () => { heic: "image/heic", heif: "image/heif" }; - const ext2 = (file6) => path50.extname(file6).toLowerCase().slice(1); - const name26 = (file6) => path50.basename(file6).toLowerCase(); + const ext2 = (file6) => path51.extname(file6).toLowerCase().slice(1); + const name26 = (file6) => path51.basename(file6).toLowerCase(); const isImageByExtension = (file6) => image.has(ext2(file6)); const isTextByExtension = (file6) => text9.has(ext2(file6)); const isTextByName = (file6) => textName.has(name26(file6)); @@ -368022,8 +368322,8 @@ var init_file = __esm(async () => { } function assertWritableTarget(full) { assertInsideProject(full); - let ancestor = path50.dirname(full); - while (ancestor && ancestor !== path50.dirname(ancestor)) { + let ancestor = path51.dirname(full); + while (ancestor && ancestor !== path51.dirname(ancestor)) { if (Filesystem.stat(ancestor)) { const real4 = AppFileSystem.resolve(ancestor); if (!Instance.containsPath(real4)) { @@ -368031,7 +368331,7 @@ var init_file = __esm(async () => { } return; } - ancestor = path50.dirname(ancestor); + ancestor = path51.dirname(ancestor); } } @@ -368040,11 +368340,11 @@ var init_file = __esm(async () => { File.Service = Service3; File.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const appFs = yield* AppFileSystem.Service; - const state3 = yield* InstanceState.make(exports_Effect.fn("File.state")(() => exports_Effect.succeed({ + const state2 = yield* InstanceState.make(exports_Effect.fn("File.state")(() => exports_Effect.succeed({ cache: { files: [], dirs: [] } }))); const scan5 = exports_Effect.fn("File.scan")(function* () { - if (Instance.directory === path50.parse(Instance.directory).root) + if (Instance.directory === path51.parse(Instance.directory).root) return; const isGlobalHome = Instance.directory === Global.Path.home && Instance.project.id === "global"; const next3 = { files: [], dirs: [] }; @@ -368067,7 +368367,7 @@ var init_file = __esm(async () => { if (shouldIgnoreName(entry.name)) continue; dirs.add(entry.name + "/"); - const base3 = path50.join(Instance.directory, entry.name); + const base3 = path51.join(Instance.directory, entry.name); const children = yield* appFs.readDirectoryEntries(base3).pipe(exports_Effect.catchCause((cause) => { log12.warn("readDirectoryEntries failed; subtree skipped", { dir: base3, @@ -368091,7 +368391,7 @@ var init_file = __esm(async () => { next3.files.push(file6); let current = file6; while (true) { - const dir2 = path50.dirname(current); + const dir2 = path51.dirname(current); if (dir2 === ".") break; if (dir2 === current) @@ -368104,7 +368404,7 @@ var init_file = __esm(async () => { } } } - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); s5.cache = next3; }); const scanLoggingCause = (cause) => { @@ -368154,7 +368454,7 @@ var init_file = __esm(async () => { for (const file6 of untrackedOutput.trim().split(` `)) { try { - const content = await Filesystem.readText(path50.join(Instance.directory, file6)); + const content = await Filesystem.readText(path51.join(Instance.directory, file6)); changed.push({ path: file6, added: content.split(` @@ -368189,17 +368489,17 @@ var init_file = __esm(async () => { } } return changed.map((item) => { - const full = path50.isAbsolute(item.path) ? item.path : path50.join(Instance.directory, item.path); + const full = path51.isAbsolute(item.path) ? item.path : path51.join(Instance.directory, item.path); return { ...item, - path: path50.relative(Instance.directory, full) + path: path51.relative(Instance.directory, full) }; }); }); }); const read4 = exports_Effect.fn("File.read")(function* (file6) { using _3 = log12.time("read", { file: file6 }); - const full = path50.join(Instance.directory, file6); + const full = path51.join(Instance.directory, file6); assertInsideProject(full); LSP.touchFile(full, false).catch((err2) => log12.warn("touchFile failed", { full, error: err2 })); if (isImageByExtension(file6)) { @@ -368271,17 +368571,17 @@ var init_file = __esm(async () => { let ignored = (_3) => false; if (Instance.project.vcs === "git") { const ig = import_ignore2.default(); - const gitignore = path50.join(Instance.project.worktree, ".gitignore"); + const gitignore = path51.join(Instance.project.worktree, ".gitignore"); const gitignoreText = yield* appFs.readFileString(gitignore).pipe(exports_Effect.catch(() => exports_Effect.succeed(""))); if (gitignoreText) ig.add(gitignoreText); - const ignoreFile = path50.join(Instance.project.worktree, ".ignore"); + const ignoreFile = path51.join(Instance.project.worktree, ".ignore"); const ignoreText = yield* appFs.readFileString(ignoreFile).pipe(exports_Effect.catch(() => exports_Effect.succeed(""))); if (ignoreText) ig.add(ignoreText); ignored = ig.ignores.bind(ig); } - const resolved = dir2 ? path50.join(Instance.directory, dir2) : Instance.directory; + const resolved = dir2 ? path51.join(Instance.directory, dir2) : Instance.directory; assertInsideProject(resolved); const entries10 = yield* appFs.readDirectoryEntries(resolved).pipe(exports_Effect.catchCause((cause) => { log12.warn("readDirectoryEntries failed; listing may be incomplete", { @@ -368294,8 +368594,8 @@ var init_file = __esm(async () => { for (const entry of entries10) { if (exclude.includes(entry.name)) continue; - const absolute = path50.join(resolved, entry.name); - const file6 = path50.relative(Instance.directory, absolute); + const absolute = path51.join(resolved, entry.name); + const file6 = path51.relative(Instance.directory, absolute); const type3 = entry.type === "directory" ? "directory" : "file"; nodes3.push({ name: entry.name, @@ -368313,7 +368613,7 @@ var init_file = __esm(async () => { }); const search3 = exports_Effect.fn("File.search")(function* (input) { yield* ensure2(); - const { cache: cache5 } = yield* InstanceState.get(state3); + const { cache: cache5 } = yield* InstanceState.get(state2); const query2 = input.query.trim(); const normalizedQuery = query2.replaceAll("\\", "/"); const limit2 = input.limit ?? 100; @@ -368335,7 +368635,7 @@ var init_file = __esm(async () => { return output2; }); const mkdir6 = exports_Effect.fn("File.mkdir")(function* (dir2) { - const resolved = path50.isAbsolute(dir2) ? dir2 : path50.join(Instance.directory, dir2); + const resolved = path51.isAbsolute(dir2) ? dir2 : path51.join(Instance.directory, dir2); assertInsideProject(resolved); yield* appFs.ensureDir(resolved).pipe(exports_Effect.catch((err2) => { log12.warn("ensureDir failed", { dir: resolved, error: String(err2) }); @@ -368418,9 +368718,9 @@ var init_file = __esm(async () => { return stampOf(content, Filesystem.stat(full)); } async function atomicWrite(full, content) { - const dir2 = path50.dirname(full); + const dir2 = path51.dirname(full); await fsMkdir(dir2, { recursive: true }); - const tmp = path50.join(dir2, `.${path50.basename(full)}.${process.pid}.${Date.now()}.tmp`); + const tmp = path51.join(dir2, `.${path51.basename(full)}.${process.pid}.${Date.now()}.tmp`); const handle2 = await fsOpen(tmp, "w"); try { await handle2.writeFile(content, "utf8"); @@ -368467,15 +368767,15 @@ var init_file = __esm(async () => { LSP.touchFile(full, false).catch((err2) => log12.warn("touchFile failed", { full, error: err2 })); } function toCanonicalRelative(full) { - const rel = path50.relative(Instance.directory, full); - return rel.split(path50.sep).join("/"); + const rel = path51.relative(Instance.directory, full); + return rel.split(path51.sep).join("/"); } File.toCanonicalRelative = toCanonicalRelative; async function write2(input) { - if (path50.isAbsolute(input.path)) { + if (path51.isAbsolute(input.path)) { throw new Error(`File.write: input.path must be relative to project root, got absolute: ${input.path}`); } - const full = path50.join(Instance.directory, input.path); + const full = path51.join(Instance.directory, input.path); assertWritableTarget(full); return FileTime.withLock(full, async () => { const exists3 = await Filesystem.exists(full); @@ -368504,10 +368804,10 @@ var init_file = __esm(async () => { } File.write = write2; async function readRaw(file6) { - if (path50.isAbsolute(file6)) { + if (path51.isAbsolute(file6)) { throw new Error(`File.readRaw: file must be relative to project root, got absolute: ${file6}`); } - const full = path50.join(Instance.directory, file6); + const full = path51.join(Instance.directory, file6); assertInsideProject(full); if (!await Filesystem.exists(full)) throw new PathNotFoundError(file6); @@ -368518,8 +368818,8 @@ var init_file = __esm(async () => { } File.readRaw = readRaw; async function relocate(from, to2, expectedHash) { - const fromFull = path50.join(Instance.directory, from); - const toFull = path50.join(Instance.directory, to2); + const fromFull = path51.join(Instance.directory, from); + const toFull = path51.join(Instance.directory, to2); if (fromFull === toFull) throw new Error("Source and destination are the same path"); assertInsideProject(fromFull); @@ -368536,7 +368836,7 @@ var init_file = __esm(async () => { } if (await Filesystem.exists(toFull)) throw new TargetExistsError(to2); - await fsMkdir(path50.dirname(toFull), { recursive: true }); + await fsMkdir(path51.dirname(toFull), { recursive: true }); await fsRename(fromFull, toFull); await notifyDelete(fromFull); await notifyWrite(toFull, "add"); @@ -368552,7 +368852,7 @@ var init_file = __esm(async () => { } File.move = move; async function remove19(input) { - const full = path50.join(Instance.directory, input.path); + const full = path51.join(Instance.directory, input.path); assertInsideProject(full); return FileTime.withLock(full, async () => { if (!await Filesystem.exists(full)) @@ -368575,7 +368875,7 @@ var init_file = __esm(async () => { }); // packages/unifia/src/tool/external-directory.ts -import path51 from "path"; +import path52 from "path"; async function assertExternalDirectory(ctx, target, options4) { if (!target) return; @@ -368585,8 +368885,8 @@ async function assertExternalDirectory(ctx, target, options4) { if (Instance.containsPath(full)) return; const kind = options4?.kind ?? "file"; - const dir2 = kind === "directory" ? full : path51.dirname(full); - const glob = process.platform === "win32" ? AppFileSystem.normalizePathPattern(path51.join(dir2, "*")) : path51.join(dir2, "*").replaceAll("\\", "/"); + const dir2 = kind === "directory" ? full : path52.dirname(full); + const glob = process.platform === "win32" ? AppFileSystem.normalizePathPattern(path52.join(dir2, "*")) : path52.join(dir2, "*").replaceAll("\\", "/"); await ctx.ask({ permission: "external_directory", patterns: [glob], @@ -369022,7 +369322,7 @@ var init_lock = __esm(async () => { }); // packages/unifia/src/tool/edit.ts -import * as path52 from "path"; +import * as path53 from "path"; function normalizeLineEndings(text9) { return text9.replaceAll(`\r `, ` @@ -369496,7 +369796,7 @@ var init_edit3 = __esm(async () => { if (params.oldString === params.newString) { throw new Error("No changes to apply: oldString and newString are identical."); } - const filePath = path52.isAbsolute(params.filePath) ? params.filePath : path52.join(Instance.directory, params.filePath); + const filePath = path53.isAbsolute(params.filePath) ? params.filePath : path53.join(Instance.directory, params.filePath); await assertExternalDirectory(ctx, filePath); if (params.dry_run) { let previewDiff; @@ -369523,7 +369823,7 @@ var init_edit3 = __esm(async () => { ${previewDiff} \`\`\``; return { - title: `[dry-run] Edit ${path52.basename(filePath)}`, + title: `[dry-run] Edit ${path53.basename(filePath)}`, metadata: { diff: previewDiff, filediff: { file: filePath, before: "", after: "", additions: 0, deletions: 0 }, @@ -369542,7 +369842,7 @@ ${previewDiff} diff = trimDiff(createTwoFilesPatch(filePath, filePath, contentOld, contentNew)); await ctx.ask({ permission: "edit", - patterns: [path52.relative(Instance.worktree, filePath)], + patterns: [path53.relative(Instance.worktree, filePath)], always: ["*"], metadata: { filepath: filePath, @@ -369573,7 +369873,7 @@ ${previewDiff} diff = trimDiff(createTwoFilesPatch(filePath, filePath, normalizeLineEndings(contentOld), normalizeLineEndings(contentNew))); await ctx.ask({ permission: "edit", - patterns: [path52.relative(Instance.worktree, filePath)], + patterns: [path53.relative(Instance.worktree, filePath)], always: ["*"], metadata: { filepath: filePath, @@ -369647,7 +369947,7 @@ File is being edited by ${lockConflict.heldBy.username} (session: ${lockConflict diff, filediff }, - title: `${path52.relative(Instance.worktree, filePath)}`, + title: `${path53.relative(Instance.worktree, filePath)}`, output: output2 }; } @@ -369665,7 +369965,7 @@ var glob_default = `- Fast file pattern matching tool that works with any codeba var init_glob2 = () => {}; // packages/unifia/src/tool/glob.ts -import path53 from "path"; +import path54 from "path"; var GlobTool; var init_glob3 = __esm(async () => { init_zod(); @@ -369694,7 +369994,7 @@ var init_glob3 = __esm(async () => { } }); let search2 = params.path ?? Instance.directory; - search2 = path53.isAbsolute(search2) ? search2 : path53.resolve(Instance.directory, search2); + search2 = path54.isAbsolute(search2) ? search2 : path54.resolve(Instance.directory, search2); await assertExternalDirectory(ctx, search2, { kind: "directory" }); const limit2 = 100; const files = []; @@ -369708,7 +370008,7 @@ var init_glob3 = __esm(async () => { truncated = true; break; } - const full = path53.resolve(search2, file6); + const full = path54.resolve(search2, file6); const stats = Filesystem.stat(full)?.mtime.getTime() ?? 0; files.push({ path: full, @@ -369727,7 +370027,7 @@ var init_glob3 = __esm(async () => { } } return { - title: path53.relative(Instance.worktree, search2), + title: path54.relative(Instance.worktree, search2), metadata: { count: files.length, truncated @@ -369753,7 +370053,7 @@ var init_grep = () => {}; // packages/unifia/src/tool/grep.ts import { text as text9 } from "stream/consumers"; -import path54 from "path"; +import path55 from "path"; var MAX_LINE_LENGTH = 2000, GrepTool; var init_grep2 = __esm(async () => { init_zod(); @@ -369788,7 +370088,7 @@ var init_grep2 = __esm(async () => { } }); let searchPath = params.path ?? Instance.directory; - searchPath = path54.isAbsolute(searchPath) ? searchPath : path54.resolve(Instance.directory, searchPath); + searchPath = path55.isAbsolute(searchPath) ? searchPath : path55.resolve(Instance.directory, searchPath); await assertExternalDirectory(ctx, searchPath, { kind: "directory" }); const rgPath = await Ripgrep.filepath(); const args3 = ["-nH", "--hidden", "--no-messages", "--field-match-separator=|", "--regexp", params.pattern]; @@ -370094,7 +370394,7 @@ var init_read = () => {}; // packages/unifia/src/tool/read.ts import { createReadStream } from "fs"; import { open as open4 } from "fs/promises"; -import * as path55 from "path"; +import * as path56 from "path"; import { createInterface } from "readline"; async function lines(filepath, opts) { const stream4 = createReadStream(filepath, { encoding: "utf8" }); @@ -370134,7 +370434,7 @@ async function lines(filepath, opts) { return { raw: raw3, count: count5, cut, more, offset: opts.offset }; } async function isBinaryFile(filepath, fileSize) { - const ext2 = path55.extname(filepath).toLowerCase(); + const ext2 = path56.extname(filepath).toLowerCase(); switch (ext2) { case ".zip": case ".tar": @@ -370219,9 +370519,9 @@ var init_read2 = __esm(async () => { const time6 = yield* FileTime.Service; const scope3 = yield* exports_Scope.Scope; const miss = exports_Effect.fn("ReadTool.miss")(function* (filepath) { - const dir2 = path55.dirname(filepath); - const base3 = path55.basename(filepath); - const items2 = yield* fs18.readDirectory(dir2).pipe(exports_Effect.map((items3) => items3.filter((item) => item.toLowerCase().includes(base3.toLowerCase()) || base3.toLowerCase().includes(item.toLowerCase())).map((item) => path55.join(dir2, item)).slice(0, 3)), exports_Effect.catch(() => exports_Effect.succeed([]))); + const dir2 = path56.dirname(filepath); + const base3 = path56.basename(filepath); + const items2 = yield* fs18.readDirectory(dir2).pipe(exports_Effect.map((items3) => items3.filter((item) => item.toLowerCase().includes(base3.toLowerCase()) || base3.toLowerCase().includes(item.toLowerCase())).map((item) => path56.join(dir2, item)).slice(0, 3)), exports_Effect.catch(() => exports_Effect.succeed([]))); if (items2.length > 0) { return yield* exports_Effect.fail(new Error(`File not found: ${filepath} @@ -370238,7 +370538,7 @@ ${items2.join(` return item.name + "/"; if (item.type !== "symlink") return item.name; - const target = yield* fs18.stat(path55.join(filepath, item.name)).pipe(exports_Effect.catch(() => exports_Effect.succeed(undefined))); + const target = yield* fs18.stat(path56.join(filepath, item.name)).pipe(exports_Effect.catch(() => exports_Effect.succeed(undefined))); if (target?.type === "Directory") return item.name + "/"; return item.name; @@ -370253,13 +370553,13 @@ ${items2.join(` return yield* exports_Effect.fail(new Error("offset must be greater than or equal to 1")); } let filepath = params.filePath; - if (!path55.isAbsolute(filepath)) { - filepath = path55.resolve(Instance.directory, filepath); + if (!path56.isAbsolute(filepath)) { + filepath = path56.resolve(Instance.directory, filepath); } if (process.platform === "win32") { filepath = AppFileSystem.normalizePath(filepath); } - const title = path55.relative(Instance.worktree, filepath); + const title = path56.relative(Instance.worktree, filepath); const stat4 = yield* fs18.stat(filepath).pipe(exports_Effect.catchIf((err2) => ("reason" in err2) && err2.reason._tag === "NotFound", () => exports_Effect.succeed(undefined))); yield* assertExternalDirectoryEffect(ctx, filepath, { bypass: Boolean(ctx.extra?.["bypassCwdCheck"]), @@ -370494,7 +370794,7 @@ var init_workspace_sql = __esm(() => { }); // packages/unifia/src/project/vcs.ts -import path56 from "path"; +import path57 from "path"; var Vcs2; var init_vcs = __esm(async () => { init_dist3(); @@ -370523,7 +370823,7 @@ var init_vcs = __esm(async () => { `).length; }; const work = exports_Effect.fnUntraced(function* (fs18, cwd, file6) { - const full = path56.join(cwd, file6); + const full = path57.join(cwd, file6); if (!(yield* fs18.exists(full).pipe(exports_Effect.orDie))) return ""; const buf = yield* fs18.readFile(full).pipe(exports_Effect.catch(() => exports_Effect.succeed(new Uint8Array))); @@ -370597,7 +370897,7 @@ var init_vcs = __esm(async () => { const fs18 = yield* AppFileSystem.Service; const git = yield* Git.Service; const bus = yield* Bus.Service; - const state3 = yield* InstanceState.make(exports_Effect.fn("Vcs.state")((ctx) => exports_Effect.gen(function* () { + const state2 = yield* InstanceState.make(exports_Effect.fn("Vcs.state")((ctx) => exports_Effect.gen(function* () { if (ctx.project.vcs !== "git") { return { current: undefined, root: undefined }; } @@ -370650,16 +370950,16 @@ var init_vcs = __esm(async () => { }))); return Service3.of({ init: exports_Effect.fn("Vcs.init")(function* () { - yield* InstanceState.get(state3); + yield* InstanceState.get(state2); }), branch: exports_Effect.fn("Vcs.branch")(function* () { - return yield* InstanceState.use(state3, (x3) => x3.current); + return yield* InstanceState.use(state2, (x3) => x3.current); }), defaultBranch: exports_Effect.fn("Vcs.defaultBranch")(function* () { - return yield* InstanceState.use(state3, (x3) => x3.root?.name); + return yield* InstanceState.use(state2, (x3) => x3.root?.name); }), diff: exports_Effect.fn("Vcs.diff")(function* (mode2) { - const value8 = yield* InstanceState.get(state3); + const value8 = yield* InstanceState.get(state2); if (Instance.project.vcs !== "git") return []; if (mode2 === "git") { @@ -379503,21 +379803,21 @@ var init_client12 = __esm(() => { this._pendingListChangedConfig = options4.listChanged; } } - _setupListChangedHandlers(config6) { - if (config6.tools && this._serverCapabilities?.tools?.listChanged) { - this._setupListChangedHandler("tools", ToolListChangedNotificationSchema, config6.tools, async () => { + _setupListChangedHandlers(config5) { + if (config5.tools && this._serverCapabilities?.tools?.listChanged) { + this._setupListChangedHandler("tools", ToolListChangedNotificationSchema, config5.tools, async () => { const result6 = await this.listTools(); return result6.tools; }); } - if (config6.prompts && this._serverCapabilities?.prompts?.listChanged) { - this._setupListChangedHandler("prompts", PromptListChangedNotificationSchema, config6.prompts, async () => { + if (config5.prompts && this._serverCapabilities?.prompts?.listChanged) { + this._setupListChangedHandler("prompts", PromptListChangedNotificationSchema, config5.prompts, async () => { const result6 = await this.listPrompts(); return result6.prompts; }); } - if (config6.resources && this._serverCapabilities?.resources?.listChanged) { - this._setupListChangedHandler("resources", ResourceListChangedNotificationSchema, config6.resources, async () => { + if (config5.resources && this._serverCapabilities?.resources?.listChanged) { + this._setupListChangedHandler("resources", ResourceListChangedNotificationSchema, config5.resources, async () => { const result6 = await this.listResources(); return result6.resources; }); @@ -380427,11 +380727,11 @@ async function authInternal(provider2, { serverUrl, authorizationCode, scope: sc } } } - const state3 = provider2.state ? await provider2.state() : undefined; + const state2 = provider2.state ? await provider2.state() : undefined; const { authorizationUrl, codeVerifier } = await startAuthorization(authorizationServerUrl, { metadata: metadata2, clientInformation, - state: state3, + state: state2, redirectUrl: provider2.redirectUrl, scope: scope3 || resourceMetadata?.scopes_supported?.join(" ") || provider2.clientMetadata.scope, resource @@ -380639,7 +380939,7 @@ async function discoverOAuthServerInfo(serverUrl, opts) { resourceMetadata }; } -async function startAuthorization(authorizationServerUrl, { metadata: metadata2, clientInformation, redirectUrl, scope: scope3, state: state3, resource }) { +async function startAuthorization(authorizationServerUrl, { metadata: metadata2, clientInformation, redirectUrl, scope: scope3, state: state2, resource }) { let authorizationUrl; if (metadata2) { authorizationUrl = new URL(metadata2.authorization_endpoint); @@ -380660,8 +380960,8 @@ async function startAuthorization(authorizationServerUrl, { metadata: metadata2, authorizationUrl.searchParams.set("code_challenge", codeChallenge); authorizationUrl.searchParams.set("code_challenge_method", AUTHORIZATION_CODE_CHALLENGE_METHOD); authorizationUrl.searchParams.set("redirect_uri", String(redirectUrl)); - if (state3) { - authorizationUrl.searchParams.set("state", state3); + if (state2) { + authorizationUrl.searchParams.set("state", state2); } if (scope3) { authorizationUrl.searchParams.set("scope", scope3); @@ -381703,7 +382003,7 @@ var init_stdio2 = __esm(() => { }); // packages/unifia/src/mcp/auth.ts -import path57 from "path"; +import path58 from "path"; var McpAuth; var init_auth5 = __esm(async () => { init_zod(); @@ -381733,7 +382033,7 @@ var init_auth5 = __esm(async () => { oauthState: zod_default.string().optional(), serverUrl: zod_default.string().optional() }); - const filepath = path57.join(Global.Path.data, "mcp-auth.json"); + const filepath = path58.join(Global.Path.data, "mcp-auth.json"); class Service3 extends exports_ServiceMap.Service()("@opencode/McpAuth") { } @@ -381834,10 +382134,10 @@ class McpOAuthProvider { serverUrl; config; callbacks; - constructor(mcpName, serverUrl, config6, callbacks) { + constructor(mcpName, serverUrl, config5, callbacks) { this.mcpName = mcpName; this.serverUrl = serverUrl; - this.config = config6; + this.config = config5; this.callbacks = callbacks; } get redirectUrl() { @@ -381920,8 +382220,8 @@ class McpOAuthProvider { } return entry.codeVerifier; } - async saveState(state3) { - await McpAuth.updateOAuthState(this.mcpName, state3); + async saveState(state2) { + await McpAuth.updateOAuthState(this.mcpName, state2); } async state() { const entry = await McpAuth.get(this.mcpName); @@ -382029,11 +382329,11 @@ var init_oauth_callback = __esm(async () => { return new Response("Not found", { status: 404 }); } const code = url4.searchParams.get("code"); - const state3 = url4.searchParams.get("state"); + const state2 = url4.searchParams.get("state"); const error49 = url4.searchParams.get("error"); const errorDescription = url4.searchParams.get("error_description"); - log30.info("received oauth callback", { hasCode: !!code, state: state3, error: error49 }); - if (!state3) { + log30.info("received oauth callback", { hasCode: !!code, state: state2, error: error49 }); + if (!state2) { const errorMsg = "Missing required state parameter - potential CSRF attack"; log30.error("oauth callback missing state parameter", { url: url4.toString() }); return new Response(HTML_ERROR2(errorMsg), { @@ -382043,12 +382343,12 @@ var init_oauth_callback = __esm(async () => { } if (error49) { const errorMsg = errorDescription || error49; - if (pendingAuths.has(state3)) { - const pending3 = pendingAuths.get(state3); + if (pendingAuths.has(state2)) { + const pending3 = pendingAuths.get(state2); clearTimeout(pending3.timeout); - pendingAuths.delete(state3); + pendingAuths.delete(state2); for (const [name26, s5] of mcpNameToState) { - if (s5 === state3) { + if (s5 === state2) { mcpNameToState.delete(name26); break; } @@ -382065,19 +382365,19 @@ var init_oauth_callback = __esm(async () => { headers: { "Content-Type": "text/html" } }); } - if (!pendingAuths.has(state3)) { + if (!pendingAuths.has(state2)) { const errorMsg = "Invalid or expired state parameter - potential CSRF attack"; - log30.error("oauth callback with invalid state", { state: state3, pendingStates: Array.from(pendingAuths.keys()) }); + log30.error("oauth callback with invalid state", { state: state2, pendingStates: Array.from(pendingAuths.keys()) }); return new Response(HTML_ERROR2(errorMsg), { status: 400, headers: { "Content-Type": "text/html" } }); } - const pending2 = pendingAuths.get(state3); + const pending2 = pendingAuths.get(state2); clearTimeout(pending2.timeout); - pendingAuths.delete(state3); + pendingAuths.delete(state2); for (const [name26, s5] of mcpNameToState) { - if (s5 === state3) { + if (s5 === state2) { mcpNameToState.delete(name26); break; } @@ -382419,7 +382719,7 @@ var init_default_browser = __esm(() => { // node_modules/open/index.js import process8 from "process"; import { Buffer as Buffer3 } from "buffer"; -import path58 from "path"; +import path59 from "path"; import { fileURLToPath as fileURLToPath7 } from "url"; import util7 from "util"; import childProcess from "child_process"; @@ -382629,8 +382929,8 @@ var init_open = __esm(() => { init_default_browser(); init_is_inside_container(); execFile6 = util7.promisify(childProcess.execFile); - __dirname3 = path58.dirname(fileURLToPath7(import.meta.url)); - localXdgOpenPath = path58.join(__dirname3, "xdg-open"); + __dirname3 = path59.dirname(fileURLToPath7(import.meta.url)); + localXdgOpenPath = path59.join(__dirname3, "xdg-open"); ({ platform: platform4, arch } = process8); getWslDrivesMountPoint = (() => { const defaultMountPoint = "/mnt/"; @@ -383007,15 +383307,15 @@ var init_mcp = __esm(async () => { } }); } - const state3 = yield* InstanceState.make(exports_Effect.fn("MCP.state")(function* () { + const state2 = yield* InstanceState.make(exports_Effect.fn("MCP.state")(function* () { const cfg = yield* cfgSvc.get(); - const config6 = cfg.mcp ?? {}; + const config5 = cfg.mcp ?? {}; const s5 = { status: {}, clients: {}, defs: {} }; - yield* exports_Effect.forEach(Object.entries(config6), ([key, mcp2]) => exports_Effect.gen(function* () { + yield* exports_Effect.forEach(Object.entries(config5), ([key, mcp2]) => exports_Effect.gen(function* () { if (!isMcpConfigured(mcp2)) { log12.error("Ignoring MCP config entry without type", { key }); return; @@ -383059,11 +383359,11 @@ var init_mcp = __esm(async () => { return exports_Effect.tryPromise(() => client3.close()).pipe(exports_Effect.ignore); } const status2 = exports_Effect.fn("MCP.status")(function* () { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const cfg = yield* cfgSvc.get(); - const config6 = cfg.mcp ?? {}; + const config5 = cfg.mcp ?? {}; const result6 = {}; - for (const [key, mcp2] of Object.entries(config6)) { + for (const [key, mcp2] of Object.entries(config5)) { if (!isMcpConfigured(mcp2)) continue; result6[key] = s5.status[key] ?? { status: "disabled" }; @@ -383071,11 +383371,11 @@ var init_mcp = __esm(async () => { return result6; }); const clients = exports_Effect.fn("MCP.clients")(function* () { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); return s5.clients; }); const createAndStore = exports_Effect.fn("MCP.createAndStore")(function* (name26, mcp2) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const result6 = yield* create(name26, mcp2); s5.status[name26] = result6.status; if (!result6.mcpClient) { @@ -383093,7 +383393,7 @@ var init_mcp = __esm(async () => { yield* createAndStore(name26, mcp2); const cfg = yield* cfgSvc.get(); yield* cfgSvc.update({ ...cfg, mcp: { ...cfg.mcp ?? {}, [name26]: mcp2 } }); - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); return { status: s5.status }; }); const connect2 = exports_Effect.fn("MCP.connect")(function* (name26) { @@ -383105,13 +383405,13 @@ var init_mcp = __esm(async () => { yield* createAndStore(name26, { ...mcp2, enabled: true }); }); const disconnect3 = exports_Effect.fn("MCP.disconnect")(function* (name26) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); yield* closeClient(s5, name26); delete s5.clients[name26]; s5.status[name26] = { status: "disabled" }; }); const remove20 = exports_Effect.fn("MCP.remove")(function* (name26) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); yield* closeClient(s5, name26); delete s5.clients[name26]; delete s5.status[name26]; @@ -383122,13 +383422,13 @@ var init_mcp = __esm(async () => { }); const tools2 = exports_Effect.fn("MCP.tools")(function* () { const result6 = {}; - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const cfg = yield* cfgSvc.get(); - const config6 = cfg.mcp ?? {}; + const config5 = cfg.mcp ?? {}; const defaultTimeout = cfg.experimental?.mcp_timeout; const connectedClients = Object.entries(s5.clients).filter(([clientName]) => s5.status[clientName]?.status === "connected"); yield* exports_Effect.forEach(connectedClients, ([clientName, client3]) => exports_Effect.gen(function* () { - const mcpConfig = config6[clientName]; + const mcpConfig = config5[clientName]; const entry = mcpConfig && isMcpConfigured(mcpConfig) ? mcpConfig : undefined; const listed = s5.defs[clientName]; if (!listed) { @@ -383148,7 +383448,7 @@ var init_mcp = __esm(async () => { return allTools; if (!scope3.allow && !scope3.deny) return allTools; - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const connectedNames = Object.keys(s5.clients).filter((name26) => s5.status[name26]?.status === "connected"); let allowedServers; if (scope3.allow) { @@ -383191,15 +383491,15 @@ var init_mcp = __esm(async () => { return exports_Effect.forEach(Object.entries(s5.clients).filter(([name26]) => s5.status[name26]?.status === "connected"), ([clientName, client3]) => fetchFromClient(clientName, client3, listFn, label).pipe(exports_Effect.map((items2) => Object.entries(items2 ?? {}))), { concurrency: "unbounded" }).pipe(exports_Effect.map((results) => Object.fromEntries(results.flat()))); } const prompts2 = exports_Effect.fn("MCP.prompts")(function* () { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); return yield* collectFromConnected(s5, (c3) => c3.listPrompts().then((r5) => r5.prompts), "prompts"); }); const resources2 = exports_Effect.fn("MCP.resources")(function* () { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); return yield* collectFromConnected(s5, (c3) => c3.listResources().then((r5) => r5.resources), "resources"); }); const withClient = exports_Effect.fnUntraced(function* (clientName, fn4, label, meta3) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const client3 = s5.clients[clientName]; if (!client3) { log12.warn(`client not found for ${label}`, { clientName }); @@ -383391,7 +383691,7 @@ var init_mcp = __esm(async () => { // packages/unifia/src/command/template/initialize.txt var initialize_default = `Create or update \`AGENTS.md\` for this repository. -The goal is a compact instruction file that helps future OpenCode sessions avoid mistakes and ramp up quickly. Every line should answer: "Would an agent likely miss this without help?" If not, leave it out. +The goal is a compact instruction file that helps future Unifia sessions avoid mistakes and ramp up quickly. Every line should answer: "Would an agent likely miss this without help?" If not, leave it out. User-provided focus or constraints (honor these): $ARGUMENTS @@ -383403,7 +383703,7 @@ Read the highest-value sources first: - build, test, lint, formatter, typecheck, and codegen config - CI workflows and pre-commit / task runner config - existing instruction files (\`AGENTS.md\`, \`CLAUDE.md\`, \`.cursor/rules/\`, \`.cursorrules\`, \`.github/copilot-instructions.md\`) -- repo-local OpenCode config such as \`opencode.json\` +- repo-local Unifia config such as \`unifia.json\` If architecture is still unclear after reading config and docs, inspect a small number of representative code files to find the real entrypoints, package boundaries, and execution flow. Prefer reading the files that explain how the system is wired together over random leaf files. @@ -383448,7 +383748,7 @@ Exclude: - long tutorials or exhaustive file trees - obvious language conventions - speculative claims or anything you could not verify -- content better stored in another file referenced via \`opencode.json\` \`instructions\` +- content better stored in another file referenced via \`unifia.json\` \`instructions\` When in doubt, omit. @@ -383623,11 +383923,11 @@ var init_command = __esm(async () => { } Command.Service = Service3; Command.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { - const config6 = yield* Config.Service; + const config5 = yield* Config.Service; const mcp2 = yield* MCP.Service; const skill = yield* Skill.Service; const init4 = exports_Effect.fn("Command.state")(function* (ctx) { - const cfg = yield* config6.get(); + const cfg = yield* config5.get(); const commands4 = {}; commands4[Command.Default.INIT] = { name: Command.Default.INIT, @@ -383691,13 +383991,13 @@ var init_command = __esm(async () => { commands: commands4 }; }); - const state3 = yield* InstanceState.make((ctx) => init4(ctx)); + const state2 = yield* InstanceState.make((ctx) => init4(ctx)); const get34 = exports_Effect.fn("Command.get")(function* (name26) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); return s5.commands[name26]; }); const list2 = exports_Effect.fn("Command.list")(function* () { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); return Object.values(s5.commands); }); return Service3.of({ get: get34, list: list2 }); @@ -383799,7 +384099,7 @@ var init_share_next = __esm(async () => { return exports_Effect.gen(function* () { if (disabled) return; - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const existing = s5.queue.get(sessionID); if (existing) { for (const item of data2) { @@ -383814,7 +384114,7 @@ var init_share_next = __esm(async () => { })), exports_Effect.forkIn(s5.scope)); }); } - const state3 = yield* InstanceState.make(exports_Effect.fn("ShareNext.state")(function* (_ctx) { + const state2 = yield* InstanceState.make(exports_Effect.fn("ShareNext.state")(function* (_ctx) { const cache5 = { queue: new Map, scope: yield* exports_Scope.make() }; yield* exports_Effect.addFinalizer(() => exports_Scope.close(cache5.scope, exports_Exit.void).pipe(exports_Effect.andThen(exports_Effect.sync(() => { cache5.queue.clear(); @@ -383864,7 +384164,7 @@ var init_share_next = __esm(async () => { const flush = exports_Effect.fn("ShareNext.flush")(function* (sessionID) { if (disabled) return; - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const queued = s5.queue.get(sessionID); if (!queued) return; @@ -383895,7 +384195,7 @@ var init_share_next = __esm(async () => { const init5 = exports_Effect.fn("ShareNext.init")(function* () { if (disabled) return; - yield* InstanceState.get(state3); + yield* InstanceState.get(state2); }); const url5 = exports_Effect.fn("ShareNext.url")(function* () { return (yield* request4()).baseUrl; @@ -383910,7 +384210,7 @@ var init_share_next = __esm(async () => { target: SessionShareTable.session_id, set: { id: result6.id, secret: result6.secret, url: result6.url } }).run()); - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); yield* full(sessionID).pipe(exports_Effect.catchCause((cause) => exports_Effect.sync(() => { log12.error("share full sync failed", { sessionID, cause }); })), exports_Effect.forkIn(s5.scope)); @@ -384478,16 +384778,16 @@ var init_worktree2 = __esm(async () => { }; }, async create(info3) { - const config6 = Config4.parse(info3); + const config5 = Config4.parse(info3); await Worktree.createFromInfo({ - name: config6.name, - directory: config6.directory, - branch: config6.branch + name: config5.name, + directory: config5.directory, + branch: config5.branch }); }, async remove(info3) { - const config6 = Config4.parse(info3); - await Worktree.remove({ directory: config6.directory }); + const config5 = Config4.parse(info3); + await Worktree.remove({ directory: config5.directory }); }, async fetch(_info, _input, _init) { throw new Error("fetch not implemented"); @@ -384625,14 +384925,14 @@ var init_workspace = __esm(async () => { Workspace.create = fn3(CreateInput, async (input) => { const id2 = WorkspaceID.ascending(input.id); const adaptor = await getAdaptor(input.type); - const config6 = await adaptor.configure({ ...input, id: id2, name: input.name ?? null, directory: null }); + const config5 = await adaptor.configure({ ...input, id: id2, name: input.name ?? null, directory: null }); const info3 = { id: id2, - type: config6.type, - branch: config6.branch ?? null, - name: config6.name ?? null, - directory: config6.directory ?? null, - extra: config6.extra ?? null, + type: config5.type, + branch: config5.branch ?? null, + name: config5.name ?? null, + directory: config5.directory ?? null, + extra: config5.extra ?? null, projectID: input.projectID }; Database.use((db2) => { @@ -384646,7 +384946,7 @@ var init_workspace = __esm(async () => { project_id: info3.projectID }).run(); }); - await adaptor.create(config6); + await adaptor.create(config5); return info3; }); function list(project) { @@ -384788,7 +385088,7 @@ var init_task2 = __esm(async () => { description, parameters: parameters3, async execute(params, ctx2) { - const config6 = await Config.get(); + const config5 = await Config.get(); const mode2 = params.mode ?? "foreground"; if (!ctx2.extra?.bypassAgentCheck) { await ctx2.ask({ @@ -384830,7 +385130,7 @@ var init_task2 = __esm(async () => { action: "deny" } ], - ...config6.experimental?.primary_tools?.map((t2) => ({ + ...config5.experimental?.primary_tools?.map((t2) => ({ pattern: "*", action: "allow", permission: t2 @@ -384866,7 +385166,7 @@ var init_task2 = __esm(async () => { tools: { ...hasTodoWritePermission ? {} : { todowrite: false }, ...hasTaskPermission ? {} : { task: false }, - ...Object.fromEntries((config6.experimental?.primary_tools ?? []).map((t2) => [t2, false])) + ...Object.fromEntries((config5.experimental?.primary_tools ?? []).map((t2) => [t2, false])) }, parts: promptParts }; @@ -384913,7 +385213,7 @@ var init_task2 = __esm(async () => { return "__default__"; } })(); - const maxParallel = config6.experimental?.task?.max_parallel ?? DEFAULT_MAX_PARALLEL; + const maxParallel = config5.experimental?.task?.max_parallel ?? DEFAULT_MAX_PARALLEL; let slotHeld = false; const ensureSlotReleased = () => { if (slotHeld) { @@ -384928,7 +385228,7 @@ var init_task2 = __esm(async () => { const capturePolicy2 = resolveCapturePolicy((await Config.get()).experimental?.observability); const observability2 = capturePolicy2.enabled ? ObservabilityRuntime.service() : undefined; const agentTraceId2 = ObservabilityId.create(); - const agentStartedAtMs2 = Date.now(); + const agentStartedAtMs = Date.now(); let agentSpan2; if (observability2) { const started = startAgent({ traceId: agentTraceId2, sessionId: session.id, projectId: session.projectID }); @@ -384948,12 +385248,12 @@ var init_task2 = __esm(async () => { } else { result6 = await SessionPrompt.prompt(promptInput); } - return { result: result6, observability: observability2, agentSpan: agentSpan2, agentStartedAtMs: agentStartedAtMs2, error: null }; + return { result: result6, observability: observability2, agentSpan: agentSpan2, agentStartedAtMs, error: null }; } catch (err2) { - return { result: null, observability: observability2, agentSpan: agentSpan2, agentStartedAtMs: agentStartedAtMs2, error: err2 }; + return { result: null, observability: observability2, agentSpan: agentSpan2, agentStartedAtMs, error: err2 }; } }; - runPrompt().then(async ({ result: result6, observability: observability2, agentSpan: agentSpan2, agentStartedAtMs: agentStartedAtMs2, error: error49 }) => { + runPrompt().then(async ({ result: result6, observability: observability2, agentSpan: agentSpan2, agentStartedAtMs, error: error49 }) => { try { if (error49) throw error49; @@ -384967,7 +385267,7 @@ var init_task2 = __esm(async () => { result: text10.slice(0, 500) }); if (observability2 && agentSpan2) { - const terminal = finishAgent(agentSpan2.trace, "finished", agentStartedAtMs2); + const terminal = finishAgent(agentSpan2.trace, "finished", agentStartedAtMs); observability2.record(terminal.context, terminal.event); } if (workspace) { @@ -384999,7 +385299,7 @@ var init_task2 = __esm(async () => { }).catch(() => {}); log31.error("background task completion handler failed", { sessionID: session.id, error: errorMsg }); if (observability2 && agentSpan2) { - const terminal = finishAgent(agentSpan2.trace, "failed", agentStartedAtMs2); + const terminal = finishAgent(agentSpan2.trace, "failed", agentStartedAtMs); observability2.record(terminal.context, terminal.event); } } @@ -385048,7 +385348,6 @@ var init_task2 = __esm(async () => { const capturePolicy = resolveCapturePolicy((await Config.get()).experimental?.observability); const observability = capturePolicy.enabled ? ObservabilityRuntime.service() : undefined; const agentTraceId = ObservabilityId.create(); - const agentStartedAtMs = Date.now(); let agentSpan; if (observability) { const started = startAgent({ traceId: agentTraceId, sessionId: session.id, projectId: session.projectID }); @@ -387410,7 +387709,7 @@ var require_select = __commonJS((exports, module2) => { }; }, attr: function(key, op, val, i7) { - op = operators3[op]; + op = operators2[op]; return function(el) { var attr; switch (key) { @@ -387665,7 +387964,7 @@ var require_select = __commonJS((exports, module2) => { }; } }; - var operators3 = { + var operators2 = { "-": function() { return true; }, @@ -387987,7 +388286,7 @@ var require_select = __commonJS((exports, module2) => { return find2(sel, context4); }; exports.selectors = selectors; - exports.operators = operators3; + exports.operators = operators2; exports.combinators = combinators; exports.matches = function(el, sel) { var test = { sel }; @@ -401261,21 +401560,21 @@ function trimTrailingNewlines(string14) { return string14.substring(0, indexEnd); } function isBlock(node) { - return is8(node, blockElements); + return is7(node, blockElements); } function isVoid2(node) { - return is8(node, voidElements); + return is7(node, voidElements); } function hasVoid(node) { return has19(node, voidElements); } function isMeaningfulWhenBlank(node) { - return is8(node, meaningfulWhenBlankElements); + return is7(node, meaningfulWhenBlankElements); } function hasMeaningfulWhenBlank(node) { return has19(node, meaningfulWhenBlankElements); } -function is8(node, tagNames) { +function is7(node, tagNames) { return tagNames.indexOf(node.nodeName) >= 0; } function has19(node, tagNames) { @@ -402198,7 +402497,7 @@ Usage: var init_write = () => {}; // packages/unifia/src/tool/write.ts -import * as path59 from "path"; +import * as path60 from "path"; var MAX_DIAGNOSTICS_PER_FILE2 = 20, MAX_PROJECT_DIAGNOSTICS_FILES = 5, WriteTool; var init_write2 = __esm(async () => { init_zod(); @@ -402227,7 +402526,7 @@ var init_write2 = __esm(async () => { dry_run: zod_default.boolean().optional().describe("Set to true ONLY when the user explicitly asks to preview the write operation without applying it. By default leave this unset to actually write the file.") }), async execute(params, ctx) { - const filepath = path59.isAbsolute(params.filePath) ? params.filePath : path59.join(Instance.directory, params.filePath); + const filepath = path60.isAbsolute(params.filePath) ? params.filePath : path60.join(Instance.directory, params.filePath); await assertExternalDirectory(ctx, filepath); const exists3 = await Filesystem.exists(filepath); if (exists3 && ctx.extra?.model?.providerID === "local-llm") { @@ -402250,7 +402549,7 @@ var init_write2 = __esm(async () => { ${diff} \`\`\``; return { - title: `[dry-run] Write ${path59.basename(filepath)}`, + title: `[dry-run] Write ${path60.basename(filepath)}`, metadata: { diagnostics: {}, filepath, @@ -402261,7 +402560,7 @@ ${diff} } await ctx.ask({ permission: "edit", - patterns: [path59.relative(Instance.worktree, filepath)], + patterns: [path60.relative(Instance.worktree, filepath)], always: ["*"], metadata: { filepath, @@ -402322,7 +402621,7 @@ File is being edited by ${lockConflict.heldBy.username} (session: ${lockConflict output2 += formatFindings(secFindings, filepath); } return { - title: path59.relative(Instance.worktree, filepath), + title: path60.relative(Instance.worktree, filepath), metadata: { diagnostics, filepath, @@ -402356,7 +402655,7 @@ var init_invalid = __esm(async () => { }); // packages/unifia/src/tool/skill.ts -import path60 from "path"; +import path61 from "path"; import { pathToFileURL as pathToFileURL6 } from "url"; var SkillTool; var init_skill2 = __esm(async () => { @@ -402403,7 +402702,7 @@ var init_skill2 = __esm(async () => { always: [params.name], metadata: {} }); - const dir2 = path60.dirname(skill.location); + const dir2 = path61.dirname(skill.location); const base3 = pathToFileURL6(dir2).href; const limit2 = 10; const files = await iife2(async () => { @@ -402417,7 +402716,7 @@ var init_skill2 = __esm(async () => { if (file6.includes("SKILL.md")) { continue; } - arr.push(path60.resolve(dir2, file6)); + arr.push(path61.resolve(dir2, file6)); if (arr.length >= limit2) { break; } @@ -402701,7 +403000,7 @@ Note: LSP servers must be configured for the file type. If no server is availabl var init_lsp2 = () => {}; // packages/unifia/src/tool/lsp.ts -import path61 from "path"; +import path62 from "path"; import { pathToFileURL as pathToFileURL7 } from "url"; var operations, LspTool; var init_lsp3 = __esm(async () => { @@ -402734,7 +403033,7 @@ var init_lsp3 = __esm(async () => { character: zod_default.number().int().min(1).describe("The character offset (1-based, as shown in editors)") }), execute: async (args3, ctx) => { - const file6 = path61.isAbsolute(args3.filePath) ? args3.filePath : path61.join(Instance.directory, args3.filePath); + const file6 = path62.isAbsolute(args3.filePath) ? args3.filePath : path62.join(Instance.directory, args3.filePath); await assertExternalDirectory(ctx, file6); await ctx.ask({ permission: "lsp", @@ -402748,7 +403047,7 @@ var init_lsp3 = __esm(async () => { line: args3.line - 1, character: args3.character - 1 }; - const relPath = path61.relative(Instance.worktree, file6); + const relPath = path62.relative(Instance.worktree, file6); const title = `${args3.operation} ${relPath}:${args3.line}:${args3.character}`; const exists3 = await Filesystem.exists(file6); if (!exists3) { @@ -402796,7 +403095,7 @@ var init_lsp3 = __esm(async () => { }); // packages/unifia/src/patch/index.ts -import * as path62 from "path"; +import * as path63 from "path"; import * as fs23 from "fs/promises"; import { readFileSync as readFileSync9 } from "fs"; var Patch; @@ -403166,7 +403465,7 @@ ${chunk.old_lines.join(` for (const hunk of hunks) { switch (hunk.type) { case "add": { - const addDir = path62.dirname(hunk.path); + const addDir = path63.dirname(hunk.path); if (addDir !== "." && addDir !== "/") { await fs23.mkdir(addDir, { recursive: true }); } @@ -403183,7 +403482,7 @@ ${chunk.old_lines.join(` case "update": { const fileUpdate = deriveNewContentsFromChunks(hunk.path, hunk.chunks); if (hunk.move_path) { - const moveDir = path62.dirname(hunk.move_path); + const moveDir = path63.dirname(hunk.move_path); if (moveDir !== "." && moveDir !== "/") { await fs23.mkdir(moveDir, { recursive: true }); } @@ -403222,10 +403521,10 @@ ${chunk.old_lines.join(` switch (result6.type) { case "Body" /* Body */: { const { args: args3 } = result6; - const effectiveCwd = args3.workdir ? path62.resolve(cwd, args3.workdir) : cwd; + const effectiveCwd = args3.workdir ? path63.resolve(cwd, args3.workdir) : cwd; const changes4 = new Map; for (const hunk of args3.hunks) { - const resolvedPath = path62.resolve(effectiveCwd, hunk.type === "update" && hunk.move_path ? hunk.move_path : hunk.path); + const resolvedPath = path63.resolve(effectiveCwd, hunk.type === "update" && hunk.move_path ? hunk.move_path : hunk.path); switch (hunk.type) { case "add": changes4.set(resolvedPath, { @@ -403234,7 +403533,7 @@ ${chunk.old_lines.join(` }); break; case "delete": { - const deletePath = path62.resolve(effectiveCwd, hunk.path); + const deletePath = path63.resolve(effectiveCwd, hunk.path); try { const content = await fs23.readFile(deletePath, "utf-8"); changes4.set(resolvedPath, { @@ -403250,13 +403549,13 @@ ${chunk.old_lines.join(` break; } case "update": { - const updatePath = path62.resolve(effectiveCwd, hunk.path); + const updatePath = path63.resolve(effectiveCwd, hunk.path); try { const fileUpdate = deriveNewContentsFromChunks(updatePath, hunk.chunks); changes4.set(resolvedPath, { type: "update", unified_diff: fileUpdate.unified_diff, - move_path: hunk.move_path ? path62.resolve(effectiveCwd, hunk.move_path) : undefined, + move_path: hunk.move_path ? path63.resolve(effectiveCwd, hunk.move_path) : undefined, new_content: fileUpdate.content }); } catch (error49) { @@ -403329,7 +403628,7 @@ It is important to remember: var init_apply_patch = () => {}; // packages/unifia/src/tool/apply_patch.ts -import * as path63 from "path"; +import * as path64 from "path"; import * as fs25 from "fs/promises"; var PatchParams, ApplyPatchTool; var init_apply_patch2 = __esm(async () => { @@ -403379,7 +403678,7 @@ var init_apply_patch2 = __esm(async () => { const fileChanges = []; let totalDiff = ""; for (const hunk of hunks) { - const filePath = path63.resolve(Instance.directory, hunk.path); + const filePath = path64.resolve(Instance.directory, hunk.path); await assertExternalDirectory(ctx, filePath); switch (hunk.type) { case "add": { @@ -403431,7 +403730,7 @@ var init_apply_patch2 = __esm(async () => { if (change.removed) deletions += change.count || 0; } - const movePath = hunk.move_path ? path63.resolve(Instance.directory, hunk.move_path) : undefined; + const movePath = hunk.move_path ? path64.resolve(Instance.directory, hunk.move_path) : undefined; await assertExternalDirectory(ctx, movePath); fileChanges.push({ filePath, @@ -403471,7 +403770,7 @@ var init_apply_patch2 = __esm(async () => { } const files = fileChanges.map((change) => ({ filePath: change.filePath, - relativePath: path63.relative(Instance.worktree, change.movePath ?? change.filePath).replaceAll("\\", "/"), + relativePath: path64.relative(Instance.worktree, change.movePath ?? change.filePath).replaceAll("\\", "/"), type: change.type, diff: change.diff, before: change.oldContent, @@ -403480,7 +403779,7 @@ var init_apply_patch2 = __esm(async () => { deletions: change.deletions, movePath: change.movePath })); - const relativePaths = fileChanges.map((c3) => path63.relative(Instance.worktree, c3.filePath).replaceAll("\\", "/")); + const relativePaths = fileChanges.map((c3) => path64.relative(Instance.worktree, c3.filePath).replaceAll("\\", "/")); await ctx.ask({ permission: "edit", patterns: relativePaths, @@ -403496,7 +403795,7 @@ var init_apply_patch2 = __esm(async () => { const edited = change.type === "delete" ? undefined : change.movePath ?? change.filePath; switch (change.type) { case "add": - await fs25.mkdir(path63.dirname(change.filePath), { recursive: true }); + await fs25.mkdir(path64.dirname(change.filePath), { recursive: true }); await fs25.writeFile(change.filePath, change.newContent, "utf-8"); updates.push({ file: change.filePath, event: "add" }); break; @@ -403506,7 +403805,7 @@ var init_apply_patch2 = __esm(async () => { break; case "move": if (change.movePath) { - await fs25.mkdir(path63.dirname(change.movePath), { recursive: true }); + await fs25.mkdir(path64.dirname(change.movePath), { recursive: true }); await fs25.writeFile(change.movePath, change.newContent, "utf-8"); await fs25.unlink(change.filePath); updates.push({ file: change.filePath, event: "unlink" }); @@ -403535,13 +403834,13 @@ var init_apply_patch2 = __esm(async () => { const diagnostics = await LSP.diagnostics(); const summaryLines = fileChanges.map((change) => { if (change.type === "add") { - return `A ${path63.relative(Instance.worktree, change.filePath).replaceAll("\\", "/")}`; + return `A ${path64.relative(Instance.worktree, change.filePath).replaceAll("\\", "/")}`; } if (change.type === "delete") { - return `D ${path63.relative(Instance.worktree, change.filePath).replaceAll("\\", "/")}`; + return `D ${path64.relative(Instance.worktree, change.filePath).replaceAll("\\", "/")}`; } const target = change.movePath ?? change.filePath; - return `M ${path63.relative(Instance.worktree, target).replaceAll("\\", "/")}`; + return `M ${path64.relative(Instance.worktree, target).replaceAll("\\", "/")}`; }); let output2 = `Success. Updated the following files: ${summaryLines.join(` @@ -403560,7 +403859,7 @@ ${summaryLines.join(` ... and ${errors6.length - MAX_DIAGNOSTICS_PER_FILE3} more` : ""; output2 += ` -LSP errors detected in ${path63.relative(Instance.worktree, target).replaceAll("\\", "/")}, please fix: +LSP errors detected in ${path64.relative(Instance.worktree, target).replaceAll("\\", "/")}, please fix: ${limited.map(LSP.Diagnostic.pretty).join(` `)}${suffix} @@ -404886,8 +405185,8 @@ class TeamStore { return row2.next_sequence; }); } - saveCheckpoint(runId, checkpointId, state3) { - const stateJson = json7(state3, TEAM_STORE_MAX_JSON_BYTES, "checkpoint state"); + saveCheckpoint(runId, checkpointId, state2) { + const stateJson = json7(state2, TEAM_STORE_MAX_JSON_BYTES, "checkpoint state"); return this.write((db2) => { const row2 = db2.query("SELECT COALESCE(MAX(sequence), 0) + 1 AS next_sequence FROM team_checkpoints WHERE run_id = ?").get(runId); db2.prepare(`INSERT INTO team_checkpoints(checkpoint_id, run_id, sequence, state_json, created_at) @@ -404983,7 +405282,7 @@ var init_team_store = __esm(() => { }); // packages/unifia/src/team/opencode-application.ts -import path64 from "path"; +import path65 from "path"; async function runOpenCodeTeam(request3, signal, options4 = {}) { if (options4.control && !options4.registry) throw new TypeError("A pre-registered Team control requires its owning registry"); @@ -404998,7 +405297,7 @@ async function runOpenCodeTeam(request3, signal, options4 = {}) { const selection = await TeamSelectionStore.snapshot(request3.parentSessionId); if (!selection) throw new Error("Team requires at least two distinct configured models"); - const config6 = await Config.get(); + const config5 = await Config.get(); const agents = new Map((await Agent2.list()).map((agent) => [agent.name, agent])); for (const task of request3.tasks) if (!agents.has(task.agent)) @@ -405015,10 +405314,10 @@ async function runOpenCodeTeam(request3, signal, options4 = {}) { } const taskById = new Map(request3.tasks.map((task) => [task.taskId, task])); const workerResults = new Map; - const workerAdapter = createWorkerAdapter(request3, selection.models, config6, agents, taskById, workerWorkspaces, workerResults, options4.onWorkerStarted); + const workerAdapter = createWorkerAdapter(request3, selection.models, config5, agents, taskById, workerWorkspaces, workerResults, options4.onWorkerStarted); const reviewerSelector = createReviewerSelector(request3.parentSessionId, selection.models); - const integrationAdapter = createIntegrationAdapter(integrationWorkspace, workerResults); - const openedStore = options4.store ?? TeamStore.open(path64.join(Global.Path.data, "team.db")); + const integrationAdapter = createIntegrationAdapter(integrationWorkspace); + const openedStore = options4.store ?? TeamStore.open(path65.join(Global.Path.data, "team.db")); store = openedStore; const service3 = new TeamApplicationService(openedStore, workerAdapter, reviewerSelector, integrationAdapter); const result7 = await service3.run({ ...request3, integrationTargetBranch: integrationWorkspace.branch, control }, control.signal); @@ -405034,10 +405333,10 @@ async function runOpenCodeTeam(request3, signal, options4 = {}) { await removeWorkspaceIfClean(integrationWorkspace); } } -function restrictedWorkerTools(config6) { - return ["task", "team", ...config6.experimental?.primary_tools ?? []]; +function restrictedWorkerTools(config5) { + return ["task", "team", ...config5.experimental?.primary_tools ?? []]; } -function createWorkerAdapter(request3, models, config6, agents, taskById, workspaces, results, onWorkerStarted) { +function createWorkerAdapter(request3, models, config5, agents, taskById, workspaces, results, onWorkerStarted) { return { async run(input) { const task = taskById.get(input.task.taskId); @@ -405046,7 +405345,7 @@ function createWorkerAdapter(request3, models, config6, agents, taskById, worksp const agent = agents.get(task.agent); if (!agent) throw new Error(`Unknown Team agent: ${task.agent}`); - const restricted = restrictedWorkerTools(config6); + const restricted = restrictedWorkerTools(config5); const session = await Session.create({ parentID: request3.parentSessionId, title: `${task.description} (@${task.agent} team member)`, @@ -405177,7 +405476,7 @@ function reviewModel(parentSessionId, model) { } }; } -function createIntegrationAdapter(workspace, results) { +function createIntegrationAdapter(workspace) { return { async execute(plan) { if (!workspace.directory) @@ -405188,7 +405487,7 @@ function createIntegrationAdapter(workspace, results) { const commands4 = integrationValidationCommands(plan); const proofs = []; for (const command3 of commands4) { - const output2 = await processCommand(path64.join(workspace.directory, command3.cwd), [...command3.argv]); + const output2 = await processCommand(path65.join(workspace.directory, command3.cwd), [...command3.argv]); proofs.push(`${command3.label}: ${output2.stdout.trim().slice(-500) || "passed"}`); } const dirty = (await git(workspace.directory, ["status", "--porcelain"])).stdout.trim(); @@ -405871,18 +406170,18 @@ var init_debate_store = __esm(async () => { } DebateStore.Service = Service3; DebateStore.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { - const create = exports_Effect.fn("DebateStore.create")(function* (config6, providerCount, directory) { + const create = exports_Effect.fn("DebateStore.create")(function* (config5, providerCount, directory) { const id2 = Collective.DebateID.make(); - log12.info("creating debate", { id: id2, tier: config6.tier }); + log12.info("creating debate", { id: id2, tier: config5.tier }); Database.use((db2) => { db2.insert(DebateTable).values({ id: id2, status: "pending", - prompt: config6.question, - prompt_hash: hashPrompt(config6.question), + prompt: config5.question, + prompt_hash: hashPrompt(config5.question), workspace_hash: hashWorkspace(directory), - tier: config6.tier, - config: config6, + tier: config5.tier, + config: config5, provider_count: providerCount }).run(); }); @@ -406109,11 +406408,11 @@ var init_budget_tracker = __esm(async () => { }; } BudgetTracker.unlimited = unlimited; - function estimate(config6, participants) { - const questionTokens = Math.ceil(config6.question.length / 4); - const contextTokens = config6.context ? Math.ceil(config6.context.length / 4) : 0; + function estimate(config5, participants) { + const questionTokens = Math.ceil(config5.question.length / 4); + const contextTokens = config5.context ? Math.ceil(config5.context.length / 4) : 0; const inputPerModel = questionTokens + contextTokens + 500; - const tierCfg = Collective.TIER_CONFIG[config6.tier]; + const tierCfg = Collective.TIER_CONFIG[config5.tier]; const breakdown = []; let totalTokens = 0; let totalCost = 0; @@ -408272,7 +408571,7 @@ var init_orchestrator2 = __esm(async () => { Orchestrator.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const store = yield* DebateStore.Service; const bus = yield* Bus.Service; - const run9 = exports_Effect.fn("Orchestrator.run")(function* (config6, onDebateID) { + const run9 = exports_Effect.fn("Orchestrator.run")(function* (config5, onDebateID) { const startTime = Date.now(); const salt = crypto.randomUUID(); let directory; @@ -408281,38 +408580,38 @@ var init_orchestrator2 = __esm(async () => { } catch { directory = process.cwd(); } - if (!config6.participants && config6.tier === "quick") { - const recommendation = TierClassifier.classifyHeuristic(config6.question); - if (recommendation.tier !== config6.tier) { + if (!config5.participants && config5.tier === "quick") { + const recommendation = TierClassifier.classifyHeuristic(config5.question); + if (recommendation.tier !== config5.tier) { log12.info("auto-tier reclassified", { - from: config6.tier, + from: config5.tier, to: recommendation.tier, score: recommendation.score, reason: recommendation.reason }); - config6 = { ...config6, tier: recommendation.tier }; + config5 = { ...config5, tier: recommendation.tier }; } } - const tierCfg = Collective.TIER_CONFIG[config6.tier]; + const tierCfg = Collective.TIER_CONFIG[config5.tier]; let abVariant; - const isAbEligible = config6.tier === "standard" || config6.tier === "deep"; + const isAbEligible = config5.tier === "standard" || config5.tier === "deep"; if (isAbEligible) { const roll = Math.random(); if (roll < 0.1) { abVariant = "variant"; - log12.info("A/B mode: variant selected", { tier: config6.tier }); + log12.info("A/B mode: variant selected", { tier: config5.tier }); } else { abVariant = "control"; } } - const { providers: discoveredParticipants, ghostWarnings } = yield* ProviderDiscovery.discover(config6.participants); - const discovered = ProviderDiscovery.includeJudge(discoveredParticipants, config6.judgeProviderID, config6.judgeModelID); + const { providers: discoveredParticipants, ghostWarnings } = yield* ProviderDiscovery.discover(config5.participants); + const discovered = ProviderDiscovery.includeJudge(discoveredParticipants, config5.judgeProviderID, config5.judgeModelID); if (ghostWarnings.length > 0) { log12.info("ghost model warnings", { warnings: ghostWarnings }); } - const debateID = yield* store.create(config6, discovered.length, directory); + const debateID = yield* store.create(config5, discovered.length, directory); onDebateID?.(debateID); - const budgetCfg = config6.budget ?? BudgetTracker.unlimited(); + const budgetCfg = config5.budget ?? BudgetTracker.unlimited(); const budget = BudgetTracker.create(budgetCfg); const failedProviders = []; const describeError = (error49) => { @@ -408323,7 +408622,7 @@ var init_orchestrator2 = __esm(async () => { return String(error49); }; try { - const roles = yield* RoleAssigner.assign(config6.question, discovered.length, discovered[0].providerID, discovered[0].modelID, config6.roles); + const roles = yield* RoleAssigner.assign(config5.question, discovered.length, discovered[0].providerID, discovered[0].modelID, config5.roles); const participants = discovered.map((d5, i7) => ({ providerID: d5.providerID, modelID: d5.modelID, @@ -408332,28 +408631,28 @@ var init_orchestrator2 = __esm(async () => { authMethod: d5.authMethod })); let seeds = []; - if (!config6.noMemory) { - seeds = yield* store.seedWithPastBlindSpots(config6.question, directory, 3); + if (!config5.noMemory) { + seeds = yield* store.seedWithPastBlindSpots(config5.question, directory, 3); } yield* bus.publish(DebateStarted, { debateID, - tier: config6.tier, + tier: config5.tier, providers: participants.map((p2) => `${p2.providerID}/${p2.modelID}`) }); let canaryBug; - let effectiveContext = config6.context; - if (tierCfg.enableCanary && config6.enableCanary) { + let effectiveContext = config5.context; + if (tierCfg.enableCanary && config5.enableCanary) { const cheapP = discovered[0]; - const { canary, tokenUsage: canaryTokens } = yield* Canary.generate(config6.question, config6.context, cheapP.providerID, cheapP.modelID, bus, debateID); + const { canary, tokenUsage: canaryTokens } = yield* Canary.generate(config5.question, config5.context, cheapP.providerID, cheapP.modelID, bus, debateID); canaryBug = canary; - effectiveContext = Canary.injectIntoContext(config6.context, canary); + effectiveContext = Canary.injectIntoContext(config5.context, canary); budget.record("canary_gen", cheapP.providerID, canaryTokens.input, canaryTokens.output); log12.info("canary injected", { category: canary.category }); } yield* store.updateStatus(debateID, "phase1_diverge"); yield* bus.publish(DebatePhaseChanged, { debateID, phase: "phase1_diverge" }); log12.info("phase 1: diverge", { participantCount: participants.length }); - const phase1Responses = yield* exports_Effect.all(participants.map((p2) => runParticipant(p2, config6.question, effectiveContext, seeds, bus, debateID).pipe(exports_Effect.catch((error49) => { + const phase1Responses = yield* exports_Effect.all(participants.map((p2) => runParticipant(p2, config5.question, effectiveContext, seeds, bus, debateID).pipe(exports_Effect.catch((error49) => { const provider2 = `${p2.providerID}/${p2.modelID}`; const message = describeError(error49); failedProviders.push({ provider: provider2, error: message }); @@ -408389,7 +408688,7 @@ var init_orchestrator2 = __esm(async () => { yield* bus.publish(DebatePhaseChanged, { debateID, phase: "phase2_extract" }); log12.info("phase 2: extract", { responseCount: validResponses.length }); const extractorP = activeProviders[0]; - const { claims: rawClaims, tokenUsage: extractTokens } = yield* ClaimExtractor.extract(validResponses, config6.question, extractorP.providerID, extractorP.modelID, bus, debateID); + const { claims: rawClaims, tokenUsage: extractTokens } = yield* ClaimExtractor.extract(validResponses, config5.question, extractorP.providerID, extractorP.modelID, bus, debateID); budget.record("phase2_extract", extractorP.providerID, extractTokens.input, extractTokens.output); yield* budget.check(); const { updatedClaims } = yield* JargonChecker.check(rawClaims, directory); @@ -408433,7 +408732,7 @@ var init_orchestrator2 = __esm(async () => { round: round4 + 1, claimsResubmitted: targetClaims.length }); - const roundResults = yield* exports_Effect.all(participants.map((p2) => runConvergence(p2, targetClaims, config6.question, bus, debateID).pipe(exports_Effect.catch(() => exports_Effect.succeed(null)))), { concurrency: "unbounded" }); + const roundResults = yield* exports_Effect.all(participants.map((p2) => runConvergence(p2, targetClaims, config5.question, bus, debateID).pipe(exports_Effect.catch(() => exports_Effect.succeed(null)))), { concurrency: "unbounded" }); for (const cr2 of roundResults) { if (cr2) { convergenceResults.push(cr2); @@ -408463,8 +408762,8 @@ var init_orchestrator2 = __esm(async () => { } let _redTeamAttacks = []; const consensusRatio = RedTeam.computeConsensusRatio(claims); - const redTeamSetting = config6.redTeam ?? tierCfg.redTeam; - if (RedTeam.shouldActivate(config6.tier, redTeamSetting, consensusRatio)) { + const redTeamSetting = config5.redTeam ?? tierCfg.redTeam; + if (RedTeam.shouldActivate(config5.tier, redTeamSetting, consensusRatio)) { yield* bus.publish(RedTeamActivated, { debateID, reason: `Consensus ratio ${(consensusRatio * 100).toFixed(0)}% \u2265 threshold` @@ -408487,7 +408786,7 @@ var init_orchestrator2 = __esm(async () => { } yield* store.updateStatus(debateID, "phase4_synthesize"); yield* bus.publish(DebatePhaseChanged, { debateID, phase: "phase4_synthesize" }); - const requestedJudge = config6.judgeProviderID && config6.judgeModelID ? activeProviders.find((provider2) => provider2.providerID === config6.judgeProviderID && provider2.modelID === config6.judgeModelID) : undefined; + const requestedJudge = config5.judgeProviderID && config5.judgeModelID ? activeProviders.find((provider2) => provider2.providerID === config5.judgeProviderID && provider2.modelID === config5.judgeModelID) : undefined; const judge = requestedJudge ?? { ...activeProviders[0], role: "judge" }; log12.info("phase 4: synthesize", { claimCount: claims.length, @@ -408501,12 +408800,12 @@ var init_orchestrator2 = __esm(async () => { meta: meta3, tokenUsage: synthTokens } = yield* SynthesisJudge.synthesize({ - question: config6.question, + question: config5.question, claims, participants, judgeProviderID: judge.providerID, judgeModelID: judge.modelID, - tier: config6.tier, + tier: config5.tier, initialDisagreements, convergenceResults, bus, @@ -408532,15 +408831,15 @@ var init_orchestrator2 = __esm(async () => { }); } let shadowDelta; - if (config6.enableShadowBaseline && config6.tier !== "free") { + if (config5.enableShadowBaseline && config5.tier !== "free") { const strongest = [...discovered].sort((a5, b3) => { const ca = "cost" in a5 && a5.cost ? a5.cost.output : 10; const cb = "cost" in b3 && b3.cost ? b3.cost.output : 10; return cb - ca; })[0]; const shadowResult = yield* Metrics.runShadowBaseline({ - question: config6.question, - context: config6.context, + question: config5.question, + context: config5.context, bestProviderID: strongest.providerID, bestModelID: strongest.modelID, collectiveClaims: adjustedClaims @@ -408563,9 +408862,9 @@ var init_orchestrator2 = __esm(async () => { } const report2 = { id: debateID, - prompt: config6.question, + prompt: config5.question, timestamp: new Date(startTime).toISOString(), - tier: config6.tier, + tier: config5.tier, providers: participants.map((p2) => `${p2.providerID}/${p2.modelID}`), failedProviders, roles: rolesMap, @@ -408611,20 +408910,20 @@ var init_orchestrator2 = __esm(async () => { throw error49; } }); - const estimate = exports_Effect.fn("Orchestrator.estimate")(function* (config6) { - const { providers: discovered } = yield* ProviderDiscovery.discover(config6.participants, Collective.TIER_CONFIG[config6.tier].maxProviders); - return BudgetTracker.estimate(config6, discovered); + const estimate = exports_Effect.fn("Orchestrator.estimate")(function* (config5) { + const { providers: discovered } = yield* ProviderDiscovery.discover(config5.participants, Collective.TIER_CONFIG[config5.tier].maxProviders); + return BudgetTracker.estimate(config5, discovered); }); return Service3.of({ run: run9, estimate }); })); Orchestrator.defaultLayer = Orchestrator.layer.pipe(exports_Layer.provide(DebateStore.layer), exports_Layer.provide(Bus.layer)); const { runPromise: runPromise3 } = makeRuntime4(Service3, Orchestrator.defaultLayer); - async function runPromiseExport(config6, onDebateID) { - return runPromise3((svc) => svc.run(config6, onDebateID)); + async function runPromiseExport(config5, onDebateID) { + return runPromise3((svc) => svc.run(config5, onDebateID)); } Orchestrator.runPromiseExport = runPromiseExport; - async function estimatePromise(config6) { - return runPromise3((svc) => svc.estimate(config6)); + async function estimatePromise(config5) { + return runPromise3((svc) => svc.estimate(config5)); } Orchestrator.estimatePromise = estimatePromise; function runParticipant(participant, question, context4, seeds, bus, debateID) { @@ -409002,8 +409301,8 @@ function initSubscription() { properties: {} }, async (event) => { try { - const config6 = await Config.get(); - const shadowCfg = config6.experimental?.collective?.shadow_daemon; + const config5 = await Config.get(); + const shadowCfg = config5.experimental?.collective?.shadow_daemon; if (!shadowCfg?.enabled) return; const sessionID = event.properties?.sessionID; @@ -409065,19 +409364,19 @@ var init_collective = __esm(async () => { }); // packages/unifia/src/tool/debate.ts -async function executeWithLiveTracking(config6, ctx, run9) { +async function executeWithLiveTracking(config5, ctx, run9) { let currentDebateID; - const tracker = DebateLive.createTracker((snapshot4) => { + const tracker = DebateLive.createTracker((snapshot3) => { ctx.metadata({ metadata: { - phase: snapshot4.phase, - participants: snapshot4.participants + phase: snapshot3.phase, + participants: snapshot3.participants } }); }); const unsubscribeAll = DebateLive.subscribe(() => currentDebateID, tracker); try { - const report2 = await run9(config6, (id2) => { + const report2 = await run9(config5, (id2) => { currentDebateID = id2; }); const summary2 = [ @@ -409165,7 +409464,7 @@ var init_debate3 = __esm(async () => { error: event.error }; } - function snapshot4() { + function snapshot3() { return { phase, participants: { ...participants } }; } function drain4() { @@ -409178,14 +409477,14 @@ var init_debate3 = __esm(async () => { } finally { draining = false; } - onFlush(snapshot4()); + onFlush(snapshot3()); } return { enqueue(event) { queue.push(event); drain4(); }, - snapshot: snapshot4 + snapshot: snapshot3 }; } DebateLive.createTracker = createTracker; @@ -409239,12 +409538,12 @@ var init_debate3 = __esm(async () => { } DebateLive.subscribe = subscribe3; function formatParticipantSummary(participants) { - return Object.entries(participants).map(([provider2, state3]) => `${provider2}: ${state3.status}${state3.error ? ` (${state3.error})` : ""}`).join(", "); + return Object.entries(participants).map(([provider2, state2]) => `${provider2}: ${state2.status}${state2.error ? ` (${state2.error})` : ""}`).join(", "); } - function describeFailure(snapshot4, cause) { + function describeFailure(snapshot3, cause) { const message = cause instanceof Error ? cause.message : String(cause); - const participantSummary = formatParticipantSummary(snapshot4.participants); - const context4 = participantSummary ? `phase "${snapshot4.phase}", participants: ${participantSummary}` : `phase "${snapshot4.phase}", no participant activity recorded`; + const participantSummary = formatParticipantSummary(snapshot3.participants); + const context4 = participantSummary ? `phase "${snapshot3.phase}", participants: ${participantSummary}` : `phase "${snapshot3.phase}", no participant activity recorded`; return `Debate failed (${context4}): ${message}`; } DebateLive.describeFailure = describeFailure; @@ -409260,7 +409559,7 @@ var init_debate3 = __esm(async () => { parameters: parameters6, async execute(args3, ctx) { const selection = await DebateSelection.get(ctx.sessionID); - const config6 = { + const config5 = { question: args3.question, context: args3.context, tier: args3.tier ?? "quick", @@ -409275,7 +409574,7 @@ var init_debate3 = __esm(async () => { maxRounds: 2 }; try { - return await executeWithLiveTracking(config6, ctx, Orchestrator.runPromiseExport); + return await executeWithLiveTracking(config5, ctx, Orchestrator.runPromiseExport); } catch (error49) { const message = error49 instanceof Error ? error49.message : String(error49); return { @@ -409301,7 +409600,7 @@ var exports_registry = {}; __export(exports_registry, { ToolRegistry: () => ToolRegistry }); -import path65 from "path"; +import path66 from "path"; import { pathToFileURL as pathToFileURL8 } from "url"; var ToolRegistry; var init_registry = __esm(async () => { @@ -409353,10 +409652,10 @@ var init_registry = __esm(async () => { } ToolRegistry.Service = Service3; ToolRegistry.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { - const config6 = yield* Config.Service; + const config5 = yield* Config.Service; const plugin = yield* Plugin.Service; const build2 = (tool2) => exports_Effect.isEffect(tool2) ? tool2 : exports_Effect.succeed(tool2); - const state3 = yield* InstanceState.make(exports_Effect.fn("ToolRegistry.state")(function* (ctx) { + const state2 = yield* InstanceState.make(exports_Effect.fn("ToolRegistry.state")(function* (ctx) { const custom4 = []; function fromPlugin(id2, def) { return { @@ -409381,12 +409680,12 @@ var init_registry = __esm(async () => { }) }; } - const dirs = yield* config6.directories(); + const dirs = yield* config5.directories(); const matches = dirs.flatMap((dir2) => Glob.scanSync("{tool,tools}/*.{js,ts}", { cwd: dir2, absolute: true, dot: true, symlink: true })); if (matches.length) - yield* config6.waitForDependencies(); + yield* config5.waitForDependencies(); for (const match17 of matches) { - const namespace = path65.basename(match17, path65.extname(match17)); + const namespace = path66.basename(match17, path66.extname(match17)); const mod2 = yield* exports_Effect.promise(() => process.platform === "win32" ? import(match17) : import(pathToFileURL8(match17).href)); for (const [id2, def] of Object.entries(mod2)) { custom4.push(fromPlugin(id2 === "default" ? namespace : `${namespace}_${id2}`, def)); @@ -409421,8 +409720,8 @@ var init_registry = __esm(async () => { const plan = yield* build2(PlanExitTool); const debate = yield* build2(DebateTool); const all7 = exports_Effect.fn("ToolRegistry.all")(function* (custom4) { - const cfg = yield* config6.get(); - const question = ["app", "cli", "desktop"].includes(Flag.OPENCODE_CLIENT) || Flag.UNIFIA_ENABLE_QUESTION_TOOL; + const cfg = yield* config5.get(); + const question = ["app", "cli", "desktop"].includes(Flag.UNIFIA_CLIENT) || Flag.UNIFIA_ENABLE_QUESTION_TOOL; return [ invalid2, ...question ? [ask2] : [], @@ -409442,18 +409741,18 @@ var init_registry = __esm(async () => { patch3, ...Flag.UNIFIA_EXPERIMENTAL_LSP_TOOL ? [lsp] : [], ...cfg.experimental?.batch_tool === true ? [batch] : [], - ...Flag.OPENCODE_EXPERIMENTAL_PLAN_MODE && Flag.OPENCODE_CLIENT === "cli" ? [plan] : [], + ...Flag.UNIFIA_EXPERIMENTAL_PLAN_MODE && Flag.UNIFIA_CLIENT === "cli" ? [plan] : [], debate, ...custom4 ]; }); const ids2 = exports_Effect.fn("ToolRegistry.ids")(function* () { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const tools3 = yield* all7(s5.custom); return tools3.map((t2) => t2.id); }); const tools2 = exports_Effect.fn("ToolRegistry.tools")(function* (model, agent, permission) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const allTools = yield* all7(s5.custom); const LOCAL_TOOLS = new Set([ "bash", @@ -409553,7 +409852,7 @@ var init_runner = __esm(() => { const busy = opts?.onBusy ?? exports_Effect.void; const onInterrupt3 = opts?.onInterrupt; let ids = 0; - const state3 = () => exports_SynchronizedRef.getUnsafe(ref); + const state2 = () => exports_SynchronizedRef.getUnsafe(ref); const next4 = () => { ids += 1; return ids; @@ -409671,10 +409970,10 @@ var init_runner = __esm(() => { }).pipe(exports_Effect.flatten); return { get state() { - return state3(); + return state2(); }, get busy() { - return state3()._tag !== "Idle"; + return state2()._tag !== "Idle"; }, ensureRunning, startShell, @@ -409686,7 +409985,7 @@ var init_runner = __esm(() => { // packages/unifia/src/session/project-context.ts import fs26 from "fs"; -import path66 from "path"; +import path67 from "path"; var log34, DECLARATION_PATTERNS, SOURCE_EXTENSIONS, ProjectContext; var init_project_context = __esm(async () => { init_glob(); @@ -409750,7 +410049,7 @@ var init_project_context = __esm(async () => { for (const rel of allFiles) { if (FileIgnore.match(rel)) continue; - const abs5 = path66.join(dir2, rel); + const abs5 = path67.join(dir2, rel); try { const stat5 = fs26.statSync(abs5); const content = fs26.readFileSync(abs5, "utf-8"); @@ -409774,7 +410073,7 @@ var init_project_context = __esm(async () => { async function extractAllDeclarations(files) { const results = []; for (const file6 of files) { - const ext2 = path66.extname(file6.relativePath).toLowerCase(); + const ext2 = path67.extname(file6.relativePath).toLowerCase(); const pattern = DECLARATION_PATTERNS[ext2]; if (!pattern) { results.push({ file: file6, declarations: [] }); @@ -409806,12 +410105,12 @@ var init_project_context = __esm(async () => { } function format11(symbols, budgetTokens) { const budgetChars = budgetTokens * 4; - const filesLine = symbols.filter((s5) => SOURCE_EXTENSIONS.has(path66.extname(s5.file.relativePath).toLowerCase()) || s5.declarations.length > 0).map((s5) => `${s5.file.relativePath} (${s5.file.lines}L)`).join(", "); + const filesLine = symbols.filter((s5) => SOURCE_EXTENSIONS.has(path67.extname(s5.file.relativePath).toLowerCase()) || s5.declarations.length > 0).map((s5) => `${s5.file.relativePath} (${s5.file.lines}L)`).join(", "); const level1 = ` Files: ${filesLine} `; if (level1.length > budgetChars) { - const truncated = symbols.filter((s5) => SOURCE_EXTENSIONS.has(path66.extname(s5.file.relativePath).toLowerCase())).slice(0, 10).map((s5) => `${s5.file.relativePath} (${s5.file.lines}L)`).join(", "); + const truncated = symbols.filter((s5) => SOURCE_EXTENSIONS.has(path67.extname(s5.file.relativePath).toLowerCase())).slice(0, 10).map((s5) => `${s5.file.relativePath} (${s5.file.lines}L)`).join(", "); const minimal = ` Files: ${truncated} `; @@ -409948,8 +410247,8 @@ function assertVector(vec, expected) { } return parsed.data; } -async function getEmbeddingModel(config6) { - const cfg = config6 ?? DEFAULT_CONFIG; +async function getEmbeddingModel(config5) { + const cfg = config5 ?? DEFAULT_CONFIG; const ragConfig = (await Config.get())?.experimental?.rag; const apiKey = ragConfig?.api_key; switch (cfg.provider) { @@ -409978,25 +410277,25 @@ async function getEmbeddingModel(config6) { throw new Error(`Unsupported embedding provider: ${cfg.provider}`); } } -async function generateEmbedding(text10, config6) { - const model = await getEmbeddingModel(config6); +async function generateEmbedding(text10, config5) { + const model = await getEmbeddingModel(config5); const result7 = await embed({ model, value: text10 }); - const vec = assertVector(result7.embedding, config6?.dimensions); + const vec = assertVector(result7.embedding, config5?.dimensions); log35.info("generated embedding", { tokens: result7.usage?.tokens ?? 0, dimensions: vec.length }); return { embedding: new Float32Array(vec), tokens: result7.usage?.tokens ?? 0 }; } -async function generateEmbeddings(texts, config6) { +async function generateEmbeddings(texts, config5) { if (texts.length === 0) return { embeddings: [], tokens: 0 }; - const model = await getEmbeddingModel(config6); + const model = await getEmbeddingModel(config5); const result7 = await embedMany({ model, values: texts }); if (!Array.isArray(result7.embeddings) || result7.embeddings.length !== texts.length) { throw new Error(`embedding: batch size mismatch \u2014 sent ${texts.length}, got ${Array.isArray(result7.embeddings) ? result7.embeddings.length : "non-array"}`); } - const validated = result7.embeddings.map((e4) => assertVector(e4, config6?.dimensions)); + const validated = result7.embeddings.map((e4) => assertVector(e4, config5?.dimensions)); log35.info("generated embeddings", { count: texts.length, tokens: result7.usage?.tokens ?? 0 @@ -410353,7 +410652,7 @@ var init_vector_store = __esm(async () => { }); // packages/unifia/src/rag/index.ts -import path67 from "path"; +import path68 from "path"; import fs27 from "fs"; var log37, MAX_BATCH_SIZE = 50, DEFAULT_TOP_K = 5, MIN_SIMILARITY = 0.3, RAG; var init_rag = __esm(async () => { @@ -410408,7 +410707,7 @@ var init_rag = __esm(async () => { if (!await isEnabled3()) return 0; const provider2 = await getActiveProvider(); - const relativePath = path67.relative(Instance.worktree, filePath); + const relativePath = path68.relative(Instance.worktree, filePath); if (FileIgnore.match(relativePath)) return 0; let byteSize; @@ -410427,8 +410726,8 @@ var init_rag = __esm(async () => { return 0; if (provider2 === "bm25") return indexBM25Chunks(projectID, "file", relativePath, chunks3); - const config6 = await getEmbeddingConfig(); - return indexVectorChunks(projectID, "file", relativePath, chunks3, config6); + const config5 = await getEmbeddingConfig(); + return indexVectorChunks(projectID, "file", relativePath, chunks3, config5); } RAG.indexFile = indexFile; async function indexSummary(projectID, sessionID, summary2) { @@ -410440,8 +410739,8 @@ var init_rag = __esm(async () => { ${summary2}`, { sessionID }); if (provider2 === "bm25") return indexBM25Chunks(projectID, "summary", sessionID, chunks3); - const config6 = await getEmbeddingConfig(); - return indexVectorChunks(projectID, "summary", sessionID, chunks3, config6); + const config5 = await getEmbeddingConfig(); + return indexVectorChunks(projectID, "summary", sessionID, chunks3, config5); } RAG.indexSummary = indexSummary; async function indexLearning(projectID, filePath, content) { @@ -410453,8 +410752,8 @@ ${summary2}`, { sessionID }); ${content}`, { file: filePath }); if (provider2 === "bm25") return indexBM25Chunks(projectID, "learning", filePath, chunks3); - const config6 = await getEmbeddingConfig(); - return indexVectorChunks(projectID, "learning", filePath, chunks3, config6); + const config5 = await getEmbeddingConfig(); + return indexVectorChunks(projectID, "learning", filePath, chunks3, config5); } RAG.indexLearning = indexLearning; async function indexFiles(projectID, filePaths) { @@ -410464,7 +410763,7 @@ ${content}`, { file: filePath }); let total = 0; for (const fp of filePaths) { try { - const rel = path67.relative(Instance.worktree, fp); + const rel = path68.relative(Instance.worktree, fp); validRelPaths.add(rel); total += await indexFile(projectID, fp); } catch (e4) { @@ -410531,8 +410830,8 @@ ${content}`, { file: filePath }); }); } async function vectorSearch(projectID, query2, k4, minSim, sourceTypes) { - const config6 = await getEmbeddingConfig(); - const { embedding: queryVec } = await generateEmbedding(query2, config6); + const config5 = await getEmbeddingConfig(); + const { embedding: queryVec } = await generateEmbedding(query2, config5); const db2 = Database.Client(); const conditions = [eq(EmbeddingTable.project_id, projectID)]; if (sourceTypes?.length) { @@ -410649,7 +410948,7 @@ ${sections.join(` log37.info("indexed bm25 chunks", { sourceType, sourceId, total: indexed }); return indexed; } - async function indexVectorChunks(projectID, sourceType, sourceId, chunks3, config6) { + async function indexVectorChunks(projectID, sourceType, sourceId, chunks3, config5) { const db2 = Database.Client(); const existingRows = db2.select({ content_hash: EmbeddingTable.content_hash }).from(EmbeddingTable).where(and3(eq(EmbeddingTable.project_id, projectID), eq(EmbeddingTable.source_type, sourceType), eq(EmbeddingTable.source_id, sourceId))).all(); const existingHashes = new Set(existingRows.map((r5) => r5.content_hash)); @@ -410664,7 +410963,7 @@ ${sections.join(` const batch = chunks3.slice(i7, i7 + MAX_BATCH_SIZE); const texts = batch.map((c3) => c3.content); try { - const { embeddings } = await generateEmbeddings(texts, config6); + const { embeddings } = await generateEmbeddings(texts, config5); for (let j3 = 0;j3 < batch.length; j3++) { db2.insert(EmbeddingTable).values({ id: ulid5(), @@ -410673,8 +410972,8 @@ ${sections.join(` source_id: sourceId, content: batch[j3].content, vector: vectorToBuffer(embeddings[j3]), - model: config6.model, - dimensions: config6.dimensions, + model: config5.model, + dimensions: config5.dimensions, metadata: batch[j3].metadata, content_hash: batch[j3].hash, time_created: Date.now(), @@ -410693,7 +410992,7 @@ ${sections.join(` }); // packages/unifia/src/session/learn.ts -import path68 from "path"; +import path69 from "path"; var log38, MIN_MESSAGES_FOR_LEARNING = 6, SessionLearn; var init_learn = __esm(async () => { init_dist3(); @@ -410705,6 +411004,7 @@ var init_learn = __esm(async () => { init_llm(), init_log(), init_instance(), + init_paths(), init_rag() ]); log38 = Log.create({ service: "session.learn" }); @@ -410764,7 +411064,7 @@ var init_learn = __esm(async () => { } const date13 = new Date().toISOString().split("T")[0]; const filename = `${date13}-${input.sessionID.slice(0, 8)}.md`; - const filepath = path68.join(Instance.worktree, ".opencode", "learnings", filename); + const filepath = path69.join(Instance.worktree, ConfigPaths.PROJECT_DIRECTORY, "learnings", filename); const content = lessons.map((l2) => `### ${l2.title} ${l2.content} @@ -410801,25 +411101,29 @@ ${content} // packages/unifia/src/session/learnings-context.ts import fs28 from "fs"; -import path69 from "path"; +import path70 from "path"; function readRecentLearnings(worktree, budgetTokens) { if (budgetTokens <= 0) return; - const dir2 = path69.join(worktree, ".opencode", "learnings"); - let files; - try { - files = fs28.readdirSync(dir2).filter((f5) => f5.endsWith(".md")); - } catch { - return; - } + const dirs = [ + path70.join(worktree, ConfigPaths.LEGACY_PROJECT_DIRECTORY, "learnings"), + path70.join(worktree, ConfigPaths.PROJECT_DIRECTORY, "learnings") + ]; + const files = dirs.flatMap((dir2) => { + try { + return fs28.readdirSync(dir2).filter((name26) => name26.endsWith(".md")).map((name26) => ({ name: name26, filepath: path70.join(dir2, name26) })); + } catch { + return []; + } + }); if (files.length === 0) return; - files.sort().reverse(); + files.sort((a5, b3) => b3.name.localeCompare(a5.name)); const budgetChars = budgetTokens * 4; let content = ""; for (const file6 of files.slice(0, 5)) { try { - const text10 = fs28.readFileSync(path69.join(dir2, file6), "utf-8"); + const text10 = fs28.readFileSync(file6.filepath, "utf-8"); if (content.length + text10.length > budgetChars) break; content += text10 + ` @@ -410835,7 +411139,9 @@ Previous session learnings: ${content.trim()} `; } -var init_learnings_context = () => {}; +var init_learnings_context = __esm(async () => { + await init_paths(); +}); // packages/unifia/src/util/data-url.ts function decodeDataUrl(url4) { @@ -410850,7 +411156,7 @@ function decodeDataUrl(url4) { } // packages/unifia/src/session/prompt.ts -import path70 from "path"; +import path71 from "path"; import fs29 from "fs"; import os19 from "os"; import { pathToFileURL as pathToFileURL9, fileURLToPath as fileURLToPath8 } from "url"; @@ -410913,7 +411219,6 @@ var init_prompt = __esm(async () => { init_cross_spawn_spawner(); init_Stream(); init_markdown(); - init_learnings_context(); init_error(); init_filesystem2(); init_process2(); @@ -410941,6 +411246,7 @@ var init_prompt = __esm(async () => { init_project_context(), init_rag(), init_learn(), + init_learnings_context(), init_processor(), init_permission(), init_status(), @@ -410979,7 +411285,7 @@ var init_prompt = __esm(async () => { const spawner = yield* exports_ChildProcessSpawner.ChildProcessSpawner; const scope3 = yield* exports_Scope.Scope; const instruction = yield* Instruction.Service; - const state3 = yield* InstanceState.make(exports_Effect.fn("SessionPrompt.state")(function* () { + const state2 = yield* InstanceState.make(exports_Effect.fn("SessionPrompt.state")(function* () { const runners = new Map; yield* exports_Effect.addFinalizer(exports_Effect.fnUntraced(function* () { yield* exports_Effect.forEach(runners.values(), (r5) => r5.cancel, { concurrency: "unbounded", discard: true }); @@ -411023,14 +411329,14 @@ var init_prompt = __esm(async () => { return runner; }; const assertNotBusy2 = exports_Effect.fn("SessionPrompt.assertNotBusy")(function* (sessionID) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const runner = s5.runners.get(sessionID); if (runner?.busy) throw new Session.BusyError(sessionID); }); const cancel2 = exports_Effect.fn("SessionPrompt.cancel")(function* (sessionID) { log12.info("cancel", { sessionID }); - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const runner = s5.runners.get(sessionID); if (!runner || !runner.busy) { yield* status.set(sessionID, { type: "idle" }); @@ -411048,7 +411354,7 @@ var init_prompt = __esm(async () => { if (seen.has(name26)) return; seen.add(name26); - const filepath = name26.startsWith("~/") ? path70.join(os19.homedir(), name26.slice(2)) : path70.resolve(ctx.worktree, name26); + const filepath = name26.startsWith("~/") ? path71.join(os19.homedir(), name26.slice(2)) : path71.resolve(ctx.worktree, name26); const info3 = yield* fsys.stat(filepath).pipe(exports_Effect.option); if (exports_Option.isNone(info3)) { const found = yield* agents.get(name26); @@ -411174,7 +411480,7 @@ var init_prompt = __esm(async () => { const plan = Session.plan(input.session); const exists3 = yield* fsys.existsSafe(plan); if (!exists3) - yield* fsys.ensureDir(path70.dirname(plan)).pipe(exports_Effect.catch(exports_Effect.die)); + yield* fsys.ensureDir(path71.dirname(plan)).pipe(exports_Effect.catch(exports_Effect.die)); const part = yield* sessions.updatePart({ id: PartID.ascending(), messageID: userMessage.info.id, @@ -411264,7 +411570,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the } if (args3.oldString) { try { - const resolved = path70.resolve(args3.filePath); + const resolved = path71.resolve(args3.filePath); const content = fs29.readFileSync(resolved, "utf-8"); if (!canFuzzyMatch(content, args3.oldString)) { let msg = "oldString not found in file (even with whitespace tolerance). Re-read the file with the read tool first, then copy a short unique snippet (2-5 lines) exactly as it appears."; @@ -411294,7 +411600,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the } } if (toolId === "write" && args3.filePath) { - const resolved = path70.resolve(args3.filePath); + const resolved = path71.resolve(args3.filePath); if (fs29.existsSync(resolved)) { return "File already exists. Read the file first with the read tool, then use edit with a small unique oldString snippet to modify it."; } @@ -411661,7 +411967,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the }; yield* sessions.updatePart(part); const sh = Shell.preferred(); - const shellName = (process.platform === "win32" ? path70.win32.basename(sh, ".exe") : path70.basename(sh)).toLowerCase(); + const shellName = (process.platform === "win32" ? path71.win32.basename(sh, ".exe") : path71.basename(sh)).toLowerCase(); const invocations = { nu: { args: ["-c", input.command] }, fish: { args: ["-c", input.command] }, @@ -412345,12 +412651,12 @@ NOTE: At any point in time through this workflow you should feel free to ask the return yield* lastAssistant(sessionID); }); const loop2 = exports_Effect.fn("SessionPrompt.loop")(function* (input) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const runner = getRunner(s5.runners, input.sessionID); return yield* runner.ensureRunning(runLoop(input.sessionID)); }); const shell4 = exports_Effect.fn("SessionPrompt.shell")(function* (input) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const runner = getRunner(s5.runners, input.sessionID); return yield* runner.startShell((signal) => shellImpl(input, signal)); }); @@ -412604,7 +412910,8 @@ var exports_session = {}; __export(exports_session, { Session: () => Session }); -import path71 from "path"; +import path72 from "path"; +import { existsSync as existsSync8 } from "fs"; var Session; var init_session3 = __esm(async () => { init_slug(); @@ -412622,6 +412929,7 @@ var init_session3 = __esm(async () => { init_schema7(); init_dist3(); await __promiseAll([ + init_paths(), init_bus(), init_config(), init_installation(), @@ -412809,8 +413117,14 @@ var init_session3 = __esm(async () => { })) }; function plan(input) { - const base3 = Instance.project.vcs ? path71.join(Instance.worktree, ".opencode", "plans") : path71.join(Global.Path.data, "plans"); - return path71.join(base3, [input.time.created, input.slug].join("-") + ".md"); + if (!Instance.project.vcs) { + return path72.join(Global.Path.data, "plans", [input.time.created, input.slug].join("-") + ".md"); + } + const name26 = [input.time.created, input.slug].join("-") + ".md"; + const legacy = path72.join(Instance.worktree, ConfigPaths.LEGACY_PROJECT_DIRECTORY, "plans", name26); + if (existsSync8(legacy)) + return legacy; + return path72.join(Instance.worktree, ConfigPaths.PROJECT_DIRECTORY, "plans", name26); } Session.plan = plan; Session.getUsage = (input) => { @@ -412866,7 +413180,7 @@ var init_session3 = __esm(async () => { const db2 = (fn4) => exports_Effect.sync(() => Database.use(fn4)); Session.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const bus = yield* Bus.Service; - const config6 = yield* Config.Service; + const config5 = yield* Config.Service; const scope3 = yield* exports_Scope.Scope; const createNext = exports_Effect.fn("Session.createNext")(function* (input) { const ctx = yield* InstanceState.context; @@ -412887,7 +413201,7 @@ var init_session3 = __esm(async () => { }; log12.info("created", result7); yield* exports_Effect.sync(() => SyncEvent.run(Session.Event.Created, { sessionID: result7.id, info: result7 })); - const cfg = yield* config6.get(); + const cfg = yield* config5.get(); if (!result7.parentID && (Flag.UNIFIA_AUTO_SHARE || cfg.share === "auto")) { yield* share3(result7.id).pipe(exports_Effect.ignore, exports_Effect.forkIn(scope3)); } @@ -412915,7 +413229,7 @@ var init_session3 = __esm(async () => { return fromRow(row2); }); const share3 = exports_Effect.fn("Session.share")(function* (id2) { - const cfg = yield* config6.get(); + const cfg = yield* config5.get(); if (cfg.share === "disabled") throw new Error("Sharing is disabled in configuration"); const result7 = yield* exports_Effect.promise(async () => { @@ -413212,11 +413526,11 @@ var exports_config = {}; __export(exports_config, { Config: () => Config }); -import path72 from "path"; +import path73 from "path"; import { pathToFileURL as pathToFileURL10 } from "url"; import os20 from "os"; import fsNode from "fs/promises"; -import { constants as constants2, existsSync as existsSync8 } from "fs"; +import { constants as constants2, existsSync as existsSync9 } from "fs"; var Config; var init_config = __esm(async () => { init_process2(); @@ -413273,7 +413587,7 @@ var init_config = __esm(async () => { case "darwin": return "/Library/Application Support/opencode"; case "win32": - return path72.join(process.env.ProgramData || "C:\\ProgramData", "unifia"); + return path73.join(process.env.ProgramData || "C:\\ProgramData", "unifia"); default: return "/etc/opencode"; } @@ -413307,11 +413621,11 @@ var init_config = __esm(async () => { const domain4 = MANAGED_PLIST_DOMAIN; const user = os20.userInfo().username; const paths = [ - path72.join("/Library/Managed Preferences", user, `${domain4}.plist`), - path72.join("/Library/Managed Preferences", `${domain4}.plist`) + path73.join("/Library/Managed Preferences", user, `${domain4}.plist`), + path73.join("/Library/Managed Preferences", `${domain4}.plist`) ]; for (const plist of paths) { - if (!existsSync8(plist)) + if (!existsSync9(plist)) continue; log12.info("reading macOS managed preferences", { path: plist }); const result7 = await Process.run(["plutil", "-convert", "json", "-o", "-", plist], { nothrow: true }); @@ -413343,23 +413657,35 @@ var init_config = __esm(async () => { }) }); input?.signal?.throwIfAborted(); - const pkg = path72.join(dir2, "package.json"); + const pkg = path73.join(dir2, "package.json"); const target = Installation.isLocal() ? "*" : Installation.VERSION; - const json8 = await Filesystem.readJson(pkg).catch(() => ({ - dependencies: {} - })); - json8.dependencies = { - ...json8.dependencies, - "@unifia/plugin": target - }; + const json8 = await Filesystem.readJson(pkg).catch(() => ({ dependencies: {} })); + const declared = { ...json8.dependencies }; + json8.dependencies = { ...declared, [PLUGIN_PACKAGE]: target }; await Filesystem.writeJson(pkg, json8); - const gitignore = path72.join(dir2, ".gitignore"); + const gitignore = path73.join(dir2, ".gitignore"); const ignore7 = await Filesystem.exists(gitignore); if (!ignore7) { await Filesystem.write(gitignore, ["node_modules", "package.json", "package-lock.json", "bun.lock", ".gitignore"].join(` `)); } - await Npm.install(dir2); + await Npm.install(dir2).catch(async (err2) => { + log12.warn("dependency install failed, retrying without the plugin package", { + dir: dir2, + package: PLUGIN_PACKAGE, + error: err2 instanceof Error ? err2.message : String(err2) + }); + const withoutPlugin = { ...declared }; + delete withoutPlugin[PLUGIN_PACKAGE]; + json8.dependencies = withoutPlugin; + await Filesystem.writeJson(pkg, json8); + await Npm.install(dir2).catch((retryErr) => { + log12.error("dependency install failed without the plugin package", { + dir: dir2, + error: retryErr instanceof Error ? retryErr.message : String(retryErr) + }); + }); + }); } Config.installDependencies = installDependencies; async function isWritable(dir2) { @@ -413380,7 +413706,7 @@ var init_config = __esm(async () => { } } function trim4(file6) { - const ext2 = path72.extname(file6); + const ext2 = path73.extname(file6); return ext2.length ? file6.slice(0, -ext2.length) : file6; } async function loadCommand(dir2) { @@ -413400,17 +413726,24 @@ var init_config = __esm(async () => { }); if (!md) continue; - const patterns = ["/.opencode/command/", "/.opencode/commands/", "/command/", "/commands/"]; - const file6 = rel(item, patterns) ?? path72.basename(item); + const patterns = [ + "/.unifia/command/", + "/.unifia/commands/", + "/.opencode/command/", + "/.opencode/commands/", + "/command/", + "/commands/" + ]; + const file6 = rel(item, patterns) ?? path73.basename(item); const name26 = trim4(file6); - const config6 = { + const config5 = { name: name26, ...md.data, template: md.content.trim() }; - const parsed = Config.Command.safeParse(config6); + const parsed = Config.Command.safeParse(config5); if (parsed.success) { - result7[config6.name] = parsed.data; + result7[config5.name] = parsed.data; continue; } throw new Config.InvalidError({ path: item, issues: parsed.error.issues }, { cause: parsed.error }); @@ -413434,17 +413767,24 @@ var init_config = __esm(async () => { }); if (!md) continue; - const patterns = ["/.opencode/agent/", "/.opencode/agents/", "/agent/", "/agents/"]; - const file6 = rel(item, patterns) ?? path72.basename(item); + const patterns = [ + "/.unifia/agent/", + "/.unifia/agents/", + "/.opencode/agent/", + "/.opencode/agents/", + "/agent/", + "/agents/" + ]; + const file6 = rel(item, patterns) ?? path73.basename(item); const agentName = trim4(file6); - const config6 = { + const config5 = { name: agentName, ...md.data, prompt: md.content.trim() }; - const parsed = Config.Agent.safeParse(config6); + const parsed = Config.Agent.safeParse(config5); if (parsed.success) { - result7[config6.name] = parsed.data; + result7[config5.name] = parsed.data; continue; } throw new Config.InvalidError({ path: item, issues: parsed.error.issues }, { cause: parsed.error }); @@ -413468,14 +413808,14 @@ var init_config = __esm(async () => { }); if (!md) continue; - const config6 = { - name: path72.basename(item, ".md"), + const config5 = { + name: path73.basename(item, ".md"), ...md.data, prompt: md.content.trim() }; - const parsed = Config.Agent.safeParse(config6); + const parsed = Config.Agent.safeParse(config5); if (parsed.success) { - result7[config6.name] = { + result7[config5.name] = { ...parsed.data, mode: "primary" }; @@ -413507,13 +413847,13 @@ var init_config = __esm(async () => { const spec = pluginSpecifier(plugin); if (!isPathPluginSpec(spec)) return plugin; - const base3 = path72.dirname(configFilepath); + const base3 = path73.dirname(configFilepath); const file6 = (() => { if (spec.startsWith("file://")) return spec; - if (path72.isAbsolute(spec) || /^[A-Za-z]:[\\/]/.test(spec)) + if (path73.isAbsolute(spec) || /^[A-Za-z]:[\\/]/.test(spec)) return pathToFileURL10(spec).href; - return pathToFileURL10(path72.resolve(base3, spec)).href; + return pathToFileURL10(path73.resolve(base3, spec)).href; })(); const resolved = await resolvePathPluginTarget(file6).catch(() => file6); if (Array.isArray(plugin)) @@ -413539,10 +413879,13 @@ var init_config = __esm(async () => { class Service3 extends exports_ServiceMap.Service()("@opencode/Config") { } Config.Service = Service3; + const PLUGIN_PACKAGE = "@unifia/plugin"; + const CONFIG_FILES = ["unifia.json", "unifia.jsonc"]; + const LEGACY_CONFIG_FILES = ["opencode.json", "opencode.jsonc"]; function globalConfigFile() { - const candidates = ["unifia.jsonc", "unifia.json", "config.json"].map((file6) => path72.join(Global.Path.config, file6)); + const candidates = ["unifia.jsonc", "unifia.json", "config.json", ...LEGACY_CONFIG_FILES.toReversed()].map((file6) => path73.join(Global.Path.config, file6)); for (const file6 of candidates) { - if (existsSync8(file6)) + if (existsSync9(file6)) return file6; } return candidates[0]; @@ -413666,16 +414009,16 @@ ${errorDetails} return yield* loadConfig7(text10, { path: filepath }); }); const loadGlobal = exports_Effect.fnUntraced(function* () { - let result7 = C3({}, D2(yield* loadFile(path72.join(Global.Path.config, "config.json"))), D2(yield* loadFile(path72.join(Global.Path.config, "unifia.json"))), D2(yield* loadFile(path72.join(Global.Path.config, "unifia.jsonc")))); - const legacy = path72.join(Global.Path.config, "config"); - if (existsSync8(legacy)) { + let result7 = C3({}, D2(yield* loadFile(path73.join(Global.Path.config, "config.json"))), D2(yield* loadFile(path73.join(Global.Path.config, "opencode.json"))), D2(yield* loadFile(path73.join(Global.Path.config, "opencode.jsonc"))), D2(yield* loadFile(path73.join(Global.Path.config, "unifia.json"))), D2(yield* loadFile(path73.join(Global.Path.config, "unifia.jsonc")))); + const legacy = path73.join(Global.Path.config, "config"); + if (existsSync9(legacy)) { yield* exports_Effect.promise(() => import(pathToFileURL10(legacy).href, { with: { type: "toml" } }).then(async (mod2) => { const { provider: provider2, model, ...rest } = mod2.default; if (provider2 && model) result7.model = `${provider2}/${model}`; result7["$schema"] = "https://opencode.ai/config.json"; result7 = D2(result7, rest); - await fsNode.writeFile(path72.join(Global.Path.config, "config.json"), JSON.stringify(result7, null, 2)); + await fsNode.writeFile(path73.join(Global.Path.config, "config.json"), JSON.stringify(result7, null, 2)); await fsNode.unlink(legacy); }).catch(() => {})); } @@ -413729,7 +414072,7 @@ ${errorDetails} remoteConfig.$schema = "https://opencode.ai/config.json"; const source2 = `${url4}/.well-known/opencode`; const next4 = yield* loadConfig7(JSON.stringify(remoteConfig), { - dir: path72.dirname(source2), + dir: path73.dirname(source2), source: source2 }); merge12(source2, next4, "global"); @@ -413744,7 +414087,7 @@ ${errorDetails} } const searchStop = ConfigPaths.searchStop({ worktree: ctx.worktree, vcs: ctx.project.vcs }); if (!Flag.UNIFIA_DISABLE_PROJECT_CONFIG) { - for (const file6 of yield* exports_Effect.promise(() => ConfigPaths.projectFiles("unifia", ctx.directory, searchStop))) { + for (const file6 of yield* exports_Effect.promise(() => ConfigPaths.projectFiles("unifia", ctx.directory, searchStop, "opencode"))) { merge12(file6, yield* loadFile(file6), "local"); } } @@ -413757,9 +414100,9 @@ ${errorDetails} } const deps = []; for (const dir2 of i2(directories3)) { - if (dir2.endsWith(".opencode") || dir2 === Flag.UNIFIA_CONFIG_DIR) { - for (const file6 of ["unifia.json", "unifia.jsonc"]) { - const source2 = path72.join(dir2, file6); + if (ConfigPaths.isConfigDirectory(dir2)) { + for (const file6 of LEGACY_CONFIG_FILES.concat(CONFIG_FILES)) { + const source2 = path73.join(dir2, file6); log12.debug(`loading config from ${source2}`); merge12(source2, yield* loadFile(source2)); result7.agent ??= {}; @@ -413767,13 +414110,15 @@ ${errorDetails} result7.plugin ??= []; } } - const dep = iife2(async () => { - await installDependencies(dir2); - }); - dep.catch((err2) => { - log12.warn("background dependency install failed", { dir: dir2, error: err2 }); - }); - deps.push(dep); + if (!ConfigPaths.isLegacyDirectory(dir2)) { + const dep = iife2(async () => { + await installDependencies(dir2); + }); + dep.catch((err2) => { + log12.warn("background dependency install failed", { dir: dir2, error: err2 }); + }); + deps.push(dep); + } result7.command = D2(result7.command ?? {}, yield* exports_Effect.promise(() => loadCommand(dir2))); result7.agent = D2(result7.agent, yield* exports_Effect.promise(() => loadAgent(dir2))); result7.agent = D2(result7.agent, yield* exports_Effect.promise(() => loadMode(dir2))); @@ -413801,7 +414146,7 @@ ${errorDetails} if (exports_Option.isSome(configOpt)) { const source2 = `${activeOrg.account.url}/api/config`; const next4 = yield* loadConfig7(JSON.stringify(configOpt.value), { - dir: path72.dirname(source2), + dir: path73.dirname(source2), source: source2 }); for (const providerID of Object.keys(next4.provider ?? {})) { @@ -413816,9 +414161,9 @@ ${errorDetails} return exports_Effect.void; })); } - if (existsSync8(managedDir)) { - for (const file6 of ["unifia.json", "unifia.jsonc"]) { - const source2 = path72.join(managedDir, file6); + if (existsSync9(managedDir)) { + for (const file6 of LEGACY_CONFIG_FILES.concat(CONFIG_FILES)) { + const source2 = path73.join(managedDir, file6); merge12(source2, yield* loadFile(source2), "global"); } } @@ -413876,28 +414221,28 @@ ${errorDetails} } }; }); - const state3 = yield* InstanceState.make(exports_Effect.fn("Config.state")(function* (ctx) { + const state2 = yield* InstanceState.make(exports_Effect.fn("Config.state")(function* (ctx) { return yield* loadInstanceState(ctx); })); const get35 = exports_Effect.fn("Config.get")(function* () { - return yield* InstanceState.use(state3, (s5) => s5.config); + return yield* InstanceState.use(state2, (s5) => s5.config); }); const directories2 = exports_Effect.fn("Config.directories")(function* () { - return yield* InstanceState.use(state3, (s5) => s5.directories); + return yield* InstanceState.use(state2, (s5) => s5.directories); }); const getConsoleState2 = exports_Effect.fn("Config.getConsoleState")(function* () { - return yield* InstanceState.use(state3, (s5) => s5.consoleState); + return yield* InstanceState.use(state2, (s5) => s5.consoleState); }); const waitForDependencies2 = exports_Effect.fn("Config.waitForDependencies")(function* () { - yield* InstanceState.useEffect(state3, (s5) => exports_Effect.promise(() => Promise.all(s5.deps).then(() => { + yield* InstanceState.useEffect(state2, (s5) => exports_Effect.promise(() => Promise.all(s5.deps).then(() => { return; }))); }); - const update10 = exports_Effect.fn("Config.update")(function* (config6) { + const update10 = exports_Effect.fn("Config.update")(function* (config5) { const dir2 = yield* InstanceState.directory; - const file6 = path72.join(dir2, "config.json"); + const file6 = path73.join(dir2, "config.json"); const existing = yield* loadFile(file6); - yield* fs24.writeFileString(file6, JSON.stringify(D2(writable(existing), writable(config6)), null, 2)).pipe(exports_Effect.orDie); + yield* fs24.writeFileString(file6, JSON.stringify(D2(writable(existing), writable(config5)), null, 2)).pipe(exports_Effect.orDie); yield* exports_Effect.promise(() => Instance.dispose()); }); const invalidate8 = exports_Effect.fn("Config.invalidate")(function* (wait) { @@ -413914,10 +414259,10 @@ ${errorDetails} if (wait) yield* exports_Effect.promise(() => task); }); - const updateGlobal2 = exports_Effect.fn("Config.updateGlobal")(function* (config6) { + const updateGlobal2 = exports_Effect.fn("Config.updateGlobal")(function* (config5) { const file6 = globalConfigFile(); const before = (yield* readConfigFile(file6)) ?? "{}"; - const input = writable(config6); + const input = writable(config5); let next4; if (!file6.endsWith(".jsonc")) { const existing = parseConfig(before, file6); @@ -413957,12 +414302,12 @@ ${errorDetails} return runPromise3((svc) => svc.getConsoleState()); } Config.getConsoleState = getConsoleState; - async function update9(config6) { - return runPromise3((svc) => svc.update(config6)); + async function update9(config5) { + return runPromise3((svc) => svc.update(config5)); } Config.update = update9; - async function updateGlobal(config6) { - return runPromise3((svc) => svc.updateGlobal(config6)); + async function updateGlobal(config5) { + return runPromise3((svc) => svc.updateGlobal(config5)); } Config.updateGlobal = updateGlobal; async function invalidate7(wait = false) { @@ -414517,6 +414862,10 @@ var hopByHopHeaders, ALLOWED_TOKEN_PATTERN, buildRequestInitFromRequest = (reque req.headers.delete("accept-encoding"); const res = await (customFetch || fetch)(req); const resHeaders = new Headers(res.headers); + const connectionValue = resHeaders.get("connection"); + if (connectionValue) { + connectionValue.split(",").map((h4) => h4.trim()).filter((h4) => ALLOWED_TOKEN_PATTERN.test(h4)).forEach((h4) => resHeaders.delete(h4)); + } hopByHopHeaders.forEach((header) => { resHeaders.delete(header); }); @@ -415116,7 +415465,9 @@ var StreamingApi = class { done5 ? controller.close() : controller.enqueue(value8); }, cancel: () => { - this.abort(); + if (!this.closed) { + this.abort(); + } } }); } @@ -415138,15 +415489,18 @@ var StreamingApi = class { return new Promise((res) => setTimeout(res, ms2)); } async close() { + this.closed = true; try { await this.writer.close(); } catch {} - this.closed = true; } async pipe(body3) { this.writer.releaseLock(); - await body3.pipeTo(this.writable, { preventClose: true }); - this.writer = this.writable.getWriter(); + try { + await body3.pipeTo(this.writable, { preventClose: true, preventAbort: true }); + } finally { + this.writer = this.writable.getWriter(); + } } onAbort(listener) { this.abortSubscribers.push(listener); @@ -415254,16 +415608,17 @@ var init_sse2 = __esm(() => { return `data: ${line2}`; }).join(` `); - for (const key of ["event", "id", "retry"]) { - if (message[key] && /[\r\n]/.test(message[key])) { + for (const key of ["event", "id"]) { + const value8 = message[key]; + if (value8 && /[\r\n]/.test(value8)) { throw new Error(`${key} must not contain "\\r" or "\\n"`); } } const sseData = [ message.event && `event: ${message.event}`, dataLines, - message.id && `id: ${message.id}`, - message.retry && `retry: ${message.retry}` + message.id !== undefined && `id: ${message.id}`, + message.retry !== undefined && `retry: ${message.retry}` ].filter(Boolean).join(` `) + ` @@ -416030,7 +416385,7 @@ var init_session4 = __esm(async () => { var init_mime = () => {}; // node_modules/hono/dist/middleware/serve-static/path.js -var init_path3 = () => {}; +var init_path4 = () => {}; // node_modules/hono/dist/middleware/serve-static/index.js var ENCODINGS, ENCODINGS_ORDERED_KEYS; @@ -416038,7 +416393,7 @@ var init_serve_static = __esm(() => { init_compress(); init_mime(); init_url(); - init_path3(); + init_path4(); ENCODINGS = { br: ".br", zstd: ".zst", @@ -416207,7 +416562,7 @@ var init_websocket2 = __esm(() => { data: { events, url: new URL(c3.req.url), - protocol: c3.req.url + protocol: c3.req.header("sec-websocket-protocol")?.split(",")[0]?.trim() ?? "" } }); if (upgradeResult) { @@ -416535,7 +416890,7 @@ class EventEmitter3 { import { dlopen, FFIType, ptr } from "bun:ffi"; import { Buffer as Buffer4 } from "buffer"; import { join as join21, dirname as dirname14, basename as basename7 } from "path"; -import { existsSync as existsSync9 } from "fs"; +import { existsSync as existsSync10 } from "fs"; function shQuote(s5) { if (s5.length === 0) return "''"; @@ -416543,7 +416898,7 @@ function shQuote(s5) { } function resolveLibPath() { const env7 = process.env.BUN_PTY_LIB; - if (env7 && existsSync9(env7)) + if (env7 && existsSync10(env7)) return env7; try { const embeddedPath = __require(`../rust-pty/target/release/${process.platform === "win32" ? "rust_pty.dll" : process.platform === "darwin" ? process.arch === "arm64" ? "librust_pty_arm64.dylib" : "librust_pty.dylib" : process.arch === "arm64" ? "librust_pty_arm64.so" : "librust_pty.so"}`); @@ -416569,7 +416924,7 @@ function resolveLibPath() { } } for (const path34 of fallbackPaths) { - if (existsSync9(path34)) + if (existsSync10(path34)) return path34; } throw new Error(`librust_pty shared library not found. @@ -416825,21 +417180,21 @@ var init_pty = __esm(async () => { } session.subscribers.clear(); } - const state3 = yield* InstanceState.make(exports_Effect.fn("Pty.state")(function* (ctx) { - const state4 = { + const state2 = yield* InstanceState.make(exports_Effect.fn("Pty.state")(function* (ctx) { + const state3 = { dir: ctx.directory, sessions: new Map }; yield* exports_Effect.addFinalizer(() => exports_Effect.sync(() => { - for (const session of state4.sessions.values()) { + for (const session of state3.sessions.values()) { teardown(session); } - state4.sessions.clear(); + state3.sessions.clear(); })); - return state4; + return state3; })); const remove21 = exports_Effect.fn("Pty.remove")(function* (id2) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const session = s5.sessions.get(id2); if (!session) return; @@ -416849,22 +417204,22 @@ var init_pty = __esm(async () => { yield* bus.publish(Pty.Event.Deleted, { id: session.info.id }); }); const list2 = exports_Effect.fn("Pty.list")(function* () { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); return Array.from(s5.sessions.values()).map((session) => session.info); }); const get35 = exports_Effect.fn("Pty.get")(function* (id2) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); return s5.sessions.get(id2)?.info; }); const tail4 = exports_Effect.fn("Pty.tail")(function* (id2, maxChars = 60000) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const session = s5.sessions.get(id2); if (!session) return ""; return stripAnsi2(session.buffer.slice(-maxChars)); }); const create2 = exports_Effect.fn("Pty.create")(function* (input) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); if (input.id && s5.sessions.has(input.id)) { return s5.sessions.get(input.id).info; } @@ -416979,7 +417334,7 @@ var init_pty = __esm(async () => { return info3; }); const update10 = exports_Effect.fn("Pty.update")(function* (id2, input) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const session = s5.sessions.get(id2); if (!session) return; @@ -417030,21 +417385,21 @@ var init_pty = __esm(async () => { } } const resize4 = exports_Effect.fn("Pty.resize")(function* (id2, cols, rows) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const session = s5.sessions.get(id2); if (session && session.info.status === "running") { applyResize(session, cols, rows); } }); const write4 = exports_Effect.fn("Pty.write")(function* (id2, data2) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const session = s5.sessions.get(id2); if (session && session.info.status === "running") { session.process.write(data2); } }); const connect2 = exports_Effect.fn("Pty.connect")(function* (id2, ws2, cursor2) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const session = s5.sessions.get(id2); if (!session) { ws2.close(); @@ -417383,8 +417738,8 @@ var init_mcp2 = __esm(async () => { name: zod_default.string(), config: Config.Mcp })), async (c3) => { - const { name: name26, config: config6 } = c3.req.valid("json"); - const result7 = await MCP.add(name26, config6); + const { name: name26, config: config5 } = c3.req.valid("json"); + const result7 = await MCP.add(name26, config5); return c3.json(result7.status); }).post("/:name/auth", describeRoute({ summary: "Start MCP OAuth", @@ -418739,13 +419094,13 @@ var init_config2 = __esm(async () => { ...errors6(400) } }), validator2("json", Config.Info), async (c3) => { - const config6 = c3.req.valid("json"); - await Config.update(config6); + const config5 = c3.req.valid("json"); + await Config.update(config5); AuditLog.recordAsync({ action: "config.update", - metadata: { changedKeys: Object.keys(config6 ?? {}) } + metadata: { changedKeys: Object.keys(config5 ?? {}) } }); - return c3.json(config6); + return c3.json(config5); }).get("/providers", describeRoute({ summary: "List config providers", description: "Get a list of all configured AI providers and their default models.", @@ -419210,7 +419565,7 @@ var init_auth7 = __esm(async () => { ProviderAuth.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const auth2 = yield* Auth.Service; const plugin = yield* Plugin.Service; - const state3 = yield* InstanceState.make(exports_Effect.fn("ProviderAuth.state")(function* () { + const state2 = yield* InstanceState.make(exports_Effect.fn("ProviderAuth.state")(function* () { const plugins = yield* plugin.list(); return { hooks: exports_Record.fromEntries(exports_Array.filterMap(plugins, (x3) => x3.auth?.provider !== undefined ? exports_Result.succeed([ProviderID.make(x3.auth.provider), x3.auth]) : exports_Result.failVoid)), @@ -419218,7 +419573,7 @@ var init_auth7 = __esm(async () => { }; })); const methods2 = exports_Effect.fn("ProviderAuth.methods")(function* () { - const hooks = (yield* InstanceState.get(state3)).hooks; + const hooks = (yield* InstanceState.get(state2)).hooks; return exports_Record.map(hooks, (item) => item.methods.map((method) => ({ type: method.type, label: method.label, @@ -419243,7 +419598,7 @@ var init_auth7 = __esm(async () => { }))); }); const authorize2 = exports_Effect.fn("ProviderAuth.authorize")(function* (input) { - const { hooks, pending: pending2 } = yield* InstanceState.get(state3); + const { hooks, pending: pending2 } = yield* InstanceState.get(state2); const method = hooks[input.providerID].methods[input.method]; if (method.type !== "oauth") return; @@ -419265,7 +419620,7 @@ var init_auth7 = __esm(async () => { }; }); const callback6 = exports_Effect.fn("ProviderAuth.callback")(function* (input) { - const pending2 = (yield* InstanceState.get(state3)).pending; + const pending2 = (yield* InstanceState.get(state2)).pending; const match17 = pending2.get(input.providerID); if (!match17) return yield* exports_Effect.fail(new ProviderAuth.OauthMissing({ providerID: input.providerID })); @@ -419347,9 +419702,9 @@ var init_provider3 = __esm(async () => { } } }), async (c3) => { - const config6 = await Config.get(); - const disabled = new Set(config6.disabled_providers ?? []); - const enabled = config6.enabled_providers ? new Set(config6.enabled_providers) : undefined; + const config5 = await Config.get(); + const disabled = new Set(config5.disabled_providers ?? []); + const enabled = config5.enabled_providers ? new Set(config5.enabled_providers) : undefined; const allProviders = await ModelsDev.get(); const filteredProviders = {}; for (const [key, value8] of Object.entries(allProviders)) { @@ -420207,7 +420562,7 @@ var init_agent_skills = __esm(async () => { // packages/unifia/src/server/routes/gdpr.ts import fs30 from "fs/promises"; -import path73 from "path"; +import path74 from "path"; var log51, GdprRoutes = () => new Hono2().get("/user/data/export", describeRoute({ summary: "Export user data (RGPD)", description: "Streams a JSON document containing all local sessions, messages, and non-secret config. Auth tokens are omitted by default.", @@ -420305,7 +420660,7 @@ var log51, GdprRoutes = () => new Hono2().get("/user/data/export", describeRoute log51.error("delete: worktree cleanup failed", { e: String(e4) }); } try { - const crashDir = path73.join(Global.Path.data, "crashes"); + const crashDir = path74.join(Global.Path.data, "crashes"); const entries10 = await fs30.readdir(crashDir).catch((e4) => { if (e4?.code === "ENOENT") return []; @@ -420313,7 +420668,7 @@ var log51, GdprRoutes = () => new Hono2().get("/user/data/export", describeRoute }); for (const name26 of entries10) { try { - await fs30.unlink(path73.join(crashDir, name26)); + await fs30.unlink(path74.join(crashDir, name26)); } catch (e4) { if (e4?.code !== "ENOENT") log51.warn("delete: crash unlink failed", { name: name26, e: String(e4) }); @@ -420329,11 +420684,11 @@ var log51, GdprRoutes = () => new Hono2().get("/user/data/export", describeRoute log51.warn("delete: Database.close failed", { e: String(e4) }); } const toUnlink = [ - path73.join(Global.Path.data, "auth.json"), + path74.join(Global.Path.data, "auth.json"), Database.Path, - path73.join(Global.Path.config, "unifia.jsonc"), - path73.join(Global.Path.config, "unifia.json"), - path73.join(Global.Path.config, "config.json") + path74.join(Global.Path.config, "unifia.jsonc"), + path74.join(Global.Path.config, "unifia.json"), + path74.join(Global.Path.config, "config.json") ]; for (const f5 of toUnlink) { if (f5 === ":memory:") @@ -421073,9 +421428,9 @@ var init_debate4 = __esm(async () => { } } }), validator2("json", Collective.DebateConfig), async (c3) => { - const config6 = c3.req.valid("json"); + const config5 = c3.req.valid("json"); try { - const report2 = await Orchestrator.runPromiseExport(config6); + const report2 = await Orchestrator.runPromiseExport(config5); return c3.json(report2); } catch (e4) { const message = e4 instanceof Error ? e4.message : String(e4); @@ -421148,9 +421503,9 @@ var init_debate4 = __esm(async () => { } } }), validator2("json", Collective.DebateConfig), async (c3) => { - const config6 = c3.req.valid("json"); + const config5 = c3.req.valid("json"); try { - const estimate = await Orchestrator.estimatePromise(config6); + const estimate = await Orchestrator.estimatePromise(config5); return c3.json(estimate); } catch (e4) { log52.error("estimate failed", { error: String(e4) }); @@ -421242,7 +421597,7 @@ function invalidQuery(result7, c3) { } // packages/unifia/src/server/routes/team.ts -import path74 from "path"; +import path75 from "path"; function teamStore() { opened = true; return store(); @@ -421340,7 +421695,7 @@ var init_team4 = __esm(async () => { ]); log53 = Log.create({ service: "server.team" }); teamRunRegistry = new TeamRunRegistry; - store = lazy2(() => TeamStore.open(path74.join(Global.Path.data, "team.db"))); + store = lazy2(() => TeamStore.open(path75.join(Global.Path.data, "team.db"))); RunSchema = zod_default.object({ runId: zod_default.string(), schemaVersion: zod_default.string(), @@ -422473,11 +422828,11 @@ function serialize2(registry3, generatorVersion) { snapshot: registry3 }; } -function toCanonicalJSON(snapshot4) { - return JSON.stringify(snapshot4, canonicalReplacer, 2); +function toCanonicalJSON(snapshot3) { + return JSON.stringify(snapshot3, canonicalReplacer, 2); } -function hashSnapshot(snapshot4) { - return createHash10("sha256").update(toCanonicalJSON(snapshot4)).digest("hex"); +function hashSnapshot(snapshot3) { + return createHash10("sha256").update(toCanonicalJSON(snapshot3)).digest("hex"); } function canonicalReplacer(_key, value8) { if (value8 === null || typeof value8 !== "object") @@ -422823,8 +423178,8 @@ var init_model_intelligence = __esm(async () => { } }), async (c3) => { try { - const snapshot4 = await runPromise3((svc) => svc.snapshot()); - return c3.json({ schemaVersion: SCHEMA_VERSION, hash: snapshot4.hash, byteLength: snapshot4.json.length }); + const snapshot3 = await runPromise3((svc) => svc.snapshot()); + return c3.json({ schemaVersion: SCHEMA_VERSION, hash: snapshot3.hash, byteLength: snapshot3.json.length }); } catch (e4) { return registryError(c3, e4, "snapshot failed"); } @@ -423513,8 +423868,8 @@ var init_global3 = __esm(async () => { ...errors6(400) } }), validator2("json", Config.Info), async (c3) => { - const config6 = c3.req.valid("json"); - const next4 = await Config.updateGlobal(config6); + const config5 = c3.req.valid("json"); + const next4 = await Config.updateGlobal(config5); return c3.json(next4); }).post("/dispose", describeRoute({ summary: "Dispose instance", @@ -423708,28 +424063,28 @@ var require_service = __commonJS((exports) => { var TLD = ".local"; class Service3 extends events_1.EventEmitter { - constructor(config6) { + constructor(config5) { super(); this.probe = true; this.published = false; this.activated = false; this.destroyed = false; this.txtService = new dns_txt_1.default; - if (!config6.name) + if (!config5.name) throw new Error("ServiceConfig requires `name` property to be set"); - if (!config6.type) + if (!config5.type) throw new Error("ServiceConfig requires `type` property to be set"); - if (!config6.port) + if (!config5.port) throw new Error("ServiceConfig requires `port` property to be set"); - this.name = config6.name.split(".").join("-"); - this.protocol = config6.protocol || "tcp"; - this.type = (0, service_types_1.toString)({ name: config6.type, protocol: this.protocol }); - this.port = config6.port; - this.host = config6.host || os_1.default.hostname(); + this.name = config5.name.split(".").join("-"); + this.protocol = config5.protocol || "tcp"; + this.type = (0, service_types_1.toString)({ name: config5.type, protocol: this.protocol }); + this.port = config5.port; + this.host = config5.host || os_1.default.hostname(); this.fqdn = `${this.name}.${this.type}${TLD}`; - this.txt = config6.txt; - this.subtypes = config6.subtypes; - this.disableIPv6 = !!config6.disableIPv6; + this.txt = config5.txt; + this.subtypes = config5.subtypes; + this.disableIPv6 = !!config5.disableIPv6; } records() { var records = [this.RecordPTR(this), this.RecordSRV(this), this.RecordTXT(this)]; @@ -423830,7 +424185,7 @@ var require_registry2 = __commonJS((exports) => { this.services = []; this.server = server2; } - publish(config6) { + publish(config5) { function start2(service4, registry3, opts) { if (service4.activated) return; @@ -423864,10 +424219,10 @@ var require_registry2 = __commonJS((exports) => { if (index3 !== -1) registry3.services.splice(index3, 1); } - const service3 = new service_1.default(config6); + const service3 = new service_1.default(config5); service3.start = start2.bind(null, service3, this); service3.stop = stop3.bind(null, service3, this); - service3.start({ probe: config6.probe !== false }); + service3.start({ probe: config5.probe !== false }); return service3; } unpublishAll(callback5) { @@ -426163,21 +426518,21 @@ var require_thunky = __commonJS((exports, module2) => { process.nextTick(upgrade, 42); module2.exports = thunky; function thunky(fn4) { - var state3 = run11; + var state2 = run11; return thunk; function thunk(callback5) { - state3(callback5 || noop5); + state2(callback5 || noop5); } function run11(callback5) { var stack = [callback5]; - state3 = wait; + state2 = wait; fn4(done5); function wait(callback6) { stack.push(callback6); } function done5(err2) { var args3 = arguments; - state3 = isError2(err2) ? run11 : finished; + state2 = isError2(err2) ? run11 : finished; while (stack.length) finished(stack.shift()); function finished(callback6) { @@ -427300,7 +427655,7 @@ var init_server4 = __esm(async () => { }); // packages/unifia/src/mobile-entry.ts -import { existsSync as existsSync11, writeFileSync as writeFileSync4, mkdirSync as mkdirSync3, readdirSync as readdirSync5, readFileSync as readFileSync10 } from "fs"; +import { existsSync as existsSync12, writeFileSync as writeFileSync4, mkdirSync as mkdirSync3, readdirSync as readdirSync5, readFileSync as readFileSync10 } from "fs"; import dns from "dns"; import { join as pathJoin, dirname as dirname15 } from "path"; @@ -432700,17 +433055,17 @@ function withNetworkOptions(yargs) { return yargs.options(options4); } async function resolveNetworkOptions(args3) { - const config6 = await Config.getGlobal(); + const config5 = await Config.getGlobal(); const portExplicitlySet = process.argv.includes("--port"); const hostnameExplicitlySet = process.argv.includes("--hostname"); const mdnsExplicitlySet = process.argv.includes("--mdns"); const mdnsDomainExplicitlySet = process.argv.includes("--mdns-domain"); const _corsExplicitlySet = process.argv.includes("--cors"); - const mdns = mdnsExplicitlySet ? args3.mdns : config6?.server?.mdns ?? args3.mdns; - const mdnsDomain = mdnsDomainExplicitlySet ? args3["mdns-domain"] : config6?.server?.mdnsDomain ?? args3["mdns-domain"]; - const port2 = portExplicitlySet ? args3.port : config6?.server?.port ?? args3.port; - const hostname4 = hostnameExplicitlySet ? args3.hostname : mdns && !config6?.server?.hostname ? "0.0.0.0" : config6?.server?.hostname ?? args3.hostname; - const configCors = config6?.server?.cors ?? []; + const mdns = mdnsExplicitlySet ? args3.mdns : config5?.server?.mdns ?? args3.mdns; + const mdnsDomain = mdnsDomainExplicitlySet ? args3["mdns-domain"] : config5?.server?.mdnsDomain ?? args3["mdns-domain"]; + const port2 = portExplicitlySet ? args3.port : config5?.server?.port ?? args3.port; + const hostname4 = hostnameExplicitlySet ? args3.hostname : mdns && !config5?.server?.hostname ? "0.0.0.0" : config5?.server?.hostname ?? args3.hostname; + const configCors = config5?.server?.cors ?? []; const argsCors = Array.isArray(args3.cors) ? args3.cors : args3.cors ? [args3.cors] : []; const cors2 = [...configCors, ...argsCors]; return { hostname: hostname4, port: port2, mdns, mdnsDomain, cors: cors2 }; @@ -432761,14 +433116,14 @@ await __promiseAll([ init_global(), init_log() ]); -import path75 from "path"; -import { existsSync as existsSync10 } from "fs"; +import path76 from "path"; +import { existsSync as existsSync11 } from "fs"; var JsonMigration; ((JsonMigration) => { const log12 = Log.create({ service: "json-migration" }); async function run11(sqlite, options5) { - const storageDir = path75.join(Global.Path.data, "storage"); - if (!existsSync10(storageDir)) { + const storageDir = path76.join(Global.Path.data, "storage"); + if (!existsSync11(storageDir)) { log12.info("storage directory does not exist, skipping migration"); return { projects: 0, @@ -432877,7 +433232,7 @@ var JsonMigration; const data2 = batch[j3]; if (!data2) continue; - const id2 = path75.basename(projectFiles[i7 + j3], ".json"); + const id2 = path76.basename(projectFiles[i7 + j3], ".json"); projectIds.add(id2); projectValues.push({ id: id2, @@ -432897,7 +433252,7 @@ var JsonMigration; step("projects", end4 - i7); } log12.info("migrated projects", { count: stats.projects, duration: Math.round(performance.now() - start2) }); - const sessionProjects = sessionFiles.map((file6) => path75.basename(path75.dirname(file6))); + const sessionProjects = sessionFiles.map((file6) => path76.basename(path76.dirname(file6))); const sessionIds = new Set; const sessionValues = []; for (let i7 = 0;i7 < sessionFiles.length; i7 += batchSize) { @@ -432908,7 +433263,7 @@ var JsonMigration; const data2 = batch[j3]; if (!data2) continue; - const id2 = path75.basename(sessionFiles[i7 + j3], ".json"); + const id2 = path76.basename(sessionFiles[i7 + j3], ".json"); const projectID = sessionProjects[i7 + j3]; if (!projectIds.has(projectID)) { orphans.sessions++; @@ -432947,7 +433302,7 @@ var JsonMigration; const allMessageSessions = []; const messageSessions = new Map; for (const file6 of messageFiles) { - const sessionID = path75.basename(path75.dirname(file6)); + const sessionID = path76.basename(path76.dirname(file6)); if (!sessionIds.has(sessionID)) continue; allMessageFiles.push(file6); @@ -432963,7 +433318,7 @@ var JsonMigration; if (!data2) continue; const file6 = allMessageFiles[i7 + j3]; - const id2 = path75.basename(file6, ".json"); + const id2 = path76.basename(file6, ".json"); const sessionID = allMessageSessions[i7 + j3]; messageSessions.set(id2, sessionID); const rest = data2; @@ -432992,8 +433347,8 @@ var JsonMigration; if (!data2) continue; const file6 = partFiles[i7 + j3]; - const id2 = path75.basename(file6, ".json"); - const messageID = path75.basename(path75.dirname(file6)); + const id2 = path76.basename(file6, ".json"); + const messageID = path76.basename(path76.dirname(file6)); const sessionID = messageSessions.get(messageID); if (!sessionID) { errs.push(`part missing message session: ${file6}`); @@ -433019,7 +433374,7 @@ var JsonMigration; step("parts", end4 - i7); } log12.info("migrated parts", { count: stats.parts }); - const todoSessions = todoFiles.map((file6) => path75.basename(file6, ".json")); + const todoSessions = todoFiles.map((file6) => path76.basename(file6, ".json")); for (let i7 = 0;i7 < todoFiles.length; i7 += batchSize) { const end4 = Math.min(i7 + batchSize, todoFiles.length); const batch = await read3(todoFiles, i7, end4); @@ -433059,7 +433414,7 @@ var JsonMigration; if (orphans.todos > 0) { log12.warn("skipped orphaned todos", { count: orphans.todos }); } - const permProjects = permFiles.map((file6) => path75.basename(file6, ".json")); + const permProjects = permFiles.map((file6) => path76.basename(file6, ".json")); const permValues = []; for (let i7 = 0;i7 < permFiles.length; i7 += batchSize) { const end4 = Math.min(i7 + batchSize, permFiles.length); @@ -433083,7 +433438,7 @@ var JsonMigration; if (orphans.permissions > 0) { log12.warn("skipped orphaned permissions", { count: orphans.permissions }); } - const shareSessions = shareFiles.map((file6) => path75.basename(file6, ".json")); + const shareSessions = shareFiles.map((file6) => path76.basename(file6, ".json")); const shareValues = []; for (let i7 = 0;i7 < shareFiles.length; i7 += batchSize) { const end4 = Math.min(i7 + batchSize, shareFiles.length); @@ -433136,12 +433491,12 @@ var JsonMigration; init_filesystem(); init_error2(); await init_global(); -import path76 from "path"; +import path77 from "path"; import { EOL } from "os"; var scriptPath = process.argv[1] || import.meta.path; var runtimeDir = dirname15(scriptPath); var envFile = pathJoin(runtimeDir, ".env_vars"); -if (existsSync11(envFile)) { +if (existsSync12(envFile)) { try { const content = readFileSync10(envFile, "utf8"); for (const line2 of content.split(` @@ -433189,7 +433544,7 @@ if (!process.env.XDG_CONFIG_HOME) process.env.XDG_CONFIG_HOME = pathJoin(homeDir, ".config"); if (!process.env.SSL_CERT_FILE) { const caBundlePath = pathJoin(runtimeDir, "ca-certificates.crt"); - if (existsSync11(caBundlePath)) { + if (existsSync12(caBundlePath)) { process.env.SSL_CERT_FILE = caBundlePath; process.env.NODE_EXTRA_CA_CERTS = caBundlePath; } else { @@ -433220,7 +433575,7 @@ if (!process.env.SSL_CERT_FILE) { } } } -if (!existsSync11("/etc/resolv.conf")) { +if (!existsSync12("/etc/resolv.conf")) { const servers = ["8.8.8.8", "8.8.4.4", "1.1.1.1"]; try { dns.setServers(servers); @@ -433259,7 +433614,7 @@ process.on("uncaughtException", (e4) => { Log.Default.error("exception", { e: errorMessage(e4) }); }); var args3 = hideBin(process.argv); -var cli = yargs_default(args3).scriptName("opencode").wrap(100).help("help").version(Installation.VERSION).option("print-logs", { describe: "print logs to stderr", type: "boolean" }).option("log-level", { describe: "log level", type: "string", choices: ["DEBUG", "INFO", "WARN", "ERROR"] }).middleware(async (opts) => { +var cli = yargs_default(args3).scriptName("unifia").wrap(100).help("help").version(Installation.VERSION).option("print-logs", { describe: "print logs to stderr", type: "boolean" }).option("log-level", { describe: "log level", type: "string", choices: ["DEBUG", "INFO", "WARN", "ERROR"] }).middleware(async (opts) => { await Log.init({ print: process.argv.includes("--print-logs"), dev: false, @@ -433267,12 +433622,12 @@ var cli = yargs_default(args3).scriptName("opencode").wrap(100).help("help").ver }); process.env.AGENT = "1"; process.env.OPENCODE = "1"; - process.env.OPENCODE_CLIENT = process.env.OPENCODE_CLIENT ?? "mobile-embedded"; - Log.Default.info("opencode-mobile", { + process.env.UNIFIA_CLIENT = process.env.UNIFIA_CLIENT ?? "mobile-embedded"; + Log.Default.info("unifia-mobile", { version: Installation.VERSION, args: process.argv.slice(2) }); - const marker25 = path76.join(Global.Path.data, "opencode.db"); + const marker25 = path77.join(Global.Path.data, DATABASE_FILE); if (!await Filesystem.exists(marker25)) { process.stderr.write("Performing database migration..." + EOL); await JsonMigration.run(Database.Client().$client, {}); diff --git a/packages/mobile/src-tauri/gen/android/app/src/main/assets/runtime/unifia-cli.js b/packages/mobile/src-tauri/gen/android/app/src/main/assets/runtime/unifia-cli.js index 5a87dc255b06..4a373cbaae9d 100644 --- a/packages/mobile/src-tauri/gen/android/app/src/main/assets/runtime/unifia-cli.js +++ b/packages/mobile/src-tauri/gen/android/app/src/main/assets/runtime/unifia-cli.js @@ -1,6 +1,6 @@ // AUTO-GENERATED: Inlined SQL migrations for Android mobile -globalThis.UNIFIA_VERSION = "0.0.0-reviewfix-202608100051"; -globalThis.UNIFIA_CHANNEL = "devtest"; +globalThis.UNIFIA_VERSION = "local"; +globalThis.UNIFIA_CHANNEL = "local"; globalThis.UNIFIA_MIGRATIONS = [{"sql":"CREATE TABLE `project` (\n\t`id` text PRIMARY KEY,\n\t`worktree` text NOT NULL,\n\t`vcs` text,\n\t`name` text,\n\t`icon_url` text,\n\t`icon_color` text,\n\t`time_created` integer NOT NULL,\n\t`time_updated` integer NOT NULL,\n\t`time_initialized` integer,\n\t`sandboxes` text NOT NULL\n);\n--> statement-breakpoint\nCREATE TABLE `message` (\n\t`id` text PRIMARY KEY,\n\t`session_id` text NOT NULL,\n\t`time_created` integer NOT NULL,\n\t`time_updated` integer NOT NULL,\n\t`data` text NOT NULL,\n\tCONSTRAINT `fk_message_session_id_session_id_fk` FOREIGN KEY (`session_id`) REFERENCES `session`(`id`) ON DELETE CASCADE\n);\n--> statement-breakpoint\nCREATE TABLE `part` (\n\t`id` text PRIMARY KEY,\n\t`message_id` text NOT NULL,\n\t`session_id` text NOT NULL,\n\t`time_created` integer NOT NULL,\n\t`time_updated` integer NOT NULL,\n\t`data` text NOT NULL,\n\tCONSTRAINT `fk_part_message_id_message_id_fk` FOREIGN KEY (`message_id`) REFERENCES `message`(`id`) ON DELETE CASCADE\n);\n--> statement-breakpoint\nCREATE TABLE `permission` (\n\t`project_id` text PRIMARY KEY,\n\t`time_created` integer NOT NULL,\n\t`time_updated` integer NOT NULL,\n\t`data` text NOT NULL,\n\tCONSTRAINT `fk_permission_project_id_project_id_fk` FOREIGN KEY (`project_id`) REFERENCES `project`(`id`) ON DELETE CASCADE\n);\n--> statement-breakpoint\nCREATE TABLE `session` (\n\t`id` text PRIMARY KEY,\n\t`project_id` text NOT NULL,\n\t`parent_id` text,\n\t`slug` text NOT NULL,\n\t`directory` text NOT NULL,\n\t`title` text NOT NULL,\n\t`version` text NOT NULL,\n\t`share_url` text,\n\t`summary_additions` integer,\n\t`summary_deletions` integer,\n\t`summary_files` integer,\n\t`summary_diffs` text,\n\t`revert` text,\n\t`permission` text,\n\t`time_created` integer NOT NULL,\n\t`time_updated` integer NOT NULL,\n\t`time_compacting` integer,\n\t`time_archived` integer,\n\tCONSTRAINT `fk_session_project_id_project_id_fk` FOREIGN KEY (`project_id`) REFERENCES `project`(`id`) ON DELETE CASCADE\n);\n--> statement-breakpoint\nCREATE TABLE `todo` (\n\t`session_id` text NOT NULL,\n\t`content` text NOT NULL,\n\t`status` text NOT NULL,\n\t`priority` text NOT NULL,\n\t`position` integer NOT NULL,\n\t`time_created` integer NOT NULL,\n\t`time_updated` integer NOT NULL,\n\tCONSTRAINT `todo_pk` PRIMARY KEY(`session_id`, `position`),\n\tCONSTRAINT `fk_todo_session_id_session_id_fk` FOREIGN KEY (`session_id`) REFERENCES `session`(`id`) ON DELETE CASCADE\n);\n--> statement-breakpoint\nCREATE TABLE `session_share` (\n\t`session_id` text PRIMARY KEY,\n\t`id` text NOT NULL,\n\t`secret` text NOT NULL,\n\t`url` text NOT NULL,\n\t`time_created` integer NOT NULL,\n\t`time_updated` integer NOT NULL,\n\tCONSTRAINT `fk_session_share_session_id_session_id_fk` FOREIGN KEY (`session_id`) REFERENCES `session`(`id`) ON DELETE CASCADE\n);\n--> statement-breakpoint\nCREATE INDEX `message_session_idx` ON `message` (`session_id`);--> statement-breakpoint\nCREATE INDEX `part_message_idx` ON `part` (`message_id`);--> statement-breakpoint\nCREATE INDEX `part_session_idx` ON `part` (`session_id`);--> statement-breakpoint\nCREATE INDEX `session_project_idx` ON `session` (`project_id`);--> statement-breakpoint\nCREATE INDEX `session_parent_idx` ON `session` (`parent_id`);--> statement-breakpoint\nCREATE INDEX `todo_session_idx` ON `todo` (`session_id`);","timestamp":1769552633000,"name":"20260127222353_familiar_lady_ursula"},{"sql":"ALTER TABLE `project` ADD `commands` text;","timestamp":1770830228000,"name":"20260211171708_add_project_commands"},{"sql":"CREATE TABLE `control_account` (\n\t`email` text NOT NULL,\n\t`url` text NOT NULL,\n\t`access_token` text NOT NULL,\n\t`refresh_token` text NOT NULL,\n\t`token_expiry` integer,\n\t`active` integer NOT NULL,\n\t`time_created` integer NOT NULL,\n\t`time_updated` integer NOT NULL,\n\tCONSTRAINT `control_account_pk` PRIMARY KEY(`email`, `url`)\n);\n","timestamp":1770993676000,"name":"20260213144116_wakeful_the_professor"},{"sql":"CREATE TABLE `workspace` (\n\t`id` text PRIMARY KEY,\n\t`branch` text,\n\t`project_id` text NOT NULL,\n\t`config` text NOT NULL,\n\tCONSTRAINT `fk_workspace_project_id_project_id_fk` FOREIGN KEY (`project_id`) REFERENCES `project`(`id`) ON DELETE CASCADE\n);\n","timestamp":1772056728000,"name":"20260225215848_workspace"},{"sql":"ALTER TABLE `session` ADD `workspace_id` text;--> statement-breakpoint\nCREATE INDEX `session_workspace_idx` ON `session` (`workspace_id`);","timestamp":1772228279000,"name":"20260227213759_add_session_workspace_id"},{"sql":"CREATE TABLE `account` (\n\t`id` text PRIMARY KEY,\n\t`email` text NOT NULL,\n\t`url` text NOT NULL,\n\t`access_token` text NOT NULL,\n\t`refresh_token` text NOT NULL,\n\t`token_expiry` integer,\n\t`selected_org_id` text,\n\t`time_created` integer NOT NULL,\n\t`time_updated` integer NOT NULL\n);\n--> statement-breakpoint\nCREATE TABLE `account_state` (\n\t`id` integer PRIMARY KEY NOT NULL,\n\t`active_account_id` text,\n\tFOREIGN KEY (`active_account_id`) REFERENCES `account`(`id`) ON UPDATE no action ON DELETE set null\n);\n","timestamp":1772310750000,"name":"20260228203230_blue_harpoon"},{"sql":"ALTER TABLE `workspace` ADD `type` text NOT NULL;--> statement-breakpoint\nALTER TABLE `workspace` ADD `name` text;--> statement-breakpoint\nALTER TABLE `workspace` ADD `directory` text;--> statement-breakpoint\nALTER TABLE `workspace` ADD `extra` text;--> statement-breakpoint\nALTER TABLE `workspace` DROP COLUMN `config`;","timestamp":1772579546000,"name":"20260303231226_add_workspace_fields"},{"sql":"ALTER TABLE `account_state` ADD `active_org_id` text;--> statement-breakpoint\nUPDATE `account_state` SET `active_org_id` = (SELECT `selected_org_id` FROM `account` WHERE `account`.`id` = `account_state`.`active_account_id`);--> statement-breakpoint\nALTER TABLE `account` DROP COLUMN `selected_org_id`;\n","timestamp":1773097200000,"name":"20260309230000_move_org_to_state"},{"sql":"DROP INDEX IF EXISTS `message_session_idx`;--> statement-breakpoint\nDROP INDEX IF EXISTS `part_message_idx`;--> statement-breakpoint\nCREATE INDEX `message_session_time_created_id_idx` ON `message` (`session_id`,`time_created`,`id`);--> statement-breakpoint\nCREATE INDEX `part_message_id_id_idx` ON `part` (`message_id`,`id`);","timestamp":1773290071000,"name":"20260312043431_session_message_cursor"},{"sql":"CREATE TABLE `event_sequence` (\n\t`aggregate_id` text PRIMARY KEY,\n\t`seq` integer NOT NULL\n);\n--> statement-breakpoint\nCREATE TABLE `event` (\n\t`id` text PRIMARY KEY,\n\t`aggregate_id` text NOT NULL,\n\t`seq` integer NOT NULL,\n\t`type` text NOT NULL,\n\t`data` text NOT NULL,\n\tCONSTRAINT `fk_event_aggregate_id_event_sequence_aggregate_id_fk` FOREIGN KEY (`aggregate_id`) REFERENCES `event_sequence`(`aggregate_id`) ON DELETE CASCADE\n);\n","timestamp":1774309702000,"name":"20260323234822_events"},{"sql":"ALTER TABLE `session` ADD `status` text DEFAULT 'idle';","timestamp":1775304000000,"name":"20260404120000_session_task_status"},{"sql":"CREATE TABLE IF NOT EXISTS `embedding` (\n `id` text PRIMARY KEY NOT NULL,\n `project_id` text NOT NULL REFERENCES `project`(`id`) ON DELETE CASCADE,\n `source_type` text NOT NULL,\n `source_id` text NOT NULL,\n `content` text NOT NULL,\n `vector` blob NOT NULL,\n `model` text NOT NULL,\n `dimensions` integer NOT NULL,\n `metadata` text,\n `content_hash` text NOT NULL,\n `time_created` integer DEFAULT (unixepoch() * 1000),\n `time_updated` integer DEFAULT (unixepoch() * 1000)\n);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `embedding_project_idx` ON `embedding` (`project_id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `embedding_source_idx` ON `embedding` (`source_type`, `source_id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `embedding_hash_idx` ON `embedding` (`content_hash`);\n","timestamp":1775390400000,"name":"20260405120000_rag_embeddings"},{"sql":"CREATE TABLE IF NOT EXISTS \"collab_user\" (\n \"id\" text PRIMARY KEY NOT NULL,\n \"username\" text NOT NULL,\n \"email\" text,\n \"display_name\" text,\n \"password_hash\" text NOT NULL,\n \"role\" text NOT NULL DEFAULT 'member',\n \"time_created\" integer NOT NULL DEFAULT (unixepoch() * 1000),\n \"time_updated\" integer NOT NULL DEFAULT (unixepoch() * 1000)\n);\n--> statement-breakpoint\nCREATE UNIQUE INDEX IF NOT EXISTS \"collab_user_username_idx\" ON \"collab_user\" (\"username\");\n--> statement-breakpoint\nCREATE TABLE IF NOT EXISTS \"collab_user_token\" (\n \"id\" text PRIMARY KEY NOT NULL,\n \"user_id\" text NOT NULL REFERENCES \"collab_user\"(\"id\") ON DELETE CASCADE,\n \"token_hash\" text NOT NULL,\n \"expires_at\" integer NOT NULL,\n \"time_created\" integer NOT NULL DEFAULT (unixepoch() * 1000)\n);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS \"collab_user_token_user_idx\" ON \"collab_user_token\" (\"user_id\");\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS \"collab_user_token_hash_idx\" ON \"collab_user_token\" (\"token_hash\");\n","timestamp":1775476800000,"name":"20260406120000_collaborative_users"},{"sql":"ALTER TABLE \"session\" ADD COLUMN \"user_id\" text;\n","timestamp":1775476801000,"name":"20260406120001_session_user_id"},{"sql":"CREATE INDEX IF NOT EXISTS \"session_user_idx\" ON \"session\" (\"user_id\");\n","timestamp":1775476802000,"name":"20260406120002_session_user_idx"},{"sql":"CREATE TABLE IF NOT EXISTS `bm25_doc` (\n `id` text PRIMARY KEY NOT NULL,\n `project_id` text NOT NULL REFERENCES `project`(`id`) ON DELETE CASCADE,\n `source_type` text NOT NULL,\n `source_id` text NOT NULL,\n `content` text NOT NULL,\n `content_hash` text NOT NULL,\n `tokens` text NOT NULL,\n `doc_length` integer NOT NULL,\n `time_created` integer DEFAULT (unixepoch() * 1000),\n `time_updated` integer DEFAULT (unixepoch() * 1000)\n);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `bm25_doc_project_idx` ON `bm25_doc` (`project_id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `bm25_doc_source_idx` ON `bm25_doc` (`source_type`, `source_id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `bm25_doc_hash_idx` ON `bm25_doc` (`content_hash`);\n","timestamp":1776081600000,"name":"20260413120000_bm25_docs"},{"sql":"CREATE TABLE IF NOT EXISTS `audit_log` (\n `id` text PRIMARY KEY NOT NULL,\n `ts` integer NOT NULL,\n `actor` text,\n `action` text NOT NULL,\n `target` text,\n `metadata` text,\n `time_created` integer NOT NULL,\n `time_updated` integer NOT NULL\n);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `audit_log_ts_idx` ON `audit_log` (`ts`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `audit_log_action_idx` ON `audit_log` (`action`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `audit_log_actor_idx` ON `audit_log` (`actor`);\n","timestamp":1776513600000,"name":"20260418120000_audit_log"},{"sql":"CREATE TABLE IF NOT EXISTS `debate` (\n `id` text PRIMARY KEY NOT NULL,\n `status` text NOT NULL DEFAULT 'pending',\n `prompt` text NOT NULL,\n `prompt_hash` text NOT NULL,\n `workspace_hash` text NOT NULL,\n `tier` text NOT NULL,\n `config` text NOT NULL,\n `report` text,\n `cost` real,\n `duration_ms` integer,\n `provider_count` integer NOT NULL,\n `blind_spot_count` integer,\n `error` text,\n `time_created` integer NOT NULL,\n `time_updated` integer NOT NULL\n);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `debate_status_idx` ON `debate` (`status`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `debate_time_created_idx` ON `debate` (`time_created`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `debate_prompt_hash_idx` ON `debate` (`prompt_hash`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `debate_workspace_hash_idx` ON `debate` (`workspace_hash`);\n--> statement-breakpoint\nCREATE TABLE IF NOT EXISTS `debate_claim` (\n `id` text PRIMARY KEY NOT NULL,\n `debate_id` text NOT NULL REFERENCES `debate`(`id`) ON DELETE CASCADE,\n `source_id` text NOT NULL,\n `source_provider` text NOT NULL,\n `category` text NOT NULL,\n `content` text NOT NULL,\n `confidence` real,\n `novelty` text,\n `is_actionable` integer,\n `verification_hint` text,\n `is_existence_claim` integer,\n `jargon_risk` real,\n `is_recovered` integer,\n `time_created` integer NOT NULL,\n `time_updated` integer NOT NULL\n);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `claim_debate_idx` ON `debate_claim` (`debate_id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `claim_category_idx` ON `debate_claim` (`category`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `claim_novelty_idx` ON `debate_claim` (`novelty`);\n--> statement-breakpoint\nCREATE TABLE IF NOT EXISTS `debate_claim_feedback` (\n `id` text PRIMARY KEY NOT NULL,\n `debate_id` text NOT NULL REFERENCES `debate`(`id`) ON DELETE CASCADE,\n `claim_id` text NOT NULL,\n `action` text NOT NULL,\n `time_created` integer NOT NULL,\n `time_updated` integer NOT NULL\n);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `feedback_debate_idx` ON `debate_claim_feedback` (`debate_id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `feedback_claim_idx` ON `debate_claim_feedback` (`claim_id`);\n","timestamp":1782129600000,"name":"20260622120000_debate"},{"sql":"CREATE TABLE IF NOT EXISTS `observability_event` (\n `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n `event_id` text NOT NULL,\n `trace_id` text NOT NULL,\n `span_id` text NOT NULL,\n `parent_span_id` text,\n `session_id` text,\n `project_id` text,\n `workspace_id` text,\n `message_id` text,\n `turn_id` text,\n `step_index` integer,\n `event_type` text NOT NULL,\n `status` text NOT NULL,\n `ts_ms` integer NOT NULL,\n `duration_ms` integer,\n `enqueue_seq` integer NOT NULL,\n `model_provider` text,\n `model_id` text,\n `input_tokens` integer,\n `output_tokens` integer,\n `cache_read_tokens` integer,\n `cache_write_tokens` integer,\n `cost_nano_usd` integer,\n `pricing_version` text,\n `pricing_source` text,\n `cost_computed_at_ms` integer,\n `redaction_status` text NOT NULL,\n `original_size_bytes` integer,\n `payload_truncated` integer DEFAULT false NOT NULL,\n `metadata_json` text NOT NULL,\n `local_redacted_json` text NOT NULL,\n `schema_version` integer DEFAULT 1 NOT NULL\n);\n--> statement-breakpoint\nCREATE UNIQUE INDEX IF NOT EXISTS `observability_event_event_id_idx` ON `observability_event` (`event_id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `observability_event_ts_id_idx` ON `observability_event` (`ts_ms`,`id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `observability_event_session_ts_id_idx` ON `observability_event` (`session_id`,`ts_ms`,`id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `observability_event_project_ts_id_idx` ON `observability_event` (`project_id`,`ts_ms`,`id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `observability_event_workspace_ts_id_idx` ON `observability_event` (`workspace_id`,`ts_ms`,`id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `observability_event_trace_ts_id_idx` ON `observability_event` (`trace_id`,`ts_ms`,`id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `observability_event_span_idx` ON `observability_event` (`span_id`);\n","timestamp":1783699200000,"name":"20260710160000_observability_event"},{"sql":"ALTER TABLE `observability_event` ADD COLUMN `local_content_redacted_json` text;\n--> statement-breakpoint\nALTER TABLE `observability_event` ADD COLUMN `local_full_json` text;\n--> statement-breakpoint\nALTER TABLE `observability_event` ADD COLUMN `content_expires_at_ms` integer;\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `observability_event_content_expires_idx` ON `observability_event` (`content_expires_at_ms`);\n--> statement-breakpoint\nCREATE TABLE IF NOT EXISTS `observability_content_optin` (\n `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n `scope` text NOT NULL,\n `scope_id` text NOT NULL,\n `level` text NOT NULL,\n `ttl_days` integer NOT NULL,\n `created_at_ms` integer NOT NULL,\n `expires_at_ms` integer NOT NULL\n);\n--> statement-breakpoint\nCREATE UNIQUE INDEX IF NOT EXISTS `observability_content_optin_scope_idx` ON `observability_content_optin` (`scope`,`scope_id`);\n--> statement-breakpoint\nCREATE INDEX IF NOT EXISTS `observability_content_optin_expires_idx` ON `observability_content_optin` (`expires_at_ms`);\n","timestamp":1783857600000,"name":"20260712120000_observability_content"},{"sql":"-- Model Intelligence Registry schema (C01)\n--\n-- Tables : registry_meta, sources, providers, models, model_aliases,\n-- pricing_tiers, model_health, model_source_refs, notices, audit.\n--\n-- Compatible SQLite (pour usage WAL local) et PostgreSQL (pour usage\n-- production futur) — syntaxe portable.\n--\n-- Pas de secrets, pas de credentials : tout est open data license.\n\nCREATE TABLE IF NOT EXISTS registry_meta (\n schema_version TEXT PRIMARY KEY,\n generated_at_utc TEXT NOT NULL,\n registry_id TEXT NOT NULL,\n generator_version TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS sources (\n id TEXT PRIMARY KEY,\n url TEXT NOT NULL,\n type TEXT NOT NULL CHECK (type IN ('catalog', 'pricing', 'benchmarks', 'metadata')),\n license_code TEXT,\n license_file_url TEXT,\n copyright_notice TEXT,\n parser_version TEXT NOT NULL,\n confidence_level TEXT NOT NULL CHECK (confidence_level IN ('official', 'community', 'unverified')),\n rollback_policy TEXT NOT NULL CHECK (rollback_policy IN ('disable', 'fallback_to_cache', 'manual_review')),\n policy_doc_ref TEXT,\n deprecated INTEGER NOT NULL DEFAULT 0,\n deprecation_reason TEXT\n);\n\nCREATE TABLE IF NOT EXISTS providers (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n sdk TEXT,\n api_base_url TEXT,\n env_vars_json TEXT NOT NULL DEFAULT '[]',\n capabilities_json TEXT NOT NULL,\n modalities_json TEXT NOT NULL,\n status TEXT NOT NULL CHECK (status IN ('active', 'deprecated', 'experimental')),\n deprecation_reason TEXT,\n added_at_utc TEXT NOT NULL,\n removed_at_utc TEXT,\n docs_url TEXT,\n privacy_policy_ref TEXT,\n region_policy_json TEXT NOT NULL,\n aliases_json TEXT NOT NULL DEFAULT '[]'\n);\n\nCREATE TABLE IF NOT EXISTS models (\n id TEXT NOT NULL,\n provider_id TEXT NOT NULL REFERENCES providers(id),\n canonical_name TEXT NOT NULL,\n family TEXT,\n aliases_json TEXT NOT NULL DEFAULT '[]',\n capabilities_json TEXT NOT NULL,\n modalities_json TEXT NOT NULL,\n context_window_json TEXT NOT NULL,\n reasoning_json TEXT NOT NULL,\n tool_use_json TEXT NOT NULL,\n temperature_json TEXT NOT NULL,\n status TEXT NOT NULL CHECK (status IN ('alpha', 'beta', 'active', 'deprecated', 'quarantined')),\n deprecation_reason TEXT,\n lifecycle_stage TEXT NOT NULL CHECK (lifecycle_stage IN ('discovered', 'metadata_validated', 'probed', 'low_risk_eligible', 'general_eligible', 'trusted_by_domain', 'deprecated', 'quarantined')),\n release_date_utc TEXT,\n retirement_date_utc TEXT,\n pricing_json TEXT NOT NULL,\n health_json TEXT NOT NULL,\n provenance_json TEXT NOT NULL,\n last_seen_at_utc TEXT NOT NULL,\n PRIMARY KEY (provider_id, id)\n);\n\nCREATE INDEX IF NOT EXISTS idx_models_status ON models(status);\nCREATE INDEX IF NOT EXISTS idx_models_lifecycle ON models(lifecycle_stage);\nCREATE INDEX IF NOT EXISTS idx_models_provider ON models(provider_id);\n\nCREATE TABLE IF NOT EXISTS model_aliases (\n alias TEXT PRIMARY KEY,\n canonical_provider TEXT NOT NULL,\n canonical_model TEXT NOT NULL,\n deprecated INTEGER NOT NULL DEFAULT 0,\n replaced_by_provider TEXT,\n replaced_by_model TEXT\n);\n\nCREATE TABLE IF NOT EXISTS pricing_tiers (\n model_provider TEXT NOT NULL,\n model_id TEXT NOT NULL,\n threshold_tokens INTEGER NOT NULL,\n input_price REAL NOT NULL,\n output_price REAL NOT NULL,\n FOREIGN KEY (model_provider, model_id) REFERENCES models(provider_id, id),\n PRIMARY KEY (model_provider, model_id, threshold_tokens)\n);\n\nCREATE TABLE IF NOT EXISTS model_health (\n model_provider TEXT NOT NULL,\n model_id TEXT NOT NULL,\n last_check_utc TEXT NOT NULL,\n availability_score REAL NOT NULL,\n latency_p50_ms REAL,\n latency_p95_ms REAL,\n error_rate_1h REAL NOT NULL,\n rate_limit_json TEXT,\n notes TEXT,\n FOREIGN KEY (model_provider, model_id) REFERENCES models(provider_id, id),\n PRIMARY KEY (model_provider, model_id)\n);\n\nCREATE TABLE IF NOT EXISTS model_source_refs (\n model_provider TEXT NOT NULL,\n model_id TEXT NOT NULL,\n source_id TEXT NOT NULL REFERENCES sources(id),\n observed_at_utc TEXT NOT NULL,\n source_version TEXT NOT NULL,\n field_hashes_json TEXT NOT NULL,\n FOREIGN KEY (model_provider, model_id) REFERENCES models(provider_id, id),\n PRIMARY KEY (model_provider, model_id, source_id)\n);\n\nCREATE TABLE IF NOT EXISTS notices (\n source_id TEXT PRIMARY KEY REFERENCES sources(id),\n license_code TEXT,\n copyright_notice TEXT,\n license_file_url TEXT,\n confidence_level TEXT NOT NULL,\n url TEXT\n);\n\nCREATE TABLE IF NOT EXISTS audit (\n timestamp_utc TEXT NOT NULL,\n action TEXT NOT NULL,\n before_hash TEXT,\n after_hash TEXT,\n details_json TEXT\n);\n\nCREATE INDEX IF NOT EXISTS idx_audit_timestamp ON audit(timestamp_utc);\nCREATE INDEX IF NOT EXISTS idx_audit_action ON audit(action);\n\nCREATE TABLE IF NOT EXISTS snapshots (\n schema_version TEXT PRIMARY KEY,\n generated_at_utc TEXT NOT NULL,\n registry_id TEXT NOT NULL,\n snapshot_json TEXT NOT NULL,\n snapshot_hash TEXT NOT NULL,\n generator_version TEXT NOT NULL\n);","timestamp":1784635200000,"name":"20260721120000_model_intelligence"},{"sql":"-- D02 Team durable state. JSON is state metadata only; artifact bytes stay on disk.\nPRAGMA journal_mode = WAL;\nPRAGMA synchronous = NORMAL;\nPRAGMA foreign_keys = ON;\nPRAGMA busy_timeout = 5000;\n\nCREATE TABLE IF NOT EXISTS team_store_meta (\n schema_version TEXT PRIMARY KEY,\n migration_id TEXT NOT NULL UNIQUE,\n applied_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS team_runs (\n run_id TEXT PRIMARY KEY,\n schema_version TEXT NOT NULL,\n plan_id TEXT NOT NULL,\n status TEXT NOT NULL CHECK (status IN ('pending', 'running', 'completed', 'failed', 'aborted')),\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS team_tasks (\n task_id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL REFERENCES team_runs(run_id) ON DELETE CASCADE,\n status TEXT NOT NULL CHECK (status IN ('pending', 'assigned', 'running', 'completed', 'blocked', 'cancelled')),\n depends_on_json TEXT NOT NULL DEFAULT '[]' CHECK (length(depends_on_json) <= 65536),\n scope_json TEXT NOT NULL CHECK (length(scope_json) <= 65536),\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS team_attempts (\n attempt_id TEXT PRIMARY KEY,\n task_id TEXT NOT NULL REFERENCES team_tasks(task_id) ON DELETE CASCADE,\n worker_id TEXT NOT NULL,\n outcome TEXT NOT NULL CHECK (outcome IN ('success', 'failure', 'aborted', 'in_progress')),\n commit_sha TEXT,\n report_json TEXT CHECK (report_json IS NULL OR length(report_json) <= 65536),\n started_at TEXT NOT NULL,\n finished_at TEXT\n);\n\nCREATE TABLE IF NOT EXISTS team_locks (\n lease_id TEXT PRIMARY KEY,\n run_id TEXT REFERENCES team_runs(run_id) ON DELETE SET NULL,\n task_id TEXT REFERENCES team_tasks(task_id) ON DELETE SET NULL,\n worker_id TEXT NOT NULL,\n fencing_token INTEGER NOT NULL UNIQUE,\n branch TEXT NOT NULL,\n worktree TEXT NOT NULL,\n status TEXT NOT NULL CHECK (status IN ('CLAIMED', 'RELEASED', 'EXPIRED')),\n acquired_at TEXT NOT NULL,\n expires_at TEXT NOT NULL,\n released_at TEXT,\n release_reason TEXT\n);\n\nCREATE TABLE IF NOT EXISTS team_gates (\n gate_id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL REFERENCES team_runs(run_id) ON DELETE CASCADE,\n task_id TEXT REFERENCES team_tasks(task_id) ON DELETE SET NULL,\n verdict TEXT NOT NULL CHECK (verdict IN ('APPROVED', 'APPROVED_WITH_FOLLOWUP', 'CHANGES_REQUESTED')),\n findings_json TEXT NOT NULL CHECK (length(findings_json) <= 65536),\n decided_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS team_events (\n event_id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL REFERENCES team_runs(run_id) ON DELETE CASCADE,\n sequence INTEGER NOT NULL,\n kind TEXT NOT NULL,\n payload_json TEXT NOT NULL CHECK (length(payload_json) <= 16384),\n occurred_at TEXT NOT NULL,\n UNIQUE (run_id, sequence)\n);\n\nCREATE TABLE IF NOT EXISTS team_artifacts (\n artifact_id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL REFERENCES team_runs(run_id) ON DELETE CASCADE,\n task_id TEXT REFERENCES team_tasks(task_id) ON DELETE SET NULL,\n relative_path TEXT NOT NULL,\n sha256 TEXT NOT NULL CHECK (length(sha256) = 64),\n byte_length INTEGER NOT NULL CHECK (byte_length >= 0),\n metadata_json TEXT CHECK (metadata_json IS NULL OR length(metadata_json) <= 65536),\n recorded_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS team_checkpoints (\n checkpoint_id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL REFERENCES team_runs(run_id) ON DELETE CASCADE,\n sequence INTEGER NOT NULL,\n state_json TEXT NOT NULL CHECK (length(state_json) <= 65536),\n created_at TEXT NOT NULL,\n UNIQUE (run_id, sequence)\n);\n\nCREATE TABLE IF NOT EXISTS team_audit (\n audit_id TEXT PRIMARY KEY,\n run_id TEXT,\n action TEXT NOT NULL,\n target_id TEXT NOT NULL,\n details_json TEXT NOT NULL CHECK (length(details_json) <= 16384),\n recorded_at TEXT NOT NULL\n);\n\nCREATE UNIQUE INDEX IF NOT EXISTS team_locks_claimed_branch_idx ON team_locks(branch) WHERE status = 'CLAIMED';\nCREATE UNIQUE INDEX IF NOT EXISTS team_locks_claimed_worktree_idx ON team_locks(worktree) WHERE status = 'CLAIMED';\nCREATE INDEX IF NOT EXISTS team_tasks_run_status_idx ON team_tasks(run_id, status);\nCREATE INDEX IF NOT EXISTS team_attempts_task_idx ON team_attempts(task_id, started_at);\nCREATE INDEX IF NOT EXISTS team_events_run_time_idx ON team_events(run_id, occurred_at);\nCREATE INDEX IF NOT EXISTS team_checkpoints_run_time_idx ON team_checkpoints(run_id, created_at);\nCREATE INDEX IF NOT EXISTS team_audit_run_time_idx ON team_audit(run_id, recorded_at);\n\nINSERT OR IGNORE INTO team_store_meta(schema_version, migration_id, applied_at)\nVALUES ('1.0.0', '20260726193000_team_store', strftime('%Y-%m-%dT%H:%M:%fZ', 'now'));\n","timestamp":1785094200000,"name":"20260726193000_team_store"}]; // @bun var __create = Object.create; @@ -72,28 +72,6 @@ var require_get_caller_file = __commonJS((exports, module2) => { }; }); -// node_modules/xdg-basedir/index.js -import os from "os"; -import path from "path"; -var homeDirectory, env2, xdgData, xdgConfig, xdgState, xdgCache, xdgRuntime, xdgDataDirectories, xdgConfigDirectories; -var init_xdg_basedir = __esm(() => { - homeDirectory = os.homedir(); - ({ env: env2 } = process); - xdgData = env2.XDG_DATA_HOME || (homeDirectory ? path.join(homeDirectory, ".local", "share") : undefined); - xdgConfig = env2.XDG_CONFIG_HOME || (homeDirectory ? path.join(homeDirectory, ".config") : undefined); - xdgState = env2.XDG_STATE_HOME || (homeDirectory ? path.join(homeDirectory, ".local", "state") : undefined); - xdgCache = env2.XDG_CACHE_HOME || (homeDirectory ? path.join(homeDirectory, ".cache") : undefined); - xdgRuntime = env2.XDG_RUNTIME_DIR || undefined; - xdgDataDirectories = (env2.XDG_DATA_DIRS || "/usr/local/share/:/usr/share/").split(":"); - if (xdgData) { - xdgDataDirectories.unshift(xdgData); - } - xdgConfigDirectories = (env2.XDG_CONFIG_DIRS || "/etc/xdg").split(":"); - if (xdgConfig) { - xdgConfigDirectories.unshift(xdgConfig); - } -}); - // node_modules/mime-db/db.json var require_db = __commonJS((exports, module2) => { module2.exports = { @@ -9488,11 +9466,11 @@ function extension(type) { } return exts[0]; } -function lookup(path2) { - if (!path2 || typeof path2 !== "string") { +function lookup(path) { + if (!path || typeof path !== "string") { return false; } - var extension2 = extname2("x." + path2).toLowerCase().slice(1); + var extension2 = extname2("x." + path).toLowerCase().slice(1); if (!extension2) { return false; } @@ -9566,7 +9544,7 @@ function ps(n) { return n.replace(as, fe).replace(ls, ue).replace(cs, qt).replace(fs2, de).replace(us, pe); } function ms(n) { - return n.replace(is, "\\").replace(rs, "{").replace(ns, "}").replace(os2, ",").replace(hs, "."); + return n.replace(is, "\\").replace(rs, "{").replace(ns, "}").replace(os, ",").replace(hs, "."); } function me(n) { if (!n) @@ -9690,7 +9668,7 @@ var Gt = (n, t, e) => { s.length && o !== undefined && (h = [r, o]); } return h; -}, fe, ue, qt, de, pe, is, rs, ns, os2, hs, as, ls, cs, fs2, us, ds = 1e5, at = (n) => { +}, fe, ue, qt, de, pe, is, rs, ns, os, hs, as, ls, cs, fs2, us, ds = 1e5, at = (n) => { if (typeof n != "string") throw new TypeError("invalid pattern"); if (n.length > 65536) @@ -10766,7 +10744,7 @@ var init_index_min = __esm(() => { is = new RegExp(fe, "g"); rs = new RegExp(ue, "g"); ns = new RegExp(qt, "g"); - os2 = new RegExp(de, "g"); + os = new RegExp(de, "g"); hs = new RegExp(pe, "g"); as = /\\\\/g; ls = /\\{/g; @@ -14378,7 +14356,7 @@ var minimatch = (p, pattern, options2 = {}) => { }, qmarksTestNoExtDot = ([$0]) => { const len = $0.length; return (f) => f.length === len && f !== "." && f !== ".."; -}, defaultPlatform, path2, sep, GLOBSTAR, qmark2 = "[^/]", star2, twoStarDot = "(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?", twoStarNoDot = "(?:(?!(?:\\/|^)\\.).)*?", filter = (pattern, options2 = {}) => (p) => minimatch(p, pattern, options2), ext = (a, b = {}) => Object.assign({}, a, b), defaults = (def) => { +}, defaultPlatform, path, sep, GLOBSTAR, qmark2 = "[^/]", star2, twoStarDot = "(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?", twoStarNoDot = "(?:(?!(?:\\/|^)\\.).)*?", filter = (pattern, options2 = {}) => (p) => minimatch(p, pattern, options2), ext = (a, b = {}) => Object.assign({}, a, b), defaults = (def) => { if (!def || typeof def !== "object" || !Object.keys(def).length) { return minimatch; } @@ -14436,11 +14414,11 @@ var init_esm2 = __esm(() => { starRE = /^\*+$/; qmarksRE = /^\?+([^+@!?*[(]*)?$/; defaultPlatform = typeof process === "object" && process ? typeof process.env === "object" && process.env && process.env.__MINIMATCH_TESTING_PLATFORM__ || process.platform : "posix"; - path2 = { + path = { win32: { sep: "\\" }, posix: { sep: "/" } }; - sep = defaultPlatform === "win32" ? path2.win32.sep : path2.posix.sep; + sep = defaultPlatform === "win32" ? path.win32.sep : path.posix.sep; minimatch.sep = sep; GLOBSTAR = Symbol("globstar **"); minimatch.GLOBSTAR = GLOBSTAR; @@ -14711,18 +14689,36 @@ var init_filesystem = __esm(() => { })(Filesystem ||= {}); }); -// packages/unifia/src/global/index.ts -import fs3 from "fs/promises"; -import path3 from "path"; +// node_modules/xdg-basedir/index.js +import os2 from "os"; +import path2 from "path"; +var homeDirectory, env2, xdgData, xdgConfig, xdgState, xdgCache, xdgRuntime, xdgDataDirectories, xdgConfigDirectories; +var init_xdg_basedir = __esm(() => { + homeDirectory = os2.homedir(); + ({ env: env2 } = process); + xdgData = env2.XDG_DATA_HOME || (homeDirectory ? path2.join(homeDirectory, ".local", "share") : undefined); + xdgConfig = env2.XDG_CONFIG_HOME || (homeDirectory ? path2.join(homeDirectory, ".config") : undefined); + xdgState = env2.XDG_STATE_HOME || (homeDirectory ? path2.join(homeDirectory, ".local", "state") : undefined); + xdgCache = env2.XDG_CACHE_HOME || (homeDirectory ? path2.join(homeDirectory, ".cache") : undefined); + xdgRuntime = env2.XDG_RUNTIME_DIR || undefined; + xdgDataDirectories = (env2.XDG_DATA_DIRS || "/usr/local/share/:/usr/share/").split(":"); + if (xdgData) { + xdgDataDirectories.unshift(xdgData); + } + xdgConfigDirectories = (env2.XDG_CONFIG_DIRS || "/etc/xdg").split(":"); + if (xdgConfig) { + xdgConfigDirectories.unshift(xdgConfig); + } +}); + +// packages/unifia/src/global/path.ts import os3 from "os"; -var app = "unifia", data, cache, config, state, Global, CACHE_VERSION = "21", version; -var init_global = __esm(async () => { +import path3 from "path"; +var app = "unifia", data, cache, Global; +var init_path = __esm(() => { init_xdg_basedir(); - init_filesystem(); data = path3.join(xdgData, app); cache = path3.join(xdgCache, app); - config = path3.join(xdgConfig, app); - state = path3.join(xdgState, app); ((Global) => { Global.Path = { get home() { @@ -14732,10 +14728,20 @@ var init_global = __esm(async () => { bin: path3.join(cache, "bin"), log: path3.join(data, "log"), cache, - config, - state + config: path3.join(xdgConfig, app), + state: path3.join(xdgState, app) }; })(Global ||= {}); +}); + +// packages/unifia/src/global/index.ts +import fs3 from "fs/promises"; +import path4 from "path"; +var CACHE_VERSION = "21", version; +var init_global = __esm(async () => { + init_filesystem(); + init_path(); + init_path(); await Promise.all([ fs3.mkdir(Global.Path.data, { recursive: true }), fs3.mkdir(Global.Path.config, { recursive: true }), @@ -14743,16 +14749,16 @@ var init_global = __esm(async () => { fs3.mkdir(Global.Path.log, { recursive: true }), fs3.mkdir(Global.Path.bin, { recursive: true }) ]); - version = await Filesystem.readText(path3.join(Global.Path.cache, "version")).catch(() => "0"); + version = await Filesystem.readText(path4.join(Global.Path.cache, "version")).catch(() => "0"); if (version !== CACHE_VERSION) { try { const contents = await fs3.readdir(Global.Path.cache); - await Promise.all(contents.map((item) => fs3.rm(path3.join(Global.Path.cache, item), { + await Promise.all(contents.map((item) => fs3.rm(path4.join(Global.Path.cache, item), { recursive: true, force: true }))); } catch (_e2) {} - await Filesystem.write(path3.join(Global.Path.cache, "version"), CACHE_VERSION); + await Filesystem.write(path4.join(Global.Path.cache, "version"), CACHE_VERSION); } }); @@ -14800,7 +14806,7 @@ function $constructor(name2, initializer, params) { Object.defineProperty(_2, "name", { value: name2 }); return _2; } -function config2(newConfig) { +function config(newConfig) { if (newConfig) Object.assign(globalConfig, newConfig); return globalConfig; @@ -14992,10 +14998,10 @@ function mergeDefs(...defs) { function cloneDef(schema) { return mergeDefs(schema._zod.def); } -function getElementAtPath(obj, path4) { - if (!path4) +function getElementAtPath(obj, path5) { + if (!path5) return obj; - return path4.reduce((acc, key) => acc?.[key], obj); + return path5.reduce((acc, key) => acc?.[key], obj); } function promiseAllObject(promisesObj) { const keys = Object.keys(promisesObj); @@ -15284,21 +15290,21 @@ function aborted(x2, startIndex = 0) { } return false; } -function prefixIssues(path4, issues) { +function prefixIssues(path5, issues) { return issues.map((iss) => { var _a3; (_a3 = iss).path ?? (_a3.path = []); - iss.path.unshift(path4); + iss.path.unshift(path5); return iss; }); } function unwrapMessage(message) { return typeof message === "string" ? message : message?.message; } -function finalizeIssue(iss, ctx, config3) { +function finalizeIssue(iss, ctx, config2) { const full = { ...iss, path: iss.path ?? [] }; if (!iss.message) { - const message = unwrapMessage(iss.inst?._zod.def?.error?.(iss)) ?? unwrapMessage(ctx?.error?.(iss)) ?? unwrapMessage(config3.customError?.(iss)) ?? unwrapMessage(config3.localeError?.(iss)) ?? "Invalid input"; + const message = unwrapMessage(iss.inst?._zod.def?.error?.(iss)) ?? unwrapMessage(ctx?.error?.(iss)) ?? unwrapMessage(config2.customError?.(iss)) ?? unwrapMessage(config2.localeError?.(iss)) ?? "Invalid input"; full.message = message; } delete full.inst; @@ -15511,7 +15517,7 @@ function treeifyError(error, _mapper) { return issue2.message; }; const result = { errors: [] }; - const processError = (error2, path4 = []) => { + const processError = (error2, path5 = []) => { var _a3, _b2; for (const issue2 of error2.issues) { if (issue2.code === "invalid_union" && issue2.errors.length) { @@ -15521,7 +15527,7 @@ function treeifyError(error, _mapper) { } else if (issue2.code === "invalid_element") { processError({ issues: issue2.issues }, issue2.path); } else { - const fullpath = [...path4, ...issue2.path]; + const fullpath = [...path5, ...issue2.path]; if (fullpath.length === 0) { result.errors.push(mapper(issue2)); continue; @@ -15553,8 +15559,8 @@ function treeifyError(error, _mapper) { } function toDotPath(_path) { const segs = []; - const path4 = _path.map((seg) => typeof seg === "object" ? seg.key : seg); - for (const seg of path4) { + const path5 = _path.map((seg) => typeof seg === "object" ? seg.key : seg); + for (const seg of path5) { if (typeof seg === "number") segs.push(`[${seg}]`); else if (typeof seg === "symbol") @@ -15611,7 +15617,7 @@ var _parse = (_Err) => (schema, value, _ctx, _params) => { throw new $ZodAsyncError; } if (result.issues.length) { - const e = new (_params?.Err ?? _Err)(result.issues.map((iss) => finalizeIssue(iss, ctx, config2()))); + const e = new (_params?.Err ?? _Err)(result.issues.map((iss) => finalizeIssue(iss, ctx, config()))); captureStackTrace(e, _params?.callee); throw e; } @@ -15622,7 +15628,7 @@ var _parse = (_Err) => (schema, value, _ctx, _params) => { if (result instanceof Promise) result = await result; if (result.issues.length) { - const e = new (params?.Err ?? _Err)(result.issues.map((iss) => finalizeIssue(iss, ctx, config2()))); + const e = new (params?.Err ?? _Err)(result.issues.map((iss) => finalizeIssue(iss, ctx, config()))); captureStackTrace(e, params?.callee); throw e; } @@ -15635,7 +15641,7 @@ var _parse = (_Err) => (schema, value, _ctx, _params) => { } return result.issues.length ? { success: false, - error: new (_Err ?? $ZodError)(result.issues.map((iss) => finalizeIssue(iss, ctx, config2()))) + error: new (_Err ?? $ZodError)(result.issues.map((iss) => finalizeIssue(iss, ctx, config()))) } : { success: true, data: result.value }; }, safeParse, _safeParseAsync = (_Err) => async (schema, value, _ctx) => { const ctx = _ctx ? Object.assign(_ctx, { async: true }) : { async: true }; @@ -15644,7 +15650,7 @@ var _parse = (_Err) => (schema, value, _ctx, _params) => { result = await result; return result.issues.length ? { success: false, - error: new _Err(result.issues.map((iss) => finalizeIssue(iss, ctx, config2()))) + error: new _Err(result.issues.map((iss) => finalizeIssue(iss, ctx, config()))) } : { success: true, data: result.value }; }, safeParseAsync, _encode = (_Err) => (schema, value, _ctx) => { const ctx = _ctx ? Object.assign(_ctx, { direction: "backward" }) : { direction: "backward" }; @@ -16554,7 +16560,7 @@ function handleUnionResults(results, final, inst, ctx) { code: "invalid_union", input: final.value, inst, - errors: results.map((result) => result.issues.map((iss) => finalizeIssue(iss, ctx, config2()))) + errors: results.map((result) => result.issues.map((iss) => finalizeIssue(iss, ctx, config()))) }); return final; } @@ -16634,7 +16640,7 @@ function handleMapResult(keyResult, valueResult, final, key, input, inst, ctx) { origin: "map", input, inst, - issues: keyResult.issues.map((iss) => finalizeIssue(iss, ctx, config2())) + issues: keyResult.issues.map((iss) => finalizeIssue(iss, ctx, config())) }); } } @@ -16648,7 +16654,7 @@ function handleMapResult(keyResult, valueResult, final, key, input, inst, ctx) { input, inst, key, - issues: valueResult.issues.map((iss) => finalizeIssue(iss, ctx, config2())) + issues: valueResult.issues.map((iss) => finalizeIssue(iss, ctx, config())) }); } } @@ -17721,7 +17727,7 @@ var init_schemas = __esm(() => { payload.issues.push({ code: "invalid_key", origin: "record", - issues: keyResult.issues.map((iss) => finalizeIssue(iss, ctx, config2())), + issues: keyResult.issues.map((iss) => finalizeIssue(iss, ctx, config())), input: key, path: [key], inst @@ -18008,7 +18014,7 @@ var init_schemas = __esm(() => { payload.value = def.catchValue({ ...payload, error: { - issues: result2.issues.map((iss) => finalizeIssue(iss, ctx, config2())) + issues: result2.issues.map((iss) => finalizeIssue(iss, ctx, config())) }, input: payload.value }); @@ -18022,7 +18028,7 @@ var init_schemas = __esm(() => { payload.value = def.catchValue({ ...payload, error: { - issues: result.issues.map((iss) => finalizeIssue(iss, ctx, config2())) + issues: result.issues.map((iss) => finalizeIssue(iss, ctx, config())) }, input: payload.value }); @@ -25753,7 +25759,7 @@ __export(exports_core2, { encode: () => encode, decodeAsync: () => decodeAsync, decode: () => decode, - config: () => config2, + config: () => config, clone: () => clone, _xid: () => _xid, _void: () => _void, @@ -27096,12 +27102,12 @@ var init_schemas2 = __esm(() => { // node_modules/zod/v4/classic/compat.js function setErrorMap(map2) { - config2({ + config({ customError: map2 }); } function getErrorMap() { - return config2().customError; + return config().customError; } var ZodIssueCode, ZodFirstPartyTypeKind; var init_compat = __esm(() => { @@ -27284,7 +27290,7 @@ __export(exports_external, { cuid2: () => cuid22, cuid: () => cuid3, core: () => exports_core2, - config: () => config2, + config: () => config, coerce: () => exports_coerce, codec: () => codec, clone: () => clone, @@ -27394,7 +27400,7 @@ var init_external = __esm(() => { init_errors2(); init_parse2(); init_compat(); - config2(en_default()); + config(en_default()); }); // node_modules/zod/index.js @@ -27406,7 +27412,7 @@ var init_zod = __esm(() => { }); // packages/unifia/src/util/log.ts -import path4 from "path"; +import path5 from "path"; import fs4 from "fs/promises"; import { createWriteStream as createWriteStream2 } from "fs"; var Log; @@ -27443,7 +27449,7 @@ var init_log = __esm(async () => { cleanup(Global.Path.log); if (options2.print) return; - logpath = path4.join(Global.Path.log, options2.dev ? "dev.log" : new Date().toISOString().split(".")[0].replace(/:/g, "") + ".log"); + logpath = path5.join(Global.Path.log, options2.dev ? "dev.log" : new Date().toISOString().split(".")[0].replace(/:/g, "") + ".log"); await fs4.truncate(logpath).catch(() => {}); const stream = createWriteStream2(logpath, { flags: "a" }); write = async (msg) => { @@ -27558,24 +27564,24 @@ var init_log = __esm(async () => { }); // node_modules/hono/dist/utils/url.js -var splitPath = (path5) => { - const paths = path5.split("/"); +var splitPath = (path6) => { + const paths = path6.split("/"); if (paths[0] === "") { paths.shift(); } return paths; }, splitRoutingPath = (routePath) => { - const { groups, path: path5 } = extractGroupsFromPath(routePath); - const paths = splitPath(path5); + const { groups, path: path6 } = extractGroupsFromPath(routePath); + const paths = splitPath(path6); return replaceGroupMarks(paths, groups); -}, extractGroupsFromPath = (path5) => { +}, extractGroupsFromPath = (path6) => { const groups = []; - path5 = path5.replace(/\{[^}]+\}/g, (match2, index) => { + path6 = path6.replace(/\{[^}]+\}/g, (match2, index) => { const mark = `@${index}`; groups.push([mark, match2]); return mark; }); - return { groups, path: path5 }; + return { groups, path: path6 }; }, replaceGroupMarks = (paths, groups) => { for (let i2 = groups.length - 1;i2 >= 0; i2--) { const [mark] = groups[i2]; @@ -27626,8 +27632,8 @@ var splitPath = (path5) => { const queryIndex = url2.indexOf("?", i2); const hashIndex = url2.indexOf("#", i2); const end = queryIndex === -1 ? hashIndex === -1 ? undefined : hashIndex : hashIndex === -1 ? queryIndex : Math.min(queryIndex, hashIndex); - const path5 = url2.slice(start2, end); - return tryDecodeURI(path5.includes("%25") ? path5.replace(/%25/g, "%2525") : path5); + const path6 = url2.slice(start2, end); + return tryDecodeURI(path6.includes("%25") ? path6.replace(/%25/g, "%2525") : path6); } else if (charCode === 63 || charCode === 35) { break; } @@ -27641,11 +27647,11 @@ var splitPath = (path5) => { sub = mergePath(sub, ...rest); } return `${base?.[0] === "/" ? "" : "/"}${base}${sub === "/" ? "" : `${base?.at(-1) === "/" ? "" : "/"}${sub?.[0] === "/" ? sub.slice(1) : sub}`}`; -}, checkOptionalParameter = (path5) => { - if (path5.charCodeAt(path5.length - 1) !== 63 || !path5.includes(":")) { +}, checkOptionalParameter = (path6) => { + if (path6.charCodeAt(path6.length - 1) !== 63 || !path6.includes(":")) { return null; } - const segments = path5.split("/"); + const segments = path6.split("/"); const results = []; let basePath = ""; segments.forEach((segment) => { @@ -27667,17 +27673,14 @@ var splitPath = (path5) => { } }); return results.filter((v2, i2, a) => a.indexOf(v2) === i2); -}, _decodeURI = (value) => { - if (!/[%+]/.test(value)) { - return value; - } +}, tryDecodeURIComponent = (str2) => str2.indexOf("%") !== -1 ? tryDecode(str2, decodeURIComponent_) : str2, _decodeURI = (value) => { if (value.indexOf("+") !== -1) { value = value.replace(/\+/g, " "); } - return value.indexOf("%") !== -1 ? tryDecode(value, decodeURIComponent_) : value; + return tryDecodeURIComponent(value); }, _getQueryParam = (url2, key, multiple) => { let encoded; - if (!multiple && key && !/[%+]/.test(key)) { + if (!multiple && key && key.indexOf("%") === -1 && key.indexOf("+") === -1) { let keyIndex2 = url2.indexOf("?", 8); if (keyIndex2 === -1) { return; @@ -27701,7 +27704,7 @@ var splitPath = (path5) => { return; } } - const results = {}; + const results = /* @__PURE__ */ Object.create(null); encoded ??= /[%+]/.test(url2); let keyIndex = url2.indexOf("?", 8); while (keyIndex !== -1) { @@ -27747,7 +27750,7 @@ var init_url = __esm(() => { }); // node_modules/hono/dist/utils/cookie.js -var validCookieNameRegEx, validCookieValueRegEx, trimCookieWhitespace = (value) => { +var relaxedCookieNameRegEx, validCookieValueRegEx, trimCookieWhitespace = (value) => { let start2 = 0; let end = value.length; while (start2 < end) { @@ -27770,14 +27773,14 @@ var validCookieNameRegEx, validCookieValueRegEx, trimCookieWhitespace = (value) return {}; } const pairs = cookie.split(";"); - const parsedCookie = {}; + const parsedCookie = /* @__PURE__ */ Object.create(null); for (const pairStr of pairs) { const valueStartPos = pairStr.indexOf("="); if (valueStartPos === -1) { continue; } const cookieName = trimCookieWhitespace(pairStr.substring(0, valueStartPos)); - if (name2 && name2 !== cookieName || !validCookieNameRegEx.test(cookieName)) { + if (name2 && name2 !== cookieName || !relaxedCookieNameRegEx.test(cookieName) || cookieName in parsedCookie) { continue; } let cookieValue = trimCookieWhitespace(pairStr.substring(valueStartPos + 1)); @@ -27785,7 +27788,7 @@ var validCookieNameRegEx, validCookieValueRegEx, trimCookieWhitespace = (value) cookieValue = cookieValue.slice(1, -1); } if (validCookieValueRegEx.test(cookieValue)) { - parsedCookie[cookieName] = cookieValue.indexOf("%") !== -1 ? tryDecode(cookieValue, decodeURIComponent_) : cookieValue; + parsedCookie[cookieName] = tryDecodeURIComponent(cookieValue); if (name2) { break; } @@ -27795,7 +27798,7 @@ var validCookieNameRegEx, validCookieValueRegEx, trimCookieWhitespace = (value) }; var init_cookie = __esm(() => { init_url(); - validCookieNameRegEx = /^[\w!#$%&'*.^`|~+-]+$/; + relaxedCookieNameRegEx = /^[!#-:<>-[\]-~]+$/; validCookieValueRegEx = /^[ !#-:<-[\]-~]*$/; }); @@ -27858,7 +27861,7 @@ var init_crypto = () => {}; var bufferToFormData = (arrayBuffer, contentType) => { const response = new Response(arrayBuffer, { headers: { - "Content-Type": contentType + "Content-Type": contentType.replace(/^[^;]+/, (mediaType) => mediaType.toLowerCase()) } }); return response.formData(); @@ -27944,9 +27947,9 @@ var init_validator = __esm(() => { init_cookie2(); init_http_exception(); init_buffer(); - jsonRegex = /^application\/([a-z-\.]+\+)?json(;\s*[a-zA-Z0-9\-]+\=([^;]+))*$/; - multipartRegex = /^multipart\/form-data(;\s?boundary=[a-zA-Z0-9'"()+_,\-./:=?]+)?$/; - urlencodedRegex = /^application\/x-www-form-urlencoded(;\s*[a-zA-Z0-9\-]+\=([^;]+))*$/; + jsonRegex = /^application\/([a-z-\.]+\+)?json(;\s*[a-zA-Z0-9\-]+\=([^;]+))*$/i; + multipartRegex = /^multipart\/form-data(;\s?boundary=[a-zA-Z0-9'"()+_,\-./:=?]+)?$/i; + urlencodedRegex = /^application\/x-www-form-urlencoded(;\s*[a-zA-Z0-9\-]+\=([^;]+))*$/i; }); // node_modules/hono/dist/validator/index.js @@ -27985,10 +27988,10 @@ function sanitizeArktypeIssues(issues, restrictedFields) { function sanitizeValibotIssues(issues, restrictedFields) { return issues.map((issue2) => { if (issue2 && typeof issue2 === "object" && "path" in issue2 && Array.isArray(issue2.path)) { - for (const path5 of issue2.path) { - if (typeof path5 === "object" && "input" in path5 && typeof path5.input === "object" && path5.input !== null && !Array.isArray(path5.input)) { + for (const path6 of issue2.path) { + if (typeof path6 === "object" && "input" in path6 && typeof path6.input === "object" && path6.input !== null && !Array.isArray(path6.input)) { for (const field of restrictedFields) { - delete path5.input[field]; + delete path6.input[field]; } } } @@ -29137,8 +29140,8 @@ ${ind(d)}}`; function formatPropertyKey(name2) { return typeof name2 === "string" ? JSON.stringify(name2) : String(name2); } -function formatPath(path5) { - return path5.map((key) => `[${formatPropertyKey(key)}]`).join(""); +function formatPath(path6) { + return path6.map((key) => `[${formatPropertyKey(key)}]`).join(""); } function formatDate(date5) { try { @@ -30049,15 +30052,15 @@ var none2 = () => none, some3, isOption2, isNone2, isSome2, match2, toRefinement }, zipWith, reduceCompact, toArray = (self2) => isNone2(self2) ? [] : [self2.value], partitionMap, filterMap, filter2, makeEquivalence = (isEquivalent) => make2((x2, y) => isNone2(x2) ? isNone2(y) : isNone2(y) ? false : isEquivalent(x2.value, y.value)), makeOrder = (O2) => make4((self2, that) => isSome2(self2) ? isSome2(that) ? O2(self2.value, that.value) : 1 : -1), lift2 = (f) => dual(2, (self2, that) => zipWith(self2, that, f)), liftPredicate, containsWith = (isEquivalent) => dual(2, (self2, a) => isNone2(self2) ? false : isEquivalent(self2.value, a)), contains, exists, bindTo2, let_2, bind2, Do, gen = (...args3) => { const f = args3.length === 1 ? args3[0] : args3[1].bind(args3[0]); const iterator = f(); - let state2 = iterator.next(); - while (!state2.done) { - const current = state2.value; + let state = iterator.next(); + while (!state.done) { + const current = state.value; if (isNone2(current)) { return current; } - state2 = iterator.next(current.value); + state = iterator.next(current.value); } - return some3(state2.value); + return some3(state.value); }; var init_Option = __esm(() => { init_Equal(); @@ -30221,15 +30224,15 @@ var succeed2, fail2, void_2, failVoid, fromNullishOr2, fromOption2, try_ = (eval }, flip5 = (self2) => isFailure2(self2) ? succeed2(self2.failure) : fail2(self2.success), gen2 = (...args3) => { const f = args3.length === 1 ? args3[0] : args3[1].bind(args3[0]); const iterator = f(); - let state2 = iterator.next(); - while (!state2.done) { - const current = state2.value; + let state = iterator.next(); + while (!state.done) { + const current = state.value; if (isFailure2(current)) { return current; } - state2 = iterator.next(current.success); + state = iterator.next(current.success); } - return succeed2(state2.value); + return succeed2(state.value); }, Do2, bind3, bindTo3, let_3, transposeOption = (self2) => { return isNone(self2) ? succeedNone : map3(self2.value, some2); }, transposeMapOption, succeedNone, succeedSome = (a) => succeed2(some2(a)), tap2; @@ -34418,11 +34421,11 @@ ${prefix}}`; const iterator = evaluate2(); let value = undefined; while (true) { - const state2 = iterator.next(value); - if (state2.done) { - return succeed3(state2.value); + const state = iterator.next(value); + if (state.done) { + return succeed3(state.value); } - const yieldable = state2.value; + const yieldable = state.value; const effect = yieldable.asEffect(); const primitive = effect; if (primitive && primitive._tag === "Success") { @@ -34677,15 +34680,15 @@ ${prefix}}`; }), whileLoop, forEach3, forEachSequential = (iterable, f, options2) => suspend(() => { const out2 = options2?.discard ? undefined : []; const iterator = iterable[Symbol.iterator](); - let state2 = iterator.next(); + let state = iterator.next(); let index = 0; return as3(whileLoop({ - while: () => !state2.done, - body: () => f(state2.value, index++), + while: () => !state.done, + body: () => f(state.value, index++), step: (b) => { if (out2) out2.push(b); - state2 = iterator.next(); + state = iterator.next(); } }), out2); }), filterOrElse, filterMapOrElse, filterMapOrFail, filter6, filterMap5, filterMapEffect, Do4, bindTo5, bind5, let_5, forkChild, forkUnsafe = (parent, effect, immediate = false, daemon = false, uninterruptible2 = false) => { @@ -35502,10 +35505,10 @@ var init_effect = __esm(() => { [contA](value, fiber2) { const iter = this[args2][0]; while (true) { - const state2 = iter.next(value); - if (state2.done) - return succeed3(state2.value); - const eff = state2.value.asEffect(); + const state = iter.next(value); + if (state.done) + return succeed3(state.value); + const eff = state.value.asEffect(); if (!effectIsExit(eff)) { fiber2._stack.push(this); return eff; @@ -38741,10 +38744,10 @@ var TypeId12 = "~effect/Schedule", randomNext, CurrentMetadata2, ScheduleProto, const decoded = fromInputUnsafe(duration4); return fromStepWithMetadata(succeed3((meta) => succeed3([meta.attempt - 1, decoded]))); }, tapInput, tapOutput, take3, unfold3 = (initial, next2) => fromStep(sync(() => { - let state2 = initial; - return constant(map8(suspend(() => next2(state2)), (nextState) => { - const prev2 = state2; - state2 = nextState; + let state = initial; + return constant(map8(suspend(() => next2(state)), (nextState) => { + const prev2 = state; + state = nextState; return [prev2, zero2]; })); })), while_, windowed = (interval) => { @@ -38852,22 +38855,22 @@ var init_Schedule = __esm(() => { }); modifyDelay = /* @__PURE__ */ dual(2, (self2, f) => fromStep(map8(toStep(self2), (step) => (now2, input) => flatMap5(step(now2, input), ([output, delay2]) => map8(f(output, delay2), (delay3) => [output, fromInputUnsafe(delay3)]))))); reduce4 = /* @__PURE__ */ dual(3, (self2, initial, combine6) => fromStep(map8(toStep(self2), (step) => { - let state2 = initial(); + let state = initial(); return (now2, input) => matchEffect2(step(now2, input), { onSuccess([output, delay2]) { - const next2 = combine6(state2, output); + const next2 = combine6(state, output); if (!isEffect(next2)) { - state2 = next2; + state = next2; return succeed3([next2, delay2]); } return map8(next2, (nextState) => { - state2 = nextState; + state = nextState; return [nextState, delay2]; }); }, onFailure: failCause, onDone(output) { - const next2 = combine6(state2, output); + const next2 = combine6(state, output); return isEffect(next2) ? flatMap5(next2, done2) : done2(next2); } }); @@ -39342,34 +39345,34 @@ var CurrentMetricAttributesKey = "effect/Metric/CurrentMetricAttributes", Curren const prefix = "state="; switch (metric.type) { case "Counter": { - const state2 = metric.state; - return `${prefix}[count: [${state2.count}]]`; + const state = metric.state; + return `${prefix}[count: [${state.count}]]`; } case "Frequency": { - const state2 = metric.state; - return `${prefix}[occurrences: ${renderKeyValues(state2.occurrences)}]`; + const state = metric.state; + return `${prefix}[occurrences: ${renderKeyValues(state.occurrences)}]`; } case "Gauge": { - const state2 = metric.state; - return `${prefix}[value: [${state2.value}]]`; + const state = metric.state; + return `${prefix}[value: [${state.value}]]`; } case "Histogram": { - const state2 = metric.state; - const buckets = `buckets: [${renderKeyValues(state2.buckets)}]`; - const count = `count: [${state2.count}]`; - const min9 = `min: [${state2.min}]`; - const max9 = `max: [${state2.max}]`; - const sum5 = `sum: [${state2.sum}]`; + const state = metric.state; + const buckets = `buckets: [${renderKeyValues(state.buckets)}]`; + const count = `count: [${state.count}]`; + const min9 = `min: [${state.min}]`; + const max9 = `max: [${state.max}]`; + const sum5 = `sum: [${state.sum}]`; return `${prefix}[${buckets}, ${count}, ${min9}, ${max9}, ${sum5}]`; } case "Summary": { - const state2 = metric.state; - const printableQuantiles = state2.quantiles.map(([key, value2]) => [key, value2 ?? 0]); + const state = metric.state; + const printableQuantiles = state.quantiles.map(([key, value2]) => [key, value2 ?? 0]); const quantiles = `quantiles: [${renderKeyValues(printableQuantiles)}]`; - const count = `count: [${state2.count}]`; - const min9 = `min: [${state2.min}]`; - const max9 = `max: [${state2.max}]`; - const sum5 = `sum: [${state2.sum}]`; + const count = `count: [${state.count}]`; + const min9 = `min: [${state.min}]`; + const max9 = `max: [${state.max}]`; + const sum5 = `sum: [${state.sum}]`; return `${prefix}[${quantiles}, ${count}, ${min9}, ${max9}, ${sum5}]`; } } @@ -39989,10 +39992,10 @@ __export(exports_Effect, { Transaction: () => Transaction, Do: () => Do5 }); -function commitTransaction(fiber3, state2) { +function commitTransaction(fiber3, state) { for (const [ref, { value: value2 - }] of state2.journal) { + }] of state.journal) { if (value2 !== ref.value) { ref.version = ref.version + 1; ref.value = value2; @@ -40003,50 +40006,50 @@ function commitTransaction(fiber3, state2) { ref.pending.clear(); } } -function clearTransaction(state2) { - state2.retry = false; - state2.journal.clear(); +function clearTransaction(state) { + state.retry = false; + state.journal.clear(); } var YieldableClass, isEffect2, all4, partition4, validate3, findFirst5, findFirstFilter2, forEach4, whileLoop2, promise3, tryPromise2, succeed8, succeedNone3, succeedSome3, suspend3, sync4, void_5, undefined_2, callback2, never3, Do5, bindTo6, let_6, bind6, gen4, fail8, failSync3, failCause5, failCauseSync3, die5, try_4, yieldNow2, yieldNowWith2, withFiber2, fromResult2, fromOption5, fromNullishOr5, fromYieldable2, flatMap7, flatten5, andThen5, tap5, result2, option2, exit2, map12, as4, asSome2, asVoid4, flip7, zip5, zipWith6, catch_3, catchTag3, catchTags2, catchReason2, catchReasons2, unwrapReason2, catchCause3, catchDefect2, catchIf2, catchFilter2, catchNoSuchElement2, catchCauseIf2, catchCauseFilter2, mapError4, mapBoth4, orDie3, tapError3, tapErrorTag2, tapCause3, tapCauseIf2, tapCauseFilter2, tapDefect2, eventually2, retry2, retryOrElse2, sandbox2, ignore2, ignoreCause2, withExecutionPlan2, withErrorReporting2, orElseSucceed2, timeout2, timeoutOption2, timeoutOrElse2, delay2, sleep2, timed2, raceAll2, raceAllFirst2, race2, raceFirst2, filter7, filterMap6, filterMapEffect2, filterOrElse2, filterMapOrElse2, filterOrFail3, filterMapOrFail2, when2, match12, matchEager2, matchCause2, matchCauseEager2, matchCauseEffectEager2, matchCauseEffect2, matchEffect3, isFailure5, isSuccess5, services2, servicesWith2, provide4, provideServices2, service2, serviceOption2, updateServices2, updateService3, provideService2, provideServiceEffect2, withConcurrency2, scope2, scoped2, scopedWith2, acquireRelease2, acquireUseRelease2, addFinalizer3, ensuring2, onError2, onErrorIf2, onErrorFilter2, onExitPrimitive2, onExit2, onExitIf2, onExitFilter2, cached3, cachedWithTTL2, cachedInvalidateWithTTL2, interrupt5, interruptible2, onInterrupt2, uninterruptible2, uninterruptibleMask2, interruptibleMask2, forever4, repeat4, repeatOrElse2, replicate4, replicateEffect2, schedule, scheduleFrom2, tracer2, withTracer2, withTracerEnabled2, withTracerTiming2, annotateSpans2, annotateCurrentSpan2, currentSpan2, currentParentSpan2, spanAnnotations2, spanLinks2, linkSpans2, makeSpan2, makeSpanScoped2, useSpan2, withSpan3, withSpanScoped2, withParentSpan3, request2, requestUnsafe2, forkChild2, forkIn2, forkScoped2, forkDetach2, awaitAllChildren2, fiber2, fiberId2, runFork2, runForkWith2, runCallbackWith2, runCallback2, runPromise2, runPromiseWith2, runPromiseExit2, runPromiseExitWith2, runSync2, runSyncWith2, runSyncExit2, runSyncExitWith2, fnUntraced2, fn2, clockWith3, logWithLevel2, log, logFatal, logWarning, logError, logInfo, logDebug, logTrace, withLogger, annotateLogs, annotateLogsScoped2, withLogSpan, track, trackSuccesses, trackErrors, trackDefects, trackDuration, Transaction, tx = (effect2) => withFiber2((fiber3) => { if (fiber3.services.mapUnsafe.has(Transaction.key)) { return effect2; } - const state2 = { + const state = { journal: new Map, retry: false }; let result3; return uninterruptibleMask2((restore) => flatMap7(whileLoop2({ while: () => !result3, - body: constant(restore(effect2).pipe(provideService2(Transaction, state2), tapCause3(() => { - if (!state2.retry) + body: constant(restore(effect2).pipe(provideService2(Transaction, state), tapCause3(() => { + if (!state.retry) return void_5; - return restore(awaitPendingTransaction(state2)); + return restore(awaitPendingTransaction(state)); }), exit2)), step(exit3) { - if (state2.retry || !isTransactionConsistent(state2)) { - return clearTransaction(state2); + if (state.retry || !isTransactionConsistent(state)) { + return clearTransaction(state); } if (isSuccess4(exit3)) { - commitTransaction(fiber3, state2); + commitTransaction(fiber3, state); } else { - clearTransaction(state2); + clearTransaction(state); } result3 = exit3; } }), () => result3)); -}), isTransactionConsistent = (state2) => { +}), isTransactionConsistent = (state) => { for (const [ref, { version: version4 - }] of state2.journal) { + }] of state.journal) { if (ref.version !== version4) { return false; } } return true; -}, awaitPendingTransaction = (state2) => suspend3(() => { +}, awaitPendingTransaction = (state) => suspend3(() => { const key = {}; - const refs = Array.from(state2.journal.keys()); + const refs = Array.from(state.journal.keys()); const clearPending = () => { for (const clear of refs) { clear.pending.delete(key); @@ -40337,8 +40340,8 @@ var init_Effect = __esm(() => { })); Transaction = class Transaction extends (/* @__PURE__ */ Service()("effect/Effect/Transaction")) { }; - txRetry = /* @__PURE__ */ flatMap7(/* @__PURE__ */ Transaction.asEffect(), (state2) => { - state2.retry = true; + txRetry = /* @__PURE__ */ flatMap7(/* @__PURE__ */ Transaction.asEffect(), (state) => { + state.retry = true; return interrupt5; }); mapEager2 = mapEager; @@ -40886,51 +40889,51 @@ function makeFormatterStandardSchemaV1(options2) { function getExpectedMessage(expected, actual) { return `Expected ${expected}, got ${actual}`; } -function toDefaultIssues(issue2, path5, leafHook, checkHook) { +function toDefaultIssues(issue2, path6, leafHook, checkHook) { switch (issue2._tag) { case "Filter": { const message = checkHook(issue2); if (message !== undefined) { return [{ - path: path5, + path: path6, message }]; } switch (issue2.issue._tag) { case "InvalidValue": return [{ - path: path5, + path: path6, message: getExpectedMessage(formatCheck(issue2.filter), format3(issue2.actual)) }]; default: - return toDefaultIssues(issue2.issue, path5, leafHook, checkHook); + return toDefaultIssues(issue2.issue, path6, leafHook, checkHook); } } case "Encoding": - return toDefaultIssues(issue2.issue, path5, leafHook, checkHook); + return toDefaultIssues(issue2.issue, path6, leafHook, checkHook); case "Pointer": - return toDefaultIssues(issue2.issue, [...path5, ...issue2.path], leafHook, checkHook); + return toDefaultIssues(issue2.issue, [...path6, ...issue2.path], leafHook, checkHook); case "Composite": - return issue2.issues.flatMap((issue3) => toDefaultIssues(issue3, path5, leafHook, checkHook)); + return issue2.issues.flatMap((issue3) => toDefaultIssues(issue3, path6, leafHook, checkHook)); case "AnyOf": { const message = findMessage(issue2); if (issue2.issues.length === 0) { if (message !== undefined) return [{ - path: path5, + path: path6, message }]; const expected = getExpectedMessage(getExpected(issue2.ast), format3(issue2.actual)); return [{ - path: path5, + path: path6, message: expected }]; } - return issue2.issues.flatMap((issue3) => toDefaultIssues(issue3, path5, leafHook, checkHook)); + return issue2.issues.flatMap((issue3) => toDefaultIssues(issue3, path6, leafHook, checkHook)); } default: return [{ - path: path5, + path: path6, message: leafHook(issue2) }]; } @@ -40953,9 +40956,9 @@ function makeFormatterDefault() { function formatDefaultIssue(issue2) { let out2 = issue2.message; if (issue2.path && issue2.path.length > 0) { - const path5 = formatPath(issue2.path); + const path6 = formatPath(issue2.path); out2 += ` - at ${path5}`; + at ${path6}`; } return out2; } @@ -41071,9 +41074,9 @@ var init_SchemaIssue = __esm(() => { _tag = "Pointer"; path; issue; - constructor(path5, issue2) { + constructor(path6, issue2) { super(); - this.path = path5; + this.path = path6; this.issue = issue2; } }; @@ -45834,9 +45837,9 @@ var TypeId24 = "~effect/PubSub", SubscriptionTypeId = "~effect/PubSub/Subscripti const scope3 = forkUnsafe2(self2.scope); const subscription = makeSubscriptionUnsafe(self2.pubsub, self2.subscribers, self2.strategy); return addFinalizer2(scope3, unsubscribe(subscription)).pipe(andThen5(addFinalizerExit(localScope2, (exit3) => close(scope3, exit3))), as4(subscription)); -})), unsubscribe = (self2) => uninterruptible2(withFiber2((state2) => { +})), unsubscribe = (self2) => uninterruptible2(withFiber2((state) => { set6(self2.shutdownFlag, true); - return forEach4(takeAll(self2.pollers), (d) => interruptWith(d, state2.id), { + return forEach4(takeAll(self2.pollers), (d) => interruptWith(d, state.id), { discard: true, concurrency: "unbounded" }).pipe(tap5(() => sync4(() => { @@ -46810,8 +46813,8 @@ var TypeId26 = "~effect/Channel", isChannel = (u) => hasProperty(u, TypeId26), C })), acquireRelease3, fromIterator = (iterator) => fromPull(sync4(() => { const iter = iterator(); return suspend3(() => { - const state2 = iter.next(); - return state2.done ? done2(state2.value) : succeed8(state2.value); + const state = iter.next(); + return state.done ? done2(state.value) : succeed8(state.value); }); })), fromArray = (array3) => fromPull(sync4(() => { let index = 0; @@ -46824,15 +46827,15 @@ var TypeId26 = "~effect/Channel", isChannel = (u) => hasProperty(u, TypeId26), C return done2(done4.value); const buffer = []; while (buffer.length < chunkSize) { - const state2 = iter.next(); - if (state2.done) { + const state = iter.next(); + if (state.done) { if (buffer.length === 0) { - return done2(state2.value); + return done2(state.value); } - done4 = some3(state2.value); + done4 = some3(state.value); break; } - buffer.push(state2.value); + buffer.push(state.value); } return succeed8(buffer); }); @@ -47148,11 +47151,11 @@ var init_Channel = __esm(() => { combine6 = /* @__PURE__ */ dual(4, (self2, that, s, f) => fromTransform(fnUntraced2(function* (upstream, scope3) { const leftPull = yield* toTransform(self2)(upstream, scope3); const rightPull = yield* toTransform(that)(upstream, scope3); - let state2 = s(); + let state = s(); return suspend3(() => { - const combinedPull = f(state2, leftPull, rightPull); + const combinedPull = f(state, leftPull, rightPull); return map12(combinedPull, ([a, s1]) => { - state2 = s1; + state = s1; return a; }); }); @@ -47227,18 +47230,18 @@ var init_Channel = __esm(() => { return flatMap7(filterMapEffect2(arr, filter11), (passes) => isReadonlyArrayNonEmpty(passes) ? succeed8(passes) : flatMap7(pull, loop)); })))); mapAccum3 = /* @__PURE__ */ dual((args3) => isChannel(args3[0]), (self2, initial, f, options2) => fromTransform((upstream, scope3) => map12(toTransform(self2)(upstream, scope3), (pull) => { - let state2 = initial(); + let state = initial(); let current; let index = 0; let cause; const pullNext = matchCauseEffect2(pull, { onFailure(cause_) { cause = cause_; - const b = options2?.onHalt && options2.onHalt(state2); - return b && b.length > 0 ? succeed8([state2, b]) : failCause5(cause_); + const b = options2?.onHalt && options2.onHalt(state); + return b && b.length > 0 ? succeed8([state, b]) : failCause5(cause_); }, onSuccess(a) { - const b = f(state2, a); + const b = f(state, a); return isArray(b) ? succeed8(b) : b; } }); @@ -47247,7 +47250,7 @@ var init_Channel = __esm(() => { if (cause) return failCause5(cause); return flatMap7(pullNext, ([newState, values4]) => { - state2 = newState; + state = newState; if (values4.length === 0) { return loop(); } else if (values4.length === 1) { @@ -47268,16 +47271,16 @@ var init_Channel = __esm(() => { }))); scan3 = /* @__PURE__ */ dual(3, (self2, initial, f) => scanEffect(self2, initial, (s, a) => succeed8(f(s, a)))); scanEffect = /* @__PURE__ */ dual(3, (self2, initial, f) => fromTransform((upstream, scope3) => map12(toTransform(self2)(upstream, scope3), (pull) => { - let state2 = initial; + let state = initial; let isFirst = true; return suspend3(() => { if (isFirst) { isFirst = false; - return succeed8(state2); + return succeed8(state); } - return map12(flatMap7(pull, (a) => f(state2, a)), (newState) => { - state2 = newState; - return state2; + return map12(flatMap7(pull, (a) => f(state, a)), (newState) => { + state = newState; + return state; }); }); }))); @@ -47543,24 +47546,24 @@ var init_Channel = __esm(() => { disableYield: true })))); runFold = /* @__PURE__ */ dual(3, (self2, initial, f) => suspend3(() => { - let state2 = initial(); + let state = initial(); return runWith(self2, (pull) => whileLoop2({ while: constTrue, body: () => pull, step: (value4) => { - state2 = f(state2, value4); + state = f(state, value4); } - }), () => succeed8(state2)); + }), () => succeed8(state)); })); runFoldEffect = /* @__PURE__ */ dual(3, (self2, initial, f) => suspend3(() => { - let state2 = initial(); + let state = initial(); return runWith(self2, (pull) => whileLoop2({ while: constTrue, - body: constant(pull.pipe(flatMap7((o) => f(state2, o)), map12((s) => { - state2 = s; + body: constant(pull.pipe(flatMap7((o) => f(state, o)), map12((s) => { + state = s; }))), step: constVoid - }), () => succeed8(state2)); + }), () => succeed8(state)); })); toPull2 = /* @__PURE__ */ fnUntraced2(function* (self2) { const semaphore = makeUnsafe7(1); @@ -48875,10 +48878,10 @@ var init_UndefinedOr = __esm(() => { }); // node_modules/effect/dist/internal/errors.js -function errorWithPath(message, path5) { - if (path5.length > 0) { +function errorWithPath(message, path6) { + if (path6.length > 0) { message += ` - at ${formatPath(path5)}`; + at ${formatPath(path6)}`; } return new Error(message); } @@ -48951,10 +48954,10 @@ function getFilters(checks3) { } return []; } -function recur(ast, path5) { +function recur(ast, path6) { const annotation = resolve5(ast)?.toArbitrary; if (annotation) { - const typeParameters = isDeclaration(ast) ? ast.typeParameters.map((tp) => recur(tp, path5)) : []; + const typeParameters = isDeclaration(ast) ? ast.typeParameters.map((tp) => recur(tp, path6)) : []; const filters = getFilters(ast.checks); const f = constraintContext(filters); return (fc, ctx) => applyChecks(ast, filters, annotation(typeParameters.map((tp) => tp(fc, resetContext(ctx))))(fc, f(ctx))); @@ -48962,16 +48965,16 @@ function recur(ast, path5) { if (ast.checks) { const filters = getFilters(ast.checks); const f = constraintContext(filters); - const lawc = recur(replaceChecks(ast, undefined), path5); + const lawc = recur(replaceChecks(ast, undefined), path6); return (fc, ctx) => applyChecks(ast, filters, lawc(fc, f(ctx))); } - return base(ast, path5); + return base(ast, path6); } -function base(ast, path5) { +function base(ast, path6) { switch (ast._tag) { case "Never": case "Declaration": - throw errorWithPath(`Unsupported AST ${ast._tag}`, path5); + throw errorWithPath(`Unsupported AST ${ast._tag}`, path6); case "Null": return (fc) => fc.constant(null); case "Void": @@ -49010,14 +49013,14 @@ function base(ast, path5) { case "ObjectKeyword": return (fc) => fc.oneof(fc.object(), fc.array(fc.anything())); case "Enum": - return recur(enumsToLiterals(ast), path5); + return recur(enumsToLiterals(ast), path6); case "TemplateLiteral": return (fc) => fc.stringMatching(getTemplateLiteralRegExp(ast)); case "Arrays": return (fc, ctx) => { const reset = resetContext(ctx); const elements = ast.elements.map((e, i2) => { - const out3 = recur(e, [...path5, i2])(fc, reset); + const out3 = recur(e, [...path6, i2])(fc, reset); if (!isOptional(e)) { return out3.map(some3); } @@ -49026,7 +49029,7 @@ function base(ast, path5) { let out2 = fc.tuple(...elements).map(getSomes3); if (isReadonlyArrayNonEmpty(ast.rest)) { const len = ast.elements.length; - const [head4, ...tail3] = ast.rest.map((r, i2) => recur(r, [...path5, len + i2])(fc, reset)); + const [head4, ...tail3] = ast.rest.map((r, i2) => recur(r, [...path6, len + i2])(fc, reset)); const rest = array3(fc, ast.elements.length === 0 ? ctx : reset, head4); out2 = out2.chain((as5) => { if (as5.length < len) { @@ -49056,13 +49059,13 @@ function base(ast, path5) { if (!isOptional(ps2.type)) { requiredKeys.push(name2); } - pss[name2] = recur(ps2.type, [...path5, name2])(fc, reset); + pss[name2] = recur(ps2.type, [...path6, name2])(fc, reset); } let out2 = fc.record(pss, { requiredKeys }); for (const is2 of ast.indexSignatures) { - const entry = fc.tuple(recur(is2.parameter, path5)(fc, reset), recur(is2.type, path5)(fc, reset)); + const entry = fc.tuple(recur(is2.parameter, path6)(fc, reset), recur(is2.type, path6)(fc, reset)); const entries4 = array3(fc, ast.propertySignatures.length === 0 ? ctx : reset, entry); out2 = out2.chain((o) => { return entries4.map((entries5) => { @@ -49076,12 +49079,12 @@ function base(ast, path5) { return out2; }; case "Union": - return (fc, ctx) => fc.oneof(...ast.types.map((ast2) => recur(ast2, path5)(fc, ctx))); + return (fc, ctx) => fc.oneof(...ast.types.map((ast2) => recur(ast2, path6)(fc, ctx))); case "Suspend": { const memo = arbitraryMemoMap.get(ast); if (memo) return memo; - const get12 = memoizeThunk(() => recur(ast.thunk(), path5)); + const get12 = memoizeThunk(() => recur(ast.thunk(), path6)); const out2 = (fc, ctx) => fc.constant(null).chain(() => get12()(fc, { ...ctx, isSuspend: true @@ -49420,14 +49423,14 @@ var init_SchemaParser = __esm(() => { }); // node_modules/effect/dist/internal/schema/equivalence.js -function recur3(ast, path5) { +function recur3(ast, path6) { const annotation = resolve5(ast)?.["toEquivalence"]; if (annotation) { - return annotation(isDeclaration(ast) ? ast.typeParameters.map((tp) => recur3(tp, path5)) : []); + return annotation(isDeclaration(ast) ? ast.typeParameters.map((tp) => recur3(tp, path6)) : []); } switch (ast._tag) { case "Never": - throw errorWithPath(`Unsupported AST ${ast._tag}`, path5); + throw errorWithPath(`Unsupported AST ${ast._tag}`, path6); case "Declaration": case "Null": case "Undefined": @@ -49446,9 +49449,9 @@ function recur3(ast, path5) { case "TemplateLiteral": return equals; case "Arrays": { - const elements = ast.elements.map((e, i2) => recur3(e, [...path5, i2])); + const elements = ast.elements.map((e, i2) => recur3(e, [...path6, i2])); const len = ast.elements.length; - const rest = ast.rest.map((r, i2) => recur3(r, [...path5, len + i2])); + const rest = ast.rest.map((r, i2) => recur3(r, [...path6, len + i2])); return make2((a, b) => { if (!Array.isArray(a) || !Array.isArray(b)) { return false; @@ -49484,8 +49487,8 @@ function recur3(ast, path5) { if (ast.propertySignatures.length === 0 && ast.indexSignatures.length === 0) { return equals; } - const propertySignatures = ast.propertySignatures.map((ps2) => recur3(ps2.type, [...path5, ps2.name])); - const indexSignatures = ast.indexSignatures.map((is3) => recur3(is3.type, path5)); + const propertySignatures = ast.propertySignatures.map((ps2) => recur3(ps2.type, [...path6, ps2.name])); + const indexSignatures = ast.indexSignatures.map((is3) => recur3(is3.type, path6)); return make2((a, b) => { if (!isObject2(a) || !isObject2(b)) { return false; @@ -49527,13 +49530,13 @@ function recur3(ast, path5) { for (let i2 = 0;i2 < candidates.length; i2++) { const is3 = types2[i2]; if (is3(a) && is3(b)) { - return recur3(candidates[i2], path5)(a, b); + return recur3(candidates[i2], path6)(a, b); } } return false; }); case "Suspend": { - const get12 = memoizeThunk(() => recur3(ast.thunk(), path5)); + const get12 = memoizeThunk(() => recur3(ast.thunk(), path6)); return make2((a, b) => get12()(a, b)); } } @@ -50574,10 +50577,10 @@ function get12(oldValue, newValue) { const len2 = newValue.length; const shared = Math.min(len1, len2); for (let i2 = 0;i2 < shared; i2++) { - const path5 = `/${i2}`; + const path6 = `/${i2}`; const patch = get12(oldValue[i2], newValue[i2]); for (const op of patch) { - prefixPathInPlace(op, path5); + prefixPathInPlace(op, path6); patches.push(op); } } @@ -50602,25 +50605,25 @@ function get12(oldValue, newValue) { const allKeys = Array.from(new Set([...keys1, ...keys22])).sort(); for (const key of allKeys) { const esc2 = escapeToken(key); - const path5 = `/${esc2}`; + const path6 = `/${esc2}`; const hasKey1 = Object.hasOwn(oldValue, key); const hasKey2 = Object.hasOwn(newValue, key); if (hasKey1 && hasKey2) { const patch = get12(oldValue[key], newValue[key]); for (const op of patch) { - prefixPathInPlace(op, path5); + prefixPathInPlace(op, path6); patches.push(op); } } else if (!hasKey1 && hasKey2) { patches.push({ op: "add", - path: path5, + path: path6, value: newValue[key] }); } else if (hasKey1 && !hasKey2) { patches.push({ op: "remove", - path: path5 + path: path6 }); } } @@ -51305,8 +51308,8 @@ class OptionalNode { class PathNode { _tag = "PathNode"; path; - constructor(path5) { - this.path = path5; + constructor(path6) { + this.path = path6; } } @@ -51635,24 +51638,24 @@ var init_Optic = __esm(() => { return { _tag: "LensNode", get: (s) => { - const path5 = node.path; + const path6 = node.path; let out2 = s; - for (let i2 = 0, n7 = path5.length;i2 < n7; i2++) { - out2 = out2[path5[i2]]; + for (let i2 = 0, n7 = path6.length;i2 < n7; i2++) { + out2 = out2[path6[i2]]; } return out2; }, set: (a, s) => { - const path5 = node.path; + const path6 = node.path; const out2 = cloneShallow(s); let current = out2; let i2 = 0; - for (;i2 < path5.length - 1; i2++) { - const key = path5[i2]; + for (;i2 < path6.length - 1; i2++) { + const key = path6[i2]; current[key] = cloneShallow(current[key]); current = current[key]; } - const finalKey = path5[i2]; + const finalKey = path6[i2]; current[finalKey] = a; return out2; } @@ -53080,18 +53083,18 @@ function* lazyToss(generator, seed, random2, examples) { function produce(producer) { return producer(); } -function pathWalk(path5, initialProducers, shrink) { +function pathWalk(path6, initialProducers, shrink) { const producers = initialProducers; - const segments = path5.split(":").map((text) => +text); + const segments = path6.split(":").map((text) => +text); if (segments.length === 0) return producers.map(produce); if (!segments.every((v2) => !Number.isNaN(v2))) - throw new Error(`Unable to replay, got invalid path=${path5}`); + throw new Error(`Unable to replay, got invalid path=${path6}`); let values6 = producers.drop(segments[0]).map(produce); for (const s of segments.slice(1)) { const valueToShrink = values6.getNthOrLast(0); if (valueToShrink === null) - throw new Error(`Unable to replay, got wrong path=${path5}`); + throw new Error(`Unable to replay, got wrong path=${path6}`); values6 = shrink(valueToShrink).drop(s); } return values6; @@ -55140,9 +55143,9 @@ function assertAcceptableRelations(relations) { } } } -function draftNextProductionState(state2, offset) { - const { producedLinks, toBeProducedEntities } = state2; - const nextIndex = state2.nextIndex + offset; +function draftNextProductionState(state, offset) { + const { producedLinks, toBeProducedEntities } = state; + const nextIndex = state.nextIndex + offset; const newProducedLinks = safeObjectAssign(safeObjectCreate$3(null), producedLinks); function getOrCreateProducedLinksFor(type) { if (newProducedLinks[type] === producedLinks[type]) @@ -55241,7 +55244,7 @@ function buildEntityStepArbitrary(relations, inversedRelations, lastState, offse if (subArbitraries.length === 0) return; return tuple3(...subArbitraries).map((results) => { - const state2 = draftNextProductionState(lastState, offset); + const state = draftNextProductionState(lastState, offset); for (let resultIndex = 0;resultIndex !== results.length; ++resultIndex) { const linkOrLinks = results[resultIndex]; const { name: name2, relation, sentinelLinkIndex } = linkContexts[resultIndex]; @@ -55250,37 +55253,37 @@ function buildEntityStepArbitrary(relations, inversedRelations, lastState, offse for (const link of links) { let newEntityIndexInType; if (link >= sentinelLinkIndex) - newEntityIndexInType = state2.enqueueNewEntity(relations, relation.type); + newEntityIndexInType = state.enqueueNewEntity(relations, relation.type); else newEntityIndexInType = link; safePush(effectiveLinks, newEntityIndexInType); const inversed = safeMapGet(inversedRelations, relation); if (inversed !== undefined) - state2.appendBackReference(relation.type, newEntityIndexInType, inversed.property); + state.appendBackReference(relation.type, newEntityIndexInType, inversed.property); } - state2.setOutboundLink(name2, { + state.setOutboundLink(name2, { type: relation.type, index: linkOrLinks === undefined ? undefined : typeof linkOrLinks === "number" ? effectiveLinks[0] : effectiveLinks }); } - return state2.commit(); + return state.commit(); }); } function onTheFlyLinksForEntityGraph(relations, defaultEntities) { assertAcceptableRelations(relations); const inversedRelations = buildInversedRelationsMapping(relations); - return chainUntil(constant3(buildInitialProductionState(relations, defaultEntities)), (state2) => { - if (state2.nextIndex >= state2.toBeProducedEntities.length) + return chainUntil(constant3(buildInitialProductionState(relations, defaultEntities)), (state) => { + if (state.nextIndex >= state.toBeProducedEntities.length) return; let offset = 0; let next2 = undefined; - while (next2 === undefined && state2.nextIndex + offset < state2.toBeProducedEntities.length) { - next2 = buildEntityStepArbitrary(relations, inversedRelations, state2, offset); + while (next2 === undefined && state.nextIndex + offset < state.toBeProducedEntities.length) { + next2 = buildEntityStepArbitrary(relations, inversedRelations, state, offset); offset += 1; } return next2; - }).map((state2) => { - return state2.producedLinks; + }).map((state) => { + return state.producedLinks; }); } function extractEnumerableKeys(instance2) { @@ -56212,10 +56215,10 @@ function webSegment(constraints = {}) { }); } function segmentsToPathMapper(segments) { - let path5 = ""; + let path6 = ""; for (let index2 = 0;index2 !== segments.length; ++index2) - path5 += "/" + segments[index2]; - return path5; + path6 += "/" + segments[index2]; + return path6; } function segmentsToPathUnmapper(value4) { if (typeof value4 !== "string") @@ -56254,8 +56257,8 @@ function webQueryParameters(constraints = {}) { return buildUriQueryOrFragmentArbitrary(constraints.size); } function partsToUrlMapper(data2) { - const [scheme, authority, path5] = data2; - return `${scheme}://${authority}${path5}${data2[3] === null ? "" : `?${data2[3]}`}${data2[4] === null ? "" : `#${data2[4]}`}`; + const [scheme, authority, path6] = data2; + return `${scheme}://${authority}${path6}${data2[3] === null ? "" : `?${data2[3]}`}${data2[4] === null ? "" : `#${data2[4]}`}`; } function partsToUrlUnmapper(value4) { if (typeof value4 !== "string") @@ -56265,13 +56268,13 @@ function partsToUrlUnmapper(value4) { throw new Error("Incompatible value received"); const scheme = m[1]; const authority = m[2]; - const path5 = m[3]; + const path6 = m[3]; const query = m[4]; const fragments = m[5]; return [ scheme, authority, - path5, + path6, query !== undefined ? query.substring(1) : null, fragments !== undefined ? fragments.substring(1) : null ]; @@ -57884,11 +57887,11 @@ var SharedFootPrint, PreconditionFailure, Nil, nil, safeSymbolIterator$1, Stream } return failures; } - static mergePaths(offsetPath, path5) { + static mergePaths(offsetPath, path6) { if (offsetPath.length === 0) - return path5; + return path6; const offsetItems = offsetPath.split(":"); - const remainingItems = path5.split(":"); + const remainingItems = path6.split(":"); const middle = +offsetItems[offsetItems.length - 1] + +remainingItems[0]; return [ ...offsetItems.slice(0, offsetItems.length - 1), @@ -58288,12 +58291,12 @@ var SharedFootPrint, PreconditionFailure, Nil, nil, safeSymbolIterator$1, Stream }, genericModelRun = (s, cmds, initialValue, runCmd, then) => { return s.then((o) => { const { model, real } = o; - let state2 = initialValue; + let state = initialValue; for (const c of cmds) - state2 = then(state2, () => { + state = then(state, () => { return runCmd(c, model, real); }); - return state2; + return state; }); }, internalModelRun = (s, cmds) => { const then = (_p, c) => c(); @@ -61465,12 +61468,12 @@ var init_fast_check = __esm(() => { } filterOnReplay(itemsRaw) { return itemsRaw.filter((c, idx) => { - const state2 = this.replayPath[this.replayPathPosition + idx]; - if (state2 === undefined) + const state = this.replayPath[this.replayPathPosition + idx]; + if (state === undefined) throw new Error(`Too short replayPath`); - if (!state2 && c.value_.hasRan) + if (!state && c.value_.hasRan) throw new Error(`Mismatch between replayPath and real execution`); - return state2; + return state; }); } filterForShrinkImpl(itemsRaw) { @@ -65463,29 +65466,29 @@ var TypeId31 = "~effect/Sink", endVoid, sinkVariance, SinkProto, isSink = (u) => endUnsafe(queue); return endVoid; }))), fromPubSub2 = (pubsub) => forEachArray((arr) => publishAll(pubsub, arr)), succeed11 = (a, leftovers) => fromEffectEnd(succeed8([a, leftovers])), sync6 = (a) => fromEffect2(sync4(a)), suspend6 = (evaluate2) => fromTransform2((upstream, scope3) => evaluate2().transform(upstream, scope3)), fail12 = (e) => fromEffectEnd(fail8(e)), failSync5 = (evaluate2) => fromEffectEnd(failSync3(evaluate2)), failCause8 = (cause) => fromEffectEnd(failCause5(cause)), failCauseSync5 = (evaluate2) => fromEffectEnd(failCauseSync3(evaluate2)), die7 = (defect) => fromEffectEnd(die5(defect)), never6, ignoreLeftover = (self2) => mapEnd(self2, ([a]) => [a]), drain2, fold = (s, contFn, f) => fromTransform2((upstream) => { - let state2 = s(); + let state = s(); return gen4(function* () { while (true) { const arr = yield* upstream; for (let i2 = 0;i2 < arr.length; i2++) { - state2 = yield* f(state2, arr[i2]); - if (contFn(state2)) + state = yield* f(state, arr[i2]); + if (contFn(state)) continue; - return [state2, i2 + 1 < arr.length ? arr.slice(i2 + 1) : undefined]; + return [state, i2 + 1 < arr.length ? arr.slice(i2 + 1) : undefined]; } } - }).pipe(catchDone(() => succeed8([state2]))); + }).pipe(catchDone(() => succeed8([state]))); }), foldArray = (s, contFn, f) => fromTransform2((upstream) => { - let state2 = s(); + let state = s(); return gen4(function* () { while (true) { const arr = yield* upstream; - state2 = yield* f(state2, arr); - if (contFn(state2)) + state = yield* f(state, arr); + if (contFn(state)) continue; - return [state2]; + return [state]; } - }).pipe(catchDone(() => succeed8([state2]))); + }).pipe(catchDone(() => succeed8([state]))); }), foldUntil = (s, max11, f) => fold(() => [s(), 0], (tuple4) => tuple4[1] < max11, ([output, count], input) => map12(f(output, input), (s2) => [s2, count + 1])).pipe(map22((tuple4) => tuple4[0])), every10 = (predicate) => fold(constTrue, identity, (_2, a) => succeed8(predicate(a))), some14 = (predicate) => fold(constFalse, (b) => !b, (_2, a) => succeed8(predicate(a))), map22, as5, mapInput6, mapInputEffect, mapInputArray, mapInputArrayEffect, mapEnd, transformEffect = (self2, f) => fromTransform2((upstream, scope3) => f(self2.transform(upstream, scope3))), mapEffectEnd, mapEffect2, mapError6, mapLeftover, take9 = (n7) => fromTransform2((upstream) => { const taken = []; if (n7 <= 0) { @@ -65514,15 +65517,15 @@ var TypeId31 = "~effect/Sink", endVoid, sinkVariance, SinkProto, isSink = (u) => disableYield: true }), catchDone(() => succeed8([taken, leftover]))); }), flatMap12, reduceWhile = (initial, predicate, f) => fromTransform2((upstream) => { - let state2 = initial(); + let state = initial(); let leftover = undefined; - if (!predicate(state2)) { - return succeed8([state2]); + if (!predicate(state)) { + return succeed8([state]); } return upstream.pipe(flatMap7((arr) => { for (let i2 = 0;i2 < arr.length; i2++) { - state2 = f(state2, arr[i2]); - if (!predicate(state2)) { + state = f(state, arr[i2]); + if (!predicate(state)) { if (i2 + 1 < arr.length) { leftover = arr.slice(i2 + 1); } @@ -65532,20 +65535,20 @@ var TypeId31 = "~effect/Sink", endVoid, sinkVariance, SinkProto, isSink = (u) => return void_5; }), forever4({ disableYield: true - }), catchDone(() => succeed8([state2, leftover]))); + }), catchDone(() => succeed8([state, leftover]))); }), reduceWhileEffect = (initial, predicate, f) => fromTransform2((upstream) => { - let state2 = initial(); + let state = initial(); let leftover = undefined; - if (!predicate(state2)) { - return succeed8([state2]); + if (!predicate(state)) { + return succeed8([state]); } return upstream.pipe(flatMap7((arr) => { let i2 = 0; return whileLoop2({ while: () => i2 < arr.length, - body: constant(flatMap7(suspend3(() => f(state2, arr[i2++])), (s) => { - state2 = s; - if (!predicate(state2)) { + body: constant(flatMap7(suspend3(() => f(state, arr[i2++])), (s) => { + state = s; + if (!predicate(state)) { if (i2 < arr.length) { leftover = arr.slice(i2); } @@ -65557,50 +65560,50 @@ var TypeId31 = "~effect/Sink", endVoid, sinkVariance, SinkProto, isSink = (u) => }); }), forever4({ disableYield: true - }), catchDone(() => succeed8([state2, leftover]))); + }), catchDone(() => succeed8([state, leftover]))); }), reduceWhileArray = (initial, contFn, f) => fromTransform2((upstream) => { - let state2 = initial(); - if (!contFn(state2)) { - return succeed8([state2]); + let state = initial(); + if (!contFn(state)) { + return succeed8([state]); } return upstream.pipe(flatMap7((arr) => { for (let i2 = 0;i2 < arr.length; i2++) { - state2 = f(state2, arr); - if (!contFn(state2)) { + state = f(state, arr); + if (!contFn(state)) { return done2(); } } return void_5; }), forever4({ disableYield: true - }), catchDone(() => succeed8([state2]))); + }), catchDone(() => succeed8([state]))); }), reduceWhileArrayEffect = (initial, predicate, f) => fromTransform2((upstream) => { - let state2 = initial(); - if (!predicate(state2)) { - return succeed8([state2]); + let state = initial(); + if (!predicate(state)) { + return succeed8([state]); } - return upstream.pipe(flatMap7((arr) => f(state2, arr)), flatMap7((s) => { - state2 = s; - if (!predicate(state2)) { + return upstream.pipe(flatMap7((arr) => f(state, arr)), flatMap7((s) => { + state = s; + if (!predicate(state)) { return done2(); } return void_5; }), forever4({ disableYield: true - }), catchDone(() => succeed8([state2]))); + }), catchDone(() => succeed8([state]))); }), reduce10 = (initial, f) => reduceArray(initial, (s, arr) => { for (let i2 = 0;i2 < arr.length; i2++) { s = f(s, arr[i2]); } return s; }), reduceArray = (initial, f) => fromTransform2((upstream) => { - let state2 = initial(); + let state = initial(); return upstream.pipe(flatMap7((arr) => { - state2 = f(state2, arr); + state = f(state, arr); return void_5; }), forever4({ disableYield: true - }), catchDone(() => succeed8([state2]))); + }), catchDone(() => succeed8([state]))); }), reduceEffect = (initial, f) => reduceWhileEffect(initial, constTrue, f), head_, head4 = () => head_, last_, last4 = () => last_, find = (predicate) => reduceWhile(none2, isNone2, (acc, in_) => predicate(in_) ? some3(in_) : acc), findEffect = (predicate) => reduceWhileEffect(none2, isNone2, (acc, in_) => map12(predicate(in_), (b) => b ? some3(in_) : acc)), sum5, count, collect4 = () => reduceArray(empty3, (s, arr) => { s.push(...arr); return s; @@ -65910,9 +65913,9 @@ var init_RcMap = __esm(() => { if (self2.state._tag === "Closed") { return interrupt5; } - const state2 = self2.state; + const state = self2.state; const parent = getCurrent(); - const o = get5(state2.map, key); + const o = get5(state.map, key); let entry; if (o._tag === "Some") { entry = o.value; @@ -65930,7 +65933,7 @@ var init_RcMap = __esm(() => { refCount: 1 }; entry.finalizer = release3(self2, key, entry); - set4(state2.map, key, entry); + set4(state.map, key, entry); const services3 = new Map(self2.services.mapUnsafe); parent.services.mapUnsafe.forEach((value4, key2) => { services3.set(key2, value4); @@ -65996,7 +65999,7 @@ var TypeId33 = "~effect/RcRef", stateEmpty, stateClosed, variance2, RcRefImpl, m case "Empty": { const scope3 = makeUnsafe3(); return self2.semaphore.withPermits(1)(restore(provideServices2(self2.acquire, add(self2.services, Scope, scope3))).pipe(map12((value4) => { - const state2 = { + const state = { _tag: "Acquired", value: value4, scope: scope3, @@ -66004,8 +66007,8 @@ var TypeId33 = "~effect/RcRef", stateEmpty, stateClosed, variance2, RcRefImpl, m refCount: 1, invalidated: false }; - self2.state = state2; - return state2; + self2.state = state; + return state; }))); } } @@ -66015,14 +66018,14 @@ var TypeId33 = "~effect/RcRef", stateEmpty, stateClosed, variance2, RcRefImpl, m if (self2.state._tag !== "Acquired") { return void_5; } - const state2 = self2.state; + const state = self2.state; self2.state = stateEmpty; - state2.invalidated = true; - if (state2.refCount > 0) { + state.invalidated = true; + if (state.refCount > 0) { return void_5; } - state2.fiber?.interruptUnsafe(); - return close(state2.scope, void_4); + state.fiber?.interruptUnsafe(); + return close(state.scope, void_4); })); }; var init_rcRef = __esm(() => { @@ -66065,34 +66068,34 @@ var init_rcRef = __esm(() => { }; get14 = /* @__PURE__ */ fnUntraced2(function* (self_) { const self2 = self_; - const state2 = yield* getState(self2); + const state = yield* getState(self2); const scope3 = yield* scope2; const isFinite4 = self2.idleTimeToLive !== undefined && isFinite2(self2.idleTimeToLive); yield* addFinalizerExit(scope3, () => { - state2.refCount--; - if (state2.refCount > 0) { + state.refCount--; + if (state.refCount > 0) { return void_5; } if (self2.idleTimeToLive === undefined) { self2.state = stateEmpty; - return close(state2.scope, void_4); - } else if (state2.invalidated) { - return close(state2.scope, void_4); + return close(state.scope, void_4); + } else if (state.invalidated) { + return close(state.scope, void_4); } else if (!isFinite4) { return void_5; } - state2.fiber = sleep2(self2.idleTimeToLive).pipe(flatMap7(() => { + state.fiber = sleep2(self2.idleTimeToLive).pipe(flatMap7(() => { if (self2.state._tag === "Acquired" && self2.state.refCount === 0) { self2.state = stateEmpty; - return close(state2.scope, void_4); + return close(state.scope, void_4); } return void_5; }), ensuring2(sync4(() => { - state2.fiber = undefined; + state.fiber = undefined; })), runForkWith2(self2.services), runIn(self2.scope)); return void_5; }); - return state2.value; + return state.value; }); }); @@ -66386,24 +66389,24 @@ var TypeId34 = "~effect/Stream", isStream = (u) => hasProperty(u, TypeId34), Def }, { bufferSize: typeof options2 === "object" ? options2.bufferSize : undefined }), unfold4 = (s, f) => fromPull2(sync4(() => { - let state2 = s; - return flatMap7(suspend3(() => f(state2)), (next2) => { + let state = s; + return flatMap7(suspend3(() => f(state)), (next2) => { if (next2 === undefined) return done2(); - state2 = next2[1]; + state = next2[1]; return succeed8(of2(next2[0])); }); })), paginate = (s, f) => fromPull2(sync4(() => { - let state2 = s; + let state = s; let done4 = false; return suspend3(function loop() { if (done4) return done2(); - return flatMap7(f(state2), ([a, s2]) => { + return flatMap7(f(state), ([a, s2]) => { if (isNone2(s2)) { done4 = true; } else { - state2 = s2.value; + state = s2.value; } if (!isReadonlyArrayNonEmpty(a)) return loop(); @@ -66447,8 +66450,8 @@ var TypeId34 = "~effect/Stream", isStream = (u) => hasProperty(u, TypeId34), Def } return [acc, pairs]; }, { - onHalt(state2) { - return state2._tag === "Some" ? [[state2.value, none2()]] : []; + onHalt(state) { + return state._tag === "Some" ? [[state.value, none2()]] : []; } }), zipWithPrevious = (self2) => mapAccumArray(self2, none2, (acc, arr) => { const pairs = empty3(); @@ -66808,24 +66811,24 @@ var init_Stream = __esm(() => { const fiberRight = yield* forkIn2(pullRight, scope3); return yield* joinAll([fiberLeft, fiberRight]); }); - let state2 = { + let state = { _tag: "PullBoth" }; const pull = gen4(function* () { - const [left3, right3] = state2._tag === "PullBoth" ? yield* pullBoth : state2._tag === "PullLeft" ? [yield* pullLeft, state2.rightArray] : [state2.leftArray, yield* pullRight]; + const [left3, right3] = state._tag === "PullBoth" ? yield* pullBoth : state._tag === "PullLeft" ? [yield* pullLeft, state.rightArray] : [state.leftArray, yield* pullRight]; const result4 = f(left3, right3); if (isReadonlyArrayNonEmpty(result4[1])) { - state2 = { + state = { _tag: "PullRight", leftArray: result4[1] }; } else if (isReadonlyArrayNonEmpty(result4[2])) { - state2 = { + state = { _tag: "PullLeft", rightArray: result4[2] }; } else { - state2 = { + state = { _tag: "PullBoth" }; } @@ -67255,56 +67258,56 @@ var init_Stream = __esm(() => { })); combine7 = /* @__PURE__ */ dual(4, (self2, that, s, f) => combine6(flattenArray(self2.channel), flattenArray(that.channel), s, f).pipe(map14(of2), fromChannel3)); combineArray = /* @__PURE__ */ dual(4, (self2, that, s, f) => fromChannel3(combine6(self2.channel, that.channel, s, f))); - mapAccum4 = /* @__PURE__ */ dual((args3) => isStream(args3[0]), (self2, initial, f, options2) => fromChannel3(mapAccum3(self2.channel, initial, (state2, arr) => { + mapAccum4 = /* @__PURE__ */ dual((args3) => isStream(args3[0]), (self2, initial, f, options2) => fromChannel3(mapAccum3(self2.channel, initial, (state, arr) => { const acc = empty3(); for (let index2 = 0;index2 < arr.length; index2++) { - const [newState, values6] = f(state2, arr[index2]); - state2 = newState; + const [newState, values6] = f(state, arr[index2]); + state = newState; acc.push(...values6); } - return [state2, isArrayNonEmpty2(acc) ? of2(acc) : emptyArr]; + return [state, isArrayNonEmpty2(acc) ? of2(acc) : emptyArr]; }, options2?.onHalt ? { - onHalt(state2) { - const arr = options2.onHalt(state2); + onHalt(state) { + const arr = options2.onHalt(state); return isReadonlyArrayNonEmpty(arr) ? of2(arr) : emptyArr; } } : undefined))); - mapAccumArray = /* @__PURE__ */ dual((args3) => isStream(args3[0]), (self2, initial, f, options2) => fromChannel3(mapAccum3(self2.channel, initial, (state2, arr) => { - const [newState, values6] = f(state2, arr); - state2 = newState; - return [state2, isReadonlyArrayNonEmpty(values6) ? of2(values6) : emptyArr]; + mapAccumArray = /* @__PURE__ */ dual((args3) => isStream(args3[0]), (self2, initial, f, options2) => fromChannel3(mapAccum3(self2.channel, initial, (state, arr) => { + const [newState, values6] = f(state, arr); + state = newState; + return [state, isReadonlyArrayNonEmpty(values6) ? of2(values6) : emptyArr]; }, options2?.onHalt ? { - onHalt(state2) { - const arr = options2.onHalt(state2); + onHalt(state) { + const arr = options2.onHalt(state); return isReadonlyArrayNonEmpty(arr) ? of2(arr) : emptyArr; } } : undefined))); emptyArr = /* @__PURE__ */ empty3(); - mapAccumEffect = /* @__PURE__ */ dual((args3) => isStream(args3[0]), (self2, initial, f, options2) => self2.channel.pipe(flattenArray, mapAccum3(initial, (state2, a) => map12(f(state2, a), ([state3, values6]) => [state3, isReadonlyArrayNonEmpty(values6) ? of2(values6) : empty3()]), options2?.onHalt ? { - onHalt(state2) { - const arr = options2.onHalt(state2); + mapAccumEffect = /* @__PURE__ */ dual((args3) => isStream(args3[0]), (self2, initial, f, options2) => self2.channel.pipe(flattenArray, mapAccum3(initial, (state, a) => map12(f(state, a), ([state2, values6]) => [state2, isReadonlyArrayNonEmpty(values6) ? of2(values6) : empty3()]), options2?.onHalt ? { + onHalt(state) { + const arr = options2.onHalt(state); return isReadonlyArrayNonEmpty(arr) ? of2(arr) : emptyArr; } } : undefined), fromChannel3)); - mapAccumArrayEffect = /* @__PURE__ */ dual((args3) => isStream(args3), (self2, initial, f, options2) => self2.channel.pipe(mapAccum3(initial, (state2, a) => map12(f(state2, a), ([state3, values6]) => [state3, isReadonlyArrayNonEmpty(values6) ? of2(values6) : emptyArr]), options2?.onHalt ? { - onHalt(state2) { - const arr = options2.onHalt(state2); + mapAccumArrayEffect = /* @__PURE__ */ dual((args3) => isStream(args3), (self2, initial, f, options2) => self2.channel.pipe(mapAccum3(initial, (state, a) => map12(f(state, a), ([state2, values6]) => [state2, isReadonlyArrayNonEmpty(values6) ? of2(values6) : emptyArr]), options2?.onHalt ? { + onHalt(state) { + const arr = options2.onHalt(state); return isReadonlyArrayNonEmpty(arr) ? of2(arr) : emptyArr; } } : undefined), fromChannel3)); scan4 = /* @__PURE__ */ dual(3, (self2, initial, f) => suspend7(() => { let isFirst = true; - return fromChannel3(mapAccum3(self2.channel, constant(initial), (state2, arr) => { + return fromChannel3(mapAccum3(self2.channel, constant(initial), (state, arr) => { const states = empty3(); if (isFirst) { isFirst = false; - states.push(state2); + states.push(state); } for (let index2 = 0;index2 < arr.length; index2++) { - state2 = f(state2, arr[index2]); - states.push(state2); + state = f(state, arr[index2]); + states.push(state); } - return [state2, of2(states)]; + return [state, of2(states)]; })); })); scanEffect2 = /* @__PURE__ */ dual(3, (self2, initial, f) => self2.channel.pipe(flattenArray, scanEffect(initial, f), map14(of2), fromChannel3)); @@ -67781,8 +67784,8 @@ __export(exports_FileSystem, { var TypeId35 = "~effect/platform/FileSystem", Size = (bytes) => typeof bytes === "bigint" ? bytes : BigInt(bytes), KiB = (n7) => Size(n7 * 1024), MiB = (n7) => Size(n7 * 1024 * 1024), GiB = (n7) => Size(n7 * 1024 * 1024 * 1024), TiB = (n7) => Size(n7 * 1024 * 1024 * 1024 * 1024), bigint1024, bigintPiB, PiB = (n7) => Size(BigInt(n7) * bigintPiB), FileSystem, make43 = (impl) => FileSystem.of({ ...impl, [TypeId35]: TypeId35, - exists: (path5) => pipe2(impl.access(path5), as4(true), catchTag3("PlatformError", (e) => e.reason._tag === "NotFound" ? succeed8(false) : fail8(e))), - readFileString: (path5, encoding) => flatMap7(impl.readFile(path5), (_2) => try_4({ + exists: (path6) => pipe2(impl.access(path6), as4(true), catchTag3("PlatformError", (e) => e.reason._tag === "NotFound" ? succeed8(false) : fail8(e))), + readFileString: (path6, encoding) => flatMap7(impl.readFile(path6), (_2) => try_4({ try: () => new TextDecoder(encoding).decode(_2), catch: (cause) => badArgument({ module: "FileSystem", @@ -67791,8 +67794,8 @@ var TypeId35 = "~effect/platform/FileSystem", Size = (bytes) => typeof bytes === cause }) })), - stream: fnUntraced2(function* (path5, options2) { - const file2 = yield* impl.open(path5, { + stream: fnUntraced2(function* (path6, options2) { + const file2 = yield* impl.open(path6, { flag: "r" }); if (options2?.offset) { @@ -67815,11 +67818,11 @@ var TypeId35 = "~effect/platform/FileSystem", Size = (bytes) => typeof bytes === } })))); }, unwrap4), - sink: (path5, options2) => pipe2(impl.open(path5, { + sink: (path6, options2) => pipe2(impl.open(path6, { flag: "w", ...options2 }), map12((file2) => forEach9((_2) => file2.writeAll(_2))), unwrap3), - writeFileString: (path5, data2, options2) => flatMap7(try_4({ + writeFileString: (path6, data2, options2) => flatMap7(try_4({ try: () => new TextEncoder().encode(data2), catch: (cause) => badArgument({ module: "FileSystem", @@ -67827,35 +67830,35 @@ var TypeId35 = "~effect/platform/FileSystem", Size = (bytes) => typeof bytes === description: "could not encode string", cause }) - }), (_2) => impl.writeFile(path5, _2, options2)) -}), notFound = (method, path5) => systemError({ + }), (_2) => impl.writeFile(path6, _2, options2)) +}), notFound = (method, path6) => systemError({ module: "FileSystem", method, _tag: "NotFound", description: "No such file or directory", - pathOrDescriptor: path5 + pathOrDescriptor: path6 }), makeNoop = (fileSystem) => FileSystem.of({ [TypeId35]: TypeId35, - access(path5) { - return fail8(notFound("access", path5)); + access(path6) { + return fail8(notFound("access", path6)); }, - chmod(path5) { - return fail8(notFound("chmod", path5)); + chmod(path6) { + return fail8(notFound("chmod", path6)); }, - chown(path5) { - return fail8(notFound("chown", path5)); + chown(path6) { + return fail8(notFound("chown", path6)); }, - copy(path5) { - return fail8(notFound("copy", path5)); + copy(path6) { + return fail8(notFound("copy", path6)); }, - copyFile(path5) { - return fail8(notFound("copyFile", path5)); + copyFile(path6) { + return fail8(notFound("copyFile", path6)); }, exists() { return succeed8(false); }, - link(path5) { - return fail8(notFound("link", path5)); + link(path6) { + return fail8(notFound("link", path6)); }, makeDirectory() { return die5("not implemented"); @@ -67872,23 +67875,23 @@ var TypeId35 = "~effect/platform/FileSystem", Size = (bytes) => typeof bytes === makeTempFileScoped() { return die5("not implemented"); }, - open(path5) { - return fail8(notFound("open", path5)); + open(path6) { + return fail8(notFound("open", path6)); }, - readDirectory(path5) { - return fail8(notFound("readDirectory", path5)); + readDirectory(path6) { + return fail8(notFound("readDirectory", path6)); }, - readFile(path5) { - return fail8(notFound("readFile", path5)); + readFile(path6) { + return fail8(notFound("readFile", path6)); }, - readFileString(path5) { - return fail8(notFound("readFileString", path5)); + readFileString(path6) { + return fail8(notFound("readFileString", path6)); }, - readLink(path5) { - return fail8(notFound("readLink", path5)); + readLink(path6) { + return fail8(notFound("readLink", path6)); }, - realPath(path5) { - return fail8(notFound("realPath", path5)); + realPath(path6) { + return fail8(notFound("realPath", path6)); }, remove() { return void_5; @@ -67896,32 +67899,32 @@ var TypeId35 = "~effect/platform/FileSystem", Size = (bytes) => typeof bytes === rename(oldPath) { return fail8(notFound("rename", oldPath)); }, - sink(path5) { - return fail12(notFound("sink", path5)); + sink(path6) { + return fail12(notFound("sink", path6)); }, - stat(path5) { - return fail8(notFound("stat", path5)); + stat(path6) { + return fail8(notFound("stat", path6)); }, - stream(path5) { - return fail13(notFound("stream", path5)); + stream(path6) { + return fail13(notFound("stream", path6)); }, symlink(fromPath) { return fail8(notFound("symlink", fromPath)); }, - truncate(path5) { - return fail8(notFound("truncate", path5)); + truncate(path6) { + return fail8(notFound("truncate", path6)); }, - utimes(path5) { - return fail8(notFound("utimes", path5)); + utimes(path6) { + return fail8(notFound("utimes", path6)); }, - watch(path5) { - return fail13(notFound("watch", path5)); + watch(path6) { + return fail13(notFound("watch", path6)); }, - writeFile(path5) { - return fail8(notFound("writeFile", path5)); + writeFile(path6) { + return fail8(notFound("writeFile", path6)); }, - writeFileString(path5) { - return fail8(notFound("writeFileString", path5)); + writeFileString(path6) { + return fail8(notFound("writeFileString", path6)); }, ...fileSystem }), layerNoop = (fileSystem) => succeed6(FileSystem)(makeNoop(fileSystem)), FileTypeId = "~effect/platform/FileSystem/File", isFile = (u) => hasProperty(u, FileTypeId), FileDescriptor, WatchBackend; @@ -67953,15 +67956,15 @@ __export(exports_Path, { TypeId: () => TypeId36, Path: () => Path }); -function normalizeStringPosix(path5, allowAboveRoot) { +function normalizeStringPosix(path6, allowAboveRoot) { let res = ""; let lastSegmentLength = 0; let lastSlash = -1; let dots = 0; let code; - for (let i2 = 0;i2 <= path5.length; ++i2) { - if (i2 < path5.length) { - code = path5.charCodeAt(i2); + for (let i2 = 0;i2 <= path6.length; ++i2) { + if (i2 < path6.length) { + code = path6.charCodeAt(i2); } else if (code === 47) { break; } else { @@ -68002,9 +68005,9 @@ function normalizeStringPosix(path5, allowAboveRoot) { } } else { if (res.length > 0) { - res += "/" + path5.slice(lastSlash + 1, i2); + res += "/" + path6.slice(lastSlash + 1, i2); } else { - res = path5.slice(lastSlash + 1, i2); + res = path6.slice(lastSlash + 1, i2); } lastSegmentLength = i2 - lastSlash - 1; } @@ -68092,21 +68095,21 @@ var TypeId36 = "~effect/platform/Path", Path, resolve7 = function resolve8() { let resolvedAbsolute = false; let cwd = undefined; for (let i2 = arguments.length - 1;i2 >= -1 && !resolvedAbsolute; i2--) { - let path5; + let path6; if (i2 >= 0) { - path5 = arguments[i2]; + path6 = arguments[i2]; } else { const process2 = globalThis.process; if (cwd === undefined && "process" in globalThis && typeof process2 === "object" && process2 !== null && typeof process2.cwd === "function") { cwd = process2.cwd(); } - path5 = cwd; + path6 = cwd; } - if (path5.length === 0) { + if (path6.length === 0) { continue; } - resolvedPath = path5 + "/" + resolvedPath; - resolvedAbsolute = path5.charCodeAt(0) === 47; + resolvedPath = path6 + "/" + resolvedPath; + resolvedAbsolute = path6.charCodeAt(0) === 47; } resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute); if (resolvedAbsolute) { @@ -68136,22 +68139,22 @@ var init_Path = __esm(() => { posixImpl = /* @__PURE__ */ Path.of({ [TypeId36]: TypeId36, resolve: resolve7, - normalize(path5) { - if (path5.length === 0) + normalize(path6) { + if (path6.length === 0) return "."; - const isAbsolute = path5.charCodeAt(0) === 47; - const trailingSeparator = path5.charCodeAt(path5.length - 1) === 47; - path5 = normalizeStringPosix(path5, !isAbsolute); - if (path5.length === 0 && !isAbsolute) - path5 = "."; - if (path5.length > 0 && trailingSeparator) - path5 += "/"; + const isAbsolute = path6.charCodeAt(0) === 47; + const trailingSeparator = path6.charCodeAt(path6.length - 1) === 47; + path6 = normalizeStringPosix(path6, !isAbsolute); + if (path6.length === 0 && !isAbsolute) + path6 = "."; + if (path6.length > 0 && trailingSeparator) + path6 += "/"; if (isAbsolute) - return "/" + path5; - return path5; + return "/" + path6; + return path6; }, - isAbsolute(path5) { - return path5.length > 0 && path5.charCodeAt(0) === 47; + isAbsolute(path6) { + return path6.length > 0 && path6.charCodeAt(0) === 47; }, join() { if (arguments.length === 0) { @@ -68244,15 +68247,15 @@ var init_Path = __esm(() => { return to.slice(toStart); } }, - dirname(path5) { - if (path5.length === 0) + dirname(path6) { + if (path6.length === 0) return "."; - let code = path5.charCodeAt(0); + let code = path6.charCodeAt(0); const hasRoot = code === 47; let end3 = -1; let matchedSlash = true; - for (let i2 = path5.length - 1;i2 >= 1; --i2) { - code = path5.charCodeAt(i2); + for (let i2 = path6.length - 1;i2 >= 1; --i2) { + code = path6.charCodeAt(i2); if (code === 47) { if (!matchedSlash) { end3 = i2; @@ -68266,20 +68269,20 @@ var init_Path = __esm(() => { return hasRoot ? "/" : "."; if (hasRoot && end3 === 1) return "//"; - return path5.slice(0, end3); + return path6.slice(0, end3); }, - basename(path5, ext2) { + basename(path6, ext2) { let start2 = 0; let end3 = -1; let matchedSlash = true; let i2; - if (ext2 !== undefined && ext2.length > 0 && ext2.length <= path5.length) { - if (ext2.length === path5.length && ext2 === path5) + if (ext2 !== undefined && ext2.length > 0 && ext2.length <= path6.length) { + if (ext2.length === path6.length && ext2 === path6) return ""; let extIdx = ext2.length - 1; let firstNonSlashEnd = -1; - for (i2 = path5.length - 1;i2 >= 0; --i2) { - const code = path5.charCodeAt(i2); + for (i2 = path6.length - 1;i2 >= 0; --i2) { + const code = path6.charCodeAt(i2); if (code === 47) { if (!matchedSlash) { start2 = i2 + 1; @@ -68305,11 +68308,11 @@ var init_Path = __esm(() => { if (start2 === end3) end3 = firstNonSlashEnd; else if (end3 === -1) - end3 = path5.length; - return path5.slice(start2, end3); + end3 = path6.length; + return path6.slice(start2, end3); } else { - for (i2 = path5.length - 1;i2 >= 0; --i2) { - if (path5.charCodeAt(i2) === 47) { + for (i2 = path6.length - 1;i2 >= 0; --i2) { + if (path6.charCodeAt(i2) === 47) { if (!matchedSlash) { start2 = i2 + 1; break; @@ -68321,17 +68324,17 @@ var init_Path = __esm(() => { } if (end3 === -1) return ""; - return path5.slice(start2, end3); + return path6.slice(start2, end3); } }, - extname(path5) { + extname(path6) { let startDot = -1; let startPart = 0; let end3 = -1; let matchedSlash = true; let preDotState = 0; - for (let i2 = path5.length - 1;i2 >= 0; --i2) { - const code = path5.charCodeAt(i2); + for (let i2 = path6.length - 1;i2 >= 0; --i2) { + const code = path6.charCodeAt(i2); if (code === 47) { if (!matchedSlash) { startPart = i2 + 1; @@ -68356,7 +68359,7 @@ var init_Path = __esm(() => { if (startDot === -1 || end3 === -1 || preDotState === 0 || preDotState === 1 && startDot === end3 - 1 && startDot === startPart + 1) { return ""; } - return path5.slice(startDot, end3); + return path6.slice(startDot, end3); }, format: function format8(pathObject) { if (pathObject === null || typeof pathObject !== "object") { @@ -68364,7 +68367,7 @@ var init_Path = __esm(() => { } return _format("/", pathObject); }, - parse(path5) { + parse(path6) { const ret = { root: "", dir: "", @@ -68372,9 +68375,9 @@ var init_Path = __esm(() => { ext: "", name: "" }; - if (path5.length === 0) + if (path6.length === 0) return ret; - let code = path5.charCodeAt(0); + let code = path6.charCodeAt(0); const isAbsolute = code === 47; let start2; if (isAbsolute) { @@ -68387,10 +68390,10 @@ var init_Path = __esm(() => { let startPart = 0; let end3 = -1; let matchedSlash = true; - let i2 = path5.length - 1; + let i2 = path6.length - 1; let preDotState = 0; for (;i2 >= start2; --i2) { - code = path5.charCodeAt(i2); + code = path6.charCodeAt(i2); if (code === 47) { if (!matchedSlash) { startPart = i2 + 1; @@ -68414,22 +68417,22 @@ var init_Path = __esm(() => { if (startDot === -1 || end3 === -1 || preDotState === 0 || preDotState === 1 && startDot === end3 - 1 && startDot === startPart + 1) { if (end3 !== -1) { if (startPart === 0 && isAbsolute) - ret.base = ret.name = path5.slice(1, end3); + ret.base = ret.name = path6.slice(1, end3); else - ret.base = ret.name = path5.slice(startPart, end3); + ret.base = ret.name = path6.slice(startPart, end3); } } else { if (startPart === 0 && isAbsolute) { - ret.name = path5.slice(1, startDot); - ret.base = path5.slice(1, end3); + ret.name = path6.slice(1, startDot); + ret.base = path6.slice(1, end3); } else { - ret.name = path5.slice(startPart, startDot); - ret.base = path5.slice(startPart, end3); + ret.name = path6.slice(startPart, startDot); + ret.base = path6.slice(startPart, end3); } - ret.ext = path5.slice(startDot, end3); + ret.ext = path6.slice(startDot, end3); } if (startPart > 0) - ret.dir = path5.slice(0, startPart - 1); + ret.dir = path6.slice(0, startPart - 1); else if (isAbsolute) ret.dir = "/"; return ret; @@ -68488,21 +68491,21 @@ function make44(get16, mapInput7, prefix) { self2.get = get16; self2.mapInput = mapInput7; self2.prefix = prefix; - self2.load = (path5) => { + self2.load = (path6) => { if (mapInput7) - path5 = mapInput7(path5); + path6 = mapInput7(path6); if (prefix) - path5 = [...prefix, ...path5]; - return get16(path5); + path6 = [...prefix, ...path6]; + return get16(path6); }; return self2; } function fromUnknown(root) { - return make44((path5) => succeed8(nodeAtJson(root, path5))); + return make44((path6) => succeed8(nodeAtJson(root, path6))); } -function nodeAtJson(root, path5) { +function nodeAtJson(root, path6) { let cur = root; - for (const seg of path5) { + for (const seg of path6) { if (cur === null || cur === undefined) return; if (Array.isArray(cur)) { @@ -68544,7 +68547,7 @@ function fromEnv(options2) { ...import.meta?.env }; const trie = buildEnvTrie(env3); - return make44((path5) => succeed8(nodeAtEnv(trie, env3, path5))); + return make44((path6) => succeed8(nodeAtEnv(trie, env3, path6))); } function buildEnvTrie(env3) { const root = {}; @@ -68561,10 +68564,10 @@ function buildEnvTrie(env3) { } return root; } -function nodeAtEnv(trie, env3, path5) { - const key = path5.map(String).join("_"); +function nodeAtEnv(trie, env3, path6) { + const key = path6.map(String).join("_"); const leafValue = env3[key]; - const trieNode = trieNodeAt(trie, path5); + const trieNode = trieNodeAt(trie, path6); const children = trieNode?.children ? Object.keys(trieNode.children) : []; if (children.length === 0) { return leafValue === undefined ? undefined : makeValue(leafValue); @@ -68576,11 +68579,11 @@ function nodeAtEnv(trie, env3, path5) { } return makeRecord(new Set(children), leafValue); } -function trieNodeAt(root, path5) { - if (path5.length === 0) +function trieNodeAt(root, path6) { + if (path6.length === 0) return root; let node = root; - for (const seg of path5) { + for (const seg of path6) { node = node?.children?.[String(seg)]; if (!node) return; @@ -68670,14 +68673,14 @@ var init_ConfigProvider = __esm(() => { }; } }; - orElse4 = /* @__PURE__ */ dual(2, (self2, that) => make44((path5) => flatMap7(self2.get(path5), (node) => node ? succeed8(node) : that.get(path5)))); + orElse4 = /* @__PURE__ */ dual(2, (self2, that) => make44((path6) => flatMap7(self2.get(path6), (node) => node ? succeed8(node) : that.get(path6)))); mapInput7 = /* @__PURE__ */ dual(2, (self2, f) => { return make44(self2.get, self2.mapInput ? flow(self2.mapInput, f) : f, self2.prefix ? f(self2.prefix) : undefined); }); - constantCase2 = /* @__PURE__ */ mapInput7((path5) => path5.map((seg) => typeof seg === "number" ? seg : constantCase(seg))); + constantCase2 = /* @__PURE__ */ mapInput7((path6) => path6.map((seg) => typeof seg === "number" ? seg : constantCase(seg))); nested = /* @__PURE__ */ dual(2, (self2, prefix) => { - const path5 = typeof prefix === "string" ? [prefix] : prefix; - return make44(self2.get, self2.mapInput, self2.prefix ? [...self2.prefix, ...path5] : path5); + const path6 = typeof prefix === "string" ? [prefix] : prefix; + return make44(self2.get, self2.mapInput, self2.prefix ? [...self2.prefix, ...path6] : path6); }); NUMERIC_INDEX = /^(0|[1-9][0-9]*)$/; DOT_ENV_LINE = /(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg; @@ -68692,15 +68695,15 @@ var init_ConfigProvider = __esm(() => { const platformPath = yield* Path; const fs5 = yield* FileSystem; const rootPath = options2?.rootPath ?? "/"; - return make44((path5) => { - const fullPath = platformPath.join(rootPath, ...path5.map(String)); + return make44((path6) => { + const fullPath = platformPath.join(rootPath, ...path6.map(String)); const asFile = fs5.readFileString(fullPath).pipe(map12((content) => makeValue(content.trim()))); const asDirectory = fs5.readDirectory(fullPath).pipe(map12((entries5) => { const keys8 = entries5.map((e) => typeof e === "string" ? platformPath.basename(e) : format3(e?.name ?? "")); return makeRecord(new Set(keys8)); })); return asFile.pipe(catch_3(() => asDirectory), mapError4((cause) => new SourceError({ - message: `Failed to read file at ${platformPath.join(rootPath, ...path5.map(String))}`, + message: `Failed to read file at ${platformPath.join(rootPath, ...path6.map(String))}`, cause }))); }); @@ -68797,9 +68800,9 @@ function make45(parse9) { function all6(arg) { const configs = Array.isArray(arg) ? arg : (Symbol.iterator in arg) ? [...arg] : arg; if (Array.isArray(configs)) { - return make45((provider) => all4(configs.map((config3) => config3.parse(provider)))); + return make45((provider) => all4(configs.map((config2) => config2.parse(provider)))); } else { - return make45((provider) => all4(map6(configs, (config3) => config3.parse(provider)))); + return make45((provider) => all4(map6(configs, (config2) => config2.parse(provider)))); } } function isMissingDataOnly(issue2) { @@ -68825,14 +68828,14 @@ function isMissingDataOnly(issue2) { return issue2.issues.every(isMissingDataOnly); } } -function schema(codec2, path5) { +function schema(codec2, path6) { const codecStringTree = toCodecStringTree(codec2); const decodeUnknownEffect3 = decodeUnknownEffect(codecStringTree); const codecStringTreeEncoded = toEncoded(codecStringTree.ast); - const defaultPath = typeof path5 === "string" ? [path5] : path5 ?? []; + const defaultPath = typeof path6 === "string" ? [path6] : path6 ?? []; return make45((provider) => { - const path6 = provider.prefix ? [...provider.prefix, ...defaultPath] : defaultPath; - return recur5(codecStringTreeEncoded, provider, defaultPath).pipe(flatMapEager2((tree) => decodeUnknownEffect3(tree).pipe(mapErrorEager2((issue2) => new SchemaError(path6.length > 0 ? new Pointer(path6, issue2) : issue2)))), mapErrorEager2((cause) => new ConfigError(cause))); + const path7 = provider.prefix ? [...provider.prefix, ...defaultPath] : defaultPath; + return recur5(codecStringTreeEncoded, provider, defaultPath).pipe(flatMapEager2((tree) => decodeUnknownEffect3(tree).pipe(mapErrorEager2((issue2) => new SchemaError(path7.length > 0 ? new Pointer(path7, issue2) : issue2)))), mapErrorEager2((cause) => new ConfigError(cause))); }); } function fail14(err2) { @@ -68885,7 +68888,7 @@ var TypeId37 = "~effect/Config", isConfig = (u) => hasProperty(u, TypeId37), Pro return wrapped; return make45((provider) => { const entries5 = Object.entries(wrapped); - const configs = entries5.map(([key, config3]) => unwrap5(config3).parse(provider).pipe(map12((value4) => [key, value4]))); + const configs = entries5.map(([key, config2]) => unwrap5(config2).parse(provider).pipe(map12((value4) => [key, value4]))); return all4(configs).pipe(map12(Object.fromEntries)); }); }, dump2, recur5, TrueValues, FalseValues, Boolean8, Duration2, Port, LogLevel, Record4 = (key, value4, options2) => { @@ -68942,8 +68945,8 @@ var init_Config = __esm(() => { return fail14(err2.cause); }); }); - dump2 = /* @__PURE__ */ fnUntraced2(function* (provider, path5) { - const stat = yield* provider.load(path5); + dump2 = /* @__PURE__ */ fnUntraced2(function* (provider, path6) { + const stat = yield* provider.load(path6); if (stat === undefined) return; switch (stat._tag) { @@ -68954,7 +68957,7 @@ var init_Config = __esm(() => { return stat.value; const out2 = {}; for (const key of stat.keys) { - const child = yield* dump2(provider, [...path5, key]); + const child = yield* dump2(provider, [...path6, key]); if (child !== undefined) out2[key] = child; } @@ -68965,32 +68968,32 @@ var init_Config = __esm(() => { return stat.value; const out2 = []; for (let i2 = 0;i2 < stat.length; i2++) { - out2.push(yield* dump2(provider, [...path5, i2])); + out2.push(yield* dump2(provider, [...path6, i2])); } return out2; } } }); - recur5 = /* @__PURE__ */ fnUntraced2(function* (ast, provider, path5) { + recur5 = /* @__PURE__ */ fnUntraced2(function* (ast, provider, path6) { switch (ast._tag) { case "Objects": { const out2 = {}; for (const ps2 of ast.propertySignatures) { const name2 = ps2.name; if (typeof name2 === "string") { - const value4 = yield* recur5(ps2.type, provider, [...path5, name2]); + const value4 = yield* recur5(ps2.type, provider, [...path6, name2]); if (value4 !== undefined) out2[name2] = value4; } } if (ast.indexSignatures.length > 0) { - const stat = yield* provider.load(path5); + const stat = yield* provider.load(path6); if (stat && stat._tag === "Record") { for (const is4 of ast.indexSignatures) { const matches = _is(is4.parameter); for (const key of stat.keys) { if (!Object.hasOwn(out2, key) && matches(key)) { - const value4 = yield* recur5(is4.type, provider, [...path5, key]); + const value4 = yield* recur5(is4.type, provider, [...path6, key]); if (value4 !== undefined) out2[key] = value4; } @@ -69001,21 +69004,21 @@ var init_Config = __esm(() => { return out2; } case "Arrays": { - const stat = yield* provider.load(path5); + const stat = yield* provider.load(path6); if (stat && stat._tag === "Value") return stat.value; const out2 = []; for (let i2 = 0;i2 < ast.elements.length; i2++) { - out2.push(yield* recur5(ast.elements[i2], provider, [...path5, i2])); + out2.push(yield* recur5(ast.elements[i2], provider, [...path6, i2])); } return out2; } case "Union": - return yield* dump2(provider, path5); + return yield* dump2(provider, path6); case "Suspend": - return yield* recur5(ast.thunk(), provider, path5); + return yield* recur5(ast.thunk(), provider, path6); default: { - const stat = yield* provider.load(path5); + const stat = yield* provider.load(path6); if (stat === undefined) return; if (stat._tag === "Value") @@ -69249,13 +69252,13 @@ var TypeId39 = "~effect/FiberHandle", isFiberHandle = (u) => hasProperty(u, Type self2.deferred = makeUnsafe2(); return self2; }, make47 = () => acquireRelease2(sync4(() => makeUnsafe10()), (handle2) => { - const state2 = handle2.state; - if (state2._tag === "Closed") + const state = handle2.state; + if (state._tag === "Closed") return void_5; handle2.state = { _tag: "Closed" }; - return state2.fiber ? into(asVoid4(interruptAs(state2.fiber, internalFiberId)), handle2.deferred) : done3(handle2.deferred, void_4); + return state.fiber ? into(asVoid4(interruptAs(state.fiber, internalFiberId)), handle2.deferred) : done3(handle2.deferred, void_4); }), makeRuntime = () => flatMap7(make47(), (self2) => runtime(self2)()), makeRuntimePromise = () => flatMap7(make47(), (self2) => runtimePromise(self2)()), internalFiberId = -1, isInternalInterruption, setUnsafe, set10, clear5 = (self2) => uninterruptibleMask2((restore) => { if (self2.state._tag === "Closed" || self2.state.fiber === undefined) { return void_5; @@ -69397,13 +69400,13 @@ var TypeId40 = "~effect/FiberMap", isFiberMap = (u) => hasProperty(u, TypeId40), self2.deferred = deferred; return self2; }, make48 = () => acquireRelease2(sync4(() => makeUnsafe11(empty8(), makeUnsafe2())), (map25) => suspend3(() => { - const state2 = map25.state; - if (state2._tag === "Closed") + const state = map25.state; + if (state._tag === "Closed") return void_5; map25.state = { _tag: "Closed" }; - return interruptAll(values2(state2.backing)).pipe(into(map25.deferred)); + return interruptAll(values2(state.backing)).pipe(into(map25.deferred)); })), makeRuntime2 = () => flatMap7(make48(), (self2) => runtime2(self2)()), makeRuntimePromise2 = () => flatMap7(make48(), (self2) => runtimePromise2(self2)()), internalFiberId2 = -1, isInternalInterruption2, setUnsafe2, set11, getUnsafe7, get17, hasUnsafe, has10, remove10, clear6 = (self2) => suspend3(() => { if (self2.state._tag === "Closed") { return void_5; @@ -69562,13 +69565,13 @@ var TypeId41 = "~effect/FiberSet", isFiberSet = (u) => hasProperty(u, TypeId41), self2.deferred = deferred; return self2; }, make49 = () => acquireRelease2(sync4(() => makeUnsafe12(new Set, makeUnsafe2())), (set12) => suspend3(() => { - const state2 = set12.state; - if (state2._tag === "Closed") + const state = set12.state; + if (state._tag === "Closed") return void_5; set12.state = { _tag: "Closed" }; - const fibers = state2.backing; + const fibers = state.backing; return interruptAll(fibers).pipe(into(set12.deferred)); })), makeRuntime3 = () => flatMap7(make49(), (self2) => runtime3(self2)()), makeRuntimePromise3 = () => flatMap7(make49(), (self2) => runtimePromise3(self2)()), internalFiberId3 = -1, isInternalInterruption3, addUnsafe, add6, clear7 = (self2) => suspend3(() => { if (self2.state._tag === "Closed") { @@ -70477,16 +70480,16 @@ var init_Graph = __esm(() => { return lines.join(` `); }); - dijkstra = /* @__PURE__ */ dual(2, (graph, config3) => { - if (!graph.nodes.has(config3.source)) { - throw missingNode(config3.source); + dijkstra = /* @__PURE__ */ dual(2, (graph, config2) => { + if (!graph.nodes.has(config2.source)) { + throw missingNode(config2.source); } - if (!graph.nodes.has(config3.target)) { - throw missingNode(config3.target); + if (!graph.nodes.has(config2.target)) { + throw missingNode(config2.target); } - if (config3.source === config3.target) { + if (config2.source === config2.target) { return some3({ - path: [config3.source], + path: [config2.source], distance: 0, costs: [] }); @@ -70495,11 +70498,11 @@ var init_Graph = __esm(() => { const previous = new Map; const visited = new Set; for (const node of graph.nodes.keys()) { - distances.set(node, node === config3.source ? 0 : Infinity); + distances.set(node, node === config2.source ? 0 : Infinity); previous.set(node, null); } const priorityQueue = [{ - node: config3.source, + node: config2.source, distance: 0 }]; while (priorityQueue.length > 0) { @@ -70515,7 +70518,7 @@ var init_Graph = __esm(() => { continue; } visited.add(currentNode2); - if (currentNode2 === config3.target) { + if (currentNode2 === config2.target) { break; } const currentDistance = distances.get(currentNode2); @@ -70525,7 +70528,7 @@ var init_Graph = __esm(() => { const edge = graph.edges.get(edgeIndex); if (edge !== undefined) { const neighbor = edge.target; - const cost = config3.cost(edge.data); + const cost = config2.cost(edge.data); if (cost < 0) { throw new GraphError({ message: "Dijkstra's algorithm requires non-negative edge weights" @@ -70550,15 +70553,15 @@ var init_Graph = __esm(() => { } } } - const distance3 = distances.get(config3.target); + const distance3 = distances.get(config2.target); if (distance3 === Infinity) { return none2(); } - const path5 = []; + const path6 = []; const costs = []; - let currentNode = config3.target; + let currentNode = config2.target; while (currentNode !== null) { - path5.unshift(currentNode); + path6.unshift(currentNode); const prev2 = previous.get(currentNode); if (prev2 !== null) { costs.unshift(prev2.edgeData); @@ -70568,7 +70571,7 @@ var init_Graph = __esm(() => { } } return some3({ - path: path5, + path: path6, distance: distance3, costs }); @@ -70632,10 +70635,10 @@ var init_Graph = __esm(() => { paths.get(i2).set(j2, null); costs.get(i2).set(j2, []); } else { - const path5 = []; + const path6 = []; const weights = []; let current = i2; - path5.push(current); + path6.push(current); while (current !== j2) { const nextNode = next2.get(current).get(j2); if (nextNode === null) @@ -70645,9 +70648,9 @@ var init_Graph = __esm(() => { weights.push(edgeData); } current = nextNode; - path5.push(current); + path6.push(current); } - paths.get(i2).set(j2, path5); + paths.get(i2).set(j2, path6); costs.get(i2).set(j2, weights); } } @@ -70658,24 +70661,24 @@ var init_Graph = __esm(() => { costs }; }); - astar = /* @__PURE__ */ dual(2, (graph, config3) => { - if (!graph.nodes.has(config3.source)) { - throw missingNode(config3.source); + astar = /* @__PURE__ */ dual(2, (graph, config2) => { + if (!graph.nodes.has(config2.source)) { + throw missingNode(config2.source); } - if (!graph.nodes.has(config3.target)) { - throw missingNode(config3.target); + if (!graph.nodes.has(config2.target)) { + throw missingNode(config2.target); } - if (config3.source === config3.target) { + if (config2.source === config2.target) { return some3({ - path: [config3.source], + path: [config2.source], distance: 0, costs: [] }); } - const targetNodeData = getNode(graph, config3.target); + const targetNodeData = getNode(graph, config2.target); if (isNone2(targetNodeData)) { throw new GraphError({ - message: `Missing node data for target node ${config3.target}` + message: `Missing node data for target node ${config2.target}` }); } const gScore = new Map; @@ -70683,18 +70686,18 @@ var init_Graph = __esm(() => { const previous = new Map; const visited = new Set; for (const node of graph.nodes.keys()) { - gScore.set(node, node === config3.source ? 0 : Infinity); + gScore.set(node, node === config2.source ? 0 : Infinity); fScore.set(node, Infinity); previous.set(node, null); } - const sourceNodeData = getNode(graph, config3.source); + const sourceNodeData = getNode(graph, config2.source); if (isSome2(sourceNodeData)) { - const h2 = config3.heuristic(sourceNodeData.value, targetNodeData.value); - fScore.set(config3.source, h2); + const h2 = config2.heuristic(sourceNodeData.value, targetNodeData.value); + fScore.set(config2.source, h2); } const openSet = [{ - node: config3.source, - fScore: fScore.get(config3.source) + node: config2.source, + fScore: fScore.get(config2.source) }]; while (openSet.length > 0) { let minIndex = 0; @@ -70709,7 +70712,7 @@ var init_Graph = __esm(() => { continue; } visited.add(currentNode2); - if (currentNode2 === config3.target) { + if (currentNode2 === config2.target) { break; } const currentGScore = gScore.get(currentNode2); @@ -70719,7 +70722,7 @@ var init_Graph = __esm(() => { const edge = graph.edges.get(edgeIndex); if (edge !== undefined) { const neighbor = edge.target; - const weight = config3.cost(edge.data); + const weight = config2.cost(edge.data); if (weight < 0) { throw new GraphError({ message: "A* algorithm requires non-negative edge weights" @@ -70735,7 +70738,7 @@ var init_Graph = __esm(() => { }); const neighborNodeData = getNode(graph, neighbor); if (isSome2(neighborNodeData)) { - const h2 = config3.heuristic(neighborNodeData.value, targetNodeData.value); + const h2 = config2.heuristic(neighborNodeData.value, targetNodeData.value); const f = tentativeGScore + h2; fScore.set(neighbor, f); if (!visited.has(neighbor)) { @@ -70750,15 +70753,15 @@ var init_Graph = __esm(() => { } } } - const distance3 = gScore.get(config3.target); + const distance3 = gScore.get(config2.target); if (distance3 === Infinity) { return none2(); } - const path5 = []; + const path6 = []; const costs = []; - let currentNode = config3.target; + let currentNode = config2.target; while (currentNode !== null) { - path5.unshift(currentNode); + path6.unshift(currentNode); const prev2 = previous.get(currentNode) ?? null; if (prev2 !== null) { costs.unshift(prev2.edgeData); @@ -70768,21 +70771,21 @@ var init_Graph = __esm(() => { } } return some3({ - path: path5, + path: path6, distance: distance3, costs }); }); - bellmanFord = /* @__PURE__ */ dual(2, (graph, config3) => { - if (!graph.nodes.has(config3.source)) { - throw missingNode(config3.source); + bellmanFord = /* @__PURE__ */ dual(2, (graph, config2) => { + if (!graph.nodes.has(config2.source)) { + throw missingNode(config2.source); } - if (!graph.nodes.has(config3.target)) { - throw missingNode(config3.target); + if (!graph.nodes.has(config2.target)) { + throw missingNode(config2.target); } - if (config3.source === config3.target) { + if (config2.source === config2.target) { return some3({ - path: [config3.source], + path: [config2.source], distance: 0, costs: [] }); @@ -70790,12 +70793,12 @@ var init_Graph = __esm(() => { const distances = new Map; const previous = new Map; for (const node of graph.nodes.keys()) { - distances.set(node, node === config3.source ? 0 : Infinity); + distances.set(node, node === config2.source ? 0 : Infinity); previous.set(node, null); } const edges = []; for (const [, edgeData] of graph.edges) { - const weight = config3.cost(edgeData.data); + const weight = config2.cost(edgeData.data); edges.push({ source: edgeData.source, target: edgeData.target, @@ -70843,20 +70846,20 @@ var init_Graph = __esm(() => { } } } - if (affectedNodes.has(config3.target)) { + if (affectedNodes.has(config2.target)) { return none2(); } } } - const distance3 = distances.get(config3.target); + const distance3 = distances.get(config2.target); if (distance3 === Infinity) { return none2(); } - const path5 = []; + const path6 = []; const costs = []; - let currentNode = config3.target; + let currentNode = config2.target; while (currentNode !== null) { - path5.unshift(currentNode); + path6.unshift(currentNode); const prev2 = previous.get(currentNode); if (prev2 !== null) { costs.unshift(prev2.edgeData); @@ -70866,7 +70869,7 @@ var init_Graph = __esm(() => { } } return some3({ - path: path5, + path: path6, distance: distance3, costs }); @@ -70879,9 +70882,9 @@ var init_Graph = __esm(() => { this[Symbol.iterator] = visit((index2, data2) => [index2, data2])[Symbol.iterator]; } }; - dfs = /* @__PURE__ */ dual((args3) => isGraph(args3[0]), (graph, config3 = {}) => { - const start2 = config3.start ?? []; - const direction = config3.direction ?? "outgoing"; + dfs = /* @__PURE__ */ dual((args3) => isGraph(args3[0]), (graph, config2 = {}) => { + const start2 = config2.start ?? []; + const direction = config2.direction ?? "outgoing"; for (const nodeIndex of start2) { if (!hasNode(graph, nodeIndex)) { throw missingNode(nodeIndex); @@ -70925,9 +70928,9 @@ var init_Graph = __esm(() => { } })); }); - bfs = /* @__PURE__ */ dual((args3) => isGraph(args3[0]), (graph, config3 = {}) => { - const start2 = config3.start ?? []; - const direction = config3.direction ?? "outgoing"; + bfs = /* @__PURE__ */ dual((args3) => isGraph(args3[0]), (graph, config2 = {}) => { + const start2 = config2.start ?? []; + const direction = config2.direction ?? "outgoing"; for (const nodeIndex of start2) { if (!hasNode(graph, nodeIndex)) { throw missingNode(nodeIndex); @@ -70969,13 +70972,13 @@ var init_Graph = __esm(() => { } })); }); - topo = /* @__PURE__ */ dual((args3) => isGraph(args3[0]), (graph, config3 = {}) => { + topo = /* @__PURE__ */ dual((args3) => isGraph(args3[0]), (graph, config2 = {}) => { if (!isAcyclic(graph)) { throw new GraphError({ message: "Cannot perform topological sort on cyclic graph" }); } - const initials = config3.initials ?? []; + const initials = config2.initials ?? []; for (const nodeIndex of initials) { if (!hasNode(graph, nodeIndex)) { throw missingNode(nodeIndex); @@ -71038,9 +71041,9 @@ var init_Graph = __esm(() => { } })); }); - dfsPostOrder = /* @__PURE__ */ dual((args3) => isGraph(args3[0]), (graph, config3 = {}) => { - const start2 = config3.start ?? []; - const direction = config3.direction ?? "outgoing"; + dfsPostOrder = /* @__PURE__ */ dual((args3) => isGraph(args3[0]), (graph, config2 = {}) => { + const start2 = config2.start ?? []; + const direction = config2.direction ?? "outgoing"; for (const nodeIndex of start2) { if (!hasNode(graph, nodeIndex)) { throw missingNode(nodeIndex); @@ -71102,8 +71105,8 @@ var init_Graph = __esm(() => { } })); }); - externals = /* @__PURE__ */ dual((args3) => isGraph(args3[0]), (graph, config3 = {}) => { - const direction = config3.direction ?? "outgoing"; + externals = /* @__PURE__ */ dual((args3) => isGraph(args3[0]), (graph, config2 = {}) => { + const direction = config2.direction ?? "outgoing"; return new Walker((f) => ({ [Symbol.iterator]: () => { const nodeMap = graph.nodes; @@ -71552,9 +71555,9 @@ var init_Logger = __esm(() => { consoleStructured = /* @__PURE__ */ withConsoleLog(formatStructured); consoleJson = /* @__PURE__ */ withConsoleLog(formatJson2); tracerLogger2 = tracerLogger; - toFile = /* @__PURE__ */ dual((args3) => isLogger(args3[0]), (self2, path5, options2) => gen3(function* () { + toFile = /* @__PURE__ */ dual((args3) => isLogger(args3[0]), (self2, path6, options2) => gen3(function* () { const fs5 = yield* FileSystem; - const logFile = yield* fs5.open(path5, { + const logFile = yield* fs5.open(path6, { flag: "a+", ...options2 }); @@ -72118,15 +72121,15 @@ var PartitionedTypeId = "~effect/PartitionedSemaphore", makeUnsafe13 = (options2 totalPermits = Math.min(maxPermits, totalPermits + permits); return totalPermits; } - let state2 = iterator.next(); - if (state2.done) { + let state = iterator.next(); + if (state.done) { iterator = partitions[Symbol.iterator](); - state2 = iterator.next(); - if (state2.done) { + state = iterator.next(); + if (state.done) { return totalPermits; } } - const waiter = state2.value[1].values().next().value; + const waiter = state.value[1].values().next().value; if (waiter === undefined) { continue; } @@ -72282,7 +72285,7 @@ var TypeId49 = "~effect/Pool", isPool = (u) => hasProperty(u, TypeId49), make56 const scope3 = get4(services3, Scope); const acquire = updateServices2(options2.acquire, (input) => merge3(services3, input)); const concurrency = options2.concurrency ?? 1; - const config3 = { + const config2 = { acquire, concurrency, minSize: options2.min, @@ -72290,7 +72293,7 @@ var TypeId49 = "~effect/Pool", isPool = (u) => hasProperty(u, TypeId49), make56 strategy: options2.strategy, targetUtilization: Math.min(Math.max(options2.targetUtilization ?? 1, 0.1), 1) }; - const state2 = { + const state = { scope: scope3, isShuttingDown: false, semaphore: makeUnsafe7(concurrency * options2.max), @@ -72303,8 +72306,8 @@ var TypeId49 = "~effect/Pool", isPool = (u) => hasProperty(u, TypeId49), make56 }; const self2 = { [TypeId49]: TypeId49, - config: config3, - state: state2, + config: config2, + state, pipe() { return pipeArguments(this, arguments); } @@ -75107,11 +75110,11 @@ function topologicalSort(references) { }; const dependencies = new Map(identifiers.map((id2) => [id2, collectRefs(references[id2])])); const recursive = new Set; - const state2 = new Map; + const state = new Map; const stack = []; const indexInStack = new Map; const dfs2 = (id2) => { - const s = state2.get(id2) ?? 0; + const s = state.get(id2) ?? 0; if (s === 1) { const start2 = indexInStack.get(id2); if (start2 !== undefined) { @@ -75123,7 +75126,7 @@ function topologicalSort(references) { } if (s === 2) return; - state2.set(id2, 1); + state.set(id2, 1); indexInStack.set(id2, stack.length); stack.push(id2); for (const dep of dependencies.get(id2) ?? []) { @@ -75131,7 +75134,7 @@ function topologicalSort(references) { } stack.pop(); indexInStack.delete(id2); - state2.set(id2, 2); + state.set(id2, 2); }; for (const id2 of identifiers) dfs2(id2); @@ -75907,16 +75910,16 @@ var TypeId55 = "~effect/ScopedCache", makeWith3 = (options2) => servicesWith((se if (self2.state._tag === "Closed") { return interrupt; } - const state2 = self2.state; - const oentry = get5(state2.map, key); + const state = self2.state; + const oentry = get5(state.map, key); if (isNone2(oentry)) { return undefined_; } else if (hasExpired2(oentry.value, fiber3)) { - remove3(state2.map, key); + remove3(state.map, key); return as3(close(oentry.value.scope, exitVoid), undefined); } else if (isRead) { - remove3(state2.map, key); - set4(state2.map, key, oentry.value); + remove3(state.map, key); + set4(state.map, key, oentry.value); } return succeed3(oentry.value); }, getSuccess6, set15, has13, invalidate6, invalidateWhen2, refresh3, invalidateAll2 = (self2) => withFiber((parent) => { @@ -75934,15 +75937,15 @@ var TypeId55 = "~effect/ScopedCache", makeWith3 = (options2) => servicesWith((se }, size15 = (self2) => sync(() => self2.state._tag === "Closed" ? 0 : size3(self2.state.map)), keys8 = (self2) => withFiber((fiber3) => { if (self2.state._tag === "Closed") return succeed3([]); - const state2 = self2.state; + const state = self2.state; const now3 = fiber3.getRef(ClockRef).currentTimeMillisUnsafe(); const fibers = empty3(); const keys9 = []; - for (const [key, entry] of state2.map) { + for (const [key, entry] of state.map) { if (entry.expiresAt === undefined || entry.expiresAt > now3) { keys9.push(key); } else { - remove3(state2.map, key); + remove3(state.map, key); fibers.push(forkUnsafe(fiber3, close(entry.scope, exitVoid), true, true)); } } @@ -75950,18 +75953,18 @@ var TypeId55 = "~effect/ScopedCache", makeWith3 = (options2) => servicesWith((se }), values8 = (self2) => map8(entries6(self2), map7(([, value8]) => value8)), entries6 = (self2) => withFiber((fiber3) => { if (self2.state._tag === "Closed") return succeed3([]); - const state2 = self2.state; + const state = self2.state; const now3 = fiber3.getRef(ClockRef).currentTimeMillisUnsafe(); const fibers = empty3(); const arr = []; - for (const [key, entry] of state2.map) { + for (const [key, entry] of state.map) { if (entry.expiresAt === undefined || entry.expiresAt > now3) { const exit3 = entry.deferred.effect; if (isExit(exit3) && !exitIsFailure(exit3)) { arr.push([key, exit3.value]); } } else { - remove3(state2.map, key); + remove3(state.map, key); fibers.push(forkUnsafe(fiber3, close(entry.scope, exitVoid), true, true)); } } @@ -75993,14 +75996,14 @@ var init_ScopedCache = __esm(() => { } }; get24 = /* @__PURE__ */ dual(2, (self2, key) => uninterruptibleMask((restore) => withFiber((fiber3) => { - const state2 = self2.state; - if (state2._tag === "Closed") { + const state = self2.state; + if (state._tag === "Closed") { return interrupt; } - const oentry = get5(state2.map, key); + const oentry = get5(state.map, key); if (isSome2(oentry) && !hasExpired2(oentry.value, fiber3)) { - remove3(state2.map, key); - set4(state2.map, key, oentry.value); + remove3(state.map, key); + set4(state.map, key, oentry.value); return restore(_await(oentry.value.deferred)); } const scope3 = makeUnsafe3(); @@ -76010,8 +76013,8 @@ var init_ScopedCache = __esm(() => { deferred, scope: scope3 }; - set4(state2.map, key, entry); - return checkCapacity2(fiber3, state2.map, self2.capacity).pipe(isSome2(oentry) ? flatMap5(() => close(oentry.value.scope, exitVoid)) : identity, flatMap5(() => provide(restore(self2.lookup(key)), scope3)), onExit((exit3) => { + set4(state.map, key, entry); + return checkCapacity2(fiber3, state.map, self2.capacity).pipe(isSome2(oentry) ? flatMap5(() => close(oentry.value.scope, exitVoid)) : identity, flatMap5(() => provide(restore(self2.lookup(key)), scope3)), onExit((exit3) => { doneUnsafe(deferred, exit3); const ttl = self2.timeToLive(exit3, key); if (isFinite2(ttl)) { @@ -76033,17 +76036,17 @@ var init_ScopedCache = __esm(() => { return interrupt; } const oentry = get5(self2.state.map, key); - const state2 = self2.state; + const state = self2.state; const exit3 = exitSucceed(value8); const deferred = makeUnsafe2(); doneUnsafe(deferred, exit3); const ttl = self2.timeToLive(exit3, key); - set4(state2.map, key, { + set4(state.map, key, { scope: makeUnsafe3(), deferred, expiresAt: isFinite2(ttl) ? fiber3.getRef(ClockRef).currentTimeMillisUnsafe() + toMillis(ttl) : undefined }); - const check5 = checkCapacity2(fiber3, state2.map, self2.capacity); + const check5 = checkCapacity2(fiber3, state.map, self2.capacity); return isSome2(oentry) ? flatMap5(close(oentry.value.scope, exitVoid), () => check5) : check5; }))); has13 = /* @__PURE__ */ dual(2, (self2, key) => uninterruptible(withFiber((fiber3) => map8(getImpl2(self2, key, fiber3, false), isNotUndefined)))); @@ -76923,14 +76926,14 @@ var init_TxRef = __esm(() => { init_Effect(); init_Function(); init_Pipeable(); - modify13 = /* @__PURE__ */ dual(2, (self2, f) => Transaction.asEffect().pipe(flatMap7((state2) => sync4(() => { - if (!state2.journal.has(self2)) { - state2.journal.set(self2, { + modify13 = /* @__PURE__ */ dual(2, (self2, f) => Transaction.asEffect().pipe(flatMap7((state) => sync4(() => { + if (!state.journal.has(self2)) { + state.journal.set(self2, { version: self2.version, value: self2.value }); } - const current = state2.journal.get(self2); + const current = state.journal.get(self2); const [returnValue, next3] = f(current.value); current.value = next3; return returnValue; @@ -77584,9 +77587,9 @@ var EnqueueTypeId2 = "~effect/transactions/TxQueue/Enqueue", DequeueTypeId2 = "~ txQueue.stateRef = stateRef; return txQueue; }).pipe(tx), offer3, offerAll3, take14 = (self2) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - if (state2._tag === "Done") { - return yield* failCause5(state2.cause); + const state = yield* get28(self2.stateRef); + if (state._tag === "Done") { + return yield* failCause5(state.cause); } if (yield* isEmpty16(self2)) { return yield* txRetry; @@ -77597,16 +77600,16 @@ var EnqueueTypeId2 = "~effect/transactions/TxQueue/Enqueue", DequeueTypeId2 = "~ return yield* txRetry; } yield* drop5(self2.items, 1); - if (state2._tag === "Closing" && (yield* isEmpty16(self2))) { + if (state._tag === "Closing" && (yield* isEmpty16(self2))) { yield* set17(self2.stateRef, { _tag: "Done", - cause: state2.cause + cause: state.cause }); } return head5.value; }).pipe(tx), poll4 = (self2) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - if (state2._tag === "Done") { + const state = yield* get28(self2.stateRef); + if (state._tag === "Done") { return none2(); } const chunk = yield* get29(self2.items); @@ -77617,9 +77620,9 @@ var EnqueueTypeId2 = "~effect/transactions/TxQueue/Enqueue", DequeueTypeId2 = "~ yield* drop5(self2.items, 1); return some3(head5.value); }).pipe(tx), takeAll5 = (self2) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - if (state2._tag === "Done") { - return yield* failCause5(state2.cause); + const state = yield* get28(self2.stateRef); + if (state._tag === "Done") { + return yield* failCause5(state.cause); } if (yield* isEmpty16(self2)) { return yield* txRetry; @@ -77627,17 +77630,17 @@ var EnqueueTypeId2 = "~effect/transactions/TxQueue/Enqueue", DequeueTypeId2 = "~ const chunk = yield* get29(self2.items); const items2 = toArray2(chunk); yield* set18(self2.items, empty9()); - if (state2._tag === "Closing") { + if (state._tag === "Closing") { yield* set17(self2.stateRef, { _tag: "Done", - cause: state2.cause + cause: state.cause }); } return items2; }).pipe(tx), takeN3, takeBetween3, peek3 = (self2) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - if (state2._tag === "Done") { - return yield* failCause5(state2.cause); + const state = yield* get28(self2.stateRef); + if (state._tag === "Done") { + return yield* failCause5(state.cause); } const chunk = yield* get29(self2.items); const head5 = head3(chunk); @@ -77646,12 +77649,12 @@ var EnqueueTypeId2 = "~effect/transactions/TxQueue/Enqueue", DequeueTypeId2 = "~ } return head5.value; }).pipe(tx), size22 = (self2) => size18(self2.items), isEmpty16 = (self2) => isEmpty12(self2.items), isFull3 = (self2) => self2.capacity === Number.POSITIVE_INFINITY ? succeed8(false) : map12(size22(self2), (currentSize) => currentSize >= self2.capacity), interrupt8 = (self2) => withFiber2((fiber3) => failCause10(self2, interrupt2(fiber3.id))), fail16, failCause10, end3 = (self2) => failCause10(self2, fail4(Done2())), clear11 = (self2) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - if (state2._tag === "Done") { - if (isDoneCause(state2.cause)) { + const state = yield* get28(self2.stateRef); + if (state._tag === "Done") { + if (isDoneCause(state.cause)) { return []; } - return yield* failCause5(state2.cause); + return yield* failCause5(state.cause); } const chunk = yield* get29(self2.items); yield* set18(self2.items, empty9()); @@ -77659,9 +77662,9 @@ var EnqueueTypeId2 = "~effect/transactions/TxQueue/Enqueue", DequeueTypeId2 = "~ }).pipe(tx), shutdown4 = (self2) => gen4(function* () { yield* ignore2(clear11(self2)); return yield* interrupt8(self2); -}).pipe(tx), isOpen = (self2) => map12(get28(self2.stateRef), (state2) => state2._tag === "Open"), isClosing = (self2) => map12(get28(self2.stateRef), (state2) => state2._tag === "Closing"), isDone4 = (self2) => map12(get28(self2.stateRef), (state2) => state2._tag === "Done"), isShutdown2 = (self2) => isDone4(self2), awaitCompletion = (self2) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - if (state2._tag === "Done") { +}).pipe(tx), isOpen = (self2) => map12(get28(self2.stateRef), (state) => state._tag === "Open"), isClosing = (self2) => map12(get28(self2.stateRef), (state) => state._tag === "Closing"), isDone4 = (self2) => map12(get28(self2.stateRef), (state) => state._tag === "Done"), isShutdown2 = (self2) => isDone4(self2), awaitCompletion = (self2) => gen4(function* () { + const state = yield* get28(self2.stateRef); + if (state._tag === "Done") { return; } return yield* txRetry; @@ -77705,8 +77708,8 @@ var init_TxQueue = __esm(() => { } }; offer3 = /* @__PURE__ */ dual(2, (self2, value8) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - if (state2._tag === "Done" || state2._tag === "Closing") { + const state = yield* get28(self2.stateRef); + if (state._tag === "Done" || state._tag === "Closing") { return false; } const currentSize = yield* size22(self2); @@ -77739,9 +77742,9 @@ var init_TxQueue = __esm(() => { return rejected; }).pipe(tx)); takeN3 = /* @__PURE__ */ dual(2, (self2, n7) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - if (state2._tag === "Done") { - return yield* failCause5(state2.cause); + const state = yield* get28(self2.stateRef); + if (state._tag === "Done") { + return yield* failCause5(state.cause); } const currentSize = yield* size22(self2); const requestedCount = n7; @@ -77749,11 +77752,11 @@ var init_TxQueue = __esm(() => { const shouldWaitForFull = requestedCount <= self2.capacity; const minimumRequired = shouldWaitForFull ? requestedCount : maxPossible; if (currentSize < minimumRequired) { - if (state2._tag === "Closing") { + if (state._tag === "Closing") { if (yield* isEmpty16(self2)) { yield* set17(self2.stateRef, { _tag: "Done", - cause: state2.cause + cause: state.cause }); return []; } @@ -77762,7 +77765,7 @@ var init_TxQueue = __esm(() => { yield* set18(self2.items, empty9()); yield* set17(self2.stateRef, { _tag: "Done", - cause: state2.cause + cause: state.cause }); return taken2; } @@ -77772,29 +77775,29 @@ var init_TxQueue = __esm(() => { const chunk = yield* get29(self2.items); const taken = take4(chunk, toTake); yield* drop5(self2.items, toTake); - if (state2._tag === "Closing" && (yield* isEmpty16(self2))) { + if (state._tag === "Closing" && (yield* isEmpty16(self2))) { yield* set17(self2.stateRef, { _tag: "Done", - cause: state2.cause + cause: state.cause }); } return toArray2(taken); }).pipe(tx)); takeBetween3 = /* @__PURE__ */ dual(3, (self2, min11, max11) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - if (state2._tag === "Done") { - return yield* failCause5(state2.cause); + const state = yield* get28(self2.stateRef); + if (state._tag === "Done") { + return yield* failCause5(state.cause); } if (min11 <= 0 || max11 <= 0 || min11 > max11) { return []; } const currentSize = yield* size22(self2); if (currentSize < min11) { - if (state2._tag === "Closing") { + if (state._tag === "Closing") { if (yield* isEmpty16(self2)) { yield* set17(self2.stateRef, { _tag: "Done", - cause: state2.cause + cause: state.cause }); return []; } @@ -77803,7 +77806,7 @@ var init_TxQueue = __esm(() => { yield* set18(self2.items, empty9()); yield* set17(self2.stateRef, { _tag: "Done", - cause: state2.cause + cause: state.cause }); return taken2; } @@ -77813,17 +77816,17 @@ var init_TxQueue = __esm(() => { const chunk = yield* get29(self2.items); const taken = take4(chunk, toTake); yield* drop5(self2.items, toTake); - if (state2._tag === "Closing" && (yield* isEmpty16(self2))) { + if (state._tag === "Closing" && (yield* isEmpty16(self2))) { yield* set17(self2.stateRef, { _tag: "Done", - cause: state2.cause + cause: state.cause }); } return toArray2(taken); }).pipe(tx)); fail16 = /* @__PURE__ */ dual(2, (self2, error46) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - if (state2._tag !== "Open") { + const state = yield* get28(self2.stateRef); + if (state._tag !== "Open") { return false; } yield* set18(self2.items, empty9()); @@ -77834,8 +77837,8 @@ var init_TxQueue = __esm(() => { return true; }).pipe(tx)); failCause10 = /* @__PURE__ */ dual(2, (self2, cause) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - if (state2._tag !== "Open") { + const state = yield* get28(self2.stateRef); + if (state._tag !== "Open") { return false; } if (yield* isEmpty16(self2)) { @@ -78028,64 +78031,64 @@ var TypeId67 = "~effect/transactions/TxReentrantLock", emptyState, TxReentrantLo self2.stateRef = stateRef; return self2; }).pipe(tx), acquireRead = (self2) => withFiber2((fiber3) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); + const state = yield* get28(self2.stateRef); const fiberId3 = fiber3.id; - if (isSome2(state2.writer) && state2.writer.value[0] !== fiberId3) { + if (isSome2(state.writer) && state.writer.value[0] !== fiberId3) { return yield* txRetry; } - const currentCount = getOrElse(get10(state2.readers, fiberId3), () => 0); + const currentCount = getOrElse(get10(state.readers, fiberId3), () => 0); const newCount = currentCount + 1; yield* set17(self2.stateRef, { - ...state2, - readers: set8(state2.readers, fiberId3, newCount) + ...state, + readers: set8(state.readers, fiberId3, newCount) }); return newCount; }).pipe(tx)), acquireWrite = (self2) => withFiber2((fiber3) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); + const state = yield* get28(self2.stateRef); const fiberId3 = fiber3.id; - if (isSome2(state2.writer) && state2.writer.value[0] !== fiberId3) { + if (isSome2(state.writer) && state.writer.value[0] !== fiberId3) { return yield* txRetry; } - for (const [readerId] of state2.readers) { - if (readerId !== fiberId3 && getOrElse(get10(state2.readers, readerId), () => 0) > 0) { + for (const [readerId] of state.readers) { + if (readerId !== fiberId3 && getOrElse(get10(state.readers, readerId), () => 0) > 0) { return yield* txRetry; } } - if (isSome2(state2.writer)) { - const newCount = state2.writer.value[1] + 1; + if (isSome2(state.writer)) { + const newCount = state.writer.value[1] + 1; yield* set17(self2.stateRef, { - ...state2, + ...state, writer: some3([fiberId3, newCount]) }); return newCount; } yield* set17(self2.stateRef, { - ...state2, + ...state, writer: some3([fiberId3, 1]) }); return 1; }).pipe(tx)), releaseRead = (self2) => withFiber2((fiber3) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); + const state = yield* get28(self2.stateRef); const fiberId3 = fiber3.id; - const currentCount = getOrElse(get10(state2.readers, fiberId3), () => 0); + const currentCount = getOrElse(get10(state.readers, fiberId3), () => 0); if (currentCount <= 0) return 0; const newCount = currentCount - 1; - const newReaders = newCount === 0 ? remove7(state2.readers, fiberId3) : set8(state2.readers, fiberId3, newCount); + const newReaders = newCount === 0 ? remove7(state.readers, fiberId3) : set8(state.readers, fiberId3, newCount); yield* set17(self2.stateRef, { - ...state2, + ...state, readers: newReaders }); return newCount; }).pipe(tx)), releaseWrite = (self2) => withFiber2((fiber3) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); + const state = yield* get28(self2.stateRef); const fiberId3 = fiber3.id; - if (isNone2(state2.writer) || state2.writer.value[0] !== fiberId3) + if (isNone2(state.writer) || state.writer.value[0] !== fiberId3) return 0; - const newCount = state2.writer.value[1] - 1; + const newCount = state.writer.value[1] - 1; const newWriter = newCount <= 0 ? none2() : some3([fiberId3, newCount]); yield* set17(self2.stateRef, { - ...state2, + ...state, writer: newWriter }); return newCount; @@ -78104,24 +78107,24 @@ var TypeId67 = "~effect/transactions/TxReentrantLock", emptyState, TxReentrantLo const [self2, effect2] = args3; return acquireUseRelease2(acquireWrite(self2), () => effect2, () => releaseWrite(self2)); }, withLock, readLocks = (self2) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); + const state = yield* get28(self2.stateRef); let total = 0; - for (const [, count3] of state2.readers) { + for (const [, count3] of state.readers) { total += count3; } return total; }), writeLocks = (self2) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - return isSome2(state2.writer) ? state2.writer.value[1] : 0; + const state = yield* get28(self2.stateRef); + return isSome2(state.writer) ? state.writer.value[1] : 0; }), locked = (self2) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - return size9(state2.readers) > 0 || isSome2(state2.writer); + const state = yield* get28(self2.stateRef); + return size9(state.readers) > 0 || isSome2(state.writer); }), readLocked = (self2) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - return size9(state2.readers) > 0; + const state = yield* get28(self2.stateRef); + return size9(state.readers) > 0; }), writeLocked = (self2) => gen4(function* () { - const state2 = yield* get28(self2.stateRef); - return isSome2(state2.writer); + const state = yield* get28(self2.stateRef); + return isSome2(state.writer); }), isTxReentrantLock = (u) => hasProperty(u, TypeId67); var init_TxReentrantLock = __esm(() => { init_Effect(); @@ -79207,8 +79210,8 @@ class ParseStatus { } } var makeIssue = (params) => { - const { data: data2, path: path5, errorMaps, issueData } = params; - const fullPath = [...path5, ...issueData.path || []]; + const { data: data2, path: path6, errorMaps, issueData } = params; + const fullPath = [...path6, ...issueData.path || []]; const fullIssue = { ...issueData, path: fullPath @@ -79253,11 +79256,11 @@ var init_errorUtil = __esm(() => { // node_modules/zod-to-json-schema/node_modules/zod/v3/types.js class ParseInputLazyPath { - constructor(parent, value8, path5, key) { + constructor(parent, value8, path6, key) { this._cachedPath = []; this.parent = parent; this.data = value8; - this._path = path5; + this._path = path6; this._key = key; } get path() { @@ -84213,10 +84216,10 @@ function mergeParameters(...params) { }, /* @__PURE__ */ new Map); return Array.from(merged.values()); } -function getPathContext(path5) { +function getPathContext(path6) { const context2 = []; for (const [key, data2] of specsByPathContext) { - if (data2 && path5.match(key)) { + if (data2 && path6.match(key)) { context2.push(data2); } } @@ -84268,24 +84271,24 @@ function registerSchemaPath({ specs, paths }) { - const path5 = toOpenAPIPath(route.path); + const path6 = toOpenAPIPath(route.path); const method = route.method.toLowerCase(); if (method === "all") { if (!specs) return; - if (specsByPathContext.has(path5)) { - const prev2 = specsByPathContext.get(path5) ?? {}; - specsByPathContext.set(path5, mergeSpecs(route, prev2, specs)); + if (specsByPathContext.has(path6)) { + const prev2 = specsByPathContext.get(path6) ?? {}; + specsByPathContext.set(path6, mergeSpecs(route, prev2, specs)); } else { - specsByPathContext.set(path5, specs); + specsByPathContext.set(path6, specs); } } else { - const pathContext = getPathContext(path5); - if (!(path5 in paths)) { - paths[path5] = {}; + const pathContext = getPathContext(path6); + if (!(path6 in paths)) { + paths[path6] = {}; } - if (paths[path5]) { - paths[path5][method] = mergeSpecs(route, ...pathContext, paths[path5]?.[method], specs); + if (paths[path6]) { + paths[path6][method] = mergeSpecs(route, ...pathContext, paths[path6]?.[method], specs); } } } @@ -84376,16 +84379,16 @@ async function generateSpecs(hono, options2 = DEFAULT_OPTIONS, c) { const _documentation = ctx.options.documentation ?? {}; clearSpecsContext(); const paths = await generatePaths(hono, ctx); - for (const path5 in paths) { - for (const method in paths[path5]) { + for (const path6 in paths) { + for (const method in paths[path6]) { const isHidden = getHiddenValue({ - valueOrFunc: paths[path5][method]?.hide, + valueOrFunc: paths[path6][method]?.hide, method, - path: path5, + path: path6, c }); if (isHidden) { - paths[path5][method] = undefined; + paths[path6][method] = undefined; } } } @@ -84441,13 +84444,13 @@ async function generatePaths(hono, ctx) { return paths; } function getHiddenValue(options2) { - const { valueOrFunc, c, method, path: path5 } = options2; + const { valueOrFunc, c, method, path: path6 } = options2; if (valueOrFunc != null) { if (typeof valueOrFunc === "boolean") { return valueOrFunc; } if (typeof valueOrFunc === "function") { - return valueOrFunc({ c, method, path: path5 }); + return valueOrFunc({ c, method, path: path6 }); } } return false; @@ -84592,7 +84595,7 @@ function describeRoute(spec) { } }); } -var uniqueSymbol, ALLOWED_METHODS, toOpenAPIPath = (path5) => path5.split("/").map((x2) => { +var uniqueSymbol, ALLOWED_METHODS, toOpenAPIPath = (path6) => path6.split("/").map((x2) => { let tmp = x2; if (tmp.startsWith(":")) { const match16 = tmp.match(/^:([^{?]+)(?:{(.+)})?(\?)?$/); @@ -84698,7 +84701,16 @@ var init_constants = __esm(() => { // node_modules/hono/dist/utils/body.js async function parseFormData(request3, options2) { - const formData = await request3.formData(); + if (!isRawRequest(request3) && request3.bodyCache.formData) { + return convertFormDataToBodyData(await request3.bodyCache.formData, options2); + } + const headers = isRawRequest(request3) ? request3.headers : request3.raw.headers; + const arrayBuffer = await request3.arrayBuffer(); + const formDataPromise = bufferToFormData(arrayBuffer, headers.get("Content-Type") || ""); + if (!isRawRequest(request3)) { + request3.bodyCache.formData = formDataPromise; + } + const formData = await formDataPromise; if (formData) { return convertFormDataToBodyData(formData, options2); } @@ -84725,11 +84737,12 @@ function convertFormDataToBodyData(formData, options2) { } return form; } -var parseBody = async (request3, options2 = /* @__PURE__ */ Object.create(null)) => { +var isRawRequest = (request3) => ("headers" in request3), parseBody = async (request3, options2 = /* @__PURE__ */ Object.create(null)) => { const { all: all7 = false, dot = false } = options2; - const headers = request3 instanceof HonoRequest ? request3.raw.headers : request3.headers; + const headers = isRawRequest(request3) ? request3.headers : request3.raw.headers; const contentType = headers.get("Content-Type"); - if (contentType?.startsWith("multipart/form-data") || contentType?.startsWith("application/x-www-form-urlencoded")) { + const mediaType = contentType?.split(";")[0].trim().toLowerCase(); + if (mediaType === "multipart/form-data" || mediaType === "application/x-www-form-urlencoded") { return parseFormData(request3, { all: all7, dot }); } return {}; @@ -84765,11 +84778,11 @@ var parseBody = async (request3, options2 = /* @__PURE__ */ Object.create(null)) }); }; var init_body = __esm(() => { - init_request2(); + init_buffer(); }); // node_modules/hono/dist/request.js -var tryDecodeURIComponent = (str2) => tryDecode(str2, decodeURIComponent_), HonoRequest; +var HonoRequest; var init_request2 = __esm(() => { init_http_exception(); init_constants(); @@ -84782,11 +84795,10 @@ var init_request2 = __esm(() => { routeIndex = 0; path; bodyCache = {}; - constructor(request3, path5 = "/", matchResult = [[]]) { + constructor(request3, path6 = "/", matchResult = [[]]) { this.raw = request3; - this.path = path5; + this.path = path6; this.#matchResult = matchResult; - this.#validatedData = {}; } param(key) { return key ? this.#getDecodedParam(key) : this.#getAllDecodedParams(); @@ -84794,7 +84806,7 @@ var init_request2 = __esm(() => { #getDecodedParam(key) { const paramKey2 = this.#matchResult[0][this.routeIndex][1][key]; const param = this.#getParamValue(paramKey2); - return param && /\%/.test(param) ? tryDecodeURIComponent(param) : param; + return param && tryDecodeURIComponent(param); } #getAllDecodedParams() { const decoded = {}; @@ -84802,7 +84814,7 @@ var init_request2 = __esm(() => { for (const key of keys12) { const value8 = this.#getParamValue(this.#matchResult[0][this.routeIndex][1][key]); if (value8 !== undefined) { - decoded[key] = /\%/.test(value8) ? tryDecodeURIComponent(value8) : value8; + decoded[key] = tryDecodeURIComponent(value8); } } return decoded; @@ -84820,7 +84832,7 @@ var init_request2 = __esm(() => { if (name2) { return this.raw.headers.get(name2) ?? undefined; } - const headerData = {}; + const headerData = /* @__PURE__ */ Object.create(null); this.raw.headers.forEach((value8, key) => { headerData[key] = value8; }); @@ -84835,8 +84847,7 @@ var init_request2 = __esm(() => { if (cachedBody) { return cachedBody; } - const anyCachedKey = Object.keys(bodyCache)[0]; - if (anyCachedKey) { + for (const anyCachedKey in bodyCache) { return bodyCache[anyCachedKey].then((body2) => { if (anyCachedKey === "json") { body2 = JSON.stringify(body2); @@ -84855,6 +84866,9 @@ var init_request2 = __esm(() => { arrayBuffer() { return this.#cachedBody("arrayBuffer"); } + bytes() { + return this.#cachedBody("arrayBuffer").then((buffer3) => new Uint8Array(buffer3)); + } blob() { return this.#cachedBody("blob"); } @@ -84862,10 +84876,10 @@ var init_request2 = __esm(() => { return this.#cachedBody("formData"); } addValidatedData(target, data2) { - this.#validatedData[target] = data2; + (this.#validatedData ??= {})[target] = data2; } valid(target) { - return this.#validatedData[target]; + return this.#validatedData?.[target]; } get url() { return this.raw.url; @@ -85039,11 +85053,11 @@ var TEXT_PLAIN = "text/plain; charset=UTF-8", setDefaultContentType = (contentTy return Object.fromEntries(this.#var); } #newResponse(data2, arg, headers) { - const responseHeaders = this.#res ? new Headers(this.#res.headers) : this.#preparedHeaders ?? new Headers; - if (typeof arg === "object" && "headers" in arg) { - const argHeaders = arg.headers instanceof Headers ? arg.headers : new Headers(arg.headers); - for (const [key, value8] of argHeaders) { - if (key.toLowerCase() === "set-cookie") { + let responseHeaders = this.#res ? new Headers(this.#res.headers) : this.#preparedHeaders; + if (typeof arg === "object" && arg.headers) { + responseHeaders ??= new Headers; + for (const [key, value8] of new Headers(arg.headers)) { + if (key === "set-cookie") { responseHeaders.append(key, value8); } else { responseHeaders.set(key, value8); @@ -85051,19 +85065,34 @@ var TEXT_PLAIN = "text/plain; charset=UTF-8", setDefaultContentType = (contentTy } } if (headers) { - for (const [k2, v2] of Object.entries(headers)) { - if (typeof v2 === "string") { - responseHeaders.set(k2, v2); - } else { - responseHeaders.delete(k2); - for (const v22 of v2) { - responseHeaders.append(k2, v22); + if (!responseHeaders) { + let count3 = 0; + for (const k2 in headers) { + if (++count3 > 1 || typeof headers[k2] !== "string") { + responseHeaders = new Headers; + break; + } + } + } + if (responseHeaders) { + for (const k2 in headers) { + const v2 = headers[k2]; + if (typeof v2 === "string") { + responseHeaders.set(k2, v2); + } else { + responseHeaders.delete(k2); + for (const v22 of v2) { + responseHeaders.append(k2, v22); + } } } } } const status = typeof arg === "number" ? arg : arg?.status ?? this.#status; - return createResponseInstance(data2, { status, headers: responseHeaders }); + return createResponseInstance(data2, { + status, + headers: responseHeaders ?? headers + }); } newResponse = (...args3) => this.#newResponse(...args3); body = (data2, arg, headers) => this.#newResponse(data2, arg, headers); @@ -85095,7 +85124,7 @@ var init_context = __esm(() => { // node_modules/hono/dist/router.js var METHOD_NAME_ALL = "ALL", METHOD_NAME_ALL_LOWERCASE = "all", METHODS, MESSAGE_MATCHER_IS_ALREADY_BUILT = "Can not add a route since the matcher is already built.", UnsupportedPathError; var init_router = __esm(() => { - METHODS = ["get", "post", "put", "delete", "options", "patch"]; + METHODS = ["get", "post", "put", "delete", "options", "patch", "query"]; UnsupportedPathError = class extends Error { }; }); @@ -85121,6 +85150,7 @@ var notFoundHandler = (c) => { delete; options; patch; + query; all; on; use; @@ -85144,8 +85174,8 @@ var notFoundHandler = (c) => { return this; }; }); - this.on = (method, path5, ...handlers) => { - for (const p of [path5].flat()) { + this.on = (method, path6, ...handlers) => { + for (const p of [path6].flat()) { this.#path = p; for (const m of [method].flat()) { handlers.map((handler) => { @@ -85183,8 +85213,8 @@ var notFoundHandler = (c) => { } #notFoundHandler = notFoundHandler; errorHandler = errorHandler; - route(path5, app2) { - const subApp = this.basePath(path5); + route(path6, app2) { + const subApp = this.basePath(path6); app2.routes.map((r) => { let handler; if (app2.errorHandler === errorHandler) { @@ -85193,13 +85223,13 @@ var notFoundHandler = (c) => { handler = async (c, next3) => (await compose5([], app2.errorHandler)(c, () => r.handler(c, next3))).res; handler[COMPOSED_HANDLER] = r.handler; } - subApp.#addRoute(r.method, r.path, handler); + subApp.#addRoute(r.method, r.path, handler, r.basePath); }); return this; } - basePath(path5) { + basePath(path6) { const subApp = this.#clone(); - subApp._basePath = mergePath(this._basePath, path5); + subApp._basePath = mergePath(this._basePath, path6); return subApp; } onError = (handler) => { @@ -85210,7 +85240,7 @@ var notFoundHandler = (c) => { this.#notFoundHandler = handler; return this; }; - mount(path5, applicationHandler, options2) { + mount(path6, applicationHandler, options2) { let replaceRequest; let optionHandler; if (options2) { @@ -85236,11 +85266,11 @@ var notFoundHandler = (c) => { return [c.env, executionContext]; }; replaceRequest ||= (() => { - const mergedPath = mergePath(this._basePath, path5); + const mergedPath = mergePath(this._basePath, path6); const pathPrefixLength = mergedPath === "/" ? 0 : mergedPath.length; return (request3) => { const url3 = new URL(request3.url); - url3.pathname = url3.pathname.slice(pathPrefixLength) || "/"; + url3.pathname = this.getPath(request3).slice(pathPrefixLength) || "/"; return new Request(url3, request3); }; })(); @@ -85251,14 +85281,19 @@ var notFoundHandler = (c) => { } await next3(); }; - this.#addRoute(METHOD_NAME_ALL, mergePath(path5, "*"), handler); + this.#addRoute(METHOD_NAME_ALL, mergePath(path6, "*"), handler); return this; } - #addRoute(method, path5, handler) { + #addRoute(method, path6, handler, baseRoutePath) { method = method.toUpperCase(); - path5 = mergePath(this._basePath, path5); - const r = { basePath: this._basePath, path: path5, method, handler }; - this.router.add(method, path5, [handler, r]); + path6 = mergePath(this._basePath, path6); + const r = { + basePath: baseRoutePath !== undefined ? mergePath(this._basePath, baseRoutePath) : this._basePath, + path: path6, + method, + handler + }; + this.router.add(method, path6, [handler, r]); this.routes.push(r); } #handleError(err2, c) { @@ -85271,10 +85306,10 @@ var notFoundHandler = (c) => { if (method === "HEAD") { return (async () => new Response(null, await this.#dispatch(request3, executionCtx, env3, "GET")))(); } - const path5 = this.getPath(request3, { env: env3 }); - const matchResult = this.router.match(method, path5); + const path6 = this.getPath(request3, { env: env3 }); + const matchResult = this.router.match(method, path6); const c = new Context2(request3, { - path: path5, + path: path6, matchResult, env: env3, executionCtx, @@ -85329,7 +85364,7 @@ var init_hono_base = __esm(() => { }); // node_modules/hono/dist/router/reg-exp-router/matcher.js -function match16(method, path5) { +function match16(method, path6) { const matchers = this.buildAllMatchers(); const match22 = (method2, path22) => { const matcher = matchers[method2] || matchers[METHOD_NAME_ALL]; @@ -85345,7 +85380,7 @@ function match16(method, path5) { return [matcher[1][index2], match32]; }; this.match = match22; - return match22(method, path5); + return match22(method, path6); } var emptyParam; var init_matcher2 = __esm(() => { @@ -85362,7 +85397,7 @@ function compareKey(a, b) { return 1; } if (a === ONLY_WILDCARD_REG_EXP_STR || a === TAIL_WILDCARD_REG_EXP_STR) { - return 1; + return b === TAIL_WILDCARD_REG_EXP_STR ? -1 : 1; } else if (b === ONLY_WILDCARD_REG_EXP_STR || b === TAIL_WILDCARD_REG_EXP_STR) { return -1; } @@ -85377,69 +85412,68 @@ var LABEL_REG_EXP_STR = "[^/]+", ONLY_WILDCARD_REG_EXP_STR = ".*", TAIL_WILDCARD #index; #varIndex; #children = /* @__PURE__ */ Object.create(null); - insert(tokens, index2, paramMap, context2, pathErrorCheckOnly) { - if (tokens.length === 0) { - if (this.#index !== undefined) { - throw PATH_ERROR; - } - if (pathErrorCheckOnly) { - return; - } - this.#index = index2; - return; - } - const [token, ...restTokens] = tokens; - const pattern = token === "*" ? restTokens.length === 0 ? ["", "", ONLY_WILDCARD_REG_EXP_STR] : ["", "", LABEL_REG_EXP_STR] : token === "/*" ? ["", "", TAIL_WILDCARD_REG_EXP_STR] : token.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/); - let node; - if (pattern) { - const name2 = pattern[1]; - let regexpStr = pattern[2] || LABEL_REG_EXP_STR; - if (name2 && pattern[2]) { - if (regexpStr === ".*") { - throw PATH_ERROR; - } - regexpStr = regexpStr.replace(/^\((?!\?:)(?=[^)]+\)$)/, "(?:"); - if (/\((?!\?:)/.test(regexpStr)) { - throw PATH_ERROR; - } - } - node = this.#children[regexpStr]; - if (!node) { - if (Object.keys(this.#children).some((k2) => k2 !== ONLY_WILDCARD_REG_EXP_STR && k2 !== TAIL_WILDCARD_REG_EXP_STR)) { - throw PATH_ERROR; - } - if (pathErrorCheckOnly) { - return; + insert(tokens, index2, paramMap, context2, isStatic) { + let node = this; + for (let i2 = 0, len = tokens.length;i2 < len; i2++) { + const token = tokens[i2]; + const pattern = token.length === 1 ? token === "*" ? i2 === len - 1 ? ["", "", ONLY_WILDCARD_REG_EXP_STR] : ["", "", LABEL_REG_EXP_STR] : null : token === "/*" ? ["", "", TAIL_WILDCARD_REG_EXP_STR] : token.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/); + let nextNode; + if (pattern) { + const name2 = pattern[1]; + let regexpStr = pattern[2] || LABEL_REG_EXP_STR; + if (name2 && pattern[2]) { + if (regexpStr === ".*") { + throw PATH_ERROR; + } + regexpStr = regexpStr.replace(/^\((?!\?:)(?=[^)]+\)$)/, "(?:"); + if (/\((?!\?:)/.test(regexpStr)) { + throw PATH_ERROR; + } + if (regexpStr.length === 1 && regExpMetaChars.has(regexpStr)) { + throw PATH_ERROR; + } + } + nextNode = node.#children[regexpStr]; + if (!nextNode) { + if (regexpStr !== ONLY_WILDCARD_REG_EXP_STR && regexpStr !== TAIL_WILDCARD_REG_EXP_STR) { + for (const k2 in node.#children) { + if ((regexpStr.length > 1 || k2.length > 1) && k2 !== ONLY_WILDCARD_REG_EXP_STR && k2 !== TAIL_WILDCARD_REG_EXP_STR) { + throw PATH_ERROR; + } + } + } + nextNode = node.#children[regexpStr] = new _Node; } - node = this.#children[regexpStr] = new _Node; if (name2 !== "") { - node.#varIndex = context2.varIndex++; - } - } - if (!pathErrorCheckOnly && name2 !== "") { - paramMap.push([name2, node.#varIndex]); - } - } else { - node = this.#children[token]; - if (!node) { - if (Object.keys(this.#children).some((k2) => k2.length > 1 && k2 !== ONLY_WILDCARD_REG_EXP_STR && k2 !== TAIL_WILDCARD_REG_EXP_STR)) { - throw PATH_ERROR; + nextNode.#varIndex ??= context2.varIndex++; + paramMap.push([name2, nextNode.#varIndex]); } - if (pathErrorCheckOnly) { - return; + } else { + nextNode = node.#children[token]; + if (!nextNode) { + for (const k2 in node.#children) { + if (k2.length > 1 && k2 !== ONLY_WILDCARD_REG_EXP_STR && k2 !== TAIL_WILDCARD_REG_EXP_STR) { + throw PATH_ERROR; + } + } + nextNode = node.#children[token] = new _Node; } - node = this.#children[token] = new _Node; } + node = nextNode; } - node.insert(restTokens, index2, paramMap, context2, pathErrorCheckOnly); + if (node.#index !== undefined) { + throw PATH_ERROR; + } + node.#index = isStatic ? -1 : index2; } buildRegExpStr() { const childKeys = Object.keys(this.#children).sort(compareKey); const strList = childKeys.map((k2) => { const c = this.#children[k2]; - return (typeof c.#varIndex === "number" ? `(${k2})@${c.#varIndex}` : regExpMetaChars.has(k2) ? `\\${k2}` : k2) + c.buildRegExpStr(); - }); - if (typeof this.#index === "number") { + const childStr = c.buildRegExpStr(); + return childStr === "" ? "" : (typeof c.#varIndex === "number" ? `(${k2})@${c.#varIndex}` : regExpMetaChars.has(k2) ? `\\${k2}` : k2) + childStr; + }).filter(Boolean); + if (typeof this.#index === "number" && this.#index !== -1) { strList.unshift(`#${this.#index}`); } if (strList.length === 0) { @@ -85460,12 +85494,19 @@ var init_node = __esm(() => { var Trie = class { #context = { varIndex: 0 }; #root = new Node2; - insert(path5, index2, pathErrorCheckOnly) { + #index = 0; + paths = /* @__PURE__ */ Object.create(null); + insert(path6, isStatic) { + if (isStatic) { + this.#root.insert(path6.split(""), 0, [], this.#context, true); + return; + } const paramAssoc = []; const groups = []; + let markedPath = path6; for (let i2 = 0;; ) { let replaced = false; - path5 = path5.replace(/\{[^}]+\}/g, (m) => { + markedPath = markedPath.replace(/\{[^}]+\}/g, (m) => { const mark = `@\\${i2}`; groups[i2] = [mark, m]; i2++; @@ -85476,7 +85517,7 @@ var Trie = class { break; } } - const tokens = path5.match(/(?::[^\/]+)|(?:\/\*$)|./g) || []; + const tokens = markedPath.match(/(?::[^\/]+)|(?:\/\*$)|./g) || []; for (let i2 = groups.length - 1;i2 >= 0; i2--) { const [mark] = groups[i2]; for (let j2 = tokens.length - 1;j2 >= 0; j2--) { @@ -85486,8 +85527,8 @@ var Trie = class { } } } - this.#root.insert(tokens, index2, paramAssoc, this.#context, pathErrorCheckOnly); - return paramAssoc; + this.#root.insert(tokens, this.#index, paramAssoc, this.#context, false); + this.paths[path6] = [this.#index++, paramAssoc]; } buildRegExp() { let regexp = this.#root.buildRegExpStr(); @@ -85516,111 +85557,68 @@ var init_trie2 = __esm(() => { }); // node_modules/hono/dist/router/reg-exp-router/router.js -function buildWildcardRegExp(path5) { - return wildcardRegExpCache[path5] ??= new RegExp(path5 === "*" ? "" : `^${path5.replace(/\/\*$|([.\\+*[^\]$()])/g, (_2, metaChar) => metaChar ? `\\${metaChar}` : "(?:|/.*)")}$`); +function buildWildcardRegExp(path6) { + return wildcardRegExpCache[path6] ??= new RegExp(path6 === "*" ? "" : `^${path6.replace(/\/\*$|([.\\+*[^\]$()])/g, (_2, metaChar) => metaChar ? `\\${metaChar}` : "(?:|/.*)")}$`); } function clearWildcardRegExpCache() { wildcardRegExpCache = /* @__PURE__ */ Object.create(null); } -function buildMatcherFromPreprocessedRoutes(routes) { - const trie = new Trie; - const handlerData = []; - if (routes.length === 0) { - return nullMatcher; - } - const routesWithStaticPathFlag = routes.map((route) => [!/\*|\/:/.test(route[0]), ...route]).sort(([isStaticA, pathA], [isStaticB, pathB]) => isStaticA ? 1 : isStaticB ? -1 : pathA.length - pathB.length); - const staticMap = /* @__PURE__ */ Object.create(null); - for (let i2 = 0, j2 = -1, len = routesWithStaticPathFlag.length;i2 < len; i2++) { - const [pathErrorCheckOnly, path5, handlers] = routesWithStaticPathFlag[i2]; - if (pathErrorCheckOnly) { - staticMap[path5] = [handlers.map(([h2]) => [h2, /* @__PURE__ */ Object.create(null)]), emptyParam]; - } else { - j2++; - } - let paramAssoc; - try { - paramAssoc = trie.insert(path5, j2, pathErrorCheckOnly); - } catch (e) { - throw e === PATH_ERROR ? new UnsupportedPathError(path5) : e; - } - if (pathErrorCheckOnly) { - continue; - } - handlerData[j2] = handlers.map(([h2, paramCount]) => { - const paramIndexMap = /* @__PURE__ */ Object.create(null); - paramCount -= 1; - for (;paramCount >= 0; paramCount--) { - const [key, value8] = paramAssoc[paramCount]; - paramIndexMap[key] = value8; - } - return [h2, paramIndexMap]; - }); - } - const [regexp, indexReplacementMap, paramReplacementMap] = trie.buildRegExp(); - for (let i2 = 0, len = handlerData.length;i2 < len; i2++) { - for (let j2 = 0, len2 = handlerData[i2].length;j2 < len2; j2++) { - const map32 = handlerData[i2][j2]?.[1]; - if (!map32) { - continue; - } - const keys12 = Object.keys(map32); - for (let k2 = 0, len3 = keys12.length;k2 < len3; k2++) { - map32[keys12[k2]] = paramReplacementMap[map32[keys12[k2]]]; - } - } - } - const handlerMap = []; - for (const i2 in indexReplacementMap) { - handlerMap[i2] = handlerData[indexReplacementMap[i2]]; - } - return [regexp, handlerMap, staticMap]; -} -function findMiddleware(middleware, path5) { +function findMiddleware(middleware, path6) { if (!middleware) { return; } for (const k2 of Object.keys(middleware).sort((a, b) => b.length - a.length)) { - if (buildWildcardRegExp(k2).test(path5)) { + if (buildWildcardRegExp(k2).test(path6)) { return [...middleware[k2]]; } } return; } -var nullMatcher, wildcardRegExpCache, RegExpRouter = class { +var wildcardRegExpCache, RegExpRouter = class { name = "RegExpRouter"; #middleware; #routes; + #tries; constructor() { this.#middleware = { [METHOD_NAME_ALL]: /* @__PURE__ */ Object.create(null) }; this.#routes = { [METHOD_NAME_ALL]: /* @__PURE__ */ Object.create(null) }; + this.#tries = { [METHOD_NAME_ALL]: new Trie }; } - add(method, path5, handler) { + #insertPath(method, path6) { + try { + this.#tries[method].insert(path6, !/\*|\/:/.test(path6)); + } catch (e) { + throw e === PATH_ERROR ? new UnsupportedPathError(path6) : e; + } + } + add(method, path6, handler) { const middleware = this.#middleware; const routes = this.#routes; if (!middleware || !routes) { throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT); } if (!middleware[method]) { + this.#tries[method] = new Trie; [middleware, routes].forEach((handlerMap) => { handlerMap[method] = /* @__PURE__ */ Object.create(null); Object.keys(handlerMap[METHOD_NAME_ALL]).forEach((p) => { handlerMap[method][p] = [...handlerMap[METHOD_NAME_ALL][p]]; + this.#insertPath(method, p); }); }); } - if (path5 === "/*") { - path5 = "*"; + if (path6 === "/*") { + path6 = "*"; } - const paramCount = (path5.match(/\/:/g) || []).length; - if (/\*$/.test(path5)) { - const re2 = buildWildcardRegExp(path5); - if (method === METHOD_NAME_ALL) { - Object.keys(middleware).forEach((m) => { - middleware[m][path5] ||= findMiddleware(middleware[m], path5) || findMiddleware(middleware[METHOD_NAME_ALL], path5) || []; - }); - } else { - middleware[method][path5] ||= findMiddleware(middleware[method], path5) || findMiddleware(middleware[METHOD_NAME_ALL], path5) || []; - } + const paramCount = (path6.match(/\/:/g) || []).length; + if (/\*$/.test(path6)) { + const re2 = buildWildcardRegExp(path6); + Object.keys(middleware).forEach((m) => { + if ((method === METHOD_NAME_ALL || method === m) && !middleware[m][path6]) { + this.#insertPath(m, path6); + middleware[m][path6] = findMiddleware(middleware[m], path6) || findMiddleware(middleware[METHOD_NAME_ALL], path6) || []; + } + }); Object.keys(middleware).forEach((m) => { if (method === METHOD_NAME_ALL || method === m) { Object.keys(middleware[m]).forEach((p) => { @@ -85635,14 +85633,17 @@ var nullMatcher, wildcardRegExpCache, RegExpRouter = class { }); return; } - const paths = checkOptionalParameter(path5) || [path5]; + const paths = checkOptionalParameter(path6) || [path6]; for (let i2 = 0, len = paths.length;i2 < len; i2++) { const path22 = paths[i2]; Object.keys(routes).forEach((m) => { if (method === METHOD_NAME_ALL || method === m) { - routes[m][path22] ||= [ - ...findMiddleware(middleware[m], path22) || findMiddleware(middleware[METHOD_NAME_ALL], path22) || [] - ]; + if (!routes[m][path22]) { + this.#insertPath(m, path22); + routes[m][path22] = [ + ...findMiddleware(middleware[m], path22) || findMiddleware(middleware[METHOD_NAME_ALL], path22) || [] + ]; + } routes[m][path22].push([handler, paramCount - len + i2 + 1]); } }); @@ -85654,27 +85655,54 @@ var nullMatcher, wildcardRegExpCache, RegExpRouter = class { Object.keys(this.#routes).concat(Object.keys(this.#middleware)).forEach((method) => { matchers[method] ||= this.#buildMatcher(method); }); - this.#middleware = this.#routes = undefined; + this.#middleware = this.#routes = this.#tries = undefined; clearWildcardRegExpCache(); return matchers; } #buildMatcher(method) { - const routes = []; - let hasOwnRoute = method === METHOD_NAME_ALL; - [this.#middleware, this.#routes].forEach((r) => { - const ownRoute = r[method] ? Object.keys(r[method]).map((path5) => [path5, r[method][path5]]) : []; - if (ownRoute.length !== 0) { - hasOwnRoute ||= true; - routes.push(...ownRoute); - } else if (method !== METHOD_NAME_ALL) { - routes.push(...Object.keys(r[METHOD_NAME_ALL]).map((path5) => [path5, r[METHOD_NAME_ALL][path5]])); - } - }); - if (!hasOwnRoute) { - return null; - } else { - return buildMatcherFromPreprocessedRoutes(routes); + const middleware = this.#middleware[method]; + const routes = this.#routes[method]; + const trie = this.#tries[method]; + const staticMap = /* @__PURE__ */ Object.create(null); + const handlerData = []; + [middleware, routes].forEach((r) => { + for (const path6 in r) { + const handlers = r[path6]; + const pathData = trie.paths[path6]; + if (!pathData) { + staticMap[path6] = [handlers.map(([h2]) => [h2, /* @__PURE__ */ Object.create(null)]), emptyParam]; + continue; + } + const paramAssoc = pathData[1]; + handlerData[pathData[0]] = handlers.map(([h2, paramCount]) => { + const paramIndexMap = /* @__PURE__ */ Object.create(null); + paramCount -= 1; + for (;paramCount >= 0; paramCount--) { + const [key, value8] = paramAssoc[paramCount]; + paramIndexMap[key] = value8; + } + return [h2, paramIndexMap]; + }); + } + }); + const [regexp, indexReplacementMap, paramReplacementMap] = trie.buildRegExp(); + for (let i2 = 0, len = handlerData.length;i2 < len; i2++) { + for (let j2 = 0, len2 = handlerData[i2].length;j2 < len2; j2++) { + const map32 = handlerData[i2][j2]?.[1]; + if (!map32) { + continue; + } + const keys12 = Object.keys(map32); + for (let k2 = 0, len3 = keys12.length;k2 < len3; k2++) { + map32[keys12[k2]] = paramReplacementMap[map32[keys12[k2]]]; + } + } + } + const handlerMap = []; + for (const i2 in indexReplacementMap) { + handlerMap[i2] = handlerData[indexReplacementMap[i2]]; } + return [regexp, handlerMap, staticMap]; } }; var init_router2 = __esm(() => { @@ -85683,7 +85711,6 @@ var init_router2 = __esm(() => { init_matcher2(); init_node(); init_trie2(); - nullMatcher = [/^$/, [], /* @__PURE__ */ Object.create(null)]; wildcardRegExpCache = /* @__PURE__ */ Object.create(null); }); @@ -85701,21 +85728,21 @@ var PreparedRegExpRouter = class { matcher[1].forEach((list) => list && list.push(handlerData)); Object.values(matcher[2]).forEach((list) => list[0].push(handlerData)); } - #addPath(method, path5, handler, indexes, map32) { + #addPath(method, path6, handler, indexes, map32) { const matcher = this.#matchers[method]; if (!map32) { - matcher[2][path5][0].push([handler, {}]); + matcher[2][path6][0].push([handler, {}]); } else { indexes.forEach((index2) => { if (typeof index2 === "number") { matcher[1][index2].push([handler, map32]); } else { - matcher[2][index2 || path5][0].push([handler, map32]); + matcher[2][index2 || path6][0].push([handler, map32]); } }); } } - add(method, path5, handler) { + add(method, path6, handler) { if (!this.#matchers[method]) { const all7 = this.#matchers[METHOD_NAME_ALL]; const staticMap = {}; @@ -85728,7 +85755,7 @@ var PreparedRegExpRouter = class { staticMap ]; } - if (path5 === "/*" || path5 === "*") { + if (path6 === "/*" || path6 === "*") { const handlerData = [handler, {}]; if (method === METHOD_NAME_ALL) { for (const m in this.#matchers) { @@ -85739,17 +85766,17 @@ var PreparedRegExpRouter = class { } return; } - const data2 = this.#relocateMap[path5]; + const data2 = this.#relocateMap[path6]; if (!data2) { - throw new Error(`Path ${path5} is not registered`); + throw new Error(`Path ${path6} is not registered`); } for (const [indexes, map32] of data2) { if (method === METHOD_NAME_ALL) { for (const m in this.#matchers) { - this.#addPath(m, path5, handler, indexes, map32); + this.#addPath(m, path6, handler, indexes, map32); } } else { - this.#addPath(method, path5, handler, indexes, map32); + this.#addPath(method, path6, handler, indexes, map32); } } } @@ -85778,13 +85805,13 @@ var SmartRouter = class { constructor(init3) { this.#routers = init3.routers; } - add(method, path5, handler) { + add(method, path6, handler) { if (!this.#routes) { throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT); } - this.#routes.push([method, path5, handler]); + this.#routes.push([method, path6, handler]); } - match(method, path5) { + match(method, path6) { if (!this.#routes) { throw new Error("Fatal error"); } @@ -85799,7 +85826,7 @@ var SmartRouter = class { for (let i22 = 0, len2 = routes.length;i22 < len2; i22++) { router.add(...routes[i22]); } - res = router.match(method, path5); + res = router.match(method, path6); } catch (e) { if (e instanceof UnsupportedPathError) { continue; @@ -85855,10 +85882,10 @@ var emptyParams, hasChildren = (children) => { } this.#patterns = []; } - insert(method, path5, handler) { + insert(method, path6, handler) { this.#order = ++this.#order; let curNode = this; - const parts3 = splitRoutingPath(path5); + const parts3 = splitRoutingPath(path6); const possibleKeys = []; for (let i2 = 0, len = parts3.length;i2 < len; i2++) { const p = parts3[i2]; @@ -85907,12 +85934,12 @@ var emptyParams, hasChildren = (children) => { } } } - search(method, path5) { + search(method, path6) { const handlerSets = []; this.#params = emptyParams; const curNode = this; let curNodes = [curNode]; - const parts3 = splitPath(path5); + const parts3 = splitPath(path6); const curNodesQueue = []; const len = parts3.length; let partOffsets = null; @@ -85954,20 +85981,23 @@ var emptyParams, hasChildren = (children) => { if (matcher instanceof RegExp) { if (partOffsets === null) { partOffsets = new Array(len); - let offset = path5[0] === "/" ? 1 : 0; + let offset = path6[0] === "/" ? 1 : 0; for (let p = 0;p < len; p++) { partOffsets[p] = offset; offset += parts3[p].length + 1; } } - const restPathString = path5.substring(partOffsets[i2]); + const restPathString = path6.substring(partOffsets[i2]); const m = matcher.exec(restPathString); if (m) { params[name2] = m[0]; this.#pushHandlerSets(handlerSets, child, method, node.#params, params); + if (m[0].length === restPathString.length && child.#children["*"]) { + this.#pushHandlerSets(handlerSets, child.#children["*"], method, node.#params, params); + } if (hasChildren(child.#children)) { child.#params = params; - const componentCount = m[0].match(/\//)?.length ?? 0; + const componentCount = m[0].match(/\//g)?.length ?? 0; const targetCurNodes = curNodesQueue[componentCount] ||= []; targetCurNodes.push(child); } @@ -86012,18 +86042,18 @@ var TrieRouter = class { constructor() { this.#node = new Node3; } - add(method, path5, handler) { - const results = checkOptionalParameter(path5); + add(method, path6, handler) { + const results = checkOptionalParameter(path6); if (results) { for (let i2 = 0, len = results.length;i2 < len; i2++) { this.#node.insert(method, results[i2], handler); } return; } - this.#node.insert(method, path5, handler); + this.#node.insert(method, path6, handler); } - match(method, path5) { - return this.#node.search(method, path5); + match(method, path6) { + return this.#node.search(method, path6); } }; var init_router4 = __esm(() => { @@ -86056,25 +86086,265 @@ var init_hono = __esm(() => { // node_modules/hono/dist/index.js var init_dist7 = __esm(() => { init_hono(); + init_context(); }); +// node_modules/hono/dist/utils/accept.js +var isWhitespace = (char) => char === 32 || char === 9 || char === 10 || char === 13, consumeWhitespace = (acceptHeader, startIndex) => { + while (startIndex < acceptHeader.length) { + if (!isWhitespace(acceptHeader.charCodeAt(startIndex))) { + break; + } + startIndex++; + } + return startIndex; +}, ignoreTrailingWhitespace = (acceptHeader, startIndex) => { + while (startIndex > 0) { + if (!isWhitespace(acceptHeader.charCodeAt(startIndex - 1))) { + break; + } + startIndex--; + } + return startIndex; +}, skipInvalidParam = (acceptHeader, startIndex) => { + while (startIndex < acceptHeader.length) { + const char = acceptHeader.charCodeAt(startIndex); + if (char === 59) { + return [startIndex + 1, true]; + } + if (char === 44) { + return [startIndex + 1, false]; + } + startIndex++; + } + return [startIndex, false]; +}, skipInvalidAcceptValue = (acceptHeader, startIndex) => { + let i2 = startIndex; + let inQuotes = false; + while (i2 < acceptHeader.length) { + const char = acceptHeader.charCodeAt(i2); + if (inQuotes && char === 92) { + i2++; + } else if (char === 34) { + inQuotes = !inQuotes; + } else if (!inQuotes && char === 44) { + return i2 + 1; + } + i2++; + } + return i2; +}, getNextParam = (acceptHeader, startIndex) => { + startIndex = consumeWhitespace(acceptHeader, startIndex); + let i2 = startIndex; + let key; + let value8; + let hasNext = false; + while (i2 < acceptHeader.length) { + const char = acceptHeader.charCodeAt(i2); + if (char === 61) { + key = acceptHeader.slice(startIndex, ignoreTrailingWhitespace(acceptHeader, i2)); + i2++; + break; + } + if (char === 59) { + return [i2 + 1, undefined, undefined, true]; + } + if (char === 44) { + return [i2 + 1, undefined, undefined, false]; + } + i2++; + } + if (key === undefined) { + return [i2, undefined, undefined, false]; + } + i2 = consumeWhitespace(acceptHeader, i2); + if (acceptHeader.charCodeAt(i2) === 61) { + const skipResult = skipInvalidParam(acceptHeader, i2 + 1); + return [skipResult[0], key, undefined, skipResult[1]]; + } + let inQuotes = false; + const paramStartIndex = i2; + while (i2 < acceptHeader.length) { + const char = acceptHeader.charCodeAt(i2); + if (inQuotes && char === 92) { + i2++; + } else if (char === 34) { + if (inQuotes) { + let nextIndex = consumeWhitespace(acceptHeader, i2 + 1); + const nextChar = acceptHeader.charCodeAt(nextIndex); + if (nextIndex < acceptHeader.length && !(nextChar === 59 || nextChar === 44)) { + const skipResult = skipInvalidParam(acceptHeader, nextIndex); + return [skipResult[0], key, undefined, skipResult[1]]; + } + value8 = acceptHeader.slice(paramStartIndex + 1, i2); + if (value8.includes("\\")) { + value8 = value8.replace(/\\(.)/g, "$1"); + } + if (nextChar === 44) { + return [nextIndex + 1, key, value8, false]; + } + if (nextChar === 59) { + hasNext = true; + nextIndex++; + } + i2 = nextIndex; + break; + } + inQuotes = true; + } else if (!inQuotes && (char === 59 || char === 44)) { + value8 = acceptHeader.slice(paramStartIndex, ignoreTrailingWhitespace(acceptHeader, i2)); + if (char === 59) { + hasNext = true; + } + i2++; + break; + } + i2++; + } + return [ + i2, + key, + value8 ?? acceptHeader.slice(paramStartIndex, ignoreTrailingWhitespace(acceptHeader, i2)), + hasNext + ]; +}, getNextAcceptValue = (acceptHeader, startIndex) => { + const accept = { + type: "", + params: /* @__PURE__ */ Object.create(null), + q: 1 + }; + startIndex = consumeWhitespace(acceptHeader, startIndex); + let i2 = startIndex; + while (i2 < acceptHeader.length) { + const char = acceptHeader.charCodeAt(i2); + if (char === 59 || char === 44) { + accept.type = acceptHeader.slice(startIndex, ignoreTrailingWhitespace(acceptHeader, i2)); + i2++; + if (char === 44) { + return [i2, accept.type ? accept : undefined]; + } + if (!accept.type) { + return [skipInvalidAcceptValue(acceptHeader, i2), undefined]; + } + break; + } + i2++; + } + if (!accept.type) { + accept.type = acceptHeader.slice(startIndex, ignoreTrailingWhitespace(acceptHeader, acceptHeader.length)); + return [acceptHeader.length, accept.type ? accept : undefined]; + } + let param; + let value8; + let hasNext; + while (i2 < acceptHeader.length) { + [i2, param, value8, hasNext] = getNextParam(acceptHeader, i2); + if (param && value8) { + accept.params[param] = value8; + } + if (!hasNext) { + break; + } + } + return [i2, accept]; +}, parseAccept = (acceptHeader) => { + if (!acceptHeader) { + return []; + } + const values12 = []; + let i2 = 0; + let accept; + let requiresSort = false; + let lastAccept; + while (i2 < acceptHeader.length) { + [i2, accept] = getNextAcceptValue(acceptHeader, i2); + if (accept) { + accept.q = parseQuality(accept.params.q); + values12.push(accept); + if (lastAccept && lastAccept.q < accept.q) { + requiresSort = true; + } + lastAccept = accept; + } + } + if (requiresSort) { + values12.sort((a, b) => b.q - a.q); + } + return values12; +}, parseQuality = (qVal) => { + if (qVal === undefined) { + return 1; + } + if (qVal === "") { + return 1; + } + if (qVal === "NaN") { + return 0; + } + const num = Number(qVal); + if (num === Infinity) { + return 1; + } + if (num === -Infinity) { + return 0; + } + if (Number.isNaN(num)) { + return 1; + } + if (num < 0 || num > 1) { + return 1; + } + return num; +}; +var init_accept = () => {}; + // node_modules/hono/dist/utils/compress.js var COMPRESSIBLE_CONTENT_TYPE_REGEX; var init_compress = __esm(() => { - COMPRESSIBLE_CONTENT_TYPE_REGEX = /^\s*(?:text\/(?!event-stream(?:[;\s]|$))[^;\s]+|application\/(?:javascript|json|xml|xml-dtd|ecmascript|dart|postscript|rtf|tar|toml|vnd\.dart|vnd\.ms-fontobject|vnd\.ms-opentype|wasm|x-httpd-php|x-javascript|x-ns-proxy-autoconfig|x-sh|x-tar|x-virtualbox-hdd|x-virtualbox-ova|x-virtualbox-ovf|x-virtualbox-vbox|x-virtualbox-vdi|x-virtualbox-vhd|x-virtualbox-vmdk|x-www-form-urlencoded)|font\/(?:otf|ttf)|image\/(?:bmp|vnd\.adobe\.photoshop|vnd\.microsoft\.icon|vnd\.ms-dds|x-icon|x-ms-bmp)|message\/rfc822|model\/gltf-binary|x-shader\/x-fragment|x-shader\/x-vertex|[^;\s]+?\+(?:json|text|xml|yaml))(?:[;\s]|$)/i; + COMPRESSIBLE_CONTENT_TYPE_REGEX = /^\s*(?:text\/(?!event-stream(?:[;\s]|$))[^;\s]+|application\/(?:javascript|json|xml|xml-dtd|ecmascript|dart|msgpack|postscript|rtf|tar|toml|vnd\.dart|vnd\.ms-fontobject|vnd\.ms-opentype|vnd\.msgpack|wasm|x-httpd-php|x-javascript|x-msgpack|x-ns-proxy-autoconfig|x-sh|x-tar|x-virtualbox-hdd|x-virtualbox-ova|x-virtualbox-ovf|x-virtualbox-vbox|x-virtualbox-vdi|x-virtualbox-vhd|x-virtualbox-vmdk|x-www-form-urlencoded)|font\/(?:otf|ttf)|image\/(?:bmp|vnd\.adobe\.photoshop|vnd\.microsoft\.icon|vnd\.ms-dds|x-icon|x-ms-bmp)|message\/rfc822|model\/gltf-binary|x-shader\/x-fragment|x-shader\/x-vertex|[^;\s]+?\+(?:json|text|xml|yaml|msgpack))(?:[;\s]|$)/i; }); // node_modules/hono/dist/middleware/compress/index.js -var ENCODING_TYPES, cacheControlNoTransformRegExp, compress = (options2) => { +var ENCODING_TYPES, cacheControlNoTransformRegExp, selectEncoding = (header, candidates) => { + if (header === undefined) { + return; + } + const accepts = parseAccept(header); + const wildcardQ = accepts.find((a) => a.type === "*")?.q; + let best; + for (const enc of candidates) { + const explicit = accepts.find((a) => a.type.toLowerCase() === enc); + const q2 = explicit ? explicit.q : wildcardQ ?? 0; + if (q2 === 1) { + return enc; + } else if (q2 > 0 && (!best || q2 > best.q)) { + best = { encoding: enc, q: q2 }; + } + } + return best?.encoding; +}, varyAcceptEncodingRegExp, compress = (options2) => { const threshold = options2?.threshold ?? 1024; + const candidates = options2?.encoding ? [options2.encoding] : ENCODING_TYPES; + const contentTypeFilter = options2?.contentTypeFilter ?? COMPRESSIBLE_CONTENT_TYPE_REGEX; + const shouldCompress = typeof contentTypeFilter === "function" ? (res) => { + const type3 = res.headers.get("Content-Type"); + return type3 && contentTypeFilter(type3); + } : (res) => { + const type3 = res.headers.get("Content-Type"); + return type3 && contentTypeFilter.test(type3); + }; return async function compress2(ctx, next3) { await next3(); const contentLength = ctx.res.headers.get("Content-Length"); - if (ctx.res.headers.has("Content-Encoding") || ctx.res.headers.has("Transfer-Encoding") || ctx.req.method === "HEAD" || contentLength && Number(contentLength) < threshold || !shouldCompress(ctx.res) || !shouldTransform(ctx.res)) { + if (ctx.res.status === 206 || ctx.res.headers.has("Content-Encoding") || ctx.res.headers.has("Transfer-Encoding") || ctx.req.method === "HEAD" || contentLength && Number(contentLength) < threshold || !shouldCompress(ctx.res) || !shouldTransform(ctx.res)) { return; } + const current = ctx.res.headers.get("Vary"); + if (current !== "*" && !(current && varyAcceptEncodingRegExp.test(current))) { + ctx.header("Vary", current ? `${current}, Accept-Encoding` : "Accept-Encoding"); + } const accepted = ctx.req.header("Accept-Encoding"); - const encoding = options2?.encoding ?? ENCODING_TYPES.find((encoding2) => accepted?.includes(encoding2)); + const encoding = selectEncoding(accepted, candidates); if (!encoding || !ctx.res.body) { return; } @@ -86087,24 +86357,23 @@ var ENCODING_TYPES, cacheControlNoTransformRegExp, compress = (options2) => { ctx.res.headers.set("ETag", `W/${etag}`); } }; -}, shouldCompress = (res) => { - const type3 = res.headers.get("Content-Type"); - return type3 && COMPRESSIBLE_CONTENT_TYPE_REGEX.test(type3); }, shouldTransform = (res) => { const cacheControl = res.headers.get("Cache-Control"); return !cacheControl || !cacheControlNoTransformRegExp.test(cacheControl); }; var init_compress2 = __esm(() => { + init_accept(); init_compress(); ENCODING_TYPES = ["gzip", "deflate"]; cacheControlNoTransformRegExp = /(?:^|,)\s*?no-transform\s*?(?:,|$)/i; + varyAcceptEncodingRegExp = /(?:^|,)\s*accept-encoding\s*(?:,|$)/i; }); // node_modules/hono/dist/middleware/cors/index.js var cors = (options2) => { const opts = { origin: "*", - allowMethods: ["GET", "HEAD", "PUT", "POST", "DELETE", "PATCH"], + allowMethods: ["GET", "HEAD", "PUT", "POST", "DELETE", "PATCH", "QUERY"], allowHeaders: [], exposeHeaders: [], ...options2 @@ -86112,9 +86381,6 @@ var cors = (options2) => { const findAllowOrigin = ((optsOrigin) => { if (typeof optsOrigin === "string") { if (optsOrigin === "*") { - if (opts.credentials) { - return (origin) => origin || null; - } return () => optsOrigin; } else { return (origin) => optsOrigin === origin ? origin : null; @@ -86149,7 +86415,7 @@ var cors = (options2) => { set22("Access-Control-Expose-Headers", opts.exposeHeaders.join(",")); } if (c.req.method === "OPTIONS") { - if (opts.origin !== "*" || opts.credentials) { + if (opts.origin !== "*") { set22("Vary", "Origin"); } if (opts.maxAge != null) { @@ -86163,7 +86429,7 @@ var cors = (options2) => { if (!headers?.length) { const requestHeaders = c.req.header("Access-Control-Request-Headers"); if (requestHeaders) { - headers = requestHeaders.split(/\s*,\s*/); + headers = requestHeaders.split(",").map((h2) => h2.trim()); } } if (headers?.length) { @@ -86179,7 +86445,7 @@ var cors = (options2) => { }); } await next3(); - if (opts.origin !== "*" || opts.credentials) { + if (opts.origin !== "*") { c.header("Vary", "Origin", { append: true }); } }; @@ -86207,10 +86473,10 @@ var init_migrator_utils = () => {}; import crypto2 from "crypto"; import fs5, { existsSync as existsSync2, readdirSync as readdirSync3 } from "fs"; import { join as join9 } from "path"; -function readMigrationFiles(config3) { - if (fs5.existsSync(`${config3.migrationsFolder}/meta/_journal.json`)) +function readMigrationFiles(config2) { + if (fs5.existsSync(`${config2.migrationsFolder}/meta/_journal.json`)) throw Error('We detected that you have old drizzle-kit migration folders. You must upgrade drizzle-kit and run "drizzle-kit up"'); - const migrationFolderTo = config3.migrationsFolder; + const migrationFolderTo = config2.migrationsFolder; const migrationQueries = []; const migrations = readdirSync3(migrationFolderTo).map((subdir) => ({ path: join9(migrationFolderTo, subdir, "migration.sql"), @@ -86240,10 +86506,10 @@ var init_migrator = __esm(() => { }); // node_modules/drizzle-orm/bun-sqlite/migrator.js -function migrate(db2, config3) { - if (Array.isArray(config3) || "migrationsJournal" in config3) { - const journal = Array.isArray(config3) ? config3 : config3.migrationsJournal; - const migrationsTable = Array.isArray(config3) ? undefined : config3.migrationsTable; +function migrate(db2, config2) { + if (Array.isArray(config2) || "migrationsJournal" in config2) { + const journal = Array.isArray(config2) ? config2 : config2.migrationsJournal; + const migrationsTable = Array.isArray(config2) ? undefined : config2.migrationsTable; const migrations2 = journal.map((d) => ({ sql: d.sql.split("--> statement-breakpoint"), folderMillis: d.timestamp, @@ -86253,19 +86519,13 @@ function migrate(db2, config3) { })); return db2.dialect.migrate(migrations2, db2.session, { migrationsTable }); } - const migrations = readMigrationFiles(config3); - return db2.dialect.migrate(migrations, db2.session, config3); + const migrations = readMigrationFiles(config2); + return db2.dialect.migrate(migrations, db2.session, config2); } var init_migrator2 = __esm(() => { init_migrator(); }); -// node_modules/drizzle-orm/column-common.js -var OriginalColumn; -var init_column_common = __esm(() => { - OriginalColumn = Symbol.for("drizzle:OriginalColumn"); -}); - // node_modules/drizzle-orm/entity.js function is6(value8, type3) { if (!value8 || typeof value8 !== "object") @@ -86289,6 +86549,46 @@ var init_entity = __esm(() => { hasOwnEntityKind = Symbol.for("drizzle:hasOwnEntityKind"); }); +// node_modules/drizzle-orm/logger.js +var ConsoleLogWriter, DefaultLogger, NoopLogger; +var init_logger = __esm(() => { + init_entity(); + ConsoleLogWriter = class { + static [entityKind] = "ConsoleLogWriter"; + write(message) { + console.log(message); + } + }; + DefaultLogger = class { + static [entityKind] = "DefaultLogger"; + writer; + constructor(config2) { + this.writer = config2?.writer ?? new ConsoleLogWriter; + } + logQuery(query, params) { + const stringifiedParams = params.map((p) => { + try { + return JSON.stringify(p); + } catch { + return String(p); + } + }); + const paramsStr = stringifiedParams.length ? ` -- params: [${stringifiedParams.join(", ")}]` : ""; + this.writer.write(`Query: ${query}${paramsStr}`); + } + }; + NoopLogger = class { + static [entityKind] = "NoopLogger"; + logQuery() {} + }; +}); + +// node_modules/drizzle-orm/column-common.js +var OriginalColumn; +var init_column_common = __esm(() => { + OriginalColumn = Symbol.for("drizzle:OriginalColumn"); +}); + // node_modules/drizzle-orm/column.js var Column; var init_column = __esm(() => { @@ -86318,28 +86618,28 @@ var init_column = __esm(() => { config; table; onInit() {} - constructor(table2, config3) { - this.config = config3; + constructor(table2, config2) { + this.config = config2; this.onInit(); this.table = table2; - this.name = config3.name; + this.name = config2.name; this.isAlias = false; - this.keyAsName = config3.keyAsName; - this.notNull = config3.notNull; - this.default = config3.default; - this.defaultFn = config3.defaultFn; - this.onUpdateFn = config3.onUpdateFn; - this.hasDefault = config3.hasDefault; - this.primary = config3.primaryKey; - this.isUnique = config3.isUnique; - this.uniqueName = config3.uniqueName; - this.uniqueType = config3.uniqueType; - this.dataType = config3.dataType; - this.columnType = config3.columnType; - this.generated = config3.generated; - this.generatedIdentity = config3.generatedIdentity; - this.length = config3["length"]; - this.isLengthExact = config3["isLengthExact"]; + this.keyAsName = config2.keyAsName; + this.notNull = config2.notNull; + this.default = config2.default; + this.defaultFn = config2.defaultFn; + this.onUpdateFn = config2.onUpdateFn; + this.hasDefault = config2.hasDefault; + this.primary = config2.primaryKey; + this.isUnique = config2.isUnique; + this.uniqueName = config2.uniqueName; + this.uniqueType = config2.uniqueType; + this.dataType = config2.dataType; + this.columnType = config2.columnType; + this.generated = config2.generated; + this.generatedIdentity = config2.generatedIdentity; + this.length = config2["length"]; + this.isLengthExact = config2["isLengthExact"]; } mapFromDriverValue(value8) { return value8; @@ -86534,9 +86834,9 @@ var init_sql = __esm(() => { this.queryChunks.push(...query.queryChunks); return this; } - toQuery(config3) { + toQuery(config2) { return tracer3.startActiveSpan("drizzle.buildSQL", (span3) => { - const query = this.buildQueryFromSourceParams(this.queryChunks, config3); + const query = this.buildQueryFromSourceParams(this.queryChunks, config2); span3?.setAttributes({ "drizzle.query.text": query.sql, "drizzle.query.params": JSON.stringify(query.params) @@ -86545,11 +86845,11 @@ var init_sql = __esm(() => { }); } buildQueryFromSourceParams(chunks2, _config) { - const config3 = Object.assign({}, _config, { + const config2 = Object.assign({}, _config, { inlineParams: _config.inlineParams || this.shouldInlineParams, paramStartIndex: _config.paramStartIndex || { value: 0 } }); - const { casing, escapeName, escapeParam, prepareTyping, inlineParams, paramStartIndex, invokeSource } = config3; + const { casing, escapeName, escapeParam, prepareTyping, inlineParams, paramStartIndex, invokeSource } = config2; return mergeQueries(chunks2.map((chunk) => { if (is6(chunk, StringChunk)) return { @@ -86574,11 +86874,11 @@ var init_sql = __esm(() => { result6.push(new StringChunk(", ")); } result6.push(new StringChunk(")")); - return this.buildQueryFromSourceParams(result6, config3); + return this.buildQueryFromSourceParams(result6, config2); } if (is6(chunk, SQL2)) return this.buildQueryFromSourceParams(chunk.queryChunks, { - ...config3, + ...config2, inlineParams: inlineParams || chunk.shouldInlineParams }); if (is6(chunk, Table)) { @@ -86624,10 +86924,10 @@ var init_sql = __esm(() => { }; const mappedValue = chunk.value === null ? null : chunk.encoder.mapToDriverValue(chunk.value); if (is6(mappedValue, SQL2)) - return this.buildQueryFromSourceParams([mappedValue], config3); + return this.buildQueryFromSourceParams([mappedValue], config2); if (inlineParams) return { - sql: this.mapInlineParam(mappedValue, config3), + sql: this.mapInlineParam(mappedValue, config2), params: [] }; let typings = ["none"]; @@ -86661,7 +86961,7 @@ var init_sql = __esm(() => { chunk._.sql, new StringChunk(") "), new Name(chunk._.alias) - ], config3); + ], config2); } if (typeof chunk === "function" && "enumName" in chunk) { if ("schema" in chunk && chunk.schema) @@ -86676,16 +86976,16 @@ var init_sql = __esm(() => { } if (isSQLWrapper(chunk)) { if (chunk.shouldOmitSQLParens?.()) - return this.buildQueryFromSourceParams([chunk.getSQL()], config3); + return this.buildQueryFromSourceParams([chunk.getSQL()], config2); return this.buildQueryFromSourceParams([ new StringChunk("("), chunk.getSQL(), new StringChunk(")") - ], config3); + ], config2); } if (inlineParams) return { - sql: this.mapInlineParam(chunk, config3), + sql: this.mapInlineParam(chunk, config2), params: [] }; return { @@ -86861,6 +87161,251 @@ var init_sql = __esm(() => { }; }); +// node_modules/drizzle-orm/alias.js +function aliasedTable(table2, tableAlias) { + return new Proxy(table2, new TableAliasProxyHandler(tableAlias, false, false)); +} +function aliasedColumn(column, alias) { + return new Proxy(column, new ColumnAliasProxyHandler(alias)); +} +function aliasedTableColumn(column, tableAlias) { + return new Proxy(column, new ColumnTableAliasProxyHandler(new Proxy(column.table, new TableAliasProxyHandler(tableAlias, false, false)), false)); +} +function mapColumnsInAliasedSQLToAlias(query, alias) { + return new SQL.Aliased(mapColumnsInSQLToAlias(query.sql, alias), query.fieldAlias); +} +function mapColumnsInSQLToAlias(query, alias) { + return sql.join(query.queryChunks.map((c) => { + if (is6(c, Column)) + return aliasedTableColumn(c, alias); + if (is6(c, SQL)) + return mapColumnsInSQLToAlias(c, alias); + if (is6(c, SQL.Aliased)) + return mapColumnsInAliasedSQLToAlias(c, alias); + return c; + })); +} +function getOriginalColumnFromAlias(column) { + return column[OriginalColumn](); +} +var ColumnTableAliasProxyHandler, ViewSelectionAliasProxyHandler, TableAliasProxyHandler, ColumnAliasProxyHandler; +var init_alias = __esm(() => { + init_column_common(); + init_entity(); + init_column(); + init_table(); + init_sql(); + init_subquery(); + init_view_common(); + ColumnTableAliasProxyHandler = class { + static [entityKind] = "ColumnTableAliasProxyHandler"; + constructor(table2, ignoreColumnAlias) { + this.table = table2; + this.ignoreColumnAlias = ignoreColumnAlias; + } + get(columnObj, prop) { + if (prop === "table") + return this.table; + if (prop === "isAlias" && this.ignoreColumnAlias) + return false; + return columnObj[prop]; + } + }; + ViewSelectionAliasProxyHandler = class { + static [entityKind] = "ViewSelectionAliasProxyHandler"; + constructor(view, selection, ignoreColumnAlias) { + this.view = view; + this.selection = selection; + this.ignoreColumnAlias = ignoreColumnAlias; + } + get(selection, prop) { + const value8 = selection[prop]; + if (is6(value8, Column)) + return new Proxy(value8, new ColumnTableAliasProxyHandler(this.view, this.ignoreColumnAlias)); + if (is6(value8, Subquery) || is6(value8, SQL) || is6(value8, SQL.Aliased) || isSQLWrapper(value8) || typeof value8 !== "object" || value8 === null) + return value8; + return new Proxy(value8, this); + } + }; + TableAliasProxyHandler = class { + static [entityKind] = "TableAliasProxyHandler"; + constructor(alias, replaceOriginalName, ignoreColumnAlias) { + this.alias = alias; + this.replaceOriginalName = replaceOriginalName; + this.ignoreColumnAlias = ignoreColumnAlias; + } + get(target, prop) { + if (prop === Table.Symbol.IsAlias) + return true; + if (prop === Table.Symbol.Name) + return this.alias; + if (this.replaceOriginalName && prop === Table.Symbol.OriginalName) + return this.alias; + if (prop === ViewBaseConfig) + return { + ...target[ViewBaseConfig], + name: this.alias, + isAlias: true, + selectedFields: new Proxy(target[ViewBaseConfig].selectedFields, new ViewSelectionAliasProxyHandler(new Proxy(target, this), target[ViewBaseConfig].selectedFields, this.ignoreColumnAlias)) + }; + if (prop === Table.Symbol.Columns) { + const columns = target[Table.Symbol.Columns]; + if (!columns) + return columns; + if (is6(target, View)) + return new Proxy(target[Table.Symbol.Columns], new ViewSelectionAliasProxyHandler(new Proxy(target, this), target[Table.Symbol.Columns], this.ignoreColumnAlias)); + const proxiedColumns = {}; + Object.keys(columns).map((key) => { + proxiedColumns[key] = new Proxy(columns[key], new ColumnTableAliasProxyHandler(new Proxy(target, this), this.ignoreColumnAlias)); + }); + return proxiedColumns; + } + const value8 = target[prop]; + if (is6(value8, Column)) + return new Proxy(value8, new ColumnTableAliasProxyHandler(new Proxy(target, this), this.ignoreColumnAlias)); + return value8; + } + }; + ColumnAliasProxyHandler = class { + static [entityKind] = "ColumnAliasProxyHandler"; + constructor(alias) { + this.alias = alias; + } + get(target, prop) { + if (prop === "isAlias") + return true; + if (prop === "name") + return this.alias; + if (prop === "keyAsName") + return false; + if (prop === OriginalColumn) + return () => target; + return target[prop]; + } + }; + Column.prototype.as = function(alias) { + return aliasedColumn(this, alias); + }; +}); + +// node_modules/drizzle-orm/query-promise.js +var QueryPromise; +var init_query_promise = __esm(() => { + init_entity(); + QueryPromise = class { + static [entityKind] = "QueryPromise"; + [Symbol.toStringTag] = "QueryPromise"; + catch(onRejected) { + return this.then(undefined, onRejected); + } + finally(onFinally) { + return this.then((value8) => { + onFinally?.(); + return value8; + }, (reason2) => { + onFinally?.(); + throw reason2; + }); + } + then(onFulfilled, onRejected) { + return this.execute().then(onFulfilled, onRejected); + } + }; +}); + +// node_modules/drizzle-orm/column-builder.js +var ColumnBuilder; +var init_column_builder = __esm(() => { + init_entity(); + ColumnBuilder = class { + static [entityKind] = "ColumnBuilder"; + config; + constructor(name2, dataType, columnType) { + this.config = { + name: name2, + keyAsName: name2 === "", + notNull: false, + default: undefined, + hasDefault: false, + primaryKey: false, + isUnique: false, + uniqueName: undefined, + uniqueType: undefined, + dataType, + columnType, + generated: undefined + }; + } + $type() { + return this; + } + notNull() { + this.config.notNull = true; + return this; + } + default(value8) { + this.config.default = value8; + this.config.hasDefault = true; + return this; + } + $defaultFn(fn3) { + this.config.defaultFn = fn3; + this.config.hasDefault = true; + return this; + } + $default = this.$defaultFn; + $onUpdateFn(fn3) { + this.config.onUpdateFn = fn3; + this.config.hasDefault = true; + return this; + } + $onUpdate = this.$onUpdateFn; + primaryKey() { + this.config.primaryKey = true; + this.config.notNull = true; + return this; + } + setName(name2) { + if (this.config.name !== "") + return; + this.config.name = name2; + } + }; +}); + +// node_modules/drizzle-orm/errors.js +var DrizzleError, DrizzleQueryError, TransactionRollbackError; +var init_errors5 = __esm(() => { + init_entity(); + DrizzleError = class extends Error { + static [entityKind] = "DrizzleError"; + constructor({ message, cause }) { + super(message); + this.name = "DrizzleError"; + this.cause = cause; + } + }; + DrizzleQueryError = class DrizzleQueryError2 extends Error { + static [entityKind] = "DrizzleQueryError"; + constructor(query, params, cause) { + super(`Failed query: ${query} +params: ${params}`); + this.query = query; + this.params = params; + this.cause = cause; + Error.captureStackTrace(this, DrizzleQueryError2); + if (cause) + this.cause = cause; + } + }; + TransactionRollbackError = class extends DrizzleError { + static [entityKind] = "TransactionRollbackError"; + constructor() { + super({ message: "Rollback" }); + } + }; +}); + // node_modules/drizzle-orm/sql/expressions/conditions.js function bindIfParam(value8, column) { if (isDriverValueEncoder(column) && !isSQLWrapper(value8) && !is6(value8, Param) && !is6(value8, Placeholder) && !is6(value8, Column) && !is6(value8, Table) && !is6(value8, View)) @@ -86998,6 +87543,300 @@ var init_select = __esm(() => { init_sql(); }); +// node_modules/drizzle-orm/relations.js +function mapRelationalRow(row, buildQueryResultSelection, mapColumnValue = (value8) => value8, parseJson2 = false, parseJsonIfString = false, path6) { + for (const selectionItem of buildQueryResultSelection) { + if (selectionItem.selection) { + const currentPath = `${path6 ? `${path6}.` : ""}${selectionItem.key}`; + if (row[selectionItem.key] === null) + continue; + if (parseJson2) { + row[selectionItem.key] = JSON.parse(row[selectionItem.key]); + if (row[selectionItem.key] === null) + continue; + } + if (parseJsonIfString && typeof row[selectionItem.key] === "string") + row[selectionItem.key] = JSON.parse(row[selectionItem.key]); + if (selectionItem.isArray) { + for (const item of row[selectionItem.key]) + mapRelationalRow(item, selectionItem.selection, mapColumnValue, false, parseJsonIfString, currentPath); + continue; + } + mapRelationalRow(row[selectionItem.key], selectionItem.selection, mapColumnValue, false, parseJsonIfString, currentPath); + continue; + } + const field = selectionItem.field; + const value8 = mapColumnValue(row[selectionItem.key]); + if (value8 === null) + continue; + let decoder2; + if (is6(field, Column)) + decoder2 = field; + else if (is6(field, SQL)) + decoder2 = field.decoder; + else if (is6(field, SQL.Aliased)) + decoder2 = field.sql.decoder; + else if (is6(field, Table) || is6(field, View)) + decoder2 = noopDecoder; + else + decoder2 = field.getSQL().decoder; + row[selectionItem.key] = "mapFromJsonValue" in decoder2 ? decoder2.mapFromJsonValue(value8) : decoder2.mapFromDriverValue(value8); + } + return row; +} +function fieldSelectionToSQL(table2, target) { + const field = table2[TableColumns][target]; + return field ? is6(field, Column) ? field : is6(field, SQL.Aliased) ? sql`${table2}.${sql.identifier(field.fieldAlias)}` : sql`${table2}.${sql.identifier(target)}` : sql`${table2}.${sql.identifier(target)}`; +} +function relationsFieldFilterToSQL(column, filter21) { + if (typeof filter21 !== "object" || is6(filter21, Placeholder)) + return eq(column, filter21); + const entries10 = Object.entries(filter21); + if (!entries10.length) + return; + const parts3 = []; + for (const [target, value8] of entries10) { + if (value8 === undefined) + continue; + switch (target) { + case "NOT": { + const res = relationsFieldFilterToSQL(column, value8); + if (!res) + continue; + parts3.push(not5(res)); + continue; + } + case "OR": + if (!value8.length) + continue; + parts3.push(or5(...value8.map((subFilter) => relationsFieldFilterToSQL(column, subFilter)))); + continue; + case "AND": + if (!value8.length) + continue; + parts3.push(and3(...value8.map((subFilter) => relationsFieldFilterToSQL(column, subFilter)))); + continue; + case "isNotNull": + case "isNull": + if (!value8) + continue; + parts3.push(operators[target](column)); + continue; + case "in": + parts3.push(operators.inArray(column, value8)); + continue; + case "notIn": + parts3.push(operators.notInArray(column, value8)); + continue; + default: + parts3.push(operators[target](column, value8)); + continue; + } + } + if (!parts3.length) + return; + return and3(...parts3); +} +function relationsFilterToSQL(table2, filter21, tableRelations = {}, tablesRelations = {}, casing, depth = 0) { + const entries10 = Object.entries(filter21); + if (!entries10.length) + return; + const parts3 = []; + for (const [target, value8] of entries10) { + if (value8 === undefined) + continue; + switch (target) { + case "RAW": { + const processed = typeof value8 === "function" ? value8(table2, operators) : value8.getSQL(); + parts3.push(processed); + continue; + } + case "OR": + if (!value8?.length) + continue; + parts3.push(or5(...value8.map((subFilter) => relationsFilterToSQL(table2, subFilter, tableRelations, tablesRelations, casing, depth)))); + continue; + case "AND": + if (!value8?.length) + continue; + parts3.push(and3(...value8.map((subFilter) => relationsFilterToSQL(table2, subFilter, tableRelations, tablesRelations, casing, depth)))); + continue; + case "NOT": { + if (value8 === undefined) + continue; + const built = relationsFilterToSQL(table2, value8, tableRelations, tablesRelations, casing, depth); + if (!built) + continue; + parts3.push(not5(built)); + continue; + } + default: { + if (table2[TableColumns][target]) { + const colFilter = relationsFieldFilterToSQL(fieldSelectionToSQL(table2, target), value8); + if (colFilter) + parts3.push(colFilter); + continue; + } + const relation = tableRelations[target]; + if (!relation) + throw new DrizzleError({ message: `Unknown relational filter field: "${target}"` }); + const targetTable = aliasedTable(relation.targetTable, `f${depth}`); + const throughTable = relation.throughTable ? aliasedTable(relation.throughTable, `ft${depth}`) : undefined; + const targetConfig = tablesRelations[relation.targetTableName]; + const { filter: relationFilter, joinCondition } = relationToSQL(casing, relation, table2, targetTable, throughTable); + const filter22 = and3(relationFilter, typeof value8 === "boolean" ? undefined : relationsFilterToSQL(targetTable, value8, targetConfig.relations, tablesRelations, casing, depth + 1)); + const subquery = throughTable ? sql`(select * from ${getTableAsAliasSQL(targetTable)} inner join ${getTableAsAliasSQL(throughTable)} on ${joinCondition}${sql` where ${filter22}`.if(filter22)} limit 1)` : sql`(select * from ${getTableAsAliasSQL(targetTable)}${sql` where ${filter22}`.if(filter22)} limit 1)`; + if (filter22) + parts3.push((value8 ? exists2 : notExists)(subquery)); + } + } + } + return and3(...parts3); +} +function relationsOrderToSQL(table2, orders) { + if (typeof orders === "function") { + const data2 = orders(table2, orderByOperators); + return is6(data2, SQL) ? data2 : Array.isArray(data2) ? data2.length ? sql.join(data2.map((o) => is6(o, SQL) ? o : asc(o)), sql`, `) : undefined : is6(data2, Column) ? asc(data2) : undefined; + } + const entries10 = Object.entries(orders).filter(([_2, value8]) => value8); + if (!entries10.length) + return; + return sql.join(entries10.map(([target, value8]) => (value8 === "asc" ? asc : desc)(fieldSelectionToSQL(table2, target))), sql`, `); +} +function relationExtrasToSQL(table2, extras) { + const subqueries = []; + const selection = []; + for (const [key, field] of Object.entries(extras)) { + if (!field) + continue; + const extra = typeof field === "function" ? field(table2, { sql: operators.sql }) : field; + const query = sql`(${extra.getSQL()}) as ${sql.identifier(key)}`; + query.decoder = extra.getSQL().decoder; + subqueries.push(query); + selection.push({ + key, + field: query + }); + } + return { + sql: subqueries.length ? sql.join(subqueries, sql`, `) : undefined, + selection + }; +} +function relationToSQL(casing, relation, sourceTable, targetTable, throughTable) { + if (relation.through) { + const outerColumnWhere = relation.sourceColumns.map((s, i2) => { + const t = relation.through.source[i2]; + return eq(sql`${sourceTable}.${sql.identifier(casing.getColumnCasing(s))}`, sql`${throughTable}.${sql.identifier(is6(t._.column, Column) ? casing.getColumnCasing(t._.column) : t._.key)}`); + }); + const innerColumnWhere = relation.targetColumns.map((s, i2) => { + const t = relation.through.target[i2]; + return eq(sql`${throughTable}.${sql.identifier(is6(t._.column, Column) ? casing.getColumnCasing(t._.column) : t._.key)}`, sql`${targetTable}.${sql.identifier(casing.getColumnCasing(s))}`); + }); + return { + filter: and3(relation.where ? relationsFilterToSQL(relation.isReversed ? sourceTable : targetTable, relation.where) : undefined, ...outerColumnWhere), + joinCondition: and3(...innerColumnWhere) + }; + } + return { filter: and3(...relation.sourceColumns.map((s, i2) => { + const t = relation.targetColumns[i2]; + return eq(sql`${sourceTable}.${sql.identifier(casing.getColumnCasing(s))}`, sql`${targetTable}.${sql.identifier(casing.getColumnCasing(t))}`); + }), relation.where ? relationsFilterToSQL(relation.isReversed ? sourceTable : targetTable, relation.where) : undefined) }; +} +function getTableAsAliasSQL(table2) { + return sql`${table2[IsAlias] ? sql`${sql`${sql.identifier(table2[TableSchema] ?? "")}.`.if(table2[TableSchema])}${sql.identifier(table2[OriginalName])} as ${table2}` : table2}`; +} +var Relation, One, operators, orderByOperators; +var init_relations = __esm(() => { + init_entity(); + init_column(); + init_sql(); + init_alias(); + init_errors5(); + init_conditions(); + init_select(); + init_table(); + Relation = class { + static [entityKind] = "RelationV2"; + fieldName; + sourceColumns; + targetColumns; + alias; + where; + sourceTable; + targetTable; + through; + throughTable; + isReversed; + sourceColumnTableNames = []; + targetColumnTableNames = []; + constructor(targetTable, targetTableName) { + this.targetTableName = targetTableName; + this.targetTable = targetTable; + } + }; + One = class extends Relation { + static [entityKind] = "OneV2"; + relationType = "one"; + optional; + constructor(tables, targetTable, targetTableName, config2) { + super(targetTable, targetTableName); + this.alias = config2?.alias; + this.where = config2?.where; + if (config2?.from) + this.sourceColumns = (Array.isArray(config2.from) ? config2.from : [config2.from]).map((it2) => { + this.throughTable ??= it2._.through ? tables[it2._.through._.tableName] : undefined; + this.sourceColumnTableNames.push(it2._.tableName); + return it2._.column; + }); + if (config2?.to) + this.targetColumns = (Array.isArray(config2.to) ? config2.to : [config2.to]).map((it2) => { + this.throughTable ??= it2._.through ? tables[it2._.through._.tableName] : undefined; + this.targetColumnTableNames.push(it2._.tableName); + return it2._.column; + }); + if (this.throughTable) + this.through = { + source: (Array.isArray(config2?.from) ? config2.from : (config2?.from) ? [config2.from] : []).map((c) => c._.through), + target: (Array.isArray(config2?.to) ? config2.to : (config2?.to) ? [config2.to] : []).map((c) => c._.through) + }; + this.optional = config2?.optional ?? true; + } + }; + operators = { + and: and3, + between: between7, + eq, + exists: exists2, + gt: gt2, + gte: gte2, + ilike, + inArray, + arrayContains, + arrayContained, + arrayOverlaps, + isNull: isNull3, + isNotNull: isNotNull2, + like, + lt: lt2, + lte: lte2, + ne: ne2, + not: not5, + notBetween, + notExists, + notLike, + notIlike, + notInArray, + or: or5, + sql + }; + orderByOperators = { + sql, + asc, + desc + }; +}); + // node_modules/drizzle-orm/sql/functions/aggregate.js function count3(expression) { return sql`count(${expression || sql.raw("*")})`.mapWith(Number); @@ -87011,6 +87850,134 @@ var init_aggregate = __esm(() => { init_column(); }); +// node_modules/drizzle-orm/utils.js +function mapResultRow(columns, row, joinsNotNullableMap) { + const nullifyMap = {}; + const result6 = columns.reduce((result7, { path: path6, field }, columnIndex) => { + let decoder2; + if (is6(field, Column)) + decoder2 = field; + else if (is6(field, SQL)) + decoder2 = field.decoder; + else if (is6(field, Subquery)) + decoder2 = field._.sql.decoder; + else + decoder2 = field.sql.decoder; + let node = result7; + for (const [pathChunkIndex, pathChunk] of path6.entries()) + if (pathChunkIndex < path6.length - 1) { + if (!(pathChunk in node)) + node[pathChunk] = {}; + node = node[pathChunk]; + } else { + const rawValue = row[columnIndex]; + const value8 = node[pathChunk] = rawValue === null ? null : decoder2.mapFromDriverValue(rawValue); + if (joinsNotNullableMap && is6(field, Column) && path6.length === 2) { + const objectName = path6[0]; + if (!(objectName in nullifyMap)) + nullifyMap[objectName] = value8 === null ? getTableName(field.table) : false; + else if (typeof nullifyMap[objectName] === "string" && nullifyMap[objectName] !== getTableName(field.table)) + nullifyMap[objectName] = false; + } + } + return result7; + }, {}); + if (joinsNotNullableMap && Object.keys(nullifyMap).length > 0) { + for (const [objectName, tableName] of Object.entries(nullifyMap)) + if (typeof tableName === "string" && !joinsNotNullableMap[tableName]) + result6[objectName] = null; + } + return result6; +} +function orderSelectedFields(fields, pathPrefix) { + return Object.entries(fields).reduce((result6, [name2, field]) => { + if (typeof name2 !== "string") + return result6; + const newPath = pathPrefix ? [...pathPrefix, name2] : [name2]; + if (is6(field, Column) || is6(field, SQL) || is6(field, SQL.Aliased) || is6(field, Subquery)) + result6.push({ + path: newPath, + field + }); + else if (is6(field, Table)) + result6.push(...orderSelectedFields(field[Table.Symbol.Columns], newPath)); + else + result6.push(...orderSelectedFields(field, newPath)); + return result6; + }, []); +} +function haveSameKeys(left2, right2) { + const leftKeys = Object.keys(left2); + const rightKeys = Object.keys(right2); + if (leftKeys.length !== rightKeys.length) + return false; + for (const [index2, key] of leftKeys.entries()) + if (key !== rightKeys[index2]) + return false; + return true; +} +function mapUpdateSet(table2, values12) { + const entries10 = Object.entries(values12).filter(([, value8]) => value8 !== undefined).map(([key, value8]) => { + if (is6(value8, SQL) || is6(value8, Column)) + return [key, value8]; + else + return [key, new Param(value8, table2[Table.Symbol.Columns][key])]; + }); + if (entries10.length === 0) + throw new Error("No values to set"); + return Object.fromEntries(entries10); +} +function applyMixins(baseClass, extendedClasses) { + for (const extendedClass of extendedClasses) + for (const name2 of Object.getOwnPropertyNames(extendedClass.prototype)) { + if (name2 === "constructor") + continue; + Object.defineProperty(baseClass.prototype, name2, Object.getOwnPropertyDescriptor(extendedClass.prototype, name2) || Object.create(null)); + } +} +function getTableColumns(table2) { + return table2[Table.Symbol.Columns]; +} +function getTableLikeName(table2) { + return is6(table2, Subquery) ? table2._.alias : is6(table2, View) ? table2[ViewBaseConfig].name : is6(table2, SQL) ? undefined : table2[Table.Symbol.IsAlias] ? table2[Table.Symbol.Name] : table2[Table.Symbol.BaseName]; +} +function getColumnNameAndConfig(a, b) { + return { + name: typeof a === "string" && a.length > 0 ? a : "", + config: typeof a === "object" ? a : b + }; +} +var textDecoder, CONSTANTS; +var init_utils = __esm(() => { + init_entity(); + init_column(); + init_table(); + init_sql(); + init_subquery(); + init_view_common(); + textDecoder = typeof TextDecoder === "undefined" ? null : new TextDecoder; + CONSTANTS = { + INT8_MIN: -128, + INT8_MAX: 127, + INT8_UNSIGNED_MAX: 255, + INT16_MIN: -32768, + INT16_MAX: 32767, + INT16_UNSIGNED_MAX: 65535, + INT24_MIN: -8388608, + INT24_MAX: 8388607, + INT24_UNSIGNED_MAX: 16777215, + INT32_MIN: -2147483648, + INT32_MAX: 2147483647, + INT32_UNSIGNED_MAX: 4294967295, + INT48_MIN: -140737488355328, + INT48_MAX: 140737488355327, + INT48_UNSIGNED_MAX: 281474976710655, + INT64_MIN: -9223372036854775808n, + INT64_MAX: 9223372036854775807n, + INT64_UNSIGNED_MAX: 18446744073709551615n + }; +}); + // node_modules/drizzle-orm/index.js var init_drizzle_orm = __esm(() => { init_sql(); @@ -87240,7 +88207,6 @@ var init_flag = __esm(() => { Flag.UNIFIA_DISABLE_CLAUDE_CODE_PROMPT = unifiaTruthy("DISABLE_CLAUDE_CODE_PROMPT", Flag.OPENCODE_DISABLE_CLAUDE_CODE_PROMPT); Flag.UNIFIA_ENABLE_EXPERIMENTAL_MODELS = unifiaTruthy("ENABLE_EXPERIMENTAL_MODELS", Flag.OPENCODE_ENABLE_EXPERIMENTAL_MODELS); Flag.UNIFIA_FAKE_VCS = unifiaValue("FAKE_VCS", Flag.OPENCODE_FAKE_VCS); - Flag.UNIFIA_CALLER = unifiaValue("CALLER", process.env["OPENCODE_CALLER"]); Flag.UNIFIA_DISABLE_SHARE = unifiaTruthy("DISABLE_SHARE", truthy("OPENCODE_DISABLE_SHARE")); Flag.UNIFIA_CARGO_PROXY = unifiaTruthy("CARGO_PROXY", truthy("OPENCODE_CARGO_PROXY")); Flag.UNIFIA_CARGO_PROXY_URL = unifiaValue("CARGO_PROXY_URL", process.env["OPENCODE_CARGO_PROXY_URL"]); @@ -87262,8 +88228,8 @@ var init_flag = __esm(() => { Flag.UNIFIA_EXPERIMENTAL_FILEWATCHER = dualConfigBoolean("EXPERIMENTAL_FILEWATCHER"); Flag.UNIFIA_EXPERIMENTAL_DISABLE_FILEWATCHER = dualConfigBoolean("EXPERIMENTAL_DISABLE_FILEWATCHER"); Flag.UNIFIA_AUTH_STORAGE = isolatedValue("AUTH_STORAGE"); - Flag.UNIFIA_PTY_PORT = isolatedValue("PTY_PORT"); Flag.UNIFIA_DISABLE_LSP_DOWNLOAD = unifiaTruthy("DISABLE_LSP_DOWNLOAD", Flag.OPENCODE_DISABLE_LSP_DOWNLOAD); + Flag.UNIFIA_DISABLE_LSP = truthy("UNIFIA_DISABLE_LSP"); })(Flag ||= {}); Object.defineProperty(Flag, "OPENCODE_DISABLE_PROJECT_CONFIG", { get() { @@ -87317,7 +88283,9 @@ var init_flag = __esm(() => { defineDynamic("UNIFIA_KEYCHAIN_URL", () => isolatedValue("KEYCHAIN_URL")); defineDynamic("UNIFIA_KEYCHAIN_TOKEN", () => isolatedValue("KEYCHAIN_TOKEN")); defineDynamic("UNIFIA_CONFIG_DIR", () => isolatedValue("CONFIG_DIR")); + defineDynamic("UNIFIA_PTY_PORT", () => isolatedValue("PTY_PORT")); defineDynamic("UNIFIA_CLIENT", () => isolatedValue("CLIENT") ?? "cli"); + defineDynamic("UNIFIA_CALLER", () => process.env["UNIFIA_CALLER"] ?? process.env["OPENCODE_CALLER"]); defineDynamic("UNIFIA_PURE", () => truthy("UNIFIA_PURE") || Flag.OPENCODE_PURE); defineDynamic("UNIFIA_TUI_CONFIG", () => process.env["UNIFIA_TUI_CONFIG"] ?? Flag.OPENCODE_TUI_CONFIG); defineDynamic("UNIFIA_PLUGIN_META_FILE", () => process.env["UNIFIA_PLUGIN_META_FILE"] ?? Flag.OPENCODE_PLUGIN_META_FILE); @@ -87461,66 +88429,6 @@ function iife2(fn3) { return fn3(); } -// node_modules/drizzle-orm/column-builder.js -var ColumnBuilder2; -var init_column_builder = __esm(() => { - init_entity(); - ColumnBuilder2 = class { - static [entityKind] = "ColumnBuilder"; - config; - constructor(name3, dataType, columnType) { - this.config = { - name: name3, - keyAsName: name3 === "", - notNull: false, - default: undefined, - hasDefault: false, - primaryKey: false, - isUnique: false, - uniqueName: undefined, - uniqueType: undefined, - dataType, - columnType, - generated: undefined - }; - } - $type() { - return this; - } - notNull() { - this.config.notNull = true; - return this; - } - default(value8) { - this.config.default = value8; - this.config.hasDefault = true; - return this; - } - $defaultFn(fn3) { - this.config.defaultFn = fn3; - this.config.hasDefault = true; - return this; - } - $default = this.$defaultFn; - $onUpdateFn(fn3) { - this.config.onUpdateFn = fn3; - this.config.hasDefault = true; - return this; - } - $onUpdate = this.$onUpdateFn; - primaryKey() { - this.config.primaryKey = true; - this.config.notNull = true; - return this; - } - setName(name3) { - if (this.config.name !== "") - return; - this.config.name = name3; - } - }; -}); - // node_modules/drizzle-orm/sqlite-core/foreign-keys.js var ForeignKeyBuilder, ForeignKey; var init_foreign_keys = __esm(() => { @@ -87531,9 +88439,9 @@ var init_foreign_keys = __esm(() => { reference; _onUpdate; _onDelete; - constructor(config3, actions) { + constructor(config2, actions) { this.reference = () => { - const { name: name3, columns, foreignColumns } = config3(); + const { name: name3, columns, foreignColumns } = config2(); return { name: name3, columns, @@ -87594,7 +88502,7 @@ var init_common = __esm(() => { init_column(); init_column_builder(); init_foreign_keys(); - SQLiteColumnBuilder = class extends ColumnBuilder2 { + SQLiteColumnBuilder = class extends ColumnBuilder { static [entityKind] = "SQLiteColumnBuilder"; foreignKeyConfigs = []; references(ref, actions = {}) { @@ -87609,11 +88517,11 @@ var init_common = __esm(() => { this.config.uniqueName = name3; return this; } - generatedAlwaysAs(as6, config3) { + generatedAlwaysAs(as6, config2) { this.config.generated = { as: as6, type: "always", - mode: config3?.mode ?? "virtual" + mode: config2?.mode ?? "virtual" }; return this; } @@ -87639,141 +88547,13 @@ var init_common = __esm(() => { SQLiteColumn = class extends Column { static [entityKind] = "SQLiteColumn"; table; - constructor(table2, config3) { - super(table2, config3); + constructor(table2, config2) { + super(table2, config2); this.table = table2; } }; }); -// node_modules/drizzle-orm/utils.js -function mapResultRow2(columns, row, joinsNotNullableMap) { - const nullifyMap = {}; - const result6 = columns.reduce((result7, { path: path5, field }, columnIndex) => { - let decoder2; - if (is6(field, Column)) - decoder2 = field; - else if (is6(field, SQL)) - decoder2 = field.decoder; - else if (is6(field, Subquery)) - decoder2 = field._.sql.decoder; - else - decoder2 = field.sql.decoder; - let node = result7; - for (const [pathChunkIndex, pathChunk] of path5.entries()) - if (pathChunkIndex < path5.length - 1) { - if (!(pathChunk in node)) - node[pathChunk] = {}; - node = node[pathChunk]; - } else { - const rawValue = row[columnIndex]; - const value8 = node[pathChunk] = rawValue === null ? null : decoder2.mapFromDriverValue(rawValue); - if (joinsNotNullableMap && is6(field, Column) && path5.length === 2) { - const objectName = path5[0]; - if (!(objectName in nullifyMap)) - nullifyMap[objectName] = value8 === null ? getTableName(field.table) : false; - else if (typeof nullifyMap[objectName] === "string" && nullifyMap[objectName] !== getTableName(field.table)) - nullifyMap[objectName] = false; - } - } - return result7; - }, {}); - if (joinsNotNullableMap && Object.keys(nullifyMap).length > 0) { - for (const [objectName, tableName] of Object.entries(nullifyMap)) - if (typeof tableName === "string" && !joinsNotNullableMap[tableName]) - result6[objectName] = null; - } - return result6; -} -function orderSelectedFields2(fields, pathPrefix) { - return Object.entries(fields).reduce((result6, [name3, field]) => { - if (typeof name3 !== "string") - return result6; - const newPath = pathPrefix ? [...pathPrefix, name3] : [name3]; - if (is6(field, Column) || is6(field, SQL) || is6(field, SQL.Aliased) || is6(field, Subquery)) - result6.push({ - path: newPath, - field - }); - else if (is6(field, Table)) - result6.push(...orderSelectedFields2(field[Table.Symbol.Columns], newPath)); - else - result6.push(...orderSelectedFields2(field, newPath)); - return result6; - }, []); -} -function haveSameKeys2(left2, right2) { - const leftKeys = Object.keys(left2); - const rightKeys = Object.keys(right2); - if (leftKeys.length !== rightKeys.length) - return false; - for (const [index2, key] of leftKeys.entries()) - if (key !== rightKeys[index2]) - return false; - return true; -} -function mapUpdateSet2(table2, values12) { - const entries10 = Object.entries(values12).filter(([, value8]) => value8 !== undefined).map(([key, value8]) => { - if (is6(value8, SQL) || is6(value8, Column)) - return [key, value8]; - else - return [key, new Param(value8, table2[Table.Symbol.Columns][key])]; - }); - if (entries10.length === 0) - throw new Error("No values to set"); - return Object.fromEntries(entries10); -} -function applyMixins2(baseClass, extendedClasses) { - for (const extendedClass of extendedClasses) - for (const name3 of Object.getOwnPropertyNames(extendedClass.prototype)) { - if (name3 === "constructor") - continue; - Object.defineProperty(baseClass.prototype, name3, Object.getOwnPropertyDescriptor(extendedClass.prototype, name3) || Object.create(null)); - } -} -function getTableColumns2(table2) { - return table2[Table.Symbol.Columns]; -} -function getTableLikeName2(table2) { - return is6(table2, Subquery) ? table2._.alias : is6(table2, View) ? table2[ViewBaseConfig].name : is6(table2, SQL) ? undefined : table2[Table.Symbol.IsAlias] ? table2[Table.Symbol.Name] : table2[Table.Symbol.BaseName]; -} -function getColumnNameAndConfig2(a, b) { - return { - name: typeof a === "string" && a.length > 0 ? a : "", - config: typeof a === "object" ? a : b - }; -} -var textDecoder2, CONSTANTS2; -var init_utils = __esm(() => { - init_entity(); - init_column(); - init_table(); - init_sql(); - init_subquery(); - init_view_common(); - textDecoder2 = typeof TextDecoder === "undefined" ? null : new TextDecoder; - CONSTANTS2 = { - INT8_MIN: -128, - INT8_MAX: 127, - INT8_UNSIGNED_MAX: 255, - INT16_MIN: -32768, - INT16_MAX: 32767, - INT16_UNSIGNED_MAX: 65535, - INT24_MIN: -8388608, - INT24_MAX: 8388607, - INT24_UNSIGNED_MAX: 16777215, - INT32_MIN: -2147483648, - INT32_MAX: 2147483647, - INT32_UNSIGNED_MAX: 4294967295, - INT48_MIN: -140737488355328, - INT48_MAX: 140737488355327, - INT48_UNSIGNED_MAX: 281474976710655, - INT64_MIN: -9223372036854775808n, - INT64_MAX: 9223372036854775807n, - INT64_UNSIGNED_MAX: 18446744073709551615n - }; -}); - // node_modules/drizzle-orm/sqlite-core/columns/blob.js function hexToText(hexString) { let result6 = ""; @@ -87785,10 +88565,10 @@ function hexToText(hexString) { return result6; } function blob(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - if (config3?.mode === "json") + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + if (config2?.mode === "json") return new SQLiteBlobJsonBuilder(name3); - if (config3?.mode === "bigint") + if (config2?.mode === "bigint") return new SQLiteBigIntBuilder(name3); return new SQLiteBlobBufferBuilder(name3); } @@ -87818,7 +88598,7 @@ var init_blob = __esm(() => { const buf = Buffer.isBuffer(value8) ? value8 : value8 instanceof ArrayBuffer ? Buffer.from(value8) : value8.buffer ? Buffer.from(value8.buffer, value8.byteOffset, value8.byteLength) : Buffer.from(value8); return BigInt(buf.toString("utf8")); } - return BigInt(textDecoder2.decode(value8)); + return BigInt(textDecoder.decode(value8)); } mapToDriverValue(value8) { return Buffer.from(value8.toString()); @@ -87845,7 +88625,7 @@ var init_blob = __esm(() => { const buf = Buffer.isBuffer(value8) ? value8 : value8 instanceof ArrayBuffer ? Buffer.from(value8) : value8.buffer ? Buffer.from(value8.buffer, value8.byteOffset, value8.byteLength) : Buffer.from(value8); return JSON.parse(buf.toString("utf8")); } - return JSON.parse(textDecoder2.decode(value8)); + return JSON.parse(textDecoder.decode(value8)); } mapToDriverValue(value8) { return Buffer.from(JSON.stringify(value8)); @@ -87877,11 +88657,11 @@ var init_blob = __esm(() => { // node_modules/drizzle-orm/sqlite-core/columns/integer.js function integer3(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - if (config3?.mode === "timestamp" || config3?.mode === "timestamp_ms") - return new SQLiteTimestampBuilder(name3, config3.mode); - if (config3?.mode === "boolean") - return new SQLiteBooleanBuilder(name3, config3.mode); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + if (config2?.mode === "timestamp" || config2?.mode === "timestamp_ms") + return new SQLiteTimestampBuilder(name3, config2.mode); + if (config2?.mode === "boolean") + return new SQLiteBooleanBuilder(name3, config2.mode); return new SQLiteIntegerBuilder(name3); } var SQLiteBaseIntegerBuilder, SQLiteBaseInteger, SQLiteIntegerBuilder, SQLiteInteger, SQLiteTimestampBuilder, SQLiteTimestamp, SQLiteBooleanBuilder, SQLiteBoolean; @@ -87896,8 +88676,8 @@ var init_integer = __esm(() => { super(name3, dataType, columnType); this.config.autoIncrement = false; } - primaryKey(config3) { - if (config3?.autoIncrement) + primaryKey(config2) { + if (config2?.autoIncrement) this.config.autoIncrement = true; this.config.hasDefault = true; return super.primaryKey(); @@ -88003,10 +88783,10 @@ var init_real = __esm(() => { // node_modules/drizzle-orm/sqlite-core/columns/text.js function text(a, b = {}) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - if (config3.mode === "json") + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + if (config2.mode === "json") return new SQLiteTextJsonBuilder(name3); - return new SQLiteTextBuilder(name3, config3); + return new SQLiteTextBuilder(name3, config2); } var SQLiteTextBuilder, SQLiteText, SQLiteTextJsonBuilder, SQLiteTextJson; var init_text = __esm(() => { @@ -88015,10 +88795,10 @@ var init_text = __esm(() => { init_utils(); SQLiteTextBuilder = class extends SQLiteColumnBuilder { static [entityKind] = "SQLiteTextBuilder"; - constructor(name3, config3) { - super(name3, config3.enum?.length ? "string enum" : "string", "SQLiteText"); - this.config.enumValues = config3.enum; - this.config.length = config3.length; + constructor(name3, config2) { + super(name3, config2.enum?.length ? "string enum" : "string", "SQLiteText"); + this.config.enumValues = config2.enum; + this.config.length = config2.length; } build(table2) { return new SQLiteText(table2, this.config); @@ -88027,8 +88807,8 @@ var init_text = __esm(() => { SQLiteText = class extends SQLiteColumn { static [entityKind] = "SQLiteText"; enumValues = this.config.enumValues; - constructor(table2, config3) { - super(table2, config3); + constructor(table2, config2) { + super(table2, config2); } getSQLType() { return `text${this.config.length ? `(${this.config.length})` : ""}`; @@ -88100,12 +88880,12 @@ var init_indexes = __esm(() => { static [entityKind] = "SQLiteIndex"; config; isNameExplicit; - constructor(config3, table2) { + constructor(config2, table2) { this.config = { - ...config3, + ...config2, table: table2 }; - this.isNameExplicit = !!config3.name; + this.isNameExplicit = !!config2.name; } }; }); @@ -88113,8 +88893,8 @@ var init_indexes = __esm(() => { // node_modules/drizzle-orm/sqlite-core/columns/custom.js function customType(customTypeParams) { return (a, b) => { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - return new SQLiteCustomColumnBuilder(name3, config3, customTypeParams); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + return new SQLiteCustomColumnBuilder(name3, config2, customTypeParams); }; } var SQLiteCustomColumnBuilder, SQLiteCustomColumn; @@ -88140,13 +88920,13 @@ var init_custom = __esm(() => { mapFrom; mapJson; forJsonSelect; - constructor(table2, config3) { - super(table2, config3); - this.sqlName = config3.customTypeParams.dataType(config3.fieldConfig); - this.mapTo = config3.customTypeParams.toDriver; - this.mapFrom = config3.customTypeParams.fromDriver; - this.mapJson = config3.customTypeParams.fromJson; - this.forJsonSelect = config3.customTypeParams.forJsonSelect; + constructor(table2, config2) { + super(table2, config2); + this.sqlName = config2.customTypeParams.dataType(config2.fieldConfig); + this.mapTo = config2.customTypeParams.toDriver; + this.mapFrom = config2.customTypeParams.fromDriver; + this.mapJson = config2.customTypeParams.fromJson; + this.forJsonSelect = config2.customTypeParams.forJsonSelect; } getSQLType() { return this.sqlName; @@ -88181,8 +88961,8 @@ var init_custom = __esm(() => { // node_modules/drizzle-orm/sqlite-core/columns/numeric.js function numeric2(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - const mode = config3?.mode; + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + const mode = config2?.mode; return mode === "number" ? new SQLiteNumericNumberBuilder(name3) : mode === "bigint" ? new SQLiteNumericBigIntBuilder(name3) : new SQLiteNumericBuilder(name3); } var SQLiteNumericBuilder, SQLiteNumeric, SQLiteNumericNumberBuilder, SQLiteNumericNumber, SQLiteNumericBigIntBuilder, SQLiteNumericBigInt; @@ -88306,10 +89086,10 @@ var init_table2 = __esm(() => { }); // node_modules/drizzle-orm/sqlite-core/primary-keys.js -function primaryKey(...config3) { - if (config3[0].columns) - return new PrimaryKeyBuilder(config3[0].columns, config3[0].name); - return new PrimaryKeyBuilder(config3); +function primaryKey(...config2) { + if (config2[0].columns) + return new PrimaryKeyBuilder(config2[0].columns, config2[0].name); + return new PrimaryKeyBuilder(config2); } var PrimaryKeyBuilder, PrimaryKey; var init_primary_keys = __esm(() => { @@ -88424,9 +89204,9 @@ var init_foreign_keys2 = __esm(() => { reference; _onUpdate = "no action"; _onDelete = "no action"; - constructor(config3, actions) { + constructor(config2, actions) { this.reference = () => { - const { name: name3, columns, foreignColumns } = config3(); + const { name: name3, columns, foreignColumns } = config2(); return { name: name3, columns, @@ -88551,17 +89331,17 @@ var init_common2 = __esm(() => { this.config.dimensions = dim.length / 2; return this; } - references(ref, config3 = {}) { + references(ref, config2 = {}) { this.foreignKeyConfigs.push({ ref, - config: config3 + config: config2 }); return this; } - unique(name3, config3) { + unique(name3, config2) { this.config.isUnique = true; this.config.uniqueName = name3; - this.config.uniqueType = config3?.nulls; + this.config.uniqueType = config2?.nulls; return this; } generatedAlwaysAs(as6) { @@ -88573,22 +89353,22 @@ var init_common2 = __esm(() => { return this; } buildForeignKeys(column, table2) { - return this.foreignKeyConfigs.map(({ ref, config: config3 }) => { - return iife((ref2, config4) => { + return this.foreignKeyConfigs.map(({ ref, config: config2 }) => { + return iife((ref2, config3) => { const builder = new ForeignKeyBuilder2(() => { const foreignColumn = ref2(); return { - name: config4.name, + name: config3.name, columns: [column], foreignColumns: [foreignColumn] }; }); - if (config4.onUpdate) - builder.onUpdate(config4.onUpdate); - if (config4.onDelete) - builder.onDelete(config4.onDelete); + if (config3.onUpdate) + builder.onUpdate(config3.onUpdate); + if (config3.onDelete) + builder.onDelete(config3.onDelete); return builder.build(table2); - }, ref, config3); + }, ref, config2); }); } buildExtraConfigColumn(table2) { @@ -88602,10 +89382,10 @@ var init_common2 = __esm(() => { static [entityKind] = "PgColumn"; table; dimensions; - constructor(table2, config3) { - super(table2, config3); + constructor(table2, config2) { + super(table2, config2); this.table = table2; - this.dimensions = config3.dimensions ?? 0; + this.dimensions = config2.dimensions ?? 0; if (this.dimensions) { const originalFromDriver = this.mapFromDriverValue.bind(this); const originalToDriver = this.mapToDriverValue.bind(this); @@ -88706,10 +89486,10 @@ var init_int_common = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/bigint.js function bigint7(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - if (config3.mode === "number") + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + if (config2.mode === "number") return new PgBigInt53Builder(name3); - if (config3.mode === "string") + if (config2.mode === "string") return new PgBigIntStringBuilder(name3); return new PgBigInt64Builder(name3); } @@ -88781,8 +89561,8 @@ var init_bigint2 = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/bigserial.js function bigserial(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - if (config3.mode === "number") + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + if (config2.mode === "number") return new PgBigSerial53Builder(name3); return new PgBigSerial64Builder(name3); } @@ -88862,8 +89642,8 @@ var init_boolean = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/char.js function char(a, b = {}) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - return new PgCharBuilder(name3, config3); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + return new PgCharBuilder(name3, config2); } var PgCharBuilder, PgChar; var init_char = __esm(() => { @@ -88872,11 +89652,11 @@ var init_char = __esm(() => { init_utils(); PgCharBuilder = class extends PgColumnBuilder { static [entityKind] = "PgCharBuilder"; - constructor(name3, config3) { - super(name3, config3.enum?.length ? "string enum" : "string", "PgChar"); - this.config.length = config3.length ?? 1; - this.config.setLength = config3.length !== undefined; - this.config.enumValues = config3.enum; + constructor(name3, config2) { + super(name3, config2.enum?.length ? "string enum" : "string", "PgChar"); + this.config.length = config2.length ?? 1; + this.config.setLength = config2.length !== undefined; + this.config.enumValues = config2.enum; } build(table2) { return new PgChar(table2, this.config); @@ -88886,10 +89666,10 @@ var init_char = __esm(() => { static [entityKind] = "PgChar"; enumValues; setLength; - constructor(table2, config3) { - super(table2, config3); - this.enumValues = config3.enumValues; - this.setLength = config3.setLength; + constructor(table2, config2) { + super(table2, config2); + this.enumValues = config2.enumValues; + this.setLength = config2.setLength; } getSQLType() { return this.setLength ? `char(${this.length})` : `char`; @@ -88925,8 +89705,8 @@ var init_cidr = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/custom.js function customType2(customTypeParams) { return (a, b) => { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - return new PgCustomColumnBuilder(name3, config3, customTypeParams); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + return new PgCustomColumnBuilder(name3, config2, customTypeParams); }; } var PgCustomColumnBuilder, PgCustomColumn; @@ -88953,13 +89733,13 @@ var init_custom2 = __esm(() => { mapFrom; mapJson; forJsonSelect; - constructor(table2, config3) { - super(table2, config3); - this.sqlName = config3.customTypeParams.dataType(config3.fieldConfig); - this.mapTo = config3.customTypeParams.toDriver; - this.mapFrom = config3.customTypeParams.fromDriver; - this.mapJson = config3.customTypeParams.fromJson; - this.forJsonSelect = config3.customTypeParams.forJsonSelect; + constructor(table2, config2) { + super(table2, config2); + this.sqlName = config2.customTypeParams.dataType(config2.fieldConfig); + this.mapTo = config2.customTypeParams.toDriver; + this.mapFrom = config2.customTypeParams.fromDriver; + this.mapJson = config2.customTypeParams.fromJson; + this.forJsonSelect = config2.customTypeParams.forJsonSelect; if (this.dimensions) { const elementMapper = (value8) => { if (typeof this.mapJson === "function") @@ -89030,8 +89810,8 @@ var init_date_common = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/date.js function date10(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - if (config3?.mode === "date") + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + if (config2?.mode === "date") return new PgDateBuilder(name3); return new PgDateStringBuilder(name3); } @@ -89181,8 +89961,8 @@ var init_integer2 = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/interval.js function interval(a, b = {}) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - return new PgIntervalBuilder(name3, config3); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + return new PgIntervalBuilder(name3, config2); } var PgIntervalBuilder, PgInterval; var init_interval = __esm(() => { @@ -89203,10 +89983,10 @@ var init_interval = __esm(() => { static [entityKind] = "PgInterval"; fields; precision; - constructor(table2, config3) { - super(table2, config3); - this.fields = config3.intervalConfig.fields; - this.precision = config3.intervalConfig.precision; + constructor(table2, config2) { + super(table2, config2); + this.fields = config2.intervalConfig.fields; + this.precision = config2.intervalConfig.precision; } getSQLType() { return `interval${this.fields ? ` ${this.fields}` : ""}${this.precision ? `(${this.precision})` : ""}`; @@ -89233,8 +90013,8 @@ var init_json = __esm(() => { }; PgJson = class extends PgColumn { static [entityKind] = "PgJson"; - constructor(table2, config3) { - super(table2, config3); + constructor(table2, config2) { + super(table2, config2); } getSQLType() { return "json"; @@ -89273,8 +90053,8 @@ var init_jsonb = __esm(() => { }; PgJsonb = class extends PgColumn { static [entityKind] = "PgJsonb"; - constructor(table2, config3) { - super(table2, config3); + constructor(table2, config2) { + super(table2, config2); } getSQLType() { return "jsonb"; @@ -89296,8 +90076,8 @@ var init_jsonb = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/line.js function line(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - if (!config3?.mode || config3.mode === "tuple") + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + if (!config2?.mode || config2.mode === "tuple") return new PgLineBuilder(name3); return new PgLineABCBuilder(name3); } @@ -89414,9 +90194,9 @@ var init_macaddr8 = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/numeric.js function numeric3(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - const mode = config3?.mode; - return mode === "number" ? new PgNumericNumberBuilder(name3, config3?.precision, config3?.scale) : mode === "bigint" ? new PgNumericBigIntBuilder(name3, config3?.precision, config3?.scale) : new PgNumericBuilder(name3, config3?.precision, config3?.scale); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + const mode = config2?.mode; + return mode === "number" ? new PgNumericNumberBuilder(name3, config2?.precision, config2?.scale) : mode === "bigint" ? new PgNumericBigIntBuilder(name3, config2?.precision, config2?.scale) : new PgNumericBuilder(name3, config2?.precision, config2?.scale); } var PgNumericBuilder, PgNumeric, PgNumericNumberBuilder, PgNumericNumber, PgNumericBigIntBuilder, PgNumericBigInt; var init_numeric2 = __esm(() => { @@ -89438,10 +90218,10 @@ var init_numeric2 = __esm(() => { static [entityKind] = "PgNumeric"; precision; scale; - constructor(table2, config3) { - super(table2, config3); - this.precision = config3.precision; - this.scale = config3.scale; + constructor(table2, config2) { + super(table2, config2); + this.precision = config2.precision; + this.scale = config2.scale; } mapFromDriverValue(value8) { if (typeof value8 === "string") @@ -89472,10 +90252,10 @@ var init_numeric2 = __esm(() => { static [entityKind] = "PgNumericNumber"; precision; scale; - constructor(table2, config3) { - super(table2, config3); - this.precision = config3.precision; - this.scale = config3.scale; + constructor(table2, config2) { + super(table2, config2); + this.precision = config2.precision; + this.scale = config2.scale; } mapFromDriverValue(value8) { if (typeof value8 === "number") @@ -89509,10 +90289,10 @@ var init_numeric2 = __esm(() => { static [entityKind] = "PgNumericBigInt"; precision; scale; - constructor(table2, config3) { - super(table2, config3); - this.precision = config3.precision; - this.scale = config3.scale; + constructor(table2, config2) { + super(table2, config2); + this.precision = config2.precision; + this.scale = config2.scale; } mapFromDriverValue(value8) { return BigInt(value8); @@ -89533,8 +90313,8 @@ var init_numeric2 = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/point.js function point(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - if (!config3?.mode || config3.mode === "tuple") + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + if (!config2?.mode || config2.mode === "tuple") return new PgPointTupleBuilder(name3); return new PgPointObjectBuilder(name3); } @@ -89643,10 +90423,10 @@ var init_utils2 = () => {}; // node_modules/drizzle-orm/pg-core/columns/postgis_extension/geometry.js function geometry(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - if (!config3?.mode || config3.mode === "tuple") - return new PgGeometryBuilder(name3, config3?.srid); - return new PgGeometryObjectBuilder(name3, config3?.srid); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + if (!config2?.mode || config2.mode === "tuple") + return new PgGeometryBuilder(name3, config2?.srid); + return new PgGeometryObjectBuilder(name3, config2?.srid); } var PgGeometryBuilder, PgGeometry, PgGeometryObjectBuilder, PgGeometryObject; var init_geometry = __esm(() => { @@ -89730,8 +90510,8 @@ var init_real2 = __esm(() => { }; PgReal = class extends PgColumn { static [entityKind] = "PgReal"; - constructor(table2, config3) { - super(table2, config3); + constructor(table2, config2) { + super(table2, config2); } getSQLType() { return "real"; @@ -89831,8 +90611,8 @@ var init_smallserial = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/text.js function text2(a, b = {}) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - return new PgTextBuilder(name3, config3); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + return new PgTextBuilder(name3, config2); } var PgTextBuilder, PgText; var init_text2 = __esm(() => { @@ -89841,9 +90621,9 @@ var init_text2 = __esm(() => { init_utils(); PgTextBuilder = class extends PgColumnBuilder { static [entityKind] = "PgTextBuilder"; - constructor(name3, config3) { - super(name3, config3.enum?.length ? "string enum" : "string", "PgText"); - this.config.enumValues = config3.enum; + constructor(name3, config2) { + super(name3, config2.enum?.length ? "string enum" : "string", "PgText"); + this.config.enumValues = config2.enum; } build(table2) { return new PgText(table2, this.config, this.config.enumValues); @@ -89852,8 +90632,8 @@ var init_text2 = __esm(() => { PgText = class extends PgColumn { static [entityKind] = "PgText"; enumValues; - constructor(table2, config3, enumValues) { - super(table2, config3); + constructor(table2, config2, enumValues) { + super(table2, config2); this.enumValues = enumValues; } getSQLType() { @@ -89864,8 +90644,8 @@ var init_text2 = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/time.js function time4(a, b = {}) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - return new PgTimeBuilder(name3, config3.withTimezone ?? false, config3.precision); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + return new PgTimeBuilder(name3, config2.withTimezone ?? false, config2.precision); } var PgTimeBuilder, PgTime; var init_time = __esm(() => { @@ -89890,10 +90670,10 @@ var init_time = __esm(() => { static [entityKind] = "PgTime"; withTimezone; precision; - constructor(table2, config3) { - super(table2, config3); - this.withTimezone = config3.withTimezone; - this.precision = config3.precision; + constructor(table2, config2) { + super(table2, config2); + this.withTimezone = config2.withTimezone; + this.precision = config2.precision; } getSQLType() { return `time${this.precision === undefined ? "" : `(${this.precision})`}${this.withTimezone ? " with time zone" : ""}`; @@ -89903,10 +90683,10 @@ var init_time = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/timestamp.js function timestamp(a, b = {}) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - if (config3?.mode === "string") - return new PgTimestampStringBuilder(name3, config3.withTimezone ?? false, config3.precision); - return new PgTimestampBuilder(name3, config3?.withTimezone ?? false, config3?.precision); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + if (config2?.mode === "string") + return new PgTimestampStringBuilder(name3, config2.withTimezone ?? false, config2.precision); + return new PgTimestampBuilder(name3, config2?.withTimezone ?? false, config2?.precision); } var PgTimestampBuilder, PgTimestamp, PgTimestampStringBuilder, PgTimestampString; var init_timestamp = __esm(() => { @@ -89929,10 +90709,10 @@ var init_timestamp = __esm(() => { static [entityKind] = "PgTimestamp"; withTimezone; precision; - constructor(table2, config3) { - super(table2, config3); - this.withTimezone = config3.withTimezone; - this.precision = config3.precision; + constructor(table2, config2) { + super(table2, config2); + this.withTimezone = config2.withTimezone; + this.precision = config2.precision; } getSQLType() { return `timestamp${this.precision === undefined ? "" : ` (${this.precision})`}${this.withTimezone ? " with time zone" : ""}`; @@ -89963,10 +90743,10 @@ var init_timestamp = __esm(() => { static [entityKind] = "PgTimestampString"; withTimezone; precision; - constructor(table2, config3) { - super(table2, config3); - this.withTimezone = config3.withTimezone; - this.precision = config3.precision; + constructor(table2, config2) { + super(table2, config2); + this.withTimezone = config2.withTimezone; + this.precision = config2.precision; } getSQLType() { return `timestamp${this.precision === undefined ? "" : `(${this.precision})`}${this.withTimezone ? " with time zone" : ""}`; @@ -90018,8 +90798,8 @@ var init_uuid = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/varchar.js function varchar(a, b = {}) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - return new PgVarcharBuilder(name3, config3); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + return new PgVarcharBuilder(name3, config2); } var PgVarcharBuilder, PgVarchar; var init_varchar = __esm(() => { @@ -90028,10 +90808,10 @@ var init_varchar = __esm(() => { init_utils(); PgVarcharBuilder = class extends PgColumnBuilder { static [entityKind] = "PgVarcharBuilder"; - constructor(name3, config3) { - super(name3, config3.enum?.length ? "string enum" : "string", "PgVarchar"); - this.config.length = config3.length; - this.config.enumValues = config3.enum; + constructor(name3, config2) { + super(name3, config2.enum?.length ? "string enum" : "string", "PgVarchar"); + this.config.length = config2.length; + this.config.enumValues = config2.enum; } build(table2) { return new PgVarchar(table2, this.config); @@ -90040,9 +90820,9 @@ var init_varchar = __esm(() => { PgVarchar = class extends PgColumn { static [entityKind] = "PgVarchar"; enumValues; - constructor(table2, config3) { - super(table2, config3); - this.enumValues = config3.enumValues; + constructor(table2, config2) { + super(table2, config2); + this.enumValues = config2.enumValues; } getSQLType() { return this.length === undefined ? `varchar` : `varchar(${this.length})`; @@ -90052,8 +90832,8 @@ var init_varchar = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/vector_extension/bit.js function bit(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - return new PgBinaryVectorBuilder(name3, config3); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + return new PgBinaryVectorBuilder(name3, config2); } var PgBinaryVectorBuilder, PgBinaryVector; var init_bit = __esm(() => { @@ -90062,9 +90842,9 @@ var init_bit = __esm(() => { init_utils(); PgBinaryVectorBuilder = class extends PgColumnBuilder { static [entityKind] = "PgBinaryVectorBuilder"; - constructor(name3, config3) { + constructor(name3, config2) { super(name3, "string binary", "PgBinaryVector"); - this.config.length = config3.dimensions; + this.config.length = config2.dimensions; this.config.isLengthExact = true; } build(table2) { @@ -90081,8 +90861,8 @@ var init_bit = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/vector_extension/halfvec.js function halfvec(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - return new PgHalfVectorBuilder(name3, config3); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + return new PgHalfVectorBuilder(name3, config2); } var PgHalfVectorBuilder, PgHalfVector; var init_halfvec = __esm(() => { @@ -90091,9 +90871,9 @@ var init_halfvec = __esm(() => { init_utils(); PgHalfVectorBuilder = class extends PgColumnBuilder { static [entityKind] = "PgHalfVectorBuilder"; - constructor(name3, config3) { + constructor(name3, config2) { super(name3, "array halfvector", "PgHalfVector"); - this.config.length = config3.dimensions; + this.config.length = config2.dimensions; this.config.isLengthExact = true; } build(table2) { @@ -90116,8 +90896,8 @@ var init_halfvec = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/vector_extension/sparsevec.js function sparsevec(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - return new PgSparseVectorBuilder(name3, config3); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + return new PgSparseVectorBuilder(name3, config2); } var PgSparseVectorBuilder, PgSparseVector; var init_sparsevec = __esm(() => { @@ -90126,9 +90906,9 @@ var init_sparsevec = __esm(() => { init_utils(); PgSparseVectorBuilder = class extends PgColumnBuilder { static [entityKind] = "PgSparseVectorBuilder"; - constructor(name3, config3) { + constructor(name3, config2) { super(name3, "string sparsevec", "PgSparseVector"); - this.config.vectorDimensions = config3.dimensions; + this.config.vectorDimensions = config2.dimensions; } build(table2) { return new PgSparseVector(table2, this.config); @@ -90145,8 +90925,8 @@ var init_sparsevec = __esm(() => { // node_modules/drizzle-orm/pg-core/columns/vector_extension/vector.js function vector(a, b) { - const { name: name3, config: config3 } = getColumnNameAndConfig2(a, b); - return new PgVectorBuilder(name3, config3); + const { name: name3, config: config2 } = getColumnNameAndConfig(a, b); + return new PgVectorBuilder(name3, config2); } var PgVectorBuilder, PgVector; var init_vector = __esm(() => { @@ -90155,9 +90935,9 @@ var init_vector = __esm(() => { init_utils(); PgVectorBuilder = class extends PgColumnBuilder { static [entityKind] = "PgVectorBuilder"; - constructor(name3, config3) { + constructor(name3, config2) { super(name3, "array vector", "PgVector"); - this.config.length = config3.dimensions; + this.config.length = config2.dimensions; this.config.isLengthExact = true; } build(table2) { @@ -90364,7 +91144,7 @@ function getOperators() { sql }; } -function getOrderByOperators2() { +function getOrderByOperators() { return { sql, asc, @@ -90419,13 +91199,13 @@ function extractTablesRelationalConfig(schema2, configHelpers) { }; } function createOne(sourceTable) { - return function one2(table2, config3) { - return new One2(sourceTable, table2, config3, config3?.fields.reduce((res, f) => res && f.notNull, true) ?? false); + return function one2(table2, config2) { + return new One2(sourceTable, table2, config2, config2?.fields.reduce((res, f) => res && f.notNull, true) ?? false); }; } function createMany(sourceTable) { - return function many(referencedTable, config3) { - return new Many2(sourceTable, referencedTable, config3); + return function many(referencedTable, config2) { + return new Many(sourceTable, referencedTable, config2); }; } function normalizeRelation(schema2, tableNamesMap, relation) { @@ -90485,7 +91265,7 @@ function mapRelationalRow2(tablesConfig, tableConfig, row, buildQueryResultSelec } return result6; } -var Relation2, Relations, One2, Many2; +var Relation2, Relations, One2, Many; var init__relations = __esm(() => { init_entity(); init_column(); @@ -90507,16 +91287,16 @@ var init__relations = __esm(() => { }; Relations = class { static [entityKind] = "Relations"; - constructor(table2, config3) { + constructor(table2, config2) { this.table = table2; - this.config = config3; + this.config = config2; } }; One2 = class One3 extends Relation2 { static [entityKind] = "One"; - constructor(sourceTable, referencedTable, config3, isNullable) { - super(sourceTable, referencedTable, config3?.relationName); - this.config = config3; + constructor(sourceTable, referencedTable, config2, isNullable) { + super(sourceTable, referencedTable, config2?.relationName); + this.config = config2; this.isNullable = isNullable; } withFieldName(fieldName) { @@ -90525,45 +91305,20 @@ var init__relations = __esm(() => { return relation; } }; - Many2 = class Many3 extends Relation2 { + Many = class Many2 extends Relation2 { static [entityKind] = "Many"; - constructor(sourceTable, referencedTable, config3) { - super(sourceTable, referencedTable, config3?.relationName); - this.config = config3; + constructor(sourceTable, referencedTable, config2) { + super(sourceTable, referencedTable, config2?.relationName); + this.config = config2; } withFieldName(fieldName) { - const relation = new Many3(this.sourceTable, this.referencedTable, this.config); + const relation = new Many2(this.sourceTable, this.referencedTable, this.config); relation.fieldName = fieldName; return relation; } }; }); -// node_modules/drizzle-orm/query-promise.js -var QueryPromise2; -var init_query_promise = __esm(() => { - init_entity(); - QueryPromise2 = class { - static [entityKind] = "QueryPromise"; - [Symbol.toStringTag] = "QueryPromise"; - catch(onRejected) { - return this.then(undefined, onRejected); - } - finally(onFinally) { - return this.then((value8) => { - onFinally?.(); - return value8; - }, (reason2) => { - onFinally?.(); - throw reason2; - }); - } - then(onFulfilled, onRejected) { - return this.execute().then(onFulfilled, onRejected); - } - }; -}); - // node_modules/drizzle-orm/sqlite-core/query-builders/_query.js var _RelationalQueryBuilder, SQLiteRelationalQuery, SQLiteSyncRelationalQuery; var init__query = __esm(() => { @@ -90582,23 +91337,23 @@ var init__query = __esm(() => { this.dialect = dialect; this.session = session; } - findMany(config3) { - return this.mode === "sync" ? new SQLiteSyncRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config3 ? config3 : {}, "many") : new SQLiteRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config3 ? config3 : {}, "many"); + findMany(config2) { + return this.mode === "sync" ? new SQLiteSyncRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config2 ? config2 : {}, "many") : new SQLiteRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config2 ? config2 : {}, "many"); } - findFirst(config3) { - return this.mode === "sync" ? new SQLiteSyncRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config3 ? { - ...config3, + findFirst(config2) { + return this.mode === "sync" ? new SQLiteSyncRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config2 ? { + ...config2, limit: 1 - } : { limit: 1 }, "first") : new SQLiteRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config3 ? { - ...config3, + } : { limit: 1 }, "first") : new SQLiteRelationalQuery(this.fullSchema, this.schema, this.tableNamesMap, this.table, this.tableConfig, this.dialect, this.session, config2 ? { + ...config2, limit: 1 } : { limit: 1 }, "first"); } }; - SQLiteRelationalQuery = class extends QueryPromise2 { + SQLiteRelationalQuery = class extends QueryPromise { static [entityKind] = "SQLiteAsyncRelationalQuery"; mode; - constructor(fullSchema, schema2, tableNamesMap, table2, tableConfig, dialect, session, config3, mode) { + constructor(fullSchema, schema2, tableNamesMap, table2, tableConfig, dialect, session, config2, mode) { super(); this.fullSchema = fullSchema; this.schema = schema2; @@ -90607,7 +91362,7 @@ var init__query = __esm(() => { this.tableConfig = tableConfig; this.dialect = dialect; this.session = session; - this.config = config3; + this.config = config2; this.mode = mode; } getSQL() { @@ -90708,460 +91463,6 @@ var init_count = __esm(() => { }; }); -// node_modules/drizzle-orm/alias.js -function aliasedTable2(table2, tableAlias) { - return new Proxy(table2, new TableAliasProxyHandler2(tableAlias, false, false)); -} -function aliasedColumn2(column, alias) { - return new Proxy(column, new ColumnAliasProxyHandler2(alias)); -} -function aliasedTableColumn2(column, tableAlias) { - return new Proxy(column, new ColumnTableAliasProxyHandler2(new Proxy(column.table, new TableAliasProxyHandler2(tableAlias, false, false)), false)); -} -function mapColumnsInAliasedSQLToAlias2(query, alias) { - return new SQL.Aliased(mapColumnsInSQLToAlias2(query.sql, alias), query.fieldAlias); -} -function mapColumnsInSQLToAlias2(query, alias) { - return sql.join(query.queryChunks.map((c) => { - if (is6(c, Column)) - return aliasedTableColumn2(c, alias); - if (is6(c, SQL)) - return mapColumnsInSQLToAlias2(c, alias); - if (is6(c, SQL.Aliased)) - return mapColumnsInAliasedSQLToAlias2(c, alias); - return c; - })); -} -function getOriginalColumnFromAlias2(column) { - return column[OriginalColumn](); -} -var ColumnTableAliasProxyHandler2, ViewSelectionAliasProxyHandler2, TableAliasProxyHandler2, ColumnAliasProxyHandler2; -var init_alias = __esm(() => { - init_column_common(); - init_entity(); - init_column(); - init_table(); - init_sql(); - init_subquery(); - init_view_common(); - ColumnTableAliasProxyHandler2 = class { - static [entityKind] = "ColumnTableAliasProxyHandler"; - constructor(table2, ignoreColumnAlias) { - this.table = table2; - this.ignoreColumnAlias = ignoreColumnAlias; - } - get(columnObj, prop) { - if (prop === "table") - return this.table; - if (prop === "isAlias" && this.ignoreColumnAlias) - return false; - return columnObj[prop]; - } - }; - ViewSelectionAliasProxyHandler2 = class { - static [entityKind] = "ViewSelectionAliasProxyHandler"; - constructor(view, selection, ignoreColumnAlias) { - this.view = view; - this.selection = selection; - this.ignoreColumnAlias = ignoreColumnAlias; - } - get(selection, prop) { - const value8 = selection[prop]; - if (is6(value8, Column)) - return new Proxy(value8, new ColumnTableAliasProxyHandler2(this.view, this.ignoreColumnAlias)); - if (is6(value8, Subquery) || is6(value8, SQL) || is6(value8, SQL.Aliased) || isSQLWrapper(value8) || typeof value8 !== "object" || value8 === null) - return value8; - return new Proxy(value8, this); - } - }; - TableAliasProxyHandler2 = class { - static [entityKind] = "TableAliasProxyHandler"; - constructor(alias, replaceOriginalName, ignoreColumnAlias) { - this.alias = alias; - this.replaceOriginalName = replaceOriginalName; - this.ignoreColumnAlias = ignoreColumnAlias; - } - get(target, prop) { - if (prop === Table.Symbol.IsAlias) - return true; - if (prop === Table.Symbol.Name) - return this.alias; - if (this.replaceOriginalName && prop === Table.Symbol.OriginalName) - return this.alias; - if (prop === ViewBaseConfig) - return { - ...target[ViewBaseConfig], - name: this.alias, - isAlias: true, - selectedFields: new Proxy(target[ViewBaseConfig].selectedFields, new ViewSelectionAliasProxyHandler2(new Proxy(target, this), target[ViewBaseConfig].selectedFields, this.ignoreColumnAlias)) - }; - if (prop === Table.Symbol.Columns) { - const columns = target[Table.Symbol.Columns]; - if (!columns) - return columns; - if (is6(target, View)) - return new Proxy(target[Table.Symbol.Columns], new ViewSelectionAliasProxyHandler2(new Proxy(target, this), target[Table.Symbol.Columns], this.ignoreColumnAlias)); - const proxiedColumns = {}; - Object.keys(columns).map((key) => { - proxiedColumns[key] = new Proxy(columns[key], new ColumnTableAliasProxyHandler2(new Proxy(target, this), this.ignoreColumnAlias)); - }); - return proxiedColumns; - } - const value8 = target[prop]; - if (is6(value8, Column)) - return new Proxy(value8, new ColumnTableAliasProxyHandler2(new Proxy(target, this), this.ignoreColumnAlias)); - return value8; - } - }; - ColumnAliasProxyHandler2 = class { - static [entityKind] = "ColumnAliasProxyHandler"; - constructor(alias) { - this.alias = alias; - } - get(target, prop) { - if (prop === "isAlias") - return true; - if (prop === "name") - return this.alias; - if (prop === "keyAsName") - return false; - if (prop === OriginalColumn) - return () => target; - return target[prop]; - } - }; - Column.prototype.as = function(alias) { - return aliasedColumn2(this, alias); - }; -}); - -// node_modules/drizzle-orm/errors.js -var DrizzleError2, DrizzleQueryError2, TransactionRollbackError2; -var init_errors5 = __esm(() => { - init_entity(); - DrizzleError2 = class extends Error { - static [entityKind] = "DrizzleError"; - constructor({ message, cause }) { - super(message); - this.name = "DrizzleError"; - this.cause = cause; - } - }; - DrizzleQueryError2 = class DrizzleQueryError3 extends Error { - static [entityKind] = "DrizzleQueryError"; - constructor(query, params, cause) { - super(`Failed query: ${query} -params: ${params}`); - this.query = query; - this.params = params; - this.cause = cause; - Error.captureStackTrace(this, DrizzleQueryError3); - if (cause) - this.cause = cause; - } - }; - TransactionRollbackError2 = class extends DrizzleError2 { - static [entityKind] = "TransactionRollbackError"; - constructor() { - super({ message: "Rollback" }); - } - }; -}); - -// node_modules/drizzle-orm/relations.js -function mapRelationalRow3(row, buildQueryResultSelection, mapColumnValue = (value8) => value8, parseJson2 = false, parseJsonIfString = false, path5) { - for (const selectionItem of buildQueryResultSelection) { - if (selectionItem.selection) { - const currentPath = `${path5 ? `${path5}.` : ""}${selectionItem.key}`; - if (row[selectionItem.key] === null) - continue; - if (parseJson2) { - row[selectionItem.key] = JSON.parse(row[selectionItem.key]); - if (row[selectionItem.key] === null) - continue; - } - if (parseJsonIfString && typeof row[selectionItem.key] === "string") - row[selectionItem.key] = JSON.parse(row[selectionItem.key]); - if (selectionItem.isArray) { - for (const item of row[selectionItem.key]) - mapRelationalRow3(item, selectionItem.selection, mapColumnValue, false, parseJsonIfString, currentPath); - continue; - } - mapRelationalRow3(row[selectionItem.key], selectionItem.selection, mapColumnValue, false, parseJsonIfString, currentPath); - continue; - } - const field = selectionItem.field; - const value8 = mapColumnValue(row[selectionItem.key]); - if (value8 === null) - continue; - let decoder2; - if (is6(field, Column)) - decoder2 = field; - else if (is6(field, SQL)) - decoder2 = field.decoder; - else if (is6(field, SQL.Aliased)) - decoder2 = field.sql.decoder; - else if (is6(field, Table) || is6(field, View)) - decoder2 = noopDecoder; - else - decoder2 = field.getSQL().decoder; - row[selectionItem.key] = "mapFromJsonValue" in decoder2 ? decoder2.mapFromJsonValue(value8) : decoder2.mapFromDriverValue(value8); - } - return row; -} -function fieldSelectionToSQL2(table2, target) { - const field = table2[TableColumns][target]; - return field ? is6(field, Column) ? field : is6(field, SQL.Aliased) ? sql`${table2}.${sql.identifier(field.fieldAlias)}` : sql`${table2}.${sql.identifier(target)}` : sql`${table2}.${sql.identifier(target)}`; -} -function relationsFieldFilterToSQL(column, filter21) { - if (typeof filter21 !== "object" || is6(filter21, Placeholder)) - return eq(column, filter21); - const entries10 = Object.entries(filter21); - if (!entries10.length) - return; - const parts3 = []; - for (const [target, value8] of entries10) { - if (value8 === undefined) - continue; - switch (target) { - case "NOT": { - const res = relationsFieldFilterToSQL(column, value8); - if (!res) - continue; - parts3.push(not5(res)); - continue; - } - case "OR": - if (!value8.length) - continue; - parts3.push(or5(...value8.map((subFilter) => relationsFieldFilterToSQL(column, subFilter)))); - continue; - case "AND": - if (!value8.length) - continue; - parts3.push(and3(...value8.map((subFilter) => relationsFieldFilterToSQL(column, subFilter)))); - continue; - case "isNotNull": - case "isNull": - if (!value8) - continue; - parts3.push(operators2[target](column)); - continue; - case "in": - parts3.push(operators2.inArray(column, value8)); - continue; - case "notIn": - parts3.push(operators2.notInArray(column, value8)); - continue; - default: - parts3.push(operators2[target](column, value8)); - continue; - } - } - if (!parts3.length) - return; - return and3(...parts3); -} -function relationsFilterToSQL2(table2, filter21, tableRelations = {}, tablesRelations = {}, casing, depth = 0) { - const entries10 = Object.entries(filter21); - if (!entries10.length) - return; - const parts3 = []; - for (const [target, value8] of entries10) { - if (value8 === undefined) - continue; - switch (target) { - case "RAW": { - const processed = typeof value8 === "function" ? value8(table2, operators2) : value8.getSQL(); - parts3.push(processed); - continue; - } - case "OR": - if (!value8?.length) - continue; - parts3.push(or5(...value8.map((subFilter) => relationsFilterToSQL2(table2, subFilter, tableRelations, tablesRelations, casing, depth)))); - continue; - case "AND": - if (!value8?.length) - continue; - parts3.push(and3(...value8.map((subFilter) => relationsFilterToSQL2(table2, subFilter, tableRelations, tablesRelations, casing, depth)))); - continue; - case "NOT": { - if (value8 === undefined) - continue; - const built = relationsFilterToSQL2(table2, value8, tableRelations, tablesRelations, casing, depth); - if (!built) - continue; - parts3.push(not5(built)); - continue; - } - default: { - if (table2[TableColumns][target]) { - const colFilter = relationsFieldFilterToSQL(fieldSelectionToSQL2(table2, target), value8); - if (colFilter) - parts3.push(colFilter); - continue; - } - const relation = tableRelations[target]; - if (!relation) - throw new DrizzleError2({ message: `Unknown relational filter field: "${target}"` }); - const targetTable = aliasedTable2(relation.targetTable, `f${depth}`); - const throughTable = relation.throughTable ? aliasedTable2(relation.throughTable, `ft${depth}`) : undefined; - const targetConfig = tablesRelations[relation.targetTableName]; - const { filter: relationFilter, joinCondition } = relationToSQL2(casing, relation, table2, targetTable, throughTable); - const filter22 = and3(relationFilter, typeof value8 === "boolean" ? undefined : relationsFilterToSQL2(targetTable, value8, targetConfig.relations, tablesRelations, casing, depth + 1)); - const subquery = throughTable ? sql`(select * from ${getTableAsAliasSQL2(targetTable)} inner join ${getTableAsAliasSQL2(throughTable)} on ${joinCondition}${sql` where ${filter22}`.if(filter22)} limit 1)` : sql`(select * from ${getTableAsAliasSQL2(targetTable)}${sql` where ${filter22}`.if(filter22)} limit 1)`; - if (filter22) - parts3.push((value8 ? exists2 : notExists)(subquery)); - } - } - } - return and3(...parts3); -} -function relationsOrderToSQL2(table2, orders) { - if (typeof orders === "function") { - const data2 = orders(table2, orderByOperators2); - return is6(data2, SQL) ? data2 : Array.isArray(data2) ? data2.length ? sql.join(data2.map((o) => is6(o, SQL) ? o : asc(o)), sql`, `) : undefined : is6(data2, Column) ? asc(data2) : undefined; - } - const entries10 = Object.entries(orders).filter(([_2, value8]) => value8); - if (!entries10.length) - return; - return sql.join(entries10.map(([target, value8]) => (value8 === "asc" ? asc : desc)(fieldSelectionToSQL2(table2, target))), sql`, `); -} -function relationExtrasToSQL2(table2, extras) { - const subqueries = []; - const selection = []; - for (const [key, field] of Object.entries(extras)) { - if (!field) - continue; - const extra = typeof field === "function" ? field(table2, { sql: operators2.sql }) : field; - const query = sql`(${extra.getSQL()}) as ${sql.identifier(key)}`; - query.decoder = extra.getSQL().decoder; - subqueries.push(query); - selection.push({ - key, - field: query - }); - } - return { - sql: subqueries.length ? sql.join(subqueries, sql`, `) : undefined, - selection - }; -} -function relationToSQL2(casing, relation, sourceTable, targetTable, throughTable) { - if (relation.through) { - const outerColumnWhere = relation.sourceColumns.map((s, i2) => { - const t = relation.through.source[i2]; - return eq(sql`${sourceTable}.${sql.identifier(casing.getColumnCasing(s))}`, sql`${throughTable}.${sql.identifier(is6(t._.column, Column) ? casing.getColumnCasing(t._.column) : t._.key)}`); - }); - const innerColumnWhere = relation.targetColumns.map((s, i2) => { - const t = relation.through.target[i2]; - return eq(sql`${throughTable}.${sql.identifier(is6(t._.column, Column) ? casing.getColumnCasing(t._.column) : t._.key)}`, sql`${targetTable}.${sql.identifier(casing.getColumnCasing(s))}`); - }); - return { - filter: and3(relation.where ? relationsFilterToSQL2(relation.isReversed ? sourceTable : targetTable, relation.where) : undefined, ...outerColumnWhere), - joinCondition: and3(...innerColumnWhere) - }; - } - return { filter: and3(...relation.sourceColumns.map((s, i2) => { - const t = relation.targetColumns[i2]; - return eq(sql`${sourceTable}.${sql.identifier(casing.getColumnCasing(s))}`, sql`${targetTable}.${sql.identifier(casing.getColumnCasing(t))}`); - }), relation.where ? relationsFilterToSQL2(relation.isReversed ? sourceTable : targetTable, relation.where) : undefined) }; -} -function getTableAsAliasSQL2(table2) { - return sql`${table2[IsAlias] ? sql`${sql`${sql.identifier(table2[TableSchema] ?? "")}.`.if(table2[TableSchema])}${sql.identifier(table2[OriginalName])} as ${table2}` : table2}`; -} -var Relation3, One4, operators2, orderByOperators2; -var init_relations = __esm(() => { - init_entity(); - init_column(); - init_sql(); - init_alias(); - init_errors5(); - init_conditions(); - init_select(); - init_table(); - Relation3 = class { - static [entityKind] = "RelationV2"; - fieldName; - sourceColumns; - targetColumns; - alias; - where; - sourceTable; - targetTable; - through; - throughTable; - isReversed; - sourceColumnTableNames = []; - targetColumnTableNames = []; - constructor(targetTable, targetTableName) { - this.targetTableName = targetTableName; - this.targetTable = targetTable; - } - }; - One4 = class extends Relation3 { - static [entityKind] = "OneV2"; - relationType = "one"; - optional; - constructor(tables, targetTable, targetTableName, config3) { - super(targetTable, targetTableName); - this.alias = config3?.alias; - this.where = config3?.where; - if (config3?.from) - this.sourceColumns = (Array.isArray(config3.from) ? config3.from : [config3.from]).map((it2) => { - this.throughTable ??= it2._.through ? tables[it2._.through._.tableName] : undefined; - this.sourceColumnTableNames.push(it2._.tableName); - return it2._.column; - }); - if (config3?.to) - this.targetColumns = (Array.isArray(config3.to) ? config3.to : [config3.to]).map((it2) => { - this.throughTable ??= it2._.through ? tables[it2._.through._.tableName] : undefined; - this.targetColumnTableNames.push(it2._.tableName); - return it2._.column; - }); - if (this.throughTable) - this.through = { - source: (Array.isArray(config3?.from) ? config3.from : (config3?.from) ? [config3.from] : []).map((c) => c._.through), - target: (Array.isArray(config3?.to) ? config3.to : (config3?.to) ? [config3.to] : []).map((c) => c._.through) - }; - this.optional = config3?.optional ?? true; - } - }; - operators2 = { - and: and3, - between: between7, - eq, - exists: exists2, - gt: gt2, - gte: gte2, - ilike, - inArray, - arrayContains, - arrayContained, - arrayOverlaps, - isNull: isNull3, - isNotNull: isNotNull2, - like, - lt: lt2, - lte: lte2, - ne: ne2, - not: not5, - notBetween, - notExists, - notLike, - notIlike, - notInArray, - or: or5, - sql - }; - orderByOperators2 = { - sql, - asc, - desc - }; -}); - // node_modules/drizzle-orm/sqlite-core/query-builders/query.js var RelationalQueryBuilder, SQLiteRelationalQuery2, SQLiteSyncRelationalQuery2; var init_query = __esm(() => { @@ -91181,24 +91482,24 @@ var init_query = __esm(() => { this.rowMode = rowMode; this.forbidJsonb = forbidJsonb; } - findMany(config3) { - return this.mode === "sync" ? new SQLiteSyncRelationalQuery2(this.schema, this.table, this.tableConfig, this.dialect, this.session, config3 ?? true, "many", this.rowMode, this.forbidJsonb) : new SQLiteRelationalQuery2(this.schema, this.table, this.tableConfig, this.dialect, this.session, config3 ?? true, "many", this.rowMode, this.forbidJsonb); + findMany(config2) { + return this.mode === "sync" ? new SQLiteSyncRelationalQuery2(this.schema, this.table, this.tableConfig, this.dialect, this.session, config2 ?? true, "many", this.rowMode, this.forbidJsonb) : new SQLiteRelationalQuery2(this.schema, this.table, this.tableConfig, this.dialect, this.session, config2 ?? true, "many", this.rowMode, this.forbidJsonb); } - findFirst(config3) { - return this.mode === "sync" ? new SQLiteSyncRelationalQuery2(this.schema, this.table, this.tableConfig, this.dialect, this.session, config3 ?? true, "first", this.rowMode, this.forbidJsonb) : new SQLiteRelationalQuery2(this.schema, this.table, this.tableConfig, this.dialect, this.session, config3 ?? true, "first", this.rowMode, this.forbidJsonb); + findFirst(config2) { + return this.mode === "sync" ? new SQLiteSyncRelationalQuery2(this.schema, this.table, this.tableConfig, this.dialect, this.session, config2 ?? true, "first", this.rowMode, this.forbidJsonb) : new SQLiteRelationalQuery2(this.schema, this.table, this.tableConfig, this.dialect, this.session, config2 ?? true, "first", this.rowMode, this.forbidJsonb); } }; - SQLiteRelationalQuery2 = class extends QueryPromise2 { + SQLiteRelationalQuery2 = class extends QueryPromise { static [entityKind] = "SQLiteAsyncRelationalQueryV2"; mode; table; - constructor(schema2, table2, tableConfig, dialect, session, config3, mode, rowMode, forbidJsonb) { + constructor(schema2, table2, tableConfig, dialect, session, config2, mode, rowMode, forbidJsonb) { super(); this.schema = schema2; this.tableConfig = tableConfig; this.dialect = dialect; this.session = session; - this.config = config3; + this.config = config2; this.rowMode = rowMode; this.forbidJsonb = forbidJsonb; this.mode = mode; @@ -91217,7 +91518,7 @@ var init_query = __esm(() => { _prepare(isOneTimeQuery = true) { const { query, builtQuery } = this._toSQL(); return this.session[isOneTimeQuery ? "prepareOneTimeRelationalQuery" : "prepareRelationalQuery"](builtQuery, undefined, this.mode === "first" ? "get" : "all", (rawRows, mapColumnValue) => { - const rows = rawRows.map((row) => mapRelationalRow3(row, query.selection, mapColumnValue, !this.rowMode)); + const rows = rawRows.map((row) => mapRelationalRow(row, query.selection, mapColumnValue, !this.rowMode)); if (this.mode === "first") return rows[0]; return rows; @@ -91275,7 +91576,7 @@ var SQLiteRaw; var init_raw = __esm(() => { init_entity(); init_query_promise(); - SQLiteRaw = class extends QueryPromise2 { + SQLiteRaw = class extends QueryPromise { static [entityKind] = "SQLiteRaw"; config; constructor(execute, getSQL, action, dialect, mapBatchResult) { @@ -91316,8 +91617,8 @@ var init_selection_proxy = __esm(() => { SelectionProxyHandler = class SelectionProxyHandler2 { static [entityKind] = "SelectionProxyHandler"; config; - constructor(config3) { - this.config = { ...config3 }; + constructor(config2) { + this.config = { ...config2 }; } get(subquery, prop) { if (prop === "_") @@ -91348,7 +91649,7 @@ var init_selection_proxy = __esm(() => { } if (is6(value8, Column)) { if (this.config.alias) - return new Proxy(value8, new ColumnTableAliasProxyHandler2(new Proxy(value8.table, new TableAliasProxyHandler2(this.config.alias, this.config.replaceOriginalName ?? false, true)), true)); + return new Proxy(value8, new ColumnTableAliasProxyHandler(new Proxy(value8.table, new TableAliasProxyHandler(this.config.alias, this.config.replaceOriginalName ?? false, true)), true)); return value8; } if (typeof value8 !== "object" || value8 === null) @@ -91386,7 +91687,7 @@ var init_delete = __esm(() => { init_query_promise(); init_selection_proxy(); init_table2(); - SQLiteDeleteBase = class extends QueryPromise2 { + SQLiteDeleteBase = class extends QueryPromise { static [entityKind] = "SQLiteDelete"; config; constructor(table2, session, dialect, withList) { @@ -91422,7 +91723,7 @@ var init_delete = __esm(() => { return this; } returning(fields = this.table[SQLiteTable.Symbol.Columns]) { - this.config.returning = orderSelectedFields2(fields); + this.config.returning = orderSelectedFields(fields); return this; } getSQL() { @@ -91493,7 +91794,7 @@ function createSetOperator(type3, isAll) { rightSelect: select })); for (const setOperator of setOperators) - if (!haveSameKeys2(leftSelect.getSelectedFields(), setOperator.rightSelect.getSelectedFields())) + if (!haveSameKeys(leftSelect.getSelectedFields(), setOperator.rightSelect.getSelectedFields())) throw new Error("Set operator error (union / intersect / except): selected fields are not the same or are in a different order"); return leftSelect.addSetOperators(setOperators); }; @@ -91523,12 +91824,12 @@ var init_select2 = __esm(() => { dialect; withList; distinct; - constructor(config3) { - this.fields = config3.fields; - this.session = config3.session; - this.dialect = config3.dialect; - this.withList = config3.withList; - this.distinct = config3.distinct; + constructor(config2) { + this.fields = config2.fields; + this.session = config2.session; + this.dialect = config2.dialect; + this.withList = config2.withList; + this.distinct = config2.distinct; } from(source) { const isPartialSelect = !!this.fields; @@ -91542,7 +91843,7 @@ var init_select2 = __esm(() => { else if (is6(source, SQL)) fields = {}; else - fields = getTableColumns2(source); + fields = getTableColumns(source); return new SQLiteSelectBase({ table: source, fields, @@ -91581,7 +91882,7 @@ var init_select2 = __esm(() => { selectedFields: fields, config: this.config }; - this.tableName = getTableLikeName2(table2); + this.tableName = getTableLikeName(table2); this.joinsNotNullableMap = typeof this.tableName === "string" ? { [this.tableName]: true } : {}; for (const item of extractUsedTable(table2)) this.usedTables.add(item); @@ -91592,7 +91893,7 @@ var init_select2 = __esm(() => { createJoin(joinType) { return (table2, on) => { const baseTableName = this.tableName; - const tableName = getTableLikeName2(table2); + const tableName = getTableLikeName(table2); for (const item of extractUsedTable(table2)) this.usedTables.add(item); if (typeof tableName === "string" && this.config.joins?.some((join10) => join10.alias === tableName)) @@ -91647,7 +91948,7 @@ var init_select2 = __esm(() => { createSetOperator(type3, isAll) { return (rightSelection) => { const rightSelect = typeof rightSelection === "function" ? rightSelection(getSQLiteSetOperators()) : rightSelection; - if (!haveSameKeys2(this.getSelectedFields(), rightSelect.getSelectedFields())) + if (!haveSameKeys(this.getSelectedFields(), rightSelect.getSelectedFields())) throw new Error("Set operator error (union / intersect / except): selected fields are not the same or are in a different order"); this.config.setOperators.push({ type: type3, @@ -91763,7 +92064,7 @@ var init_select2 = __esm(() => { _prepare(isOneTimeQuery = true) { if (!this.session) throw new Error("Cannot execute a query on a query builder. Please use a database instance instead."); - const fieldsList = orderSelectedFields2(this.config.fields); + const fieldsList = orderSelectedFields(this.config.fields); const query = this.session[isOneTimeQuery ? "prepareOneTimeQuery" : "prepareQuery"](this.dialect.sqlToQuery(this.getSQL()), fieldsList, "all", true, undefined, { type: "select", tables: [...this.usedTables] @@ -91771,15 +92072,15 @@ var init_select2 = __esm(() => { query.joinsNotNullableMap = this.joinsNotNullableMap; return query; } - $withCache(config3) { - this.cacheConfig = config3 === undefined ? { + $withCache(config2) { + this.cacheConfig = config2 === undefined ? { config: {}, enabled: true, autoInvalidate: true - } : config3 === false ? { enabled: false } : { + } : config2 === false ? { enabled: false } : { enabled: true, autoInvalidate: true, - ...config3 + ...config2 }; return this; } @@ -91802,7 +92103,7 @@ var init_select2 = __esm(() => { return this.all(); } }; - applyMixins2(SQLiteSelectBase, [QueryPromise2]); + applyMixins(SQLiteSelectBase, [QueryPromise]); union13 = createSetOperator("union", false); unionAll = createSetOperator("union", true); intersect = createSetOperator("intersect", false); @@ -91994,8 +92295,8 @@ var init_dialect = __esm(() => { SQLiteDialect = class { static [entityKind] = "SQLiteDialect"; casing; - constructor(config3) { - this.casing = new CasingCache(config3?.casing); + constructor(config2) { + this.casing = new CasingCache(config2?.casing); } escapeName(name3) { return `"${name3}"`; @@ -92069,13 +92370,13 @@ var init_dialect = __esm(() => { } else if (is6(field, Column)) if (field.columnType === "SQLiteNumericBigInt") if (isSingleTable) - chunk.push(field.isAlias ? sql`cast(${sql.identifier(this.casing.getColumnCasing(getOriginalColumnFromAlias2(field)))} as text) as ${field}` : sql`cast(${sql.identifier(this.casing.getColumnCasing(field))} as text)`); + chunk.push(field.isAlias ? sql`cast(${sql.identifier(this.casing.getColumnCasing(getOriginalColumnFromAlias(field)))} as text) as ${field}` : sql`cast(${sql.identifier(this.casing.getColumnCasing(field))} as text)`); else - chunk.push(field.isAlias ? sql`cast(${getOriginalColumnFromAlias2(field)} as text) as ${field}` : sql`cast(${field} as text)`); + chunk.push(field.isAlias ? sql`cast(${getOriginalColumnFromAlias(field)} as text) as ${field}` : sql`cast(${field} as text)`); else if (isSingleTable) - chunk.push(field.isAlias ? sql`${sql.identifier(this.casing.getColumnCasing(getOriginalColumnFromAlias2(field)))} as ${field}` : sql.identifier(this.casing.getColumnCasing(field))); + chunk.push(field.isAlias ? sql`${sql.identifier(this.casing.getColumnCasing(getOriginalColumnFromAlias(field)))} as ${field}` : sql.identifier(this.casing.getColumnCasing(field))); else - chunk.push(field.isAlias ? sql`${getOriginalColumnFromAlias2(field)} as ${field}` : field); + chunk.push(field.isAlias ? sql`${getOriginalColumnFromAlias(field)} as ${field}` : field); else if (is6(field, Subquery)) { const entries10 = Object.entries(field._.selectedFields); if (entries10.length === 1) { @@ -92140,7 +92441,7 @@ var init_dialect = __esm(() => { return table2; } buildSelectQuery({ withList, fields, fieldsFlat, where, having, table: table2, joins, orderBy, groupBy: groupBy4, limit, offset, distinct, setOperators }) { - const fieldsList = fieldsFlat ?? orderSelectedFields2(fields); + const fieldsList = fieldsFlat ?? orderSelectedFields(fields); for (const f of fieldsList) if (is6(f.field, Column) && getTableName(f.field.table) !== (is6(table2, Subquery) ? table2._.alias : is6(table2, SQLiteViewBase) ? table2[ViewBaseConfig].name : is6(table2, SQL) ? undefined : getTableName(table2)) && !((table3) => joins?.some(({ alias }) => alias === (table3[Table.Symbol.IsAlias] ? getTableName(table3) : table3[Table.Symbol.BaseName])))(f.field.table)) { const tableName = getTableName(f.field.table); @@ -92258,30 +92559,30 @@ var init_dialect = __esm(() => { invokeSource }); } - _buildRelationalQuery({ fullSchema, schema: schema2, tableNamesMap, table: table2, tableConfig, queryConfig: config3, tableAlias, nestedQueryRelation, joinOn }) { + _buildRelationalQuery({ fullSchema, schema: schema2, tableNamesMap, table: table2, tableConfig, queryConfig: config2, tableAlias, nestedQueryRelation, joinOn }) { let selection = []; let limit, offset, orderBy = [], where; const joins = []; - if (config3 === true) + if (config2 === true) selection = Object.entries(tableConfig.columns).map(([key, value8]) => ({ dbKey: value8.name, tsKey: key, - field: aliasedTableColumn2(value8, tableAlias), + field: aliasedTableColumn(value8, tableAlias), relationTableTsKey: undefined, isJson: false, selection: [] })); else { - const aliasedColumns = Object.fromEntries(Object.entries(tableConfig.columns).map(([key, value8]) => [key, aliasedTableColumn2(value8, tableAlias)])); - if (config3.where) { - const whereSql = typeof config3.where === "function" ? config3.where(aliasedColumns, getOperators()) : config3.where; - where = whereSql && mapColumnsInSQLToAlias2(whereSql, tableAlias); + const aliasedColumns = Object.fromEntries(Object.entries(tableConfig.columns).map(([key, value8]) => [key, aliasedTableColumn(value8, tableAlias)])); + if (config2.where) { + const whereSql = typeof config2.where === "function" ? config2.where(aliasedColumns, getOperators()) : config2.where; + where = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias); } const fieldsSelection = []; let selectedColumns = []; - if (config3.columns) { + if (config2.columns) { let isIncludeMode = false; - for (const [field, value8] of Object.entries(config3.columns)) { + for (const [field, value8] of Object.entries(config2.columns)) { if (value8 === undefined) continue; if (field in tableConfig.columns) { @@ -92291,7 +92592,7 @@ var init_dialect = __esm(() => { } } if (selectedColumns.length > 0) - selectedColumns = isIncludeMode ? selectedColumns.filter((c) => config3.columns?.[c] === true) : Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key)); + selectedColumns = isIncludeMode ? selectedColumns.filter((c) => config2.columns?.[c] === true) : Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key)); } else selectedColumns = Object.keys(tableConfig.columns); for (const field of selectedColumns) { @@ -92302,45 +92603,45 @@ var init_dialect = __esm(() => { }); } let selectedRelations = []; - if (config3.with) - selectedRelations = Object.entries(config3.with).filter((entry) => !!entry[1]).map(([tsKey, queryConfig]) => ({ + if (config2.with) + selectedRelations = Object.entries(config2.with).filter((entry) => !!entry[1]).map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey] })); let extras; - if (config3.extras) { - extras = typeof config3.extras === "function" ? config3.extras(aliasedColumns, { sql }) : config3.extras; + if (config2.extras) { + extras = typeof config2.extras === "function" ? config2.extras(aliasedColumns, { sql }) : config2.extras; for (const [tsKey, value8] of Object.entries(extras)) fieldsSelection.push({ tsKey, - value: mapColumnsInAliasedSQLToAlias2(value8, tableAlias) + value: mapColumnsInAliasedSQLToAlias(value8, tableAlias) }); } for (const { tsKey, value: value8 } of fieldsSelection) selection.push({ dbKey: is6(value8, SQL.Aliased) ? value8.fieldAlias : tableConfig.columns[tsKey].name, tsKey, - field: is6(value8, Column) ? aliasedTableColumn2(value8, tableAlias) : value8, + field: is6(value8, Column) ? aliasedTableColumn(value8, tableAlias) : value8, relationTableTsKey: undefined, isJson: false, selection: [] }); - let orderByOrig = typeof config3.orderBy === "function" ? config3.orderBy(aliasedColumns, getOrderByOperators2()) : config3.orderBy ?? []; + let orderByOrig = typeof config2.orderBy === "function" ? config2.orderBy(aliasedColumns, getOrderByOperators()) : config2.orderBy ?? []; if (!Array.isArray(orderByOrig)) orderByOrig = [orderByOrig]; orderBy = orderByOrig.map((orderByValue) => { if (is6(orderByValue, Column)) - return aliasedTableColumn2(orderByValue, tableAlias); - return mapColumnsInSQLToAlias2(orderByValue, tableAlias); + return aliasedTableColumn(orderByValue, tableAlias); + return mapColumnsInSQLToAlias(orderByValue, tableAlias); }); - limit = config3.limit; - offset = config3.offset; + limit = config2.limit; + offset = config2.offset; for (const { tsKey: selectedRelationTsKey, queryConfig: selectedRelationConfigValue, relation } of selectedRelations) { const normalizedRelation = normalizeRelation(schema2, tableNamesMap, relation); const relationTableTsName = tableNamesMap[getTableUniqueName(relation.referencedTable)]; const relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`; - const joinOn2 = and3(...normalizedRelation.fields.map((field2, i2) => eq(aliasedTableColumn2(normalizedRelation.references[i2], relationTableAlias), aliasedTableColumn2(field2, tableAlias)))); + const joinOn2 = and3(...normalizedRelation.fields.map((field2, i2) => eq(aliasedTableColumn(normalizedRelation.references[i2], relationTableAlias), aliasedTableColumn(field2, tableAlias)))); const builtRelation = this._buildRelationalQuery({ fullSchema, schema: schema2, @@ -92367,12 +92668,12 @@ var init_dialect = __esm(() => { } } if (selection.length === 0) - throw new DrizzleError2({ message: `No fields selected for table "${tableConfig.tsName}" ("${tableAlias}"). You need to have at least one item in "columns", "with" or "extras". If you need to select all columns, omit the "columns" key or set it to undefined.` }); + throw new DrizzleError({ message: `No fields selected for table "${tableConfig.tsName}" ("${tableAlias}"). You need to have at least one item in "columns", "with" or "extras". If you need to select all columns, omit the "columns" key or set it to undefined.` }); let result6; where = and3(joinOn, where); if (nestedQueryRelation) { let field = sql`json_array(${sql.join(selection.map(({ field: field2 }) => is6(field2, SQLiteColumn) ? sql.identifier(this.casing.getColumnCasing(field2)) : is6(field2, SQL.Aliased) ? field2.sql : field2), sql`, `)})`; - if (is6(nestedQueryRelation, Many2)) + if (is6(nestedQueryRelation, Many)) field = sql`coalesce(json_group_array(${field}), json_array())`; const nestedSelection = [{ dbKey: "data", @@ -92384,7 +92685,7 @@ var init_dialect = __esm(() => { }]; if (limit !== undefined || offset !== undefined || orderBy.length > 0) { result6 = this.buildSelectQuery({ - table: aliasedTable2(table2, tableAlias), + table: aliasedTable(table2, tableAlias), fields: {}, fieldsFlat: [{ path: [], @@ -92401,13 +92702,13 @@ var init_dialect = __esm(() => { offset = undefined; orderBy = undefined; } else - result6 = aliasedTable2(table2, tableAlias); + result6 = aliasedTable(table2, tableAlias); result6 = this.buildSelectQuery({ table: is6(result6, SQLiteTable) ? result6 : new Subquery(result6, {}, tableAlias), fields: {}, fieldsFlat: nestedSelection.map(({ field: field2 }) => ({ path: [], - field: is6(field2, Column) ? aliasedTableColumn2(field2, tableAlias) : field2 + field: is6(field2, Column) ? aliasedTableColumn(field2, tableAlias) : field2 })), joins, where, @@ -92418,11 +92719,11 @@ var init_dialect = __esm(() => { }); } else result6 = this.buildSelectQuery({ - table: aliasedTable2(table2, tableAlias), + table: aliasedTable(table2, tableAlias), fields: {}, fieldsFlat: selection.map(({ field }) => ({ path: [], - field: is6(field, Column) ? aliasedTableColumn2(field, tableAlias) : field + field: is6(field, Column) ? aliasedTableColumn(field, tableAlias) : field })), joins, where, @@ -92438,7 +92739,7 @@ var init_dialect = __esm(() => { }; } nestedSelectionerror() { - throw new DrizzleError2({ message: `Views with nested selections are not supported by the relational query builder` }); + throw new DrizzleError({ message: `Views with nested selections are not supported by the relational query builder` }); } buildRqbColumn(table2, column, key) { if (is6(column, Column)) { @@ -92509,20 +92810,20 @@ var init_dialect = __esm(() => { } return columnIdentifiers.length ? sql.join(columnIdentifiers, sql`, `) : undefined; })() : this.unwrapAllColumns(table2, selection); - buildRelationalQuery({ schema: schema2, table: table2, tableConfig, queryConfig: config3, relationWhere, mode, isNested, errorPath, depth, throughJoin, jsonb: jsonb2 }) { + buildRelationalQuery({ schema: schema2, table: table2, tableConfig, queryConfig: config2, relationWhere, mode, isNested, errorPath, depth, throughJoin, jsonb: jsonb2 }) { const selection = []; const isSingle = mode === "first"; - const params = config3 === true ? undefined : config3; + const params = config2 === true ? undefined : config2; const currentPath = errorPath ?? ""; const currentDepth = depth ?? 0; if (!currentDepth) - table2 = aliasedTable2(table2, `d${currentDepth}`); + table2 = aliasedTable(table2, `d${currentDepth}`); const limit = isSingle ? 1 : params?.limit; const offset = params?.offset; const columns = this.buildColumns(table2, selection, params); - const where = params?.where && relationWhere ? and3(relationsFilterToSQL2(table2, params.where, tableConfig.relations, schema2, this.casing), relationWhere) : params?.where ? relationsFilterToSQL2(table2, params.where, tableConfig.relations, schema2, this.casing) : relationWhere; - const order = params?.orderBy ? relationsOrderToSQL2(table2, params.orderBy) : undefined; - const extras = params?.extras ? relationExtrasToSQL2(table2, params.extras) : undefined; + const where = params?.where && relationWhere ? and3(relationsFilterToSQL(table2, params.where, tableConfig.relations, schema2, this.casing), relationWhere) : params?.where ? relationsFilterToSQL(table2, params.where, tableConfig.relations, schema2, this.casing) : relationWhere; + const order = params?.orderBy ? relationsOrderToSQL(table2, params.orderBy) : undefined; + const extras = params?.extras ? relationExtrasToSQL(table2, params.extras) : undefined; if (extras) selection.push(...extras.selection); const joins = params ? (() => { @@ -92534,11 +92835,11 @@ var init_dialect = __esm(() => { return; return sql.join(withEntries.map(([k2, join10]) => { const relation = tableConfig.relations[k2]; - const isSingle2 = is6(relation, One4); - const targetTable = aliasedTable2(relation.targetTable, `d${currentDepth + 1}`); - const throughTable = relation.throughTable ? aliasedTable2(relation.throughTable, `tr${currentDepth}`) : undefined; - const { filter: filter21, joinCondition } = relationToSQL2(this.casing, relation, table2, targetTable, throughTable); - const throughJoin2 = throughTable ? sql` inner join ${getTableAsAliasSQL2(throughTable)} on ${joinCondition}` : undefined; + const isSingle2 = is6(relation, One); + const targetTable = aliasedTable(relation.targetTable, `d${currentDepth + 1}`); + const throughTable = relation.throughTable ? aliasedTable(relation.throughTable, `tr${currentDepth}`) : undefined; + const { filter: filter21, joinCondition } = relationToSQL(this.casing, relation, table2, targetTable, throughTable); + const throughJoin2 = throughTable ? sql` inner join ${getTableAsAliasSQL(throughTable)} on ${joinCondition}` : undefined; const innerQuery = this.buildRelationalQuery({ table: targetTable, mode: isSingle2 ? "first" : "many", @@ -92572,17 +92873,17 @@ var init_dialect = __esm(() => { joins ].filter((e) => e !== undefined); if (!selectionArr.length) - throw new DrizzleError2({ message: `No fields selected for table "${tableConfig.name}"${currentPath ? ` ("${currentPath}")` : ""}` }); + throw new DrizzleError({ message: `No fields selected for table "${tableConfig.name}"${currentPath ? ` ("${currentPath}")` : ""}` }); return { - sql: sql`select ${sql.join(selectionArr, sql`, `)} from ${getTableAsAliasSQL2(table2)}${throughJoin}${sql` where ${where}`.if(where)}${sql` order by ${order}`.if(order)}${sql` limit ${limit}`.if(limit !== undefined)}${sql` offset ${offset}`.if(offset !== undefined)}`, + sql: sql`select ${sql.join(selectionArr, sql`, `)} from ${getTableAsAliasSQL(table2)}${throughJoin}${sql` where ${where}`.if(where)}${sql` order by ${order}`.if(order)}${sql` limit ${limit}`.if(limit !== undefined)}${sql` offset ${offset}`.if(offset !== undefined)}`, selection }; } }; SQLiteSyncDialect = class extends SQLiteDialect { static [entityKind] = "SQLiteSyncDialect"; - migrate(migrations, session, config3) { - const migrationsTable = config3 === undefined ? "__drizzle_migrations" : typeof config3 === "string" ? "__drizzle_migrations" : config3.migrationsTable ?? "__drizzle_migrations"; + migrate(migrations, session, config2) { + const migrationsTable = config2 === undefined ? "__drizzle_migrations" : typeof config2 === "string" ? "__drizzle_migrations" : config2.migrationsTable ?? "__drizzle_migrations"; const { newDb } = upgradeSyncIfNeeded(migrationsTable, session, migrations); if (newDb) { const migrationTableCreate = sql` @@ -92596,7 +92897,7 @@ var init_dialect = __esm(() => { session.run(migrationTableCreate); } const dbMigrations = session.all(sql`SELECT id, hash, created_at, name FROM ${sql.identifier(migrationsTable)}`); - if (typeof config3 === "object" && config3.init) { + if (typeof config2 === "object" && config2.init) { if (dbMigrations.length) return { exitCode: "databaseMigrations" }; if (migrations.length > 1) @@ -92739,12 +93040,12 @@ var init_insert = __esm(() => { } select(selectQuery) { const select = typeof selectQuery === "function" ? selectQuery(new QueryBuilder) : selectQuery; - if (!is6(select, SQL) && !haveSameKeys2(this.table[TableColumns], select._.selectedFields)) + if (!is6(select, SQL) && !haveSameKeys(this.table[TableColumns], select._.selectedFields)) throw new Error("Insert select error: selected fields are not the same or are in a different order compared to the table definition"); return new SQLiteInsertBase(this.table, select, this.session, this.dialect, this.withList, true); } }; - SQLiteInsertBase = class extends QueryPromise2 { + SQLiteInsertBase = class extends QueryPromise { static [entityKind] = "SQLiteInsert"; config; constructor(table2, values12, session, dialect, withList, select) { @@ -92759,31 +93060,31 @@ var init_insert = __esm(() => { }; } returning(fields = this.config.table[SQLiteTable.Symbol.Columns]) { - this.config.returning = orderSelectedFields2(fields); + this.config.returning = orderSelectedFields(fields); return this; } - onConflictDoNothing(config3 = {}) { + onConflictDoNothing(config2 = {}) { if (!this.config.onConflict) this.config.onConflict = []; - if (config3.target === undefined) + if (config2.target === undefined) this.config.onConflict.push(sql` on conflict do nothing`); else { - const targetSql = Array.isArray(config3.target) ? sql`${config3.target}` : sql`${[config3.target]}`; - const whereSql = config3.where ? sql` where ${config3.where}` : sql``; + const targetSql = Array.isArray(config2.target) ? sql`${config2.target}` : sql`${[config2.target]}`; + const whereSql = config2.where ? sql` where ${config2.where}` : sql``; this.config.onConflict.push(sql` on conflict ${targetSql} do nothing${whereSql}`); } return this; } - onConflictDoUpdate(config3) { - if (config3.where && (config3.targetWhere || config3.setWhere)) + onConflictDoUpdate(config2) { + if (config2.where && (config2.targetWhere || config2.setWhere)) throw new Error('You cannot use both "where" and "targetWhere"/"setWhere" at the same time - "where" is deprecated, use "targetWhere" or "setWhere" instead.'); if (!this.config.onConflict) this.config.onConflict = []; - const whereSql = config3.where ? sql` where ${config3.where}` : undefined; - const targetWhereSql = config3.targetWhere ? sql` where ${config3.targetWhere}` : undefined; - const setWhereSql = config3.setWhere ? sql` where ${config3.setWhere}` : undefined; - const targetSql = Array.isArray(config3.target) ? sql`${config3.target}` : sql`${[config3.target]}`; - const setSql = this.dialect.buildUpdateSet(this.config.table, mapUpdateSet2(this.config.table, config3.set)); + const whereSql = config2.where ? sql` where ${config2.where}` : undefined; + const targetWhereSql = config2.targetWhere ? sql` where ${config2.targetWhere}` : undefined; + const setWhereSql = config2.setWhere ? sql` where ${config2.setWhere}` : undefined; + const targetSql = Array.isArray(config2.target) ? sql`${config2.target}` : sql`${[config2.target]}`; + const setSql = this.dialect.buildUpdateSet(this.config.table, mapUpdateSet(this.config.table, config2.set)); this.config.onConflict.push(sql` on conflict ${targetSql}${targetWhereSql} do update set ${setSql}${whereSql}${setWhereSql}`); return this; } @@ -92846,10 +93147,10 @@ var init_update = __esm(() => { this.withList = withList; } set(values12) { - return new SQLiteUpdateBase(this.table, mapUpdateSet2(this.table, values12), this.session, this.dialect, this.withList); + return new SQLiteUpdateBase(this.table, mapUpdateSet(this.table, values12), this.session, this.dialect, this.withList); } }; - SQLiteUpdateBase = class extends QueryPromise2 { + SQLiteUpdateBase = class extends QueryPromise { static [entityKind] = "SQLiteUpdate"; config; constructor(table2, set22, session, dialect, withList) { @@ -92869,7 +93170,7 @@ var init_update = __esm(() => { } createJoin(joinType) { return (table2, on) => { - const tableName = getTableLikeName2(table2); + const tableName = getTableLikeName(table2); if (typeof tableName === "string" && this.config.joins.some((join10) => join10.alias === tableName)) throw new Error(`Alias "${tableName}" is already used in this query`); if (typeof on === "function") { @@ -92918,7 +93219,7 @@ var init_update = __esm(() => { return this; } returning(fields = this.config.table[SQLiteTable.Symbol.Columns]) { - this.config.returning = orderSelectedFields2(fields); + this.config.returning = orderSelectedFields(fields); return this; } getSQL() { @@ -93115,8 +93416,8 @@ var init_db = __esm(() => { return new SQLiteRaw(async () => this.session.values(sequel), () => sequel, "values", this.dialect, this.session.extractRawValuesValueFromBatchResult.bind(this.session)); return this.session.values(sequel); } - transaction(transaction, config3) { - return this.session.transaction(transaction, config3); + transaction(transaction, config2) { + return this.session.transaction(transaction, config2); } }; }); @@ -93153,7 +93454,7 @@ var init_session = __esm(() => { init_query_promise(); init_cache(); init_errors5(); - ExecuteResultSync = class extends QueryPromise2 { + ExecuteResultSync = class extends QueryPromise { static [entityKind] = "ExecuteResultSync"; constructor(resultCb) { super(); @@ -93189,26 +93490,26 @@ var init_session = __esm(() => { try { return await query(); } catch (e) { - throw new DrizzleQueryError2(queryString, params, e); + throw new DrizzleQueryError(queryString, params, e); } if (this.cacheConfig && !this.cacheConfig.enabled) try { return await query(); } catch (e) { - throw new DrizzleQueryError2(queryString, params, e); + throw new DrizzleQueryError(queryString, params, e); } if ((this.queryMetadata.type === "insert" || this.queryMetadata.type === "update" || this.queryMetadata.type === "delete") && this.queryMetadata.tables.length > 0) try { const [res] = await Promise.all([query(), this.cache.onMutate({ tables: this.queryMetadata.tables })]); return res; } catch (e) { - throw new DrizzleQueryError2(queryString, params, e); + throw new DrizzleQueryError(queryString, params, e); } if (!this.cacheConfig) try { return await query(); } catch (e) { - throw new DrizzleQueryError2(queryString, params, e); + throw new DrizzleQueryError(queryString, params, e); } if (this.queryMetadata.type === "select") { const fromCache = await this.cache.get(this.cacheConfig.tag ?? await hashQuery(queryString, params), this.queryMetadata.tables, this.cacheConfig.tag !== undefined, this.cacheConfig.autoInvalidate); @@ -93217,7 +93518,7 @@ var init_session = __esm(() => { try { result6 = await query(); } catch (e) { - throw new DrizzleQueryError2(queryString, params, e); + throw new DrizzleQueryError(queryString, params, e); } await this.cache.put(this.cacheConfig.tag ?? await hashQuery(queryString, params), result6, this.cacheConfig.autoInvalidate ? this.queryMetadata.tables : [], this.cacheConfig.tag !== undefined, this.cacheConfig.config); return result6; @@ -93227,7 +93528,7 @@ var init_session = __esm(() => { try { return await query(); } catch (e) { - throw new DrizzleQueryError2(queryString, params, e); + throw new DrizzleQueryError(queryString, params, e); } } getQuery() { @@ -93274,7 +93575,7 @@ var init_session = __esm(() => { try { return this.prepareOneTimeQuery(staticQuery, undefined, "run", false).run(); } catch (err2) { - throw new DrizzleError2({ + throw new DrizzleError({ cause: err2, message: `Failed to run the query '${staticQuery.sql}'` }); @@ -93314,7 +93615,7 @@ var init_session = __esm(() => { this.nestedIndex = nestedIndex; } rollback() { - throw new TransactionRollbackError2; + throw new TransactionRollbackError; } }; }); @@ -93627,8 +93928,8 @@ var require_lib = __commonJS((exports, module2) => { const p = getPathPart(envPart, cmd); for (const ext2 of pathExt) { const withExt = p + ext2; - const is8 = await isexe(withExt, { pathExt: pathExtExe, ignoreErrors: true }); - if (is8) { + const is7 = await isexe(withExt, { pathExt: pathExtExe, ignoreErrors: true }); + if (is7) { if (!opt.all) { return withExt; } @@ -93651,8 +93952,8 @@ var require_lib = __commonJS((exports, module2) => { const p = getPathPart(pathEnvPart, cmd); for (const ext2 of pathExt) { const withExt = p + ext2; - const is8 = isexeSync(withExt, { pathExt: pathExtExe, ignoreErrors: true }); - if (is8) { + const is7 = isexeSync(withExt, { pathExt: pathExtExe, ignoreErrors: true }); + if (is7) { if (!opt.all) { return withExt; } @@ -93673,10 +93974,10 @@ var require_lib = __commonJS((exports, module2) => { }); // packages/unifia/src/util/which.ts -import path5 from "path"; +import path6 from "path"; function which(cmd, env3) { const base2 = env3?.PATH ?? env3?.Path ?? process.env.PATH ?? process.env.Path ?? ""; - const full = base2 ? base2 + path5.delimiter + Global.Path.bin : Global.Path.bin; + const full = base2 ? base2 + path6.delimiter + Global.Path.bin : Global.Path.bin; const result6 = import_which.default.sync(cmd, { nothrow: true, path: full, @@ -93969,7 +94270,7 @@ var init_process = __esm(() => { }); // node_modules/@effect/platform-node-shared/dist/internal/utils.js -var handleErrnoException = (module2, method) => (err2, [path6]) => { +var handleErrnoException = (module2, method) => (err2, [path7]) => { let reason2 = "Unknown"; switch (err2.code) { case "ENOENT": @@ -93998,7 +94299,7 @@ var handleErrnoException = (module2, method) => (err2, [path6]) => { _tag: reason2, module: module2, method, - pathOrDescriptor: path6, + pathOrDescriptor: path7, syscall: err2.syscall, cause: err2 }); @@ -94025,14 +94326,14 @@ var handleBadArgument = (method) => (err2) => badArgument({ }); }, makeTempDirectory, removeFactory = (method) => { const nodeRm = effectify(NFS.rm, handleErrnoException("FileSystem", method), handleBadArgument(method)); - return (path6, options2) => nodeRm(path6, { + return (path7, options2) => nodeRm(path7, { recursive: options2?.recursive ?? false, force: options2?.force ?? false }); }, remove17, makeTempDirectoryScoped, openFactory = (method) => { const nodeOpen = effectify(NFS.open, handleErrnoException("FileSystem", method), handleBadArgument(method)); const nodeClose = effectify(NFS.close, handleErrnoException("FileSystem", method), handleBadArgument(method)); - return (path6, options2) => pipe2(acquireRelease2(nodeOpen(path6, options2?.flag ?? "r", options2?.mode), (fd) => orDie3(nodeClose(fd))), map12((fd) => makeFile(FileDescriptor(fd), options2?.flag?.startsWith("a") ?? false))); + return (path7, options2) => pipe2(acquireRelease2(nodeOpen(path7, options2?.flag ?? "r", options2?.mode), (fd) => orDie3(nodeClose(fd))), map12((fd) => makeFile(FileDescriptor(fd), options2?.flag?.startsWith("a") ?? false))); }, open3, makeFile, makeTempFileFactory = (method) => { const makeDirectory2 = makeTempDirectoryFactory(method); return fnUntraced2(function* (options2) { @@ -94042,16 +94343,16 @@ var handleBadArgument = (method) => (err2) => badArgument({ yield* writeFile4(name3, new Uint8Array(0)); return name3; }); -}, makeTempFile, makeTempFileScoped, readDirectory = (path6, options2) => tryPromise2({ - try: () => NFS.promises.readdir(path6, options2), - catch: (err2) => handleErrnoException("FileSystem", "readDirectory")(err2, [path6]) -}), readFile3 = (path6) => callback2((resume, signal) => { +}, makeTempFile, makeTempFileScoped, readDirectory = (path7, options2) => tryPromise2({ + try: () => NFS.promises.readdir(path7, options2), + catch: (err2) => handleErrnoException("FileSystem", "readDirectory")(err2, [path7]) +}), readFile3 = (path7) => callback2((resume, signal) => { try { - NFS.readFile(path6, { + NFS.readFile(path7, { signal }, (err2, data2) => { if (err2) { - resume(fail8(handleErrnoException("FileSystem", "readFile")(err2, [path6]))); + resume(fail8(handleErrnoException("FileSystem", "readFile")(err2, [path7]))); } else { resume(succeed8(data2)); } @@ -94074,22 +94375,22 @@ var handleBadArgument = (method) => (err2) => badArgument({ size: Size(stat2.size), blksize: stat2.blksize !== undefined ? some3(Size(stat2.blksize)) : none2(), blocks: fromNullishOr(stat2.blocks) -}), stat2, symlink2, truncate3, utimes2, watchNode = (path6) => callback4((queue) => acquireRelease2(sync4(() => { - const watcher = NFS.watch(path6, { +}), stat2, symlink2, truncate3, utimes2, watchNode = (path7) => callback4((queue) => acquireRelease2(sync4(() => { + const watcher = NFS.watch(path7, { recursive: true - }, (event, path7) => { - if (!path7) + }, (event, path8) => { + if (!path8) return; switch (event) { case "rename": { - runFork2(matchEffect3(stat2(path7), { + runFork2(matchEffect3(stat2(path8), { onSuccess: (_2) => offer(queue, { _tag: "Create", - path: path7 + path: path8 }), onFailure: (_2) => offer(queue, { _tag: "Remove", - path: path7 + path: path8 }) })); return; @@ -94097,7 +94398,7 @@ var handleBadArgument = (method) => (err2) => badArgument({ case "change": { offerUnsafe(queue, { _tag: "Update", - path: path7 + path: path8 }); return; } @@ -94108,7 +94409,7 @@ var handleBadArgument = (method) => (err2) => badArgument({ module: "FileSystem", _tag: "Unknown", method: "watch", - pathOrDescriptor: path6, + pathOrDescriptor: path7, cause: error46 }))); }); @@ -94116,15 +94417,15 @@ var handleBadArgument = (method) => (err2) => badArgument({ endUnsafe(queue); }); return watcher; -}), (watcher) => sync4(() => watcher.close()))), watch2 = (backend, path6) => stat2(path6).pipe(map12((stat3) => backend.pipe(flatMap((_2) => _2.register(path6, stat3)), getOrElse(() => watchNode(path6)))), unwrap4), writeFile4 = (path6, data2, options2) => callback2((resume, signal) => { +}), (watcher) => sync4(() => watcher.close()))), watch2 = (backend, path7) => stat2(path7).pipe(map12((stat3) => backend.pipe(flatMap((_2) => _2.register(path7, stat3)), getOrElse(() => watchNode(path7)))), unwrap4), writeFile4 = (path7, data2, options2) => callback2((resume, signal) => { try { - NFS.writeFile(path6, data2, { + NFS.writeFile(path7, data2, { signal, flag: options2?.flag, mode: options2?.mode }, (err2) => { if (err2) { - resume(fail8(handleErrnoException("FileSystem", "writeFile")(err2, [path6]))); + resume(fail8(handleErrnoException("FileSystem", "writeFile")(err2, [path7]))); } else { resume(void_5); } @@ -94147,7 +94448,7 @@ var init_NodeFileSystem = __esm(() => { init_utils4(); access2 = /* @__PURE__ */ (() => { const nodeAccess = /* @__PURE__ */ effectify(NFS.access, /* @__PURE__ */ handleErrnoException("FileSystem", "access"), /* @__PURE__ */ handleBadArgument("access")); - return (path6, options2) => { + return (path7, options2) => { let mode = NFS.constants.F_OK; if (options2?.readable) { mode |= NFS.constants.R_OK; @@ -94155,7 +94456,7 @@ var init_NodeFileSystem = __esm(() => { if (options2?.writable) { mode |= NFS.constants.W_OK; } - return nodeAccess(path6, mode); + return nodeAccess(path7, mode); }; })(); copy3 = /* @__PURE__ */ (() => { @@ -94172,11 +94473,11 @@ var init_NodeFileSystem = __esm(() => { })(); chmod3 = /* @__PURE__ */ (() => { const nodeChmod = /* @__PURE__ */ effectify(NFS.chmod, /* @__PURE__ */ handleErrnoException("FileSystem", "chmod"), /* @__PURE__ */ handleBadArgument("chmod")); - return (path6, mode) => nodeChmod(path6, mode); + return (path7, mode) => nodeChmod(path7, mode); })(); chown2 = /* @__PURE__ */ (() => { const nodeChown = /* @__PURE__ */ effectify(NFS.chown, /* @__PURE__ */ handleErrnoException("FileSystem", "chown"), /* @__PURE__ */ handleBadArgument("chown")); - return (path6, uid, gid) => nodeChown(path6, uid, gid); + return (path7, uid, gid) => nodeChown(path7, uid, gid); })(); link3 = /* @__PURE__ */ (() => { const nodeLink = /* @__PURE__ */ effectify(NFS.link, /* @__PURE__ */ handleErrnoException("FileSystem", "link"), /* @__PURE__ */ handleBadArgument("link")); @@ -94184,7 +94485,7 @@ var init_NodeFileSystem = __esm(() => { })(); makeDirectory = /* @__PURE__ */ (() => { const nodeMkdir = /* @__PURE__ */ effectify(NFS.mkdir, /* @__PURE__ */ handleErrnoException("FileSystem", "makeDirectory"), /* @__PURE__ */ handleBadArgument("makeDirectory")); - return (path6, options2) => nodeMkdir(path6, { + return (path7, options2) => nodeMkdir(path7, { recursive: options2?.recursive ?? false, mode: options2?.mode }); @@ -94330,11 +94631,11 @@ var init_NodeFileSystem = __esm(() => { })(); readLink = /* @__PURE__ */ (() => { const nodeReadLink = /* @__PURE__ */ effectify(NFS.readlink, /* @__PURE__ */ handleErrnoException("FileSystem", "readLink"), /* @__PURE__ */ handleBadArgument("readLink")); - return (path6) => nodeReadLink(path6); + return (path7) => nodeReadLink(path7); })(); realPath = /* @__PURE__ */ (() => { const nodeRealPath = /* @__PURE__ */ effectify(NFS.realpath, /* @__PURE__ */ handleErrnoException("FileSystem", "realPath"), /* @__PURE__ */ handleBadArgument("realPath")); - return (path6) => nodeRealPath(path6); + return (path7) => nodeRealPath(path7); })(); rename2 = /* @__PURE__ */ (() => { const nodeRename = /* @__PURE__ */ effectify(NFS.rename, /* @__PURE__ */ handleErrnoException("FileSystem", "rename"), /* @__PURE__ */ handleBadArgument("rename")); @@ -94342,19 +94643,19 @@ var init_NodeFileSystem = __esm(() => { })(); stat2 = /* @__PURE__ */ (() => { const nodeStat = /* @__PURE__ */ effectify(NFS.stat, /* @__PURE__ */ handleErrnoException("FileSystem", "stat"), /* @__PURE__ */ handleBadArgument("stat")); - return (path6) => map12(nodeStat(path6), makeFileInfo); + return (path7) => map12(nodeStat(path7), makeFileInfo); })(); symlink2 = /* @__PURE__ */ (() => { const nodeSymlink = /* @__PURE__ */ effectify(NFS.symlink, /* @__PURE__ */ handleErrnoException("FileSystem", "symlink"), /* @__PURE__ */ handleBadArgument("symlink")); - return (target, path6) => nodeSymlink(target, path6); + return (target, path7) => nodeSymlink(target, path7); })(); truncate3 = /* @__PURE__ */ (() => { const nodeTruncate = /* @__PURE__ */ effectify(NFS.truncate, /* @__PURE__ */ handleErrnoException("FileSystem", "truncate"), /* @__PURE__ */ handleBadArgument("truncate")); - return (path6, length3) => nodeTruncate(path6, length3 !== undefined ? Number(length3) : undefined); + return (path7, length3) => nodeTruncate(path7, length3 !== undefined ? Number(length3) : undefined); })(); utimes2 = /* @__PURE__ */ (() => { const nodeUtimes = /* @__PURE__ */ effectify(NFS.utimes, /* @__PURE__ */ handleErrnoException("FileSystem", "utime"), /* @__PURE__ */ handleBadArgument("utime")); - return (path6, atime, mtime) => nodeUtimes(path6, atime, mtime); + return (path7, atime, mtime) => nodeUtimes(path7, atime, mtime); })(); makeFileSystem = /* @__PURE__ */ map12(/* @__PURE__ */ serviceOption2(WatchBackend), (backend) => make43({ access: access2, @@ -94379,8 +94680,8 @@ var init_NodeFileSystem = __esm(() => { symlink: symlink2, truncate: truncate3, utimes: utimes2, - watch(path6) { - return watch2(backend, path6); + watch(path7) { + return watch2(backend, path7); }, writeFile: writeFile4 })); @@ -94408,8 +94709,8 @@ var fromFileUrl2 = (url3) => try_4({ method: "fromFileUrl", cause }) -}), toFileUrl2 = (path6) => try_4({ - try: () => NodeUrl.pathToFileURL(path6), +}), toFileUrl2 = (path7) => try_4({ + try: () => NodeUrl.pathToFileURL(path7), catch: (cause) => new BadArgument({ module: "Path", method: "toFileUrl", @@ -94812,15 +95113,15 @@ var init_filesystem2 = __esm(() => { AppFileSystem.Service = Service3; AppFileSystem.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const fs6 = yield* exports_FileSystem.FileSystem; - const existsSafe = exports_Effect.fn("FileSystem.existsSafe")(function* (path6) { - return yield* fs6.exists(path6).pipe(exports_Effect.orElseSucceed(() => false)); + const existsSafe = exports_Effect.fn("FileSystem.existsSafe")(function* (path7) { + return yield* fs6.exists(path7).pipe(exports_Effect.orElseSucceed(() => false)); }); - const isDir = exports_Effect.fn("FileSystem.isDir")(function* (path6) { - const info3 = yield* fs6.stat(path6).pipe(exports_Effect.catch(() => exports_Effect.void)); + const isDir = exports_Effect.fn("FileSystem.isDir")(function* (path7) { + const info3 = yield* fs6.stat(path7).pipe(exports_Effect.catch(() => exports_Effect.void)); return info3?.type === "Directory"; }); - const isFile2 = exports_Effect.fn("FileSystem.isFile")(function* (path6) { - const info3 = yield* fs6.stat(path6).pipe(exports_Effect.catch(() => exports_Effect.void)); + const isFile2 = exports_Effect.fn("FileSystem.isFile")(function* (path7) { + const info3 = yield* fs6.stat(path7).pipe(exports_Effect.catch(() => exports_Effect.void)); return info3?.type === "File"; }); const readDirectoryEntries = exports_Effect.fn("FileSystem.readDirectoryEntries")(function* (dirPath) { @@ -94848,27 +95149,27 @@ var init_filesystem2 = __esm(() => { catch: (cause) => new FileSystemError({ method: "readDirectoryEntries", cause }) }); }); - const readJson = exports_Effect.fn("FileSystem.readJson")(function* (path6) { - const text4 = yield* fs6.readFileString(path6); + const readJson = exports_Effect.fn("FileSystem.readJson")(function* (path7) { + const text4 = yield* fs6.readFileString(path7); return JSON.parse(text4); }); - const writeJson = exports_Effect.fn("FileSystem.writeJson")(function* (path6, data2, mode) { + const writeJson = exports_Effect.fn("FileSystem.writeJson")(function* (path7, data2, mode) { const content = JSON.stringify(data2, null, 2); - yield* fs6.writeFileString(path6, content); + yield* fs6.writeFileString(path7, content); if (mode) - yield* fs6.chmod(path6, mode); + yield* fs6.chmod(path7, mode); }); - const ensureDir = exports_Effect.fn("FileSystem.ensureDir")(function* (path6) { - yield* fs6.makeDirectory(path6, { recursive: true }); + const ensureDir = exports_Effect.fn("FileSystem.ensureDir")(function* (path7) { + yield* fs6.makeDirectory(path7, { recursive: true }); }); - const writeWithDirs = exports_Effect.fn("FileSystem.writeWithDirs")(function* (path6, content, mode) { - const write2 = typeof content === "string" ? fs6.writeFileString(path6, content) : fs6.writeFile(path6, content); + const writeWithDirs = exports_Effect.fn("FileSystem.writeWithDirs")(function* (path7, content, mode) { + const write2 = typeof content === "string" ? fs6.writeFileString(path7, content) : fs6.writeFile(path7, content); yield* write2.pipe(exports_Effect.catchIf((e) => e.reason._tag === "NotFound", () => exports_Effect.gen(function* () { - yield* fs6.makeDirectory(dirname5(path6), { recursive: true }); + yield* fs6.makeDirectory(dirname5(path7), { recursive: true }); yield* write2; }))); if (mode) - yield* fs6.chmod(path6, mode); + yield* fs6.chmod(path7, mode); }); const glob = exports_Effect.fn("FileSystem.glob")(function* (pattern, options2) { return yield* exports_Effect.tryPromise({ @@ -95005,7 +95306,7 @@ var require_windows = __commonJS((exports, module2) => { module2.exports = isexe; isexe.sync = sync8; var fs6 = __require("fs"); - function checkPathExt(path6, options2) { + function checkPathExt(path7, options2) { var pathext = options2.pathExt !== undefined ? options2.pathExt : process.env.PATHEXT; if (!pathext) { return true; @@ -95016,25 +95317,25 @@ var require_windows = __commonJS((exports, module2) => { } for (var i2 = 0;i2 < pathext.length; i2++) { var p = pathext[i2].toLowerCase(); - if (p && path6.substr(-p.length).toLowerCase() === p) { + if (p && path7.substr(-p.length).toLowerCase() === p) { return true; } } return false; } - function checkStat(stat3, path6, options2) { + function checkStat(stat3, path7, options2) { if (!stat3.isSymbolicLink() && !stat3.isFile()) { return false; } - return checkPathExt(path6, options2); + return checkPathExt(path7, options2); } - function isexe(path6, options2, cb) { - fs6.stat(path6, function(er, stat3) { - cb(er, er ? false : checkStat(stat3, path6, options2)); + function isexe(path7, options2, cb) { + fs6.stat(path7, function(er, stat3) { + cb(er, er ? false : checkStat(stat3, path7, options2)); }); } - function sync8(path6, options2) { - return checkStat(fs6.statSync(path6), path6, options2); + function sync8(path7, options2) { + return checkStat(fs6.statSync(path7), path7, options2); } }); @@ -95043,13 +95344,13 @@ var require_mode = __commonJS((exports, module2) => { module2.exports = isexe; isexe.sync = sync8; var fs6 = __require("fs"); - function isexe(path6, options2, cb) { - fs6.stat(path6, function(er, stat3) { + function isexe(path7, options2, cb) { + fs6.stat(path7, function(er, stat3) { cb(er, er ? false : checkStat(stat3, options2)); }); } - function sync8(path6, options2) { - return checkStat(fs6.statSync(path6), options2); + function sync8(path7, options2) { + return checkStat(fs6.statSync(path7), options2); } function checkStat(stat3, options2) { return stat3.isFile() && checkMode(stat3, options2); @@ -95080,7 +95381,7 @@ var require_isexe = __commonJS((exports, module2) => { } module2.exports = isexe; isexe.sync = sync8; - function isexe(path6, options2, cb) { + function isexe(path7, options2, cb) { if (typeof options2 === "function") { cb = options2; options2 = {}; @@ -95090,28 +95391,28 @@ var require_isexe = __commonJS((exports, module2) => { throw new TypeError("callback not provided"); } return new Promise(function(resolve9, reject) { - isexe(path6, options2 || {}, function(er, is8) { + isexe(path7, options2 || {}, function(er, is7) { if (er) { reject(er); } else { - resolve9(is8); + resolve9(is7); } }); }); } - core2(path6, options2 || {}, function(er, is8) { + core2(path7, options2 || {}, function(er, is7) { if (er) { if (er.code === "EACCES" || options2 && options2.ignoreErrors) { er = null; - is8 = false; + is7 = false; } } - cb(er, is8); + cb(er, is7); }); } - function sync8(path6, options2) { + function sync8(path7, options2) { try { - return core2.sync(path6, options2 || {}); + return core2.sync(path7, options2 || {}); } catch (er) { if (options2 && options2.ignoreErrors || er.code === "EACCES") { return false; @@ -95125,7 +95426,7 @@ var require_isexe = __commonJS((exports, module2) => { // node_modules/cross-spawn/node_modules/which/which.js var require_which = __commonJS((exports, module2) => { var isWindows = process.platform === "win32" || process.env.OSTYPE === "cygwin" || process.env.OSTYPE === "msys"; - var path6 = __require("path"); + var path7 = __require("path"); var COLON = isWindows ? ";" : ":"; var isexe = require_isexe(); var getNotFoundError = (cmd) => Object.assign(new Error(`not found: ${cmd}`), { code: "ENOENT" }); @@ -95161,7 +95462,7 @@ var require_which = __commonJS((exports, module2) => { return opt.all && found.length ? resolve9(found) : reject(getNotFoundError(cmd)); const ppRaw = pathEnv[i2]; const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw; - const pCmd = path6.join(pathPart, cmd); + const pCmd = path7.join(pathPart, cmd); const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd : pCmd; resolve9(subStep(p, i2, 0)); }); @@ -95169,8 +95470,8 @@ var require_which = __commonJS((exports, module2) => { if (ii2 === pathExt.length) return resolve9(step(i2 + 1)); const ext2 = pathExt[ii2]; - isexe(p + ext2, { pathExt: pathExtExe }, (er, is8) => { - if (!er && is8) { + isexe(p + ext2, { pathExt: pathExtExe }, (er, is7) => { + if (!er && is7) { if (opt.all) found.push(p + ext2); else @@ -95188,13 +95489,13 @@ var require_which = __commonJS((exports, module2) => { for (let i2 = 0;i2 < pathEnv.length; i2++) { const ppRaw = pathEnv[i2]; const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw; - const pCmd = path6.join(pathPart, cmd); + const pCmd = path7.join(pathPart, cmd); const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd : pCmd; for (let j2 = 0;j2 < pathExt.length; j2++) { const cur = p + pathExt[j2]; try { - const is8 = isexe.sync(cur, { pathExt: pathExtExe }); - if (is8) { + const is7 = isexe.sync(cur, { pathExt: pathExtExe }); + if (is7) { if (opt.all) found.push(cur); else @@ -95229,7 +95530,7 @@ var require_path_key = __commonJS((exports, module2) => { // node_modules/cross-spawn/lib/util/resolveCommand.js var require_resolveCommand = __commonJS((exports, module2) => { - var path6 = __require("path"); + var path7 = __require("path"); var which2 = require_which(); var getPathKey = require_path_key(); function resolveCommandAttempt(parsed, withoutPathExt) { @@ -95246,7 +95547,7 @@ var require_resolveCommand = __commonJS((exports, module2) => { try { resolved = which2.sync(parsed.command, { path: env3[getPathKey({ env: env3 })], - pathExt: withoutPathExt ? path6.delimiter : undefined + pathExt: withoutPathExt ? path7.delimiter : undefined }); } catch (e) {} finally { if (shouldSwitchCwd) { @@ -95254,7 +95555,7 @@ var require_resolveCommand = __commonJS((exports, module2) => { } } if (resolved) { - resolved = path6.resolve(hasCustomCwd ? parsed.options.cwd : "", resolved); + resolved = path7.resolve(hasCustomCwd ? parsed.options.cwd : "", resolved); } return resolved; } @@ -95299,8 +95600,8 @@ var require_shebang_command = __commonJS((exports, module2) => { if (!match17) { return null; } - const [path6, argument] = match17[0].replace(/#! ?/, "").split(" "); - const binary2 = path6.split("/").pop(); + const [path7, argument] = match17[0].replace(/#! ?/, "").split(" "); + const binary2 = path7.split("/").pop(); if (binary2 === "env") { return argument; } @@ -95328,7 +95629,7 @@ var require_readShebang = __commonJS((exports, module2) => { // node_modules/cross-spawn/lib/parse.js var require_parse = __commonJS((exports, module2) => { - var path6 = __require("path"); + var path7 = __require("path"); var resolveCommand = require_resolveCommand(); var escape4 = require_escape(); var readShebang = require_readShebang(); @@ -95353,7 +95654,7 @@ var require_parse = __commonJS((exports, module2) => { const needsShell = !isExecutableRegExp.test(commandFile); if (parsed.options.forceShell || needsShell) { const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile); - parsed.command = path6.normalize(parsed.command); + parsed.command = path7.normalize(parsed.command); parsed.command = escape4.command(parsed.command); parsed.args = parsed.args.map((arg) => escape4.argument(arg, needsDoubleEscapeMetaChars)); const shellCommand = [parsed.command].concat(parsed.args).join(" "); @@ -95530,12 +95831,12 @@ var init_cross_spawn_spawner = __esm(() => { import_cross_spawn = __toESM(require_cross_spawn(), 1); make79 = gen4(function* () { const fs6 = yield* FileSystem; - const path6 = yield* Path; + const path7 = yield* Path; const cwd = fnUntraced2(function* (opts) { if (isUndefined(opts.cwd)) return; yield* fs6.access(opts.cwd); - return path6.resolve(opts.cwd); + return path7.resolve(opts.cwd); }); const env3 = (opts) => opts.extendEnv ? { ...globalThis.process.env, ...opts.env } : opts.env; const input = (x2) => isStream(x2) ? "pipe" : x2; @@ -95567,9 +95868,9 @@ var init_cross_spawn_spawner = __esm(() => { const fds = (opts) => { if (isUndefined(opts.additionalFds)) return []; - return Object.entries(opts.additionalFds).flatMap(([name3, config3]) => { + return Object.entries(opts.additionalFds).flatMap(([name3, config2]) => { const fd = parseFdName(name3); - return isUndefined(fd) ? [] : [{ fd, config: config3 }]; + return isUndefined(fd) ? [] : [{ fd, config: config2 }]; }).toSorted((a, b) => a.fd - b.fd); }; const stdios = (sin, sout, serr, extra) => { @@ -96233,12 +96534,12 @@ var init_state = __esm(async () => { const exists3 = entries10.get(init3); if (exists3) return exists3.state; - const state2 = init3(); + const state = init3(); entries10.set(init3, { - state: state2, + state, dispose: dispose2 }); - return state2; + return state; }; } State.create = create; @@ -96258,7 +96559,7 @@ var init_state = __esm(async () => { if (!entry.dispose) continue; const label = typeof init3 === "function" ? init3.name : String(init3); - const task = Promise.resolve(entry.state).then((state2) => entry.dispose(state2)).catch((error46) => { + const task = Promise.resolve(entry.state).then((state) => entry.dispose(state)).catch((error46) => { log4.error("Error while disposing state:", { error: error46, key, init: label }); }); tasks.push(task); @@ -96489,40 +96790,6 @@ var init_instance_state = __esm(async () => { })(InstanceState ||= {}); }); -// node_modules/drizzle-orm/logger.js -var ConsoleLogWriter2, DefaultLogger2, NoopLogger2; -var init_logger = __esm(() => { - init_entity(); - ConsoleLogWriter2 = class { - static [entityKind] = "ConsoleLogWriter"; - write(message) { - console.log(message); - } - }; - DefaultLogger2 = class { - static [entityKind] = "DefaultLogger"; - writer; - constructor(config3) { - this.writer = config3?.writer ?? new ConsoleLogWriter2; - } - logQuery(query, params) { - const stringifiedParams = params.map((p) => { - try { - return JSON.stringify(p); - } catch { - return String(p); - } - }); - const paramsStr = stringifiedParams.length ? ` -- params: [${stringifiedParams.join(", ")}]` : ""; - this.writer.write(`Query: ${query}${paramsStr}`); - } - }; - NoopLogger2 = class { - static [entityKind] = "NoopLogger"; - logQuery() {} - }; -}); - // node_modules/drizzle-orm/bun-sqlite/session.js var SQLiteBunSession, SQLiteBunTransaction, PreparedQuery; var init_session2 = __esm(() => { @@ -96540,7 +96807,7 @@ var init_session2 = __esm(() => { this.client = client; this.relations = relations; this.schema = schema2; - this.logger = options2.logger ?? new NoopLogger2; + this.logger = options2.logger ?? new NoopLogger; } exec(query) { this.client.exec(query); @@ -96551,12 +96818,12 @@ var init_session2 = __esm(() => { prepareRelationalQuery(query, fields, executeMethod, customResultMapper) { return new PreparedQuery(this.client.prepare(query.sql), query, this.logger, fields, executeMethod, false, customResultMapper, true); } - transaction(transaction, config3 = {}) { + transaction(transaction, config2 = {}) { const tx2 = new SQLiteBunTransaction("sync", this.dialect, this, this.relations, this.schema); let result6; this.client.transaction(() => { result6 = transaction(tx2); - })[config3.behavior ?? "deferred"](); + })[config2.behavior ?? "deferred"](); return result6; } }; @@ -96604,7 +96871,7 @@ var init_session2 = __esm(() => { const rows = this.values(placeholderValues); if (customResultMapper) return customResultMapper(rows); - return rows.map((row) => mapResultRow2(fields, row, joinsNotNullableMap)); + return rows.map((row) => mapResultRow(fields, row, joinsNotNullableMap)); } get(placeholderValues) { if (this.isRqbV2Query) @@ -96623,7 +96890,7 @@ var init_session2 = __esm(() => { return; if (customResultMapper) return customResultMapper([row]); - return mapResultRow2(fields, row, joinsNotNullableMap); + return mapResultRow(fields, row, joinsNotNullableMap); } allRqbV2(placeholderValues) { const { query, logger, stmt, customResultMapper } = this; @@ -96653,23 +96920,23 @@ var init_session2 = __esm(() => { // node_modules/drizzle-orm/bun-sqlite/driver.js import { Database as Database2 } from "bun:sqlite"; -function construct(client, config3 = {}) { - const dialect = new SQLiteSyncDialect({ casing: config3.casing }); +function construct(client, config2 = {}) { + const dialect = new SQLiteSyncDialect({ casing: config2.casing }); let logger; - if (config3.logger === true) - logger = new DefaultLogger2; - else if (config3.logger !== false) - logger = config3.logger; + if (config2.logger === true) + logger = new DefaultLogger; + else if (config2.logger !== false) + logger = config2.logger; let schema2; - if (config3.schema) { - const tablesConfig = extractTablesRelationalConfig(config3.schema, createTableRelationsHelpers); + if (config2.schema) { + const tablesConfig = extractTablesRelationalConfig(config2.schema, createTableRelationsHelpers); schema2 = { - fullSchema: config3.schema, + fullSchema: config2.schema, schema: tablesConfig.tables, tableNamesMap: tablesConfig.tableNamesMap }; } - const relations = config3.relations ?? {}; + const relations = config2.relations ?? {}; const db2 = new SQLiteBunDatabase("sync", dialect, new SQLiteBunSession(client, dialect, relations, schema2, { logger }), relations, schema2); db2.$client = client; return db2; @@ -96698,8 +96965,8 @@ var init_driver = __esm(() => { static [entityKind] = "SQLiteBunDatabase"; }; (function(_drizzle) { - function mock2(config3) { - return construct({}, config3); + function mock2(config2) { + return construct({}, config2); } _drizzle.mock = mock2; })(drizzle || (drizzle = {})); @@ -96712,8 +96979,8 @@ var init_bun_sqlite = __esm(() => { // packages/unifia/src/storage/db.bun.ts import { Database as Database3 } from "bun:sqlite"; -function init3(path6) { - const sqlite = new Database3(path6, { create: true }); +function init3(path7) { + const sqlite = new Database3(path7, { create: true }); const db2 = drizzle({ client: sqlite }); return db2; } @@ -96721,9 +96988,33 @@ var init_db_bun = __esm(() => { init_bun_sqlite(); }); +// packages/unifia/src/storage/db-file.ts +var DATABASE_FILE = "unifia.db", LEGACY_DATABASE_FILE = "opencode.db"; + // packages/unifia/src/storage/db.ts -import path6 from "path"; -import { readFileSync as readFileSync4, readdirSync as readdirSync4, existsSync as existsSync3 } from "fs"; +import path7 from "path"; +import { readFileSync as readFileSync4, readdirSync as readdirSync4, existsSync as existsSync3, copyFileSync } from "fs"; +function channelFileNames() { + if (["latest", "beta"].includes(CHANNEL) || Flag.UNIFIA_DISABLE_CHANNEL_DB) { + return { current: DATABASE_FILE, legacy: LEGACY_DATABASE_FILE }; + } + const safe = CHANNEL.replace(/[^a-zA-Z0-9._-]/g, "-"); + return { current: `unifia-${safe}.db`, legacy: `opencode-${safe}.db` }; +} +function migrateLegacyDatabaseFile(newPath, oldPath) { + if (existsSync3(newPath)) + return false; + if (!existsSync3(oldPath)) + return false; + log4.info("migrating legacy database file", { from: oldPath, to: newPath }); + for (const suffix of ["", "-wal", "-shm"]) { + const src = oldPath + suffix; + if (!existsSync3(src)) + continue; + copyFileSync(src, newPath + suffix); + } + return true; +} var NotFoundError, log4, Database; var init_db2 = __esm(async () => { init_migrator2(); @@ -96745,18 +97036,19 @@ var init_db2 = __esm(async () => { log4 = Log.create({ service: "db" }); ((Database) => { function getChannelPath() { - if (["latest", "beta"].includes(CHANNEL) || Flag.UNIFIA_DISABLE_CHANNEL_DB) - return path6.join(Global.Path.data, "opencode.db"); - const safe = CHANNEL.replace(/[^a-zA-Z0-9._-]/g, "-"); - return path6.join(Global.Path.data, `opencode-${safe}.db`); + const files = channelFileNames(); + const newPath = path7.join(Global.Path.data, files.current); + const oldPath = path7.join(Global.Path.data, files.legacy); + migrateLegacyDatabaseFile(newPath, oldPath); + return newPath; } Database.getChannelPath = getChannelPath; Database.Path = iife2(() => { const override = Flag.UNIFIA_DB; if (override) { - if (override === ":memory:" || path6.isAbsolute(override)) + if (override === ":memory:" || path7.isAbsolute(override)) return override; - return path6.join(Global.Path.data, override); + return path7.join(Global.Path.data, override); } return getChannelPath(); }); @@ -96769,7 +97061,7 @@ var init_db2 = __esm(async () => { function migrations(dir2) { const dirs = readdirSync4(dir2, { withFileTypes: true }).filter((entry) => entry.isDirectory()).map((entry) => entry.name); const sql2 = dirs.map((name3) => { - const file2 = path6.join(dir2, name3, "migration.sql"); + const file2 = path7.join(dir2, name3, "migration.sql"); if (!existsSync3(file2)) return; return { @@ -96790,7 +97082,7 @@ var init_db2 = __esm(async () => { db2.run("PRAGMA foreign_keys = ON"); db2.run("PRAGMA wal_checkpoint(PASSIVE)"); const bundledMigrations = globalThis.UNIFIA_MIGRATIONS ?? globalThis.OPENCODE_MIGRATIONS; - const entries10 = typeof UNIFIA_MIGRATIONS !== "undefined" ? UNIFIA_MIGRATIONS : bundledMigrations ? bundledMigrations : migrations(path6.join(import.meta.dirname, "../../migration")); + const entries10 = typeof UNIFIA_MIGRATIONS !== "undefined" ? UNIFIA_MIGRATIONS : bundledMigrations ? bundledMigrations : migrations(path7.join(import.meta.dirname, "../../migration")); if (entries10.length > 0) { log4.info("applying migrations", { count: entries10.length, @@ -97791,7 +98083,7 @@ var init_audit = __esm(async () => { }); // packages/unifia/src/auth/index.ts -import path7 from "path"; +import path8 from "path"; class KeychainStorage { static SERVICE = "auth"; @@ -97918,7 +98210,7 @@ async function writeEncryptedAuth(data2) { const iv = crypto3.randomBytes(12); const cipher = crypto3.createCipheriv("aes-256-gcm", key, iv); const ciphertext = Buffer.concat([cipher.update(JSON.stringify(data2), "utf8"), cipher.final()]); - await fs6.mkdir(path7.dirname(encryptedFile), { recursive: true }); + await fs6.mkdir(path8.dirname(encryptedFile), { recursive: true }); await fs6.writeFile(encryptedFile, JSON.stringify({ v: 1, iv: iv.toString("base64"), tag: cipher.getAuthTag().toString("base64"), ciphertext: ciphertext.toString("base64") }), { mode: 384 }); } async function maybeMigrateToEncryptedFile() { @@ -98024,9 +98316,9 @@ var init_auth = __esm(async () => { init_global() ]); AUTH_STORAGE_BACKEND = (Flag.UNIFIA_AUTH_STORAGE ?? (Flag.UNIFIA_CLIENT === "mobile-embedded" ? "encrypted-file" : "file")).toLowerCase(); - file2 = path7.join(Global.Path.data, "auth.json"); - migratedMarker = path7.join(Global.Path.data, "auth.json.migrated"); - encryptedFile = path7.join(Global.Path.data, "auth.enc.json"); + file2 = path8.join(Global.Path.data, "auth.json"); + migratedMarker = path8.join(Global.Path.data, "auth.json.migrated"); + encryptedFile = path8.join(Global.Path.data, "auth.enc.json"); ((Auth) => { class Oauth extends exports_Schema.Class("OAuth")({ @@ -98178,25 +98470,25 @@ var Env; var init_env = __esm(async () => { await init_instance(); ((Env) => { - const state2 = Instance.state(() => { + const state = Instance.state(() => { return { ...process.env }; }); function get32(key) { - const env3 = state2(); + const env3 = state(); return env3[key]; } Env.get = get32; function all7() { - return state2(); + return state(); } Env.all = all7; function set22(key, value8) { - const env3 = state2(); + const env3 = state(); env3[key] = value8; } Env.set = set22; function remove18(key) { - const env3 = state2(); + const env3 = state(); delete env3[key]; } Env.remove = remove18; @@ -99005,12 +99297,12 @@ function parseTree(text4, errors4 = [], options2 = ParseOptions.DEFAULT) { } return result6; } -function findNodeAtLocation(root, path8) { +function findNodeAtLocation(root, path9) { if (!root) { return; } let node = root; - for (let segment of path8) { + for (let segment of path9) { if (typeof segment === "string") { if (node.type !== "object" || !Array.isArray(node.children)) { return; @@ -99320,14 +99612,14 @@ var init_parser = __esm(() => { // node_modules/jsonc-parser/lib/esm/impl/edit.js function setProperty(text4, originalPath, value8, options2) { - const path8 = originalPath.slice(); + const path9 = originalPath.slice(); const errors4 = []; const root = parseTree(text4, errors4); let parent = undefined; let lastSegment = undefined; - while (path8.length > 0) { - lastSegment = path8.pop(); - parent = findNodeAtLocation(root, path8); + while (path9.length > 0) { + lastSegment = path9.pop(); + parent = findNodeAtLocation(root, path9); if (parent === undefined && value8 !== undefined) { if (typeof lastSegment === "string") { value8 = { [lastSegment]: value8 }; @@ -99504,8 +99796,8 @@ function printParseErrorCode(code) { } return ""; } -function modify17(text4, path8, value8, options2) { - return setProperty(text4, path8, value8, options2); +function modify17(text4, path9, value8, options2) { + return setProperty(text4, path9, value8, options2); } function applyEdits(text4, edits) { let sortedEdits = edits.slice(0).sort((a4, b2) => { @@ -100152,7 +100444,7 @@ var TypeId76 = "~effect/http/HttpBody", HttpBodyErrorTypeId = "~effect/http/Http } } return formData(data2); -}, Stream3, stream2 = (body3, contentType, contentLength) => new Stream3(body3, contentType ?? "application/octet-stream", contentLength), file3 = (path8, options2) => flatMap7(FileSystem.asEffect(), (fs6) => map12(fs6.stat(path8), (info3) => stream2(fs6.stream(path8, options2), options2?.contentType, Number(info3.size)))); +}, Stream3, stream2 = (body3, contentType, contentLength) => new Stream3(body3, contentType ?? "application/octet-stream", contentLength), file3 = (path9, options2) => flatMap7(FileSystem.asEffect(), (fs6) => map12(fs6.stat(path9), (info3) => stream2(fs6.stream(path9, options2), options2?.contentType, Number(info3.size)))); var init_HttpBody = __esm(() => { init_Data(); init_Effect(); @@ -100517,15 +100809,15 @@ var init_HttpClientRequest = __esm(() => { clone3.hash = ""; return makeWith4(self2.method, clone3.toString(), urlParams2, hash4, self2.headers, self2.body); }); - prependUrl = /* @__PURE__ */ dual(2, (self2, path8) => { - if (path8 === "") + prependUrl = /* @__PURE__ */ dual(2, (self2, path9) => { + if (path9 === "") return self2; - return makeWith4(self2.method, joinSegments(path8, self2.url), self2.urlParams, self2.hash, self2.headers, self2.body); + return makeWith4(self2.method, joinSegments(path9, self2.url), self2.urlParams, self2.hash, self2.headers, self2.body); }); - appendUrl = /* @__PURE__ */ dual(2, (self2, path8) => { - if (path8 === "") + appendUrl = /* @__PURE__ */ dual(2, (self2, path9) => { + if (path9 === "") return self2; - return makeWith4(self2.method, joinSegments(self2.url, path8), self2.urlParams, self2.hash, self2.headers, self2.body); + return makeWith4(self2.method, joinSegments(self2.url, path9), self2.urlParams, self2.hash, self2.headers, self2.body); }); updateUrl = /* @__PURE__ */ dual(2, (self2, f4) => makeWith4(self2.method, f4(self2.url), self2.urlParams, self2.hash, self2.headers, self2.body)); setUrlParam = /* @__PURE__ */ dual(3, (self2, key, value8) => makeWith4(self2.method, self2.url, set23(self2.urlParams, key, value8), self2.hash, self2.headers, self2.body)); @@ -100555,7 +100847,7 @@ var init_HttpClientRequest = __esm(() => { bodyFormData = /* @__PURE__ */ dual(2, (self2, body3) => setBody(self2, formData(body3))); bodyFormDataRecord = /* @__PURE__ */ dual(2, (self2, entries10) => setBody(self2, formDataRecord(entries10))); bodyStream = /* @__PURE__ */ dual((args3) => isHttpClientRequest(args3[0]), (self2, body3, options3) => setBody(self2, stream2(body3, options3?.contentType, options3?.contentLength))); - bodyFile = /* @__PURE__ */ dual((args3) => isHttpClientRequest(args3[0]), (self2, path8, options3) => map12(file3(path8, options3), (body3) => setBody(self2, body3))); + bodyFile = /* @__PURE__ */ dual((args3) => isHttpClientRequest(args3[0]), (self2, path9, options3) => map12(file3(path9, options3), (body3) => setBody(self2, body3))); }); // node_modules/effect/dist/unstable/http/HttpIncomingMessage.js @@ -100935,18 +101227,18 @@ var TypeId80 = "~effect/http/HttpClient", isHttpClient = (u6) => hasProperty(u6, } }))); }); -})), succeed8), mapRequest, mapRequestEffect, mapRequestInput, mapRequestInputEffect, retry5, retryTransient, withRateLimiter, parseRateLimiterState = (state2, clock, headers, tokens) => { - const limit = parseRateLimitLimit(state2, headers, tokens) ?? state2.limit; - const window3 = parseRateLimitWindow(clock, headers) ?? state2.window; - if (limit === state2.limit && equals3(window3, state2.window)) { - return state2; +})), succeed8), mapRequest, mapRequestEffect, mapRequestInput, mapRequestInputEffect, retry5, retryTransient, withRateLimiter, parseRateLimiterState = (state, clock, headers, tokens) => { + const limit = parseRateLimitLimit(state, headers, tokens) ?? state.limit; + const window3 = parseRateLimitWindow(clock, headers) ?? state.window; + if (limit === state.limit && equals3(window3, state.window)) { + return state; } return { limit, window: window3, initial: false }; -}, parseRateLimitLimit = (state2, headers, tokens) => { +}, parseRateLimitLimit = (state, headers, tokens) => { const raw3 = getHeader(headers, "ratelimit-limit", "x-ratelimit-limit"); const value8 = parseNumberHeader(raw3); if (value8 !== undefined && value8 > 0) { @@ -100956,7 +101248,7 @@ var TypeId80 = "~effect/http/HttpClient", isHttpClient = (u6) => hasProperty(u6, if (remaining2 === undefined) { return; } - return state2.initial ? remaining2 + tokens : Math.max(remaining2 + tokens, state2.limit); + return state.initial ? remaining2 + tokens : Math.max(remaining2 + tokens, state.limit); }, parseRateLimitRemaining = (headers) => { const raw3 = getHeader(headers, "ratelimit-remaining", "x-ratelimit-remaining"); const value8 = parseNumberHeader(raw3); @@ -103210,8 +103502,8 @@ var require_semver2 = __commonJS((exports, module2) => { }); // packages/unifia/src/installation/index.ts -import path8 from "path"; -var import_semver, FORK_REPO = "Rwanbt/opencode", Installation; +import path9 from "path"; +var import_semver, FORK_REPO = "Rwanbt/unifia", NPM_PACKAGE = "unifia-ai", INSTALL_SCRIPT_URL, Installation; var init_installation = __esm(async () => { init_dist3(); init_http(); @@ -103227,6 +103519,7 @@ var init_installation = __esm(async () => { init_log() ]); import_semver = __toESM(require_semver2(), 1); + INSTALL_SCRIPT_URL = `https://github.com/${FORK_REPO}/releases/latest/download/install`; ((Installation) => { const log7 = Log.create({ service: "installation" }); Installation.Event = { @@ -103274,14 +103567,6 @@ var init_installation = __esm(async () => { Installation.UpgradeFailedError = UpgradeFailedError; const GitHubRelease = exports_Schema.Struct({ tag_name: exports_Schema.String }); const NpmPackage = exports_Schema.Struct({ version: exports_Schema.String }); - const BrewFormula = exports_Schema.Struct({ versions: exports_Schema.Struct({ stable: exports_Schema.String }) }); - const BrewInfoV2 = exports_Schema.Struct({ - formulae: exports_Schema.Array(exports_Schema.Struct({ versions: exports_Schema.Struct({ stable: exports_Schema.String }) })) - }); - const ChocoPackage = exports_Schema.Struct({ - d: exports_Schema.Struct({ results: exports_Schema.Array(exports_Schema.Struct({ Version: exports_Schema.String })) }) - }); - const ScoopManifest = NpmPackage; class Service3 extends exports_ServiceMap.Service()("@opencode/Installation") { } @@ -103312,17 +103597,8 @@ var init_installation = __esm(async () => { const code = yield* handle2.exitCode; return { code, stdout, stderr }; }, exports_Effect.scoped, exports_Effect.catch(() => exports_Effect.succeed({ code: exports_ChildProcessSpawner.ExitCode(1), stdout: "", stderr: "" }))); - const getBrewFormula = exports_Effect.fnUntraced(function* () { - const tapFormula = yield* text5(["brew", "list", "--formula", "anomalyco/tap/opencode"]); - if (tapFormula.includes("unifia")) - return "anomalyco/tap/opencode"; - const coreFormula = yield* text5(["brew", "list", "--formula", "unifia"]); - if (coreFormula.includes("unifia")) - return "unifia"; - return "unifia"; - }); const upgradeCurl = exports_Effect.fnUntraced(function* (target) { - const response = yield* httpOk.execute(exports_HttpClientRequest.get("https://opencode.ai/install")); + const response = yield* httpOk.execute(exports_HttpClientRequest.get(INSTALL_SCRIPT_URL)); const body3 = yield* response.text; const bodyBytes = new TextEncoder().encode(body3); const proc = exports_ChildProcess.make("bash", [], { @@ -103336,19 +103612,18 @@ var init_installation = __esm(async () => { return { code, stdout, stderr }; }, exports_Effect.scoped, exports_Effect.orDie); const methodImpl = exports_Effect.fn("Installation.method")(function* () { - if (process.execPath.includes(path8.join(".opencode", "bin"))) + if (process.execPath.includes(path9.join(".unifia", "bin"))) + return "curl"; + if (process.execPath.includes(path9.join(".opencode", "bin"))) return "curl"; - if (process.execPath.includes(path8.join(".local", "bin"))) + if (process.execPath.includes(path9.join(".local", "bin"))) return "curl"; const exec3 = process.execPath.toLowerCase(); const checks3 = [ { name: "npm", command: () => text5(["npm", "list", "-g", "--depth=0"]) }, { name: "yarn", command: () => text5(["yarn", "global", "list"]) }, { name: "pnpm", command: () => text5(["pnpm", "list", "-g", "--depth=0"]) }, - { name: "bun", command: () => text5(["bun", "pm", "ls", "-g"]) }, - { name: "brew", command: () => text5(["brew", "list", "--formula", "unifia"]) }, - { name: "scoop", command: () => text5(["scoop", "list", "unifia"]) }, - { name: "choco", command: () => text5(["choco", "list", "--limit-output", "unifia"]) } + { name: "bun", command: () => text5(["bun", "pm", "ls", "-g"]) } ]; checks3.sort((a4, b2) => { const aMatches = exec3.includes(a4.name); @@ -103361,8 +103636,7 @@ var init_installation = __esm(async () => { }); for (const check6 of checks3) { const output = yield* check6.command(); - const installedName = check6.name === "brew" || check6.name === "choco" || check6.name === "scoop" ? "unifia" : "unifia-ai"; - if (output.includes(installedName)) { + if (output.includes(NPM_PACKAGE)) { return check6.name; } } @@ -103370,36 +103644,15 @@ var init_installation = __esm(async () => { }); const latestImpl = exports_Effect.fn("Installation.latest")(function* (installMethod) { const detectedMethod = installMethod || (yield* methodImpl()); - if (detectedMethod === "brew") { - const formula = yield* getBrewFormula(); - if (formula.includes("/")) { - const infoJson = yield* text5(["brew", "info", "--json=v2", formula]); - const info3 = yield* exports_Schema.decodeUnknownEffect(exports_Schema.fromJsonString(BrewInfoV2))(infoJson); - return info3.formulae[0].versions.stable; - } - const response2 = yield* httpOk.execute(exports_HttpClientRequest.get("https://formulae.brew.sh/api/formula/opencode.json").pipe(exports_HttpClientRequest.acceptJson)); - const data3 = yield* exports_HttpClientResponse.schemaBodyJson(BrewFormula)(response2); - return data3.versions.stable; - } if (detectedMethod === "npm" || detectedMethod === "bun" || detectedMethod === "pnpm") { const r4 = (yield* text5(["npm", "config", "get", "registry"])).trim(); const reg = r4 || "https://registry.npmjs.org"; const registry2 = reg.endsWith("/") ? reg.slice(0, -1) : reg; const channel = Installation.CHANNEL; - const response2 = yield* httpOk.execute(exports_HttpClientRequest.get(`${registry2}/opencode-ai/${channel}`).pipe(exports_HttpClientRequest.acceptJson)); + const response2 = yield* httpOk.execute(exports_HttpClientRequest.get(`${registry2}/${NPM_PACKAGE}/${channel}`).pipe(exports_HttpClientRequest.acceptJson)); const data3 = yield* exports_HttpClientResponse.schemaBodyJson(NpmPackage)(response2); return data3.version; } - if (detectedMethod === "choco") { - const response2 = yield* httpOk.execute(exports_HttpClientRequest.get("https://community.chocolatey.org/api/v2/Packages?$filter=Id%20eq%20%27opencode%27%20and%20IsLatestVersion&$select=Version").pipe(exports_HttpClientRequest.setHeaders({ Accept: "application/json;odata=verbose" }))); - const data3 = yield* exports_HttpClientResponse.schemaBodyJson(ChocoPackage)(response2); - return data3.d.results[0].Version; - } - if (detectedMethod === "scoop") { - const response2 = yield* httpOk.execute(exports_HttpClientRequest.get("https://raw.githubusercontent.com/ScoopInstaller/Main/master/bucket/opencode.json").pipe(exports_HttpClientRequest.setHeaders({ Accept: "application/json" }))); - const data3 = yield* exports_HttpClientResponse.schemaBodyJson(ScoopManifest)(response2); - return data3.version; - } const response = yield* httpOk.execute(exports_HttpClientRequest.get(`https://api.github.com/repos/${FORK_REPO}/releases/latest`).pipe(exports_HttpClientRequest.acceptJson)); const data2 = yield* exports_HttpClientResponse.schemaBodyJson(GitHubRelease)(response); return data2.tag_name.replace(/^v/, "").replace(/-fork.*$/, ""); @@ -103411,48 +103664,19 @@ var init_installation = __esm(async () => { result6 = yield* upgradeCurl(target); break; case "npm": - result6 = yield* run7(["npm", "install", "-g", `unifia-ai@${target}`]); + result6 = yield* run7(["npm", "install", "-g", `${NPM_PACKAGE}@${target}`]); break; case "pnpm": - result6 = yield* run7(["pnpm", "install", "-g", `unifia-ai@${target}`]); + result6 = yield* run7(["pnpm", "install", "-g", `${NPM_PACKAGE}@${target}`]); break; case "bun": - result6 = yield* run7(["bun", "install", "-g", `unifia-ai@${target}`]); - break; - case "brew": { - const formula = yield* getBrewFormula(); - const env3 = { HOMEBREW_NO_AUTO_UPDATE: "1" }; - if (formula.includes("/")) { - const tap9 = yield* run7(["brew", "tap", "anomalyco/tap"], { env: env3 }); - if (tap9.code !== 0) { - result6 = tap9; - break; - } - const repo = yield* text5(["brew", "--repo", "anomalyco/tap"]); - const dir2 = repo.trim(); - if (dir2) { - const pull = yield* run7(["git", "pull", "--ff-only"], { cwd: dir2, env: env3 }); - if (pull.code !== 0) { - result6 = pull; - break; - } - } - } - result6 = yield* run7(["brew", "upgrade", formula], { env: env3 }); - break; - } - case "choco": - result6 = yield* run7(["choco", "upgrade", "unifia", `--version=${target}`, "-y"]); - break; - case "scoop": - result6 = yield* run7(["scoop", "install", `unifia@${target}`]); + result6 = yield* run7(["bun", "install", "-g", `${NPM_PACKAGE}@${target}`]); break; default: return yield* new UpgradeFailedError({ stderr: `Unknown method: ${m3}` }); } if (!result6 || result6.code !== 0) { - const stderr = m3 === "choco" ? "not running from an elevated command shell" : result6?.stderr || ""; - return yield* new UpgradeFailedError({ stderr }); + return yield* new UpgradeFailedError({ stderr: result6?.stderr || "" }); } log7.info("upgraded", { method: m3, @@ -104967,87 +105191,87 @@ var require_loader = __commonJS((exports, module2) => { this.totalMergeKeys = 0; this.documents = []; } - function generateError(state2, message) { - return new YAMLException(message, new Mark(state2.filename, state2.input, state2.position, state2.line, state2.position - state2.lineStart)); + function generateError(state, message) { + return new YAMLException(message, new Mark(state.filename, state.input, state.position, state.line, state.position - state.lineStart)); } - function throwError(state2, message) { - throw generateError(state2, message); + function throwError(state, message) { + throw generateError(state, message); } - function throwWarning(state2, message) { - if (state2.onWarning) { - state2.onWarning.call(null, generateError(state2, message)); + function throwWarning(state, message) { + if (state.onWarning) { + state.onWarning.call(null, generateError(state, message)); } } var directiveHandlers = { - YAML: function handleYamlDirective(state2, name3, args3) { + YAML: function handleYamlDirective(state, name3, args3) { var match17, major, minor; - if (state2.version !== null) { - throwError(state2, "duplication of %YAML directive"); + if (state.version !== null) { + throwError(state, "duplication of %YAML directive"); } if (args3.length !== 1) { - throwError(state2, "YAML directive accepts exactly one argument"); + throwError(state, "YAML directive accepts exactly one argument"); } match17 = /^([0-9]+)\.([0-9]+)$/.exec(args3[0]); if (match17 === null) { - throwError(state2, "ill-formed argument of the YAML directive"); + throwError(state, "ill-formed argument of the YAML directive"); } major = parseInt(match17[1], 10); minor = parseInt(match17[2], 10); if (major !== 1) { - throwError(state2, "unacceptable YAML version of the document"); + throwError(state, "unacceptable YAML version of the document"); } - state2.version = args3[0]; - state2.checkLineBreaks = minor < 2; + state.version = args3[0]; + state.checkLineBreaks = minor < 2; if (minor !== 1 && minor !== 2) { - throwWarning(state2, "unsupported YAML version of the document"); + throwWarning(state, "unsupported YAML version of the document"); } }, - TAG: function handleTagDirective(state2, name3, args3) { + TAG: function handleTagDirective(state, name3, args3) { var handle2, prefix3; if (args3.length !== 2) { - throwError(state2, "TAG directive accepts exactly two arguments"); + throwError(state, "TAG directive accepts exactly two arguments"); } handle2 = args3[0]; prefix3 = args3[1]; if (!PATTERN_TAG_HANDLE.test(handle2)) { - throwError(state2, "ill-formed tag handle (first argument) of the TAG directive"); + throwError(state, "ill-formed tag handle (first argument) of the TAG directive"); } - if (_hasOwnProperty.call(state2.tagMap, handle2)) { - throwError(state2, 'there is a previously declared suffix for "' + handle2 + '" tag handle'); + if (_hasOwnProperty.call(state.tagMap, handle2)) { + throwError(state, 'there is a previously declared suffix for "' + handle2 + '" tag handle'); } if (!PATTERN_TAG_URI.test(prefix3)) { - throwError(state2, "ill-formed tag prefix (second argument) of the TAG directive"); + throwError(state, "ill-formed tag prefix (second argument) of the TAG directive"); } - state2.tagMap[handle2] = prefix3; + state.tagMap[handle2] = prefix3; } }; - function captureSegment(state2, start2, end4, checkJson) { + function captureSegment(state, start2, end4, checkJson) { var _position, _length2, _character, _result; if (start2 < end4) { - _result = state2.input.slice(start2, end4); + _result = state.input.slice(start2, end4); if (checkJson) { for (_position = 0, _length2 = _result.length;_position < _length2; _position += 1) { _character = _result.charCodeAt(_position); if (!(_character === 9 || 32 <= _character && _character <= 1114111)) { - throwError(state2, "expected valid JSON character"); + throwError(state, "expected valid JSON character"); } } } else if (PATTERN_NON_PRINTABLE.test(_result)) { - throwError(state2, "the stream contains non-printable characters"); + throwError(state, "the stream contains non-printable characters"); } - state2.result += _result; + state.result += _result; } } - function mergeMappings(state2, destination, source, overridableKeys) { + function mergeMappings(state, destination, source, overridableKeys) { var sourceKeys, key, index3, quantity; if (!common.isObject(source)) { - throwError(state2, "cannot merge mappings; the provided source object is unacceptable"); + throwError(state, "cannot merge mappings; the provided source object is unacceptable"); } sourceKeys = Object.keys(source); for (index3 = 0, quantity = sourceKeys.length;index3 < quantity; index3 += 1) { key = sourceKeys[index3]; - if (state2.maxTotalMergeKeys !== -1 && ++state2.totalMergeKeys > state2.maxTotalMergeKeys) { - throwError(state2, "merge keys exceeded maxTotalMergeKeys (" + state2.maxTotalMergeKeys + ")"); + if (state.maxTotalMergeKeys !== -1 && ++state.totalMergeKeys > state.maxTotalMergeKeys) { + throwError(state, "merge keys exceeded maxTotalMergeKeys (" + state.maxTotalMergeKeys + ")"); } if (!_hasOwnProperty.call(destination, key)) { setProperty2(destination, key, source[key]); @@ -105055,13 +105279,13 @@ var require_loader = __commonJS((exports, module2) => { } } } - function storeMappingPair(state2, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, startPos) { + function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, startPos) { var index3, quantity; if (Array.isArray(keyNode)) { keyNode = Array.prototype.slice.call(keyNode); for (index3 = 0, quantity = keyNode.length;index3 < quantity; index3 += 1) { if (Array.isArray(keyNode[index3])) { - throwError(state2, "nested arrays are not supported inside keys"); + throwError(state, "nested arrays are not supported inside keys"); } if (typeof keyNode === "object" && _class(keyNode[index3]) === "[object Object]") { keyNode[index3] = "[object Object]"; @@ -105078,242 +105302,242 @@ var require_loader = __commonJS((exports, module2) => { if (keyTag === "tag:yaml.org,2002:merge") { if (Array.isArray(valueNode)) { for (index3 = 0, quantity = valueNode.length;index3 < quantity; index3 += 1) { - mergeMappings(state2, _result, valueNode[index3], overridableKeys); + mergeMappings(state, _result, valueNode[index3], overridableKeys); } } else { - mergeMappings(state2, _result, valueNode, overridableKeys); + mergeMappings(state, _result, valueNode, overridableKeys); } } else { - if (!state2.json && !_hasOwnProperty.call(overridableKeys, keyNode) && _hasOwnProperty.call(_result, keyNode)) { - state2.line = startLine || state2.line; - state2.position = startPos || state2.position; - throwError(state2, "duplicated mapping key"); + if (!state.json && !_hasOwnProperty.call(overridableKeys, keyNode) && _hasOwnProperty.call(_result, keyNode)) { + state.line = startLine || state.line; + state.position = startPos || state.position; + throwError(state, "duplicated mapping key"); } setProperty2(_result, keyNode, valueNode); delete overridableKeys[keyNode]; } return _result; } - function readLineBreak(state2) { + function readLineBreak(state) { var ch; - ch = state2.input.charCodeAt(state2.position); + ch = state.input.charCodeAt(state.position); if (ch === 10) { - state2.position++; + state.position++; } else if (ch === 13) { - state2.position++; - if (state2.input.charCodeAt(state2.position) === 10) { - state2.position++; + state.position++; + if (state.input.charCodeAt(state.position) === 10) { + state.position++; } } else { - throwError(state2, "a line break is expected"); + throwError(state, "a line break is expected"); } - state2.line += 1; - state2.lineStart = state2.position; + state.line += 1; + state.lineStart = state.position; } - function skipSeparationSpace(state2, allowComments, checkIndent) { - var lineBreaks = 0, ch = state2.input.charCodeAt(state2.position); + function skipSeparationSpace(state, allowComments, checkIndent) { + var lineBreaks = 0, ch = state.input.charCodeAt(state.position); while (ch !== 0) { while (is_WHITE_SPACE(ch)) { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } if (allowComments && ch === 35) { do { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } while (ch !== 10 && ch !== 13 && ch !== 0); } if (is_EOL(ch)) { - readLineBreak(state2); - ch = state2.input.charCodeAt(state2.position); + readLineBreak(state); + ch = state.input.charCodeAt(state.position); lineBreaks++; - state2.lineIndent = 0; + state.lineIndent = 0; while (ch === 32) { - state2.lineIndent++; - ch = state2.input.charCodeAt(++state2.position); + state.lineIndent++; + ch = state.input.charCodeAt(++state.position); } } else { break; } } - if (checkIndent !== -1 && lineBreaks !== 0 && state2.lineIndent < checkIndent) { - throwWarning(state2, "deficient indentation"); + if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) { + throwWarning(state, "deficient indentation"); } return lineBreaks; } - function testDocumentSeparator(state2) { - var _position = state2.position, ch; - ch = state2.input.charCodeAt(_position); - if ((ch === 45 || ch === 46) && ch === state2.input.charCodeAt(_position + 1) && ch === state2.input.charCodeAt(_position + 2)) { + function testDocumentSeparator(state) { + var _position = state.position, ch; + ch = state.input.charCodeAt(_position); + if ((ch === 45 || ch === 46) && ch === state.input.charCodeAt(_position + 1) && ch === state.input.charCodeAt(_position + 2)) { _position += 3; - ch = state2.input.charCodeAt(_position); + ch = state.input.charCodeAt(_position); if (ch === 0 || is_WS_OR_EOL(ch)) { return true; } } return false; } - function writeFoldedLines(state2, count5) { + function writeFoldedLines(state, count5) { if (count5 === 1) { - state2.result += " "; + state.result += " "; } else if (count5 > 1) { - state2.result += common.repeat(` + state.result += common.repeat(` `, count5 - 1); } } - function readPlainScalar(state2, nodeIndent, withinFlowCollection) { - var preceding, following, captureStart, captureEnd, hasPendingContent, _line, _lineStart, _lineIndent, _kind = state2.kind, _result = state2.result, ch; - ch = state2.input.charCodeAt(state2.position); + function readPlainScalar(state, nodeIndent, withinFlowCollection) { + var preceding, following, captureStart, captureEnd, hasPendingContent, _line, _lineStart, _lineIndent, _kind = state.kind, _result = state.result, ch; + ch = state.input.charCodeAt(state.position); if (is_WS_OR_EOL(ch) || is_FLOW_INDICATOR(ch) || ch === 35 || ch === 38 || ch === 42 || ch === 33 || ch === 124 || ch === 62 || ch === 39 || ch === 34 || ch === 37 || ch === 64 || ch === 96) { return false; } if (ch === 63 || ch === 45) { - following = state2.input.charCodeAt(state2.position + 1); + following = state.input.charCodeAt(state.position + 1); if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { return false; } } - state2.kind = "scalar"; - state2.result = ""; - captureStart = captureEnd = state2.position; + state.kind = "scalar"; + state.result = ""; + captureStart = captureEnd = state.position; hasPendingContent = false; while (ch !== 0) { if (ch === 58) { - following = state2.input.charCodeAt(state2.position + 1); + following = state.input.charCodeAt(state.position + 1); if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { break; } } else if (ch === 35) { - preceding = state2.input.charCodeAt(state2.position - 1); + preceding = state.input.charCodeAt(state.position - 1); if (is_WS_OR_EOL(preceding)) { break; } - } else if (state2.position === state2.lineStart && testDocumentSeparator(state2) || withinFlowCollection && is_FLOW_INDICATOR(ch)) { + } else if (state.position === state.lineStart && testDocumentSeparator(state) || withinFlowCollection && is_FLOW_INDICATOR(ch)) { break; } else if (is_EOL(ch)) { - _line = state2.line; - _lineStart = state2.lineStart; - _lineIndent = state2.lineIndent; - skipSeparationSpace(state2, false, -1); - if (state2.lineIndent >= nodeIndent) { + _line = state.line; + _lineStart = state.lineStart; + _lineIndent = state.lineIndent; + skipSeparationSpace(state, false, -1); + if (state.lineIndent >= nodeIndent) { hasPendingContent = true; - ch = state2.input.charCodeAt(state2.position); + ch = state.input.charCodeAt(state.position); continue; } else { - state2.position = captureEnd; - state2.line = _line; - state2.lineStart = _lineStart; - state2.lineIndent = _lineIndent; + state.position = captureEnd; + state.line = _line; + state.lineStart = _lineStart; + state.lineIndent = _lineIndent; break; } } if (hasPendingContent) { - captureSegment(state2, captureStart, captureEnd, false); - writeFoldedLines(state2, state2.line - _line); - captureStart = captureEnd = state2.position; + captureSegment(state, captureStart, captureEnd, false); + writeFoldedLines(state, state.line - _line); + captureStart = captureEnd = state.position; hasPendingContent = false; } if (!is_WHITE_SPACE(ch)) { - captureEnd = state2.position + 1; + captureEnd = state.position + 1; } - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } - captureSegment(state2, captureStart, captureEnd, false); - if (state2.result) { + captureSegment(state, captureStart, captureEnd, false); + if (state.result) { return true; } - state2.kind = _kind; - state2.result = _result; + state.kind = _kind; + state.result = _result; return false; } - function readSingleQuotedScalar(state2, nodeIndent) { + function readSingleQuotedScalar(state, nodeIndent) { var ch, captureStart, captureEnd; - ch = state2.input.charCodeAt(state2.position); + ch = state.input.charCodeAt(state.position); if (ch !== 39) { return false; } - state2.kind = "scalar"; - state2.result = ""; - state2.position++; - captureStart = captureEnd = state2.position; - while ((ch = state2.input.charCodeAt(state2.position)) !== 0) { + state.kind = "scalar"; + state.result = ""; + state.position++; + captureStart = captureEnd = state.position; + while ((ch = state.input.charCodeAt(state.position)) !== 0) { if (ch === 39) { - captureSegment(state2, captureStart, state2.position, true); - ch = state2.input.charCodeAt(++state2.position); + captureSegment(state, captureStart, state.position, true); + ch = state.input.charCodeAt(++state.position); if (ch === 39) { - captureStart = state2.position; - state2.position++; - captureEnd = state2.position; + captureStart = state.position; + state.position++; + captureEnd = state.position; } else { return true; } } else if (is_EOL(ch)) { - captureSegment(state2, captureStart, captureEnd, true); - writeFoldedLines(state2, skipSeparationSpace(state2, false, nodeIndent)); - captureStart = captureEnd = state2.position; - } else if (state2.position === state2.lineStart && testDocumentSeparator(state2)) { - throwError(state2, "unexpected end of the document within a single quoted scalar"); + captureSegment(state, captureStart, captureEnd, true); + writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); + captureStart = captureEnd = state.position; + } else if (state.position === state.lineStart && testDocumentSeparator(state)) { + throwError(state, "unexpected end of the document within a single quoted scalar"); } else { - state2.position++; - captureEnd = state2.position; + state.position++; + captureEnd = state.position; } } - throwError(state2, "unexpected end of the stream within a single quoted scalar"); + throwError(state, "unexpected end of the stream within a single quoted scalar"); } - function readDoubleQuotedScalar(state2, nodeIndent) { + function readDoubleQuotedScalar(state, nodeIndent) { var captureStart, captureEnd, hexLength, hexResult, tmp, ch; - ch = state2.input.charCodeAt(state2.position); + ch = state.input.charCodeAt(state.position); if (ch !== 34) { return false; } - state2.kind = "scalar"; - state2.result = ""; - state2.position++; - captureStart = captureEnd = state2.position; - while ((ch = state2.input.charCodeAt(state2.position)) !== 0) { + state.kind = "scalar"; + state.result = ""; + state.position++; + captureStart = captureEnd = state.position; + while ((ch = state.input.charCodeAt(state.position)) !== 0) { if (ch === 34) { - captureSegment(state2, captureStart, state2.position, true); - state2.position++; + captureSegment(state, captureStart, state.position, true); + state.position++; return true; } else if (ch === 92) { - captureSegment(state2, captureStart, state2.position, true); - ch = state2.input.charCodeAt(++state2.position); + captureSegment(state, captureStart, state.position, true); + ch = state.input.charCodeAt(++state.position); if (is_EOL(ch)) { - skipSeparationSpace(state2, false, nodeIndent); + skipSeparationSpace(state, false, nodeIndent); } else if (ch < 256 && simpleEscapeCheck[ch]) { - state2.result += simpleEscapeMap[ch]; - state2.position++; + state.result += simpleEscapeMap[ch]; + state.position++; } else if ((tmp = escapedHexLen(ch)) > 0) { hexLength = tmp; hexResult = 0; for (;hexLength > 0; hexLength--) { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); if ((tmp = fromHexCode(ch)) >= 0) { hexResult = (hexResult << 4) + tmp; } else { - throwError(state2, "expected hexadecimal character"); + throwError(state, "expected hexadecimal character"); } } - state2.result += charFromCodepoint(hexResult); - state2.position++; + state.result += charFromCodepoint(hexResult); + state.position++; } else { - throwError(state2, "unknown escape sequence"); + throwError(state, "unknown escape sequence"); } - captureStart = captureEnd = state2.position; + captureStart = captureEnd = state.position; } else if (is_EOL(ch)) { - captureSegment(state2, captureStart, captureEnd, true); - writeFoldedLines(state2, skipSeparationSpace(state2, false, nodeIndent)); - captureStart = captureEnd = state2.position; - } else if (state2.position === state2.lineStart && testDocumentSeparator(state2)) { - throwError(state2, "unexpected end of the document within a double quoted scalar"); + captureSegment(state, captureStart, captureEnd, true); + writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); + captureStart = captureEnd = state.position; + } else if (state.position === state.lineStart && testDocumentSeparator(state)) { + throwError(state, "unexpected end of the document within a double quoted scalar"); } else { - state2.position++; - captureEnd = state2.position; + state.position++; + captureEnd = state.position; } } - throwError(state2, "unexpected end of the stream within a double quoted scalar"); + throwError(state, "unexpected end of the stream within a double quoted scalar"); } - function readFlowCollection(state2, nodeIndent) { - var readNext = true, _line, _tag = state2.tag, _result, _anchor = state2.anchor, following, terminator, isPair, isExplicitPair, isMapping, overridableKeys = {}, keyNode, keyTag, valueNode, ch; - ch = state2.input.charCodeAt(state2.position); + function readFlowCollection(state, nodeIndent) { + var readNext = true, _line, _tag = state.tag, _result, _anchor = state.anchor, following, terminator, isPair, isExplicitPair, isMapping, overridableKeys = {}, keyNode, keyTag, valueNode, ch; + ch = state.input.charCodeAt(state.position); if (ch === 91) { terminator = 93; isMapping = false; @@ -105325,67 +105549,67 @@ var require_loader = __commonJS((exports, module2) => { } else { return false; } - if (state2.anchor !== null) { - state2.anchorMap[state2.anchor] = _result; + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; } - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); while (ch !== 0) { - skipSeparationSpace(state2, true, nodeIndent); - ch = state2.input.charCodeAt(state2.position); + skipSeparationSpace(state, true, nodeIndent); + ch = state.input.charCodeAt(state.position); if (ch === terminator) { - state2.position++; - state2.tag = _tag; - state2.anchor = _anchor; - state2.kind = isMapping ? "mapping" : "sequence"; - state2.result = _result; + state.position++; + state.tag = _tag; + state.anchor = _anchor; + state.kind = isMapping ? "mapping" : "sequence"; + state.result = _result; return true; } else if (!readNext) { - throwError(state2, "missed comma between flow collection entries"); + throwError(state, "missed comma between flow collection entries"); } keyTag = keyNode = valueNode = null; isPair = isExplicitPair = false; if (ch === 63) { - following = state2.input.charCodeAt(state2.position + 1); + following = state.input.charCodeAt(state.position + 1); if (is_WS_OR_EOL(following)) { isPair = isExplicitPair = true; - state2.position++; - skipSeparationSpace(state2, true, nodeIndent); + state.position++; + skipSeparationSpace(state, true, nodeIndent); } } - _line = state2.line; - composeNode(state2, nodeIndent, CONTEXT_FLOW_IN, false, true); - keyTag = state2.tag; - keyNode = state2.result; - skipSeparationSpace(state2, true, nodeIndent); - ch = state2.input.charCodeAt(state2.position); - if ((isExplicitPair || state2.line === _line) && ch === 58) { + _line = state.line; + composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); + keyTag = state.tag; + keyNode = state.result; + skipSeparationSpace(state, true, nodeIndent); + ch = state.input.charCodeAt(state.position); + if ((isExplicitPair || state.line === _line) && ch === 58) { isPair = true; - ch = state2.input.charCodeAt(++state2.position); - skipSeparationSpace(state2, true, nodeIndent); - composeNode(state2, nodeIndent, CONTEXT_FLOW_IN, false, true); - valueNode = state2.result; + ch = state.input.charCodeAt(++state.position); + skipSeparationSpace(state, true, nodeIndent); + composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); + valueNode = state.result; } if (isMapping) { - storeMappingPair(state2, _result, overridableKeys, keyTag, keyNode, valueNode); + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode); } else if (isPair) { - _result.push(storeMappingPair(state2, null, overridableKeys, keyTag, keyNode, valueNode)); + _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode)); } else { _result.push(keyNode); } - skipSeparationSpace(state2, true, nodeIndent); - ch = state2.input.charCodeAt(state2.position); + skipSeparationSpace(state, true, nodeIndent); + ch = state.input.charCodeAt(state.position); if (ch === 44) { readNext = true; - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } else { readNext = false; } } - throwError(state2, "unexpected end of the stream within a flow collection"); + throwError(state, "unexpected end of the stream within a flow collection"); } - function readBlockScalar(state2, nodeIndent) { + function readBlockScalar(state, nodeIndent) { var captureStart, folding, chomping = CHOMPING_CLIP, didReadContent = false, detectedIndent = false, textIndent = nodeIndent, emptyLines = 0, atMoreIndented = false, tmp, ch; - ch = state2.input.charCodeAt(state2.position); + ch = state.input.charCodeAt(state.position); if (ch === 124) { folding = false; } else if (ch === 62) { @@ -105393,24 +105617,24 @@ var require_loader = __commonJS((exports, module2) => { } else { return false; } - state2.kind = "scalar"; - state2.result = ""; + state.kind = "scalar"; + state.result = ""; while (ch !== 0) { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); if (ch === 43 || ch === 45) { if (CHOMPING_CLIP === chomping) { chomping = ch === 43 ? CHOMPING_KEEP : CHOMPING_STRIP; } else { - throwError(state2, "repeat of a chomping mode identifier"); + throwError(state, "repeat of a chomping mode identifier"); } } else if ((tmp = fromDecimalCode(ch)) >= 0) { if (tmp === 0) { - throwError(state2, "bad explicit indentation width of a block scalar; it cannot be less than one"); + throwError(state, "bad explicit indentation width of a block scalar; it cannot be less than one"); } else if (!detectedIndent) { textIndent = nodeIndent + tmp - 1; detectedIndent = true; } else { - throwError(state2, "repeat of an indentation width identifier"); + throwError(state, "repeat of an indentation width identifier"); } } else { break; @@ -105418,36 +105642,36 @@ var require_loader = __commonJS((exports, module2) => { } if (is_WHITE_SPACE(ch)) { do { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } while (is_WHITE_SPACE(ch)); if (ch === 35) { do { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } while (!is_EOL(ch) && ch !== 0); } } while (ch !== 0) { - readLineBreak(state2); - state2.lineIndent = 0; - ch = state2.input.charCodeAt(state2.position); - while ((!detectedIndent || state2.lineIndent < textIndent) && ch === 32) { - state2.lineIndent++; - ch = state2.input.charCodeAt(++state2.position); + readLineBreak(state); + state.lineIndent = 0; + ch = state.input.charCodeAt(state.position); + while ((!detectedIndent || state.lineIndent < textIndent) && ch === 32) { + state.lineIndent++; + ch = state.input.charCodeAt(++state.position); } - if (!detectedIndent && state2.lineIndent > textIndent) { - textIndent = state2.lineIndent; + if (!detectedIndent && state.lineIndent > textIndent) { + textIndent = state.lineIndent; } if (is_EOL(ch)) { emptyLines++; continue; } - if (state2.lineIndent < textIndent) { + if (state.lineIndent < textIndent) { if (chomping === CHOMPING_KEEP) { - state2.result += common.repeat(` + state.result += common.repeat(` `, didReadContent ? 1 + emptyLines : emptyLines); } else if (chomping === CHOMPING_CLIP) { if (didReadContent) { - state2.result += ` + state.result += ` `; } } @@ -105456,92 +105680,92 @@ var require_loader = __commonJS((exports, module2) => { if (folding) { if (is_WHITE_SPACE(ch)) { atMoreIndented = true; - state2.result += common.repeat(` + state.result += common.repeat(` `, didReadContent ? 1 + emptyLines : emptyLines); } else if (atMoreIndented) { atMoreIndented = false; - state2.result += common.repeat(` + state.result += common.repeat(` `, emptyLines + 1); } else if (emptyLines === 0) { if (didReadContent) { - state2.result += " "; + state.result += " "; } } else { - state2.result += common.repeat(` + state.result += common.repeat(` `, emptyLines); } } else { - state2.result += common.repeat(` + state.result += common.repeat(` `, didReadContent ? 1 + emptyLines : emptyLines); } didReadContent = true; detectedIndent = true; emptyLines = 0; - captureStart = state2.position; + captureStart = state.position; while (!is_EOL(ch) && ch !== 0) { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } - captureSegment(state2, captureStart, state2.position, false); + captureSegment(state, captureStart, state.position, false); } return true; } - function readBlockSequence(state2, nodeIndent) { - var _line, _tag = state2.tag, _anchor = state2.anchor, _result = [], following, detected = false, ch; - if (state2.anchor !== null) { - state2.anchorMap[state2.anchor] = _result; + function readBlockSequence(state, nodeIndent) { + var _line, _tag = state.tag, _anchor = state.anchor, _result = [], following, detected = false, ch; + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; } - ch = state2.input.charCodeAt(state2.position); + ch = state.input.charCodeAt(state.position); while (ch !== 0) { if (ch !== 45) { break; } - following = state2.input.charCodeAt(state2.position + 1); + following = state.input.charCodeAt(state.position + 1); if (!is_WS_OR_EOL(following)) { break; } detected = true; - state2.position++; - if (skipSeparationSpace(state2, true, -1)) { - if (state2.lineIndent <= nodeIndent) { + state.position++; + if (skipSeparationSpace(state, true, -1)) { + if (state.lineIndent <= nodeIndent) { _result.push(null); - ch = state2.input.charCodeAt(state2.position); + ch = state.input.charCodeAt(state.position); continue; } } - _line = state2.line; - composeNode(state2, nodeIndent, CONTEXT_BLOCK_IN, false, true); - _result.push(state2.result); - skipSeparationSpace(state2, true, -1); - ch = state2.input.charCodeAt(state2.position); - if ((state2.line === _line || state2.lineIndent > nodeIndent) && ch !== 0) { - throwError(state2, "bad indentation of a sequence entry"); - } else if (state2.lineIndent < nodeIndent) { + _line = state.line; + composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true); + _result.push(state.result); + skipSeparationSpace(state, true, -1); + ch = state.input.charCodeAt(state.position); + if ((state.line === _line || state.lineIndent > nodeIndent) && ch !== 0) { + throwError(state, "bad indentation of a sequence entry"); + } else if (state.lineIndent < nodeIndent) { break; } } if (detected) { - state2.tag = _tag; - state2.anchor = _anchor; - state2.kind = "sequence"; - state2.result = _result; + state.tag = _tag; + state.anchor = _anchor; + state.kind = "sequence"; + state.result = _result; return true; } return false; } - function readBlockMapping(state2, nodeIndent, flowIndent) { - var following, allowCompact, _line, _pos, _tag = state2.tag, _anchor = state2.anchor, _result = {}, overridableKeys = {}, keyTag = null, keyNode = null, valueNode = null, atExplicitKey = false, detected = false, ch; - if (state2.anchor !== null) { - state2.anchorMap[state2.anchor] = _result; + function readBlockMapping(state, nodeIndent, flowIndent) { + var following, allowCompact, _line, _pos, _tag = state.tag, _anchor = state.anchor, _result = {}, overridableKeys = {}, keyTag = null, keyNode = null, valueNode = null, atExplicitKey = false, detected = false, ch; + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; } - ch = state2.input.charCodeAt(state2.position); + ch = state.input.charCodeAt(state.position); while (ch !== 0) { - following = state2.input.charCodeAt(state2.position + 1); - _line = state2.line; - _pos = state2.position; + following = state.input.charCodeAt(state.position + 1); + _line = state.line; + _pos = state.position; if ((ch === 63 || ch === 58) && is_WS_OR_EOL(following)) { if (ch === 63) { if (atExplicitKey) { - storeMappingPair(state2, _result, overridableKeys, keyTag, keyNode, null); + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); keyTag = keyNode = valueNode = null; } detected = true; @@ -105551,218 +105775,218 @@ var require_loader = __commonJS((exports, module2) => { atExplicitKey = false; allowCompact = true; } else { - throwError(state2, "incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line"); + throwError(state, "incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line"); } - state2.position += 1; + state.position += 1; ch = following; - } else if (composeNode(state2, flowIndent, CONTEXT_FLOW_OUT, false, true)) { - if (state2.line === _line) { - ch = state2.input.charCodeAt(state2.position); + } else if (composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) { + if (state.line === _line) { + ch = state.input.charCodeAt(state.position); while (is_WHITE_SPACE(ch)) { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } if (ch === 58) { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); if (!is_WS_OR_EOL(ch)) { - throwError(state2, "a whitespace character is expected after the key-value separator within a block mapping"); + throwError(state, "a whitespace character is expected after the key-value separator within a block mapping"); } if (atExplicitKey) { - storeMappingPair(state2, _result, overridableKeys, keyTag, keyNode, null); + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); keyTag = keyNode = valueNode = null; } detected = true; atExplicitKey = false; allowCompact = false; - keyTag = state2.tag; - keyNode = state2.result; + keyTag = state.tag; + keyNode = state.result; } else if (detected) { - throwError(state2, "can not read an implicit mapping pair; a colon is missed"); + throwError(state, "can not read an implicit mapping pair; a colon is missed"); } else { - state2.tag = _tag; - state2.anchor = _anchor; + state.tag = _tag; + state.anchor = _anchor; return true; } } else if (detected) { - throwError(state2, "can not read a block mapping entry; a multiline key may not be an implicit key"); + throwError(state, "can not read a block mapping entry; a multiline key may not be an implicit key"); } else { - state2.tag = _tag; - state2.anchor = _anchor; + state.tag = _tag; + state.anchor = _anchor; return true; } } else { break; } - if (state2.line === _line || state2.lineIndent > nodeIndent) { - if (composeNode(state2, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) { + if (state.line === _line || state.lineIndent > nodeIndent) { + if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) { if (atExplicitKey) { - keyNode = state2.result; + keyNode = state.result; } else { - valueNode = state2.result; + valueNode = state.result; } } if (!atExplicitKey) { - storeMappingPair(state2, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _pos); + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _pos); keyTag = keyNode = valueNode = null; } - skipSeparationSpace(state2, true, -1); - ch = state2.input.charCodeAt(state2.position); + skipSeparationSpace(state, true, -1); + ch = state.input.charCodeAt(state.position); } - if (state2.lineIndent > nodeIndent && ch !== 0) { - throwError(state2, "bad indentation of a mapping entry"); - } else if (state2.lineIndent < nodeIndent) { + if (state.lineIndent > nodeIndent && ch !== 0) { + throwError(state, "bad indentation of a mapping entry"); + } else if (state.lineIndent < nodeIndent) { break; } } if (atExplicitKey) { - storeMappingPair(state2, _result, overridableKeys, keyTag, keyNode, null); + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null); } if (detected) { - state2.tag = _tag; - state2.anchor = _anchor; - state2.kind = "mapping"; - state2.result = _result; + state.tag = _tag; + state.anchor = _anchor; + state.kind = "mapping"; + state.result = _result; } return detected; } - function readTagProperty(state2) { + function readTagProperty(state) { var _position, isVerbatim = false, isNamed = false, tagHandle, tagName, ch; - ch = state2.input.charCodeAt(state2.position); + ch = state.input.charCodeAt(state.position); if (ch !== 33) return false; - if (state2.tag !== null) { - throwError(state2, "duplication of a tag property"); + if (state.tag !== null) { + throwError(state, "duplication of a tag property"); } - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); if (ch === 60) { isVerbatim = true; - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } else if (ch === 33) { isNamed = true; tagHandle = "!!"; - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } else { tagHandle = "!"; } - _position = state2.position; + _position = state.position; if (isVerbatim) { do { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } while (ch !== 0 && ch !== 62); - if (state2.position < state2.length) { - tagName = state2.input.slice(_position, state2.position); - ch = state2.input.charCodeAt(++state2.position); + if (state.position < state.length) { + tagName = state.input.slice(_position, state.position); + ch = state.input.charCodeAt(++state.position); } else { - throwError(state2, "unexpected end of the stream within a verbatim tag"); + throwError(state, "unexpected end of the stream within a verbatim tag"); } } else { while (ch !== 0 && !is_WS_OR_EOL(ch)) { if (ch === 33) { if (!isNamed) { - tagHandle = state2.input.slice(_position - 1, state2.position + 1); + tagHandle = state.input.slice(_position - 1, state.position + 1); if (!PATTERN_TAG_HANDLE.test(tagHandle)) { - throwError(state2, "named tag handle cannot contain such characters"); + throwError(state, "named tag handle cannot contain such characters"); } isNamed = true; - _position = state2.position + 1; + _position = state.position + 1; } else { - throwError(state2, "tag suffix cannot contain exclamation marks"); + throwError(state, "tag suffix cannot contain exclamation marks"); } } - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } - tagName = state2.input.slice(_position, state2.position); + tagName = state.input.slice(_position, state.position); if (PATTERN_FLOW_INDICATORS.test(tagName)) { - throwError(state2, "tag suffix cannot contain flow indicator characters"); + throwError(state, "tag suffix cannot contain flow indicator characters"); } } if (tagName && !PATTERN_TAG_URI.test(tagName)) { - throwError(state2, "tag name cannot contain such characters: " + tagName); + throwError(state, "tag name cannot contain such characters: " + tagName); } if (isVerbatim) { - state2.tag = tagName; - } else if (_hasOwnProperty.call(state2.tagMap, tagHandle)) { - state2.tag = state2.tagMap[tagHandle] + tagName; + state.tag = tagName; + } else if (_hasOwnProperty.call(state.tagMap, tagHandle)) { + state.tag = state.tagMap[tagHandle] + tagName; } else if (tagHandle === "!") { - state2.tag = "!" + tagName; + state.tag = "!" + tagName; } else if (tagHandle === "!!") { - state2.tag = "tag:yaml.org,2002:" + tagName; + state.tag = "tag:yaml.org,2002:" + tagName; } else { - throwError(state2, 'undeclared tag handle "' + tagHandle + '"'); + throwError(state, 'undeclared tag handle "' + tagHandle + '"'); } return true; } - function readAnchorProperty(state2) { + function readAnchorProperty(state) { var _position, ch; - ch = state2.input.charCodeAt(state2.position); + ch = state.input.charCodeAt(state.position); if (ch !== 38) return false; - if (state2.anchor !== null) { - throwError(state2, "duplication of an anchor property"); + if (state.anchor !== null) { + throwError(state, "duplication of an anchor property"); } - ch = state2.input.charCodeAt(++state2.position); - _position = state2.position; + ch = state.input.charCodeAt(++state.position); + _position = state.position; while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } - if (state2.position === _position) { - throwError(state2, "name of an anchor node must contain at least one character"); + if (state.position === _position) { + throwError(state, "name of an anchor node must contain at least one character"); } - state2.anchor = state2.input.slice(_position, state2.position); + state.anchor = state.input.slice(_position, state.position); return true; } - function readAlias(state2) { + function readAlias(state) { var _position, alias2, ch; - ch = state2.input.charCodeAt(state2.position); + ch = state.input.charCodeAt(state.position); if (ch !== 42) return false; - ch = state2.input.charCodeAt(++state2.position); - _position = state2.position; + ch = state.input.charCodeAt(++state.position); + _position = state.position; while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } - if (state2.position === _position) { - throwError(state2, "name of an alias node must contain at least one character"); + if (state.position === _position) { + throwError(state, "name of an alias node must contain at least one character"); } - alias2 = state2.input.slice(_position, state2.position); - if (!_hasOwnProperty.call(state2.anchorMap, alias2)) { - throwError(state2, 'unidentified alias "' + alias2 + '"'); + alias2 = state.input.slice(_position, state.position); + if (!_hasOwnProperty.call(state.anchorMap, alias2)) { + throwError(state, 'unidentified alias "' + alias2 + '"'); } - state2.result = state2.anchorMap[alias2]; - skipSeparationSpace(state2, true, -1); + state.result = state.anchorMap[alias2]; + skipSeparationSpace(state, true, -1); return true; } - function composeNode(state2, parentIndent, nodeContext, allowToSeek, allowCompact) { + function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) { var allowBlockStyles, allowBlockScalars, allowBlockCollections, indentStatus = 1, atNewLine = false, hasContent = false, typeIndex, typeQuantity, type3, flowIndent, blockIndent; - if (state2.listener !== null) { - state2.listener("open", state2); + if (state.listener !== null) { + state.listener("open", state); } - state2.tag = null; - state2.anchor = null; - state2.kind = null; - state2.result = null; + state.tag = null; + state.anchor = null; + state.kind = null; + state.result = null; allowBlockStyles = allowBlockScalars = allowBlockCollections = CONTEXT_BLOCK_OUT === nodeContext || CONTEXT_BLOCK_IN === nodeContext; if (allowToSeek) { - if (skipSeparationSpace(state2, true, -1)) { + if (skipSeparationSpace(state, true, -1)) { atNewLine = true; - if (state2.lineIndent > parentIndent) { + if (state.lineIndent > parentIndent) { indentStatus = 1; - } else if (state2.lineIndent === parentIndent) { + } else if (state.lineIndent === parentIndent) { indentStatus = 0; - } else if (state2.lineIndent < parentIndent) { + } else if (state.lineIndent < parentIndent) { indentStatus = -1; } } } if (indentStatus === 1) { - while (readTagProperty(state2) || readAnchorProperty(state2)) { - if (skipSeparationSpace(state2, true, -1)) { + while (readTagProperty(state) || readAnchorProperty(state)) { + if (skipSeparationSpace(state, true, -1)) { atNewLine = true; allowBlockCollections = allowBlockStyles; - if (state2.lineIndent > parentIndent) { + if (state.lineIndent > parentIndent) { indentStatus = 1; - } else if (state2.lineIndent === parentIndent) { + } else if (state.lineIndent === parentIndent) { indentStatus = 0; - } else if (state2.lineIndent < parentIndent) { + } else if (state.lineIndent < parentIndent) { indentStatus = -1; } } else { @@ -105779,141 +106003,141 @@ var require_loader = __commonJS((exports, module2) => { } else { flowIndent = parentIndent + 1; } - blockIndent = state2.position - state2.lineStart; + blockIndent = state.position - state.lineStart; if (indentStatus === 1) { - if (allowBlockCollections && (readBlockSequence(state2, blockIndent) || readBlockMapping(state2, blockIndent, flowIndent)) || readFlowCollection(state2, flowIndent)) { + if (allowBlockCollections && (readBlockSequence(state, blockIndent) || readBlockMapping(state, blockIndent, flowIndent)) || readFlowCollection(state, flowIndent)) { hasContent = true; } else { - if (allowBlockScalars && readBlockScalar(state2, flowIndent) || readSingleQuotedScalar(state2, flowIndent) || readDoubleQuotedScalar(state2, flowIndent)) { + if (allowBlockScalars && readBlockScalar(state, flowIndent) || readSingleQuotedScalar(state, flowIndent) || readDoubleQuotedScalar(state, flowIndent)) { hasContent = true; - } else if (readAlias(state2)) { + } else if (readAlias(state)) { hasContent = true; - if (state2.tag !== null || state2.anchor !== null) { - throwError(state2, "alias node should not have any properties"); + if (state.tag !== null || state.anchor !== null) { + throwError(state, "alias node should not have any properties"); } - } else if (readPlainScalar(state2, flowIndent, CONTEXT_FLOW_IN === nodeContext)) { + } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) { hasContent = true; - if (state2.tag === null) { - state2.tag = "?"; + if (state.tag === null) { + state.tag = "?"; } } - if (state2.anchor !== null) { - state2.anchorMap[state2.anchor] = state2.result; + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; } } } else if (indentStatus === 0) { - hasContent = allowBlockCollections && readBlockSequence(state2, blockIndent); + hasContent = allowBlockCollections && readBlockSequence(state, blockIndent); } } - if (state2.tag !== null && state2.tag !== "!") { - if (state2.tag === "?") { - if (state2.result !== null && state2.kind !== "scalar") { - throwError(state2, 'unacceptable node kind for ! tag; it should be "scalar", not "' + state2.kind + '"'); + if (state.tag !== null && state.tag !== "!") { + if (state.tag === "?") { + if (state.result !== null && state.kind !== "scalar") { + throwError(state, 'unacceptable node kind for ! tag; it should be "scalar", not "' + state.kind + '"'); } - for (typeIndex = 0, typeQuantity = state2.implicitTypes.length;typeIndex < typeQuantity; typeIndex += 1) { - type3 = state2.implicitTypes[typeIndex]; - if (type3.resolve(state2.result)) { - state2.result = type3.construct(state2.result); - state2.tag = type3.tag; - if (state2.anchor !== null) { - state2.anchorMap[state2.anchor] = state2.result; + for (typeIndex = 0, typeQuantity = state.implicitTypes.length;typeIndex < typeQuantity; typeIndex += 1) { + type3 = state.implicitTypes[typeIndex]; + if (type3.resolve(state.result)) { + state.result = type3.construct(state.result); + state.tag = type3.tag; + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; } break; } } - } else if (_hasOwnProperty.call(state2.typeMap[state2.kind || "fallback"], state2.tag)) { - type3 = state2.typeMap[state2.kind || "fallback"][state2.tag]; - if (state2.result !== null && type3.kind !== state2.kind) { - throwError(state2, "unacceptable node kind for !<" + state2.tag + '> tag; it should be "' + type3.kind + '", not "' + state2.kind + '"'); + } else if (_hasOwnProperty.call(state.typeMap[state.kind || "fallback"], state.tag)) { + type3 = state.typeMap[state.kind || "fallback"][state.tag]; + if (state.result !== null && type3.kind !== state.kind) { + throwError(state, "unacceptable node kind for !<" + state.tag + '> tag; it should be "' + type3.kind + '", not "' + state.kind + '"'); } - if (!type3.resolve(state2.result)) { - throwError(state2, "cannot resolve a node with !<" + state2.tag + "> explicit tag"); + if (!type3.resolve(state.result)) { + throwError(state, "cannot resolve a node with !<" + state.tag + "> explicit tag"); } else { - state2.result = type3.construct(state2.result); - if (state2.anchor !== null) { - state2.anchorMap[state2.anchor] = state2.result; + state.result = type3.construct(state.result); + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; } } } else { - throwError(state2, "unknown tag !<" + state2.tag + ">"); + throwError(state, "unknown tag !<" + state.tag + ">"); } } - if (state2.listener !== null) { - state2.listener("close", state2); + if (state.listener !== null) { + state.listener("close", state); } - return state2.tag !== null || state2.anchor !== null || hasContent; + return state.tag !== null || state.anchor !== null || hasContent; } - function readDocument(state2) { - var documentStart = state2.position, _position, directiveName, directiveArgs, hasDirectives = false, ch; - state2.version = null; - state2.checkLineBreaks = state2.legacy; - state2.tagMap = {}; - state2.anchorMap = {}; - while ((ch = state2.input.charCodeAt(state2.position)) !== 0) { - skipSeparationSpace(state2, true, -1); - ch = state2.input.charCodeAt(state2.position); - if (state2.lineIndent > 0 || ch !== 37) { + function readDocument(state) { + var documentStart = state.position, _position, directiveName, directiveArgs, hasDirectives = false, ch; + state.version = null; + state.checkLineBreaks = state.legacy; + state.tagMap = {}; + state.anchorMap = {}; + while ((ch = state.input.charCodeAt(state.position)) !== 0) { + skipSeparationSpace(state, true, -1); + ch = state.input.charCodeAt(state.position); + if (state.lineIndent > 0 || ch !== 37) { break; } hasDirectives = true; - ch = state2.input.charCodeAt(++state2.position); - _position = state2.position; + ch = state.input.charCodeAt(++state.position); + _position = state.position; while (ch !== 0 && !is_WS_OR_EOL(ch)) { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } - directiveName = state2.input.slice(_position, state2.position); + directiveName = state.input.slice(_position, state.position); directiveArgs = []; if (directiveName.length < 1) { - throwError(state2, "directive name must not be less than one character in length"); + throwError(state, "directive name must not be less than one character in length"); } while (ch !== 0) { while (is_WHITE_SPACE(ch)) { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } if (ch === 35) { do { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } while (ch !== 0 && !is_EOL(ch)); break; } if (is_EOL(ch)) break; - _position = state2.position; + _position = state.position; while (ch !== 0 && !is_WS_OR_EOL(ch)) { - ch = state2.input.charCodeAt(++state2.position); + ch = state.input.charCodeAt(++state.position); } - directiveArgs.push(state2.input.slice(_position, state2.position)); + directiveArgs.push(state.input.slice(_position, state.position)); } if (ch !== 0) - readLineBreak(state2); + readLineBreak(state); if (_hasOwnProperty.call(directiveHandlers, directiveName)) { - directiveHandlers[directiveName](state2, directiveName, directiveArgs); + directiveHandlers[directiveName](state, directiveName, directiveArgs); } else { - throwWarning(state2, 'unknown document directive "' + directiveName + '"'); + throwWarning(state, 'unknown document directive "' + directiveName + '"'); } } - skipSeparationSpace(state2, true, -1); - if (state2.lineIndent === 0 && state2.input.charCodeAt(state2.position) === 45 && state2.input.charCodeAt(state2.position + 1) === 45 && state2.input.charCodeAt(state2.position + 2) === 45) { - state2.position += 3; - skipSeparationSpace(state2, true, -1); + skipSeparationSpace(state, true, -1); + if (state.lineIndent === 0 && state.input.charCodeAt(state.position) === 45 && state.input.charCodeAt(state.position + 1) === 45 && state.input.charCodeAt(state.position + 2) === 45) { + state.position += 3; + skipSeparationSpace(state, true, -1); } else if (hasDirectives) { - throwError(state2, "directives end mark is expected"); + throwError(state, "directives end mark is expected"); } - composeNode(state2, state2.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true); - skipSeparationSpace(state2, true, -1); - if (state2.checkLineBreaks && PATTERN_NON_ASCII_LINE_BREAKS.test(state2.input.slice(documentStart, state2.position))) { - throwWarning(state2, "non-ASCII line breaks are interpreted as content"); + composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true); + skipSeparationSpace(state, true, -1); + if (state.checkLineBreaks && PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) { + throwWarning(state, "non-ASCII line breaks are interpreted as content"); } - state2.documents.push(state2.result); - if (state2.position === state2.lineStart && testDocumentSeparator(state2)) { - if (state2.input.charCodeAt(state2.position) === 46) { - state2.position += 3; - skipSeparationSpace(state2, true, -1); + state.documents.push(state.result); + if (state.position === state.lineStart && testDocumentSeparator(state)) { + if (state.input.charCodeAt(state.position) === 46) { + state.position += 3; + skipSeparationSpace(state, true, -1); } return; } - if (state2.position < state2.length - 1) { - throwError(state2, "end of the stream or a document separator is expected"); + if (state.position < state.length - 1) { + throwError(state, "end of the stream or a document separator is expected"); } else { return; } @@ -105930,21 +106154,21 @@ var require_loader = __commonJS((exports, module2) => { input = input.slice(1); } } - var state2 = new State2(input, options4); + var state = new State2(input, options4); var nullpos = input.indexOf("\x00"); if (nullpos !== -1) { - state2.position = nullpos; - throwError(state2, "null byte is not allowed in input"); + state.position = nullpos; + throwError(state, "null byte is not allowed in input"); } - state2.input += "\x00"; - while (state2.input.charCodeAt(state2.position) === 32) { - state2.lineIndent += 1; - state2.position += 1; + state.input += "\x00"; + while (state.input.charCodeAt(state.position) === 32) { + state.lineIndent += 1; + state.position += 1; } - while (state2.position < state2.length - 1) { - readDocument(state2); + while (state.position < state.length - 1) { + readDocument(state); } - return state2.documents; + return state.documents; } function loadAll(input, iterator, options4) { if (iterator !== null && typeof iterator === "object" && typeof options4 === "undefined") { @@ -106125,34 +106349,34 @@ var require_dumper = __commonJS((exports, module2) => { } return result6; } - function generateNextLine(state2, level) { + function generateNextLine(state, level) { return ` -` + common.repeat(" ", state2.indent * level); +` + common.repeat(" ", state.indent * level); } - function testImplicitResolving(state2, str2) { + function testImplicitResolving(state, str2) { var index3, length3, type3; - for (index3 = 0, length3 = state2.implicitTypes.length;index3 < length3; index3 += 1) { - type3 = state2.implicitTypes[index3]; + for (index3 = 0, length3 = state.implicitTypes.length;index3 < length3; index3 += 1) { + type3 = state.implicitTypes[index3]; if (type3.resolve(str2)) { return true; } } return false; } - function isWhitespace(c2) { + function isWhitespace2(c2) { return c2 === CHAR_SPACE || c2 === CHAR_TAB; } function isPrintable(c2) { return 32 <= c2 && c2 <= 126 || 161 <= c2 && c2 <= 55295 && c2 !== 8232 && c2 !== 8233 || 57344 <= c2 && c2 <= 65533 && c2 !== 65279 || 65536 <= c2 && c2 <= 1114111; } function isNsChar(c2) { - return isPrintable(c2) && !isWhitespace(c2) && c2 !== 65279 && c2 !== CHAR_CARRIAGE_RETURN && c2 !== CHAR_LINE_FEED; + return isPrintable(c2) && !isWhitespace2(c2) && c2 !== 65279 && c2 !== CHAR_CARRIAGE_RETURN && c2 !== CHAR_LINE_FEED; } function isPlainSafe(c2, prev2) { return isPrintable(c2) && c2 !== 65279 && c2 !== CHAR_COMMA && c2 !== CHAR_LEFT_SQUARE_BRACKET && c2 !== CHAR_RIGHT_SQUARE_BRACKET && c2 !== CHAR_LEFT_CURLY_BRACKET && c2 !== CHAR_RIGHT_CURLY_BRACKET && c2 !== CHAR_COLON && (c2 !== CHAR_SHARP || prev2 && isNsChar(prev2)); } function isPlainSafeFirst(c2) { - return isPrintable(c2) && c2 !== 65279 && !isWhitespace(c2) && c2 !== CHAR_MINUS && c2 !== CHAR_QUESTION && c2 !== CHAR_COLON && c2 !== CHAR_COMMA && c2 !== CHAR_LEFT_SQUARE_BRACKET && c2 !== CHAR_RIGHT_SQUARE_BRACKET && c2 !== CHAR_LEFT_CURLY_BRACKET && c2 !== CHAR_RIGHT_CURLY_BRACKET && c2 !== CHAR_SHARP && c2 !== CHAR_AMPERSAND && c2 !== CHAR_ASTERISK && c2 !== CHAR_EXCLAMATION && c2 !== CHAR_VERTICAL_LINE && c2 !== CHAR_EQUALS && c2 !== CHAR_GREATER_THAN && c2 !== CHAR_SINGLE_QUOTE && c2 !== CHAR_DOUBLE_QUOTE && c2 !== CHAR_PERCENT && c2 !== CHAR_COMMERCIAL_AT && c2 !== CHAR_GRAVE_ACCENT; + return isPrintable(c2) && c2 !== 65279 && !isWhitespace2(c2) && c2 !== CHAR_MINUS && c2 !== CHAR_QUESTION && c2 !== CHAR_COLON && c2 !== CHAR_COMMA && c2 !== CHAR_LEFT_SQUARE_BRACKET && c2 !== CHAR_RIGHT_SQUARE_BRACKET && c2 !== CHAR_LEFT_CURLY_BRACKET && c2 !== CHAR_RIGHT_CURLY_BRACKET && c2 !== CHAR_SHARP && c2 !== CHAR_AMPERSAND && c2 !== CHAR_ASTERISK && c2 !== CHAR_EXCLAMATION && c2 !== CHAR_VERTICAL_LINE && c2 !== CHAR_EQUALS && c2 !== CHAR_GREATER_THAN && c2 !== CHAR_SINGLE_QUOTE && c2 !== CHAR_DOUBLE_QUOTE && c2 !== CHAR_PERCENT && c2 !== CHAR_COMMERCIAL_AT && c2 !== CHAR_GRAVE_ACCENT; } function needIndentIndicator(string12) { var leadingSpaceRe = /^\n* /; @@ -106170,7 +106394,7 @@ var require_dumper = __commonJS((exports, module2) => { var hasFoldableLine = false; var shouldTrackWidth = lineWidth !== -1; var previousLineBreak = -1; - var plain = isPlainSafeFirst(string12.charCodeAt(0)) && !isWhitespace(string12.charCodeAt(string12.length - 1)); + var plain = isPlainSafeFirst(string12.charCodeAt(0)) && !isWhitespace2(string12.charCodeAt(string12.length - 1)); if (singleLineOnly) { for (i6 = 0;i6 < string12.length; i6++) { char2 = string12.charCodeAt(i6); @@ -106205,29 +106429,29 @@ var require_dumper = __commonJS((exports, module2) => { } return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL; } - function writeScalar(state2, string12, level, iskey) { - state2.dump = function() { + function writeScalar(state, string12, level, iskey) { + state.dump = function() { if (string12.length === 0) { return "''"; } - if (!state2.noCompatMode && DEPRECATED_BOOLEANS_SYNTAX.indexOf(string12) !== -1) { + if (!state.noCompatMode && DEPRECATED_BOOLEANS_SYNTAX.indexOf(string12) !== -1) { return "'" + string12 + "'"; } - var indent = state2.indent * Math.max(1, level); - var lineWidth = state2.lineWidth === -1 ? -1 : Math.max(Math.min(state2.lineWidth, 40), state2.lineWidth - indent); - var singleLineOnly = iskey || state2.flowLevel > -1 && level >= state2.flowLevel; + var indent = state.indent * Math.max(1, level); + var lineWidth = state.lineWidth === -1 ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent); + var singleLineOnly = iskey || state.flowLevel > -1 && level >= state.flowLevel; function testAmbiguity(string13) { - return testImplicitResolving(state2, string13); + return testImplicitResolving(state, string13); } - switch (chooseScalarStyle(string12, singleLineOnly, state2.indent, lineWidth, testAmbiguity)) { + switch (chooseScalarStyle(string12, singleLineOnly, state.indent, lineWidth, testAmbiguity)) { case STYLE_PLAIN: return string12; case STYLE_SINGLE: return "'" + string12.replace(/'/g, "''") + "'"; case STYLE_LITERAL: - return "|" + blockHeader(string12, state2.indent) + dropEndingNewline(indentString(string12, indent)); + return "|" + blockHeader(string12, state.indent) + dropEndingNewline(indentString(string12, indent)); case STYLE_FOLDED: - return ">" + blockHeader(string12, state2.indent) + dropEndingNewline(indentString(foldString(string12, lineWidth), indent)); + return ">" + blockHeader(string12, state.indent) + dropEndingNewline(indentString(foldString(string12, lineWidth), indent)); case STYLE_DOUBLE: return '"' + escapeString(string12, lineWidth) + '"'; default: @@ -106318,115 +106542,115 @@ var require_dumper = __commonJS((exports, module2) => { } return result6; } - function writeFlowSequence(state2, level, object5) { - var _result = "", _tag = state2.tag, index3, length3; + function writeFlowSequence(state, level, object5) { + var _result = "", _tag = state.tag, index3, length3; for (index3 = 0, length3 = object5.length;index3 < length3; index3 += 1) { - if (writeNode(state2, level, object5[index3], false, false)) { + if (writeNode(state, level, object5[index3], false, false)) { if (index3 !== 0) - _result += "," + (!state2.condenseFlow ? " " : ""); - _result += state2.dump; + _result += "," + (!state.condenseFlow ? " " : ""); + _result += state.dump; } } - state2.tag = _tag; - state2.dump = "[" + _result + "]"; + state.tag = _tag; + state.dump = "[" + _result + "]"; } - function writeBlockSequence(state2, level, object5, compact7) { - var _result = "", _tag = state2.tag, index3, length3; + function writeBlockSequence(state, level, object5, compact7) { + var _result = "", _tag = state.tag, index3, length3; for (index3 = 0, length3 = object5.length;index3 < length3; index3 += 1) { - if (writeNode(state2, level + 1, object5[index3], true, true)) { + if (writeNode(state, level + 1, object5[index3], true, true)) { if (!compact7 || index3 !== 0) { - _result += generateNextLine(state2, level); + _result += generateNextLine(state, level); } - if (state2.dump && CHAR_LINE_FEED === state2.dump.charCodeAt(0)) { + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { _result += "-"; } else { _result += "- "; } - _result += state2.dump; + _result += state.dump; } } - state2.tag = _tag; - state2.dump = _result || "[]"; + state.tag = _tag; + state.dump = _result || "[]"; } - function writeFlowMapping(state2, level, object5) { - var _result = "", _tag = state2.tag, objectKeyList = Object.keys(object5), index3, length3, objectKey, objectValue, pairBuffer; + function writeFlowMapping(state, level, object5) { + var _result = "", _tag = state.tag, objectKeyList = Object.keys(object5), index3, length3, objectKey, objectValue, pairBuffer; for (index3 = 0, length3 = objectKeyList.length;index3 < length3; index3 += 1) { pairBuffer = ""; if (index3 !== 0) pairBuffer += ", "; - if (state2.condenseFlow) + if (state.condenseFlow) pairBuffer += '"'; objectKey = objectKeyList[index3]; objectValue = object5[objectKey]; - if (!writeNode(state2, level, objectKey, false, false)) { + if (!writeNode(state, level, objectKey, false, false)) { continue; } - if (state2.dump.length > 1024) + if (state.dump.length > 1024) pairBuffer += "? "; - pairBuffer += state2.dump + (state2.condenseFlow ? '"' : "") + ":" + (state2.condenseFlow ? "" : " "); - if (!writeNode(state2, level, objectValue, false, false)) { + pairBuffer += state.dump + (state.condenseFlow ? '"' : "") + ":" + (state.condenseFlow ? "" : " "); + if (!writeNode(state, level, objectValue, false, false)) { continue; } - pairBuffer += state2.dump; + pairBuffer += state.dump; _result += pairBuffer; } - state2.tag = _tag; - state2.dump = "{" + _result + "}"; + state.tag = _tag; + state.dump = "{" + _result + "}"; } - function writeBlockMapping(state2, level, object5, compact7) { - var _result = "", _tag = state2.tag, objectKeyList = Object.keys(object5), index3, length3, objectKey, objectValue, explicitPair, pairBuffer; - if (state2.sortKeys === true) { + function writeBlockMapping(state, level, object5, compact7) { + var _result = "", _tag = state.tag, objectKeyList = Object.keys(object5), index3, length3, objectKey, objectValue, explicitPair, pairBuffer; + if (state.sortKeys === true) { objectKeyList.sort(); - } else if (typeof state2.sortKeys === "function") { - objectKeyList.sort(state2.sortKeys); - } else if (state2.sortKeys) { + } else if (typeof state.sortKeys === "function") { + objectKeyList.sort(state.sortKeys); + } else if (state.sortKeys) { throw new YAMLException("sortKeys must be a boolean or a function"); } for (index3 = 0, length3 = objectKeyList.length;index3 < length3; index3 += 1) { pairBuffer = ""; if (!compact7 || index3 !== 0) { - pairBuffer += generateNextLine(state2, level); + pairBuffer += generateNextLine(state, level); } objectKey = objectKeyList[index3]; objectValue = object5[objectKey]; - if (!writeNode(state2, level + 1, objectKey, true, true, true)) { + if (!writeNode(state, level + 1, objectKey, true, true, true)) { continue; } - explicitPair = state2.tag !== null && state2.tag !== "?" || state2.dump && state2.dump.length > 1024; + explicitPair = state.tag !== null && state.tag !== "?" || state.dump && state.dump.length > 1024; if (explicitPair) { - if (state2.dump && CHAR_LINE_FEED === state2.dump.charCodeAt(0)) { + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { pairBuffer += "?"; } else { pairBuffer += "? "; } } - pairBuffer += state2.dump; + pairBuffer += state.dump; if (explicitPair) { - pairBuffer += generateNextLine(state2, level); + pairBuffer += generateNextLine(state, level); } - if (!writeNode(state2, level + 1, objectValue, true, explicitPair)) { + if (!writeNode(state, level + 1, objectValue, true, explicitPair)) { continue; } - if (state2.dump && CHAR_LINE_FEED === state2.dump.charCodeAt(0)) { + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { pairBuffer += ":"; } else { pairBuffer += ": "; } - pairBuffer += state2.dump; + pairBuffer += state.dump; _result += pairBuffer; } - state2.tag = _tag; - state2.dump = _result || "{}"; + state.tag = _tag; + state.dump = _result || "{}"; } - function detectType(state2, object5, explicit) { + function detectType(state, object5, explicit) { var _result, typeList, index3, length3, type3, style; - typeList = explicit ? state2.explicitTypes : state2.implicitTypes; + typeList = explicit ? state.explicitTypes : state.implicitTypes; for (index3 = 0, length3 = typeList.length;index3 < length3; index3 += 1) { type3 = typeList[index3]; if ((type3.instanceOf || type3.predicate) && (!type3.instanceOf || typeof object5 === "object" && object5 instanceof type3.instanceOf) && (!type3.predicate || type3.predicate(object5))) { - state2.tag = explicit ? type3.tag : "?"; + state.tag = explicit ? type3.tag : "?"; if (type3.represent) { - style = state2.styleMap[type3.tag] || type3.defaultStyle; + style = state.styleMap[type3.tag] || type3.defaultStyle; if (_toString.call(type3.represent) === "[object Function]") { _result = type3.represent(object5, style); } else if (_hasOwnProperty.call(type3.represent, style)) { @@ -106434,84 +106658,84 @@ var require_dumper = __commonJS((exports, module2) => { } else { throw new YAMLException("!<" + type3.tag + '> tag resolver accepts not "' + style + '" style'); } - state2.dump = _result; + state.dump = _result; } return true; } } return false; } - function writeNode(state2, level, object5, block, compact7, iskey) { - state2.tag = null; - state2.dump = object5; - if (!detectType(state2, object5, false)) { - detectType(state2, object5, true); + function writeNode(state, level, object5, block, compact7, iskey) { + state.tag = null; + state.dump = object5; + if (!detectType(state, object5, false)) { + detectType(state, object5, true); } - var type3 = _toString.call(state2.dump); + var type3 = _toString.call(state.dump); if (block) { - block = state2.flowLevel < 0 || state2.flowLevel > level; + block = state.flowLevel < 0 || state.flowLevel > level; } var objectOrArray = type3 === "[object Object]" || type3 === "[object Array]", duplicateIndex, duplicate; if (objectOrArray) { - duplicateIndex = state2.duplicates.indexOf(object5); + duplicateIndex = state.duplicates.indexOf(object5); duplicate = duplicateIndex !== -1; } - if (state2.tag !== null && state2.tag !== "?" || duplicate || state2.indent !== 2 && level > 0) { + if (state.tag !== null && state.tag !== "?" || duplicate || state.indent !== 2 && level > 0) { compact7 = false; } - if (duplicate && state2.usedDuplicates[duplicateIndex]) { - state2.dump = "*ref_" + duplicateIndex; + if (duplicate && state.usedDuplicates[duplicateIndex]) { + state.dump = "*ref_" + duplicateIndex; } else { - if (objectOrArray && duplicate && !state2.usedDuplicates[duplicateIndex]) { - state2.usedDuplicates[duplicateIndex] = true; + if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) { + state.usedDuplicates[duplicateIndex] = true; } if (type3 === "[object Object]") { - if (block && Object.keys(state2.dump).length !== 0) { - writeBlockMapping(state2, level, state2.dump, compact7); + if (block && Object.keys(state.dump).length !== 0) { + writeBlockMapping(state, level, state.dump, compact7); if (duplicate) { - state2.dump = "&ref_" + duplicateIndex + state2.dump; + state.dump = "&ref_" + duplicateIndex + state.dump; } } else { - writeFlowMapping(state2, level, state2.dump); + writeFlowMapping(state, level, state.dump); if (duplicate) { - state2.dump = "&ref_" + duplicateIndex + " " + state2.dump; + state.dump = "&ref_" + duplicateIndex + " " + state.dump; } } } else if (type3 === "[object Array]") { - var arrayLevel = state2.noArrayIndent && level > 0 ? level - 1 : level; - if (block && state2.dump.length !== 0) { - writeBlockSequence(state2, arrayLevel, state2.dump, compact7); + var arrayLevel = state.noArrayIndent && level > 0 ? level - 1 : level; + if (block && state.dump.length !== 0) { + writeBlockSequence(state, arrayLevel, state.dump, compact7); if (duplicate) { - state2.dump = "&ref_" + duplicateIndex + state2.dump; + state.dump = "&ref_" + duplicateIndex + state.dump; } } else { - writeFlowSequence(state2, arrayLevel, state2.dump); + writeFlowSequence(state, arrayLevel, state.dump); if (duplicate) { - state2.dump = "&ref_" + duplicateIndex + " " + state2.dump; + state.dump = "&ref_" + duplicateIndex + " " + state.dump; } } } else if (type3 === "[object String]") { - if (state2.tag !== "?") { - writeScalar(state2, state2.dump, level, iskey); + if (state.tag !== "?") { + writeScalar(state, state.dump, level, iskey); } } else { - if (state2.skipInvalid) + if (state.skipInvalid) return false; throw new YAMLException("unacceptable kind of an object to dump " + type3); } - if (state2.tag !== null && state2.tag !== "?") { - state2.dump = "!<" + state2.tag + "> " + state2.dump; + if (state.tag !== null && state.tag !== "?") { + state.dump = "!<" + state.tag + "> " + state.dump; } } return true; } - function getDuplicateReferences(object5, state2) { + function getDuplicateReferences(object5, state) { var objects = [], duplicatesIndexes = [], index3, length3; inspectNode(object5, objects, duplicatesIndexes); for (index3 = 0, length3 = duplicatesIndexes.length;index3 < length3; index3 += 1) { - state2.duplicates.push(objects[duplicatesIndexes[index3]]); + state.duplicates.push(objects[duplicatesIndexes[index3]]); } - state2.usedDuplicates = new Array(length3); + state.usedDuplicates = new Array(length3); } function inspectNode(object5, objects, duplicatesIndexes) { var objectKeyList, index3, length3; @@ -106538,11 +106762,11 @@ var require_dumper = __commonJS((exports, module2) => { } function dump3(input, options4) { options4 = options4 || {}; - var state2 = new State2(options4); - if (!state2.noRefs) - getDuplicateReferences(input, state2); - if (writeNode(state2, 0, input, true, true)) - return state2.dump + ` + var state = new State2(options4); + if (!state.noRefs) + getDuplicateReferences(input, state); + if (writeNode(state, 0, input, true, true)) + return state.dump + ` `; return ""; } @@ -107071,7 +107295,7 @@ var init_bus = __esm(async () => { } Bus.Service = Service3; Bus.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { - const state2 = yield* InstanceState.make(exports_Effect.fn("Bus.state")(function* (ctx) { + const state = yield* InstanceState.make(exports_Effect.fn("Bus.state")(function* (ctx) { const wildcard = yield* exports_PubSub.unbounded(); const typed = new Map; yield* exports_Effect.addFinalizer(() => exports_Effect.gen(function* () { @@ -107086,19 +107310,19 @@ var init_bus = __esm(async () => { })); return { wildcard, typed }; })); - function getOrCreate(state3, def) { + function getOrCreate(state2, def) { return exports_Effect.gen(function* () { - let ps2 = state3.typed.get(def.type); + let ps2 = state2.typed.get(def.type); if (!ps2) { ps2 = yield* exports_PubSub.unbounded(); - state3.typed.set(def.type, ps2); + state2.typed.set(def.type, ps2); } return ps2; }); } function publish4(def, properties) { return exports_Effect.gen(function* () { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); const payload = { type: def.type, properties }; log7.info("publishing", { type: def.type }); const ps2 = s5.typed.get(def.type); @@ -107115,7 +107339,7 @@ var init_bus = __esm(async () => { function subscribe4(def) { log7.info("subscribing", { type: def.type }); return exports_Stream.unwrap(exports_Effect.gen(function* () { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); const ps2 = yield* getOrCreate(s5, def); return exports_Stream.fromPubSub(ps2); })).pipe(exports_Stream.ensuring(exports_Effect.sync(() => log7.info("unsubscribing", { type: def.type })))); @@ -107123,7 +107347,7 @@ var init_bus = __esm(async () => { function subscribeAll2() { log7.info("subscribing", { type: "*" }); return exports_Stream.unwrap(exports_Effect.gen(function* () { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); return exports_Stream.fromPubSub(s5.wildcard); })).pipe(exports_Stream.ensuring(exports_Effect.sync(() => log7.info("unsubscribing", { type: "*" })))); } @@ -107145,12 +107369,12 @@ var init_bus = __esm(async () => { }); } const subscribeCallback = exports_Effect.fn("Bus.subscribeCallback")(function* (def, callback5) { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); const ps2 = yield* getOrCreate(s5, def); return yield* on(ps2, def.type, callback5); }); const subscribeAllCallback = exports_Effect.fn("Bus.subscribeAllCallback")(function* (callback5) { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); return yield* on(s5.wildcard, "*", callback5); }); return Service3.of({ publish: publish4, subscribe: subscribe4, subscribeAll: subscribeAll2, subscribeCallback, subscribeAllCallback }); @@ -107292,15 +107516,15 @@ var init_repo = __esm(async () => { catch: (cause) => new AccountRepoError({ message: "Database operation failed", cause }) }); const current = (db2) => { - const state3 = db2.select().from(AccountStateTable).where(eq(AccountStateTable.id, ACCOUNT_STATE_ID)).get(); - if (!state3?.active_account_id) + const state2 = db2.select().from(AccountStateTable).where(eq(AccountStateTable.id, ACCOUNT_STATE_ID)).get(); + if (!state2?.active_account_id) return; - const account = db2.select().from(AccountTable).where(eq(AccountTable.id, state3.active_account_id)).get(); + const account = db2.select().from(AccountTable).where(eq(AccountTable.id, state2.active_account_id)).get(); if (!account) return; - return { ...account, active_org_id: state3.active_org_id ?? null }; + return { ...account, active_org_id: state2.active_org_id ?? null }; }; - const state2 = (db2, accountID, orgID) => { + const state = (db2, accountID, orgID) => { const id2 = exports_Option.getOrNull(orgID); return db2.insert(AccountStateTable).values({ id: ACCOUNT_STATE_ID, active_account_id: accountID, active_org_id: id2 }).onConflictDoUpdate({ target: AccountStateTable.id, @@ -107313,7 +107537,7 @@ var init_repo = __esm(async () => { db2.update(AccountStateTable).set({ active_account_id: null, active_org_id: null }).where(eq(AccountStateTable.active_account_id, accountID)).run(); db2.delete(AccountTable).where(eq(AccountTable.id, accountID)).run(); }).pipe(exports_Effect.asVoid)); - const use2 = exports_Effect.fn("AccountRepo.use")((accountID, orgID) => query((db2) => state2(db2, accountID, orgID)).pipe(exports_Effect.asVoid)); + const use2 = exports_Effect.fn("AccountRepo.use")((accountID, orgID) => query((db2) => state(db2, accountID, orgID)).pipe(exports_Effect.asVoid)); const getRow = exports_Effect.fn("AccountRepo.getRow")((accountID) => query((db2) => db2.select().from(AccountTable).where(eq(AccountTable.id, accountID)).get()).pipe(exports_Effect.map(exports_Option.fromNullishOr))); const persistToken = exports_Effect.fn("AccountRepo.persistToken")((input) => query((db2) => db2.update(AccountTable).set({ access_token: input.accessToken, @@ -107338,7 +107562,7 @@ var init_repo = __esm(async () => { token_expiry: input.expiry } }).run(); - state2(db2, input.id, input.orgID); + state(db2, input.id, input.orgID); }).pipe(exports_Effect.asVoid)); return AccountRepo.of({ active, @@ -107528,7 +107752,7 @@ var init_account = __esm(async () => { const { account, accessToken } = resolved.value; return yield* fetchOrgs(account.url, accessToken); }); - const config3 = exports_Effect.fn("Account.config")(function* (accountID, orgID) { + const config2 = exports_Effect.fn("Account.config")(function* (accountID, orgID) { const resolved = yield* resolveAccess(accountID); if (exports_Option.isNone(resolved)) return exports_Option.none(); @@ -107588,7 +107812,7 @@ var init_account = __esm(async () => { remove: repo.remove, use: repo.use, orgs: orgs2, - config: config3, + config: config2, token: token2, login, poll: poll5 @@ -107629,7 +107853,7 @@ var init_account = __esm(async () => { }); // packages/unifia/src/config/paths.ts -import path9 from "path"; +import path10 from "path"; import os4 from "os"; var ConfigPaths; var init_paths = __esm(async () => { @@ -107640,24 +107864,36 @@ var init_paths = __esm(async () => { init_flag(); await init_global(); ((ConfigPaths) => { + ConfigPaths.PROJECT_DIRECTORY = ".unifia"; + ConfigPaths.LEGACY_PROJECT_DIRECTORY = ".opencode"; + const PROJECT_DIRECTORIES = [ConfigPaths.LEGACY_PROJECT_DIRECTORY, ConfigPaths.PROJECT_DIRECTORY]; + function isConfigDirectory(dir3) { + return PROJECT_DIRECTORIES.some((name3) => dir3.endsWith(name3)) || dir3 === Flag.UNIFIA_CONFIG_DIR; + } + ConfigPaths.isConfigDirectory = isConfigDirectory; + function isLegacyDirectory(dir3) { + return dir3.endsWith(ConfigPaths.LEGACY_PROJECT_DIRECTORY); + } + ConfigPaths.isLegacyDirectory = isLegacyDirectory; function searchStop(input) { return input.vcs === "git" ? input.worktree : undefined; } ConfigPaths.searchStop = searchStop; - async function projectFiles(name3, directory, stop2) { - return Filesystem.findUp([`${name3}.json`, `${name3}.jsonc`], directory, stop2, { rootFirst: true }); + async function projectFiles(name3, directory, stop2, legacy) { + const targets = legacy ? [`${legacy}.json`, `${legacy}.jsonc`, `${name3}.json`, `${name3}.jsonc`] : [`${name3}.json`, `${name3}.jsonc`]; + return Filesystem.findUp(targets, directory, stop2, { rootFirst: true }); } ConfigPaths.projectFiles = projectFiles; async function directories(directory, stop2) { return [ Global.Path.config, ...!Flag.UNIFIA_DISABLE_PROJECT_CONFIG ? await Array.fromAsync(Filesystem.up({ - targets: [".opencode"], + targets: PROJECT_DIRECTORIES, start: directory, stop: stop2 })) : [], ...await Array.fromAsync(Filesystem.up({ - targets: [".opencode"], + targets: PROJECT_DIRECTORIES, start: Global.Path.home, stop: Global.Path.home })), @@ -107666,7 +107902,7 @@ var init_paths = __esm(async () => { } ConfigPaths.directories = directories; function fileInDirectory(dir3, name3) { - return [path9.join(dir3, `${name3}.json`), path9.join(dir3, `${name3}.jsonc`)]; + return [path10.join(dir3, `${name3}.json`), path10.join(dir3, `${name3}.jsonc`)]; } ConfigPaths.fileInDirectory = fileInDirectory; ConfigPaths.JsonError = NamedError.create("ConfigJsonError", zod_default.object({ @@ -107690,7 +107926,7 @@ var init_paths = __esm(async () => { return typeof input === "string" ? input : input.source; } function dir2(input) { - return typeof input === "string" ? path9.dirname(input) : input.dir; + return typeof input === "string" ? path10.dirname(input) : input.dir; } async function substitute(text5, input, missing = "error") { text5 = text5.replace(/\{env:([^}]+)\}/g, (_3, varName) => { @@ -107717,9 +107953,9 @@ var init_paths = __esm(async () => { } let filePath = token.replace(/^\{file:/, "").replace(/\}$/, ""); if (filePath.startsWith("~/")) { - filePath = path9.join(os4.homedir(), filePath.slice(2)); + filePath = path10.join(os4.homedir(), filePath.slice(2)); } - const resolvedPath = path9.isAbsolute(filePath) ? filePath : path9.resolve(configDir, filePath); + const resolvedPath = path10.isAbsolute(filePath) ? filePath : path10.resolve(configDir, filePath); const fileContent = (await Filesystem.readText(resolvedPath).catch((error46) => { if (missing === "empty") return ""; @@ -107789,7 +108025,7 @@ var init_hash = __esm(() => { }); // packages/unifia/src/util/flock.ts -import path10 from "path"; +import path11 from "path"; import os5 from "os"; import { randomBytes as randomBytes5, randomUUID } from "crypto"; import { mkdir as mkdir3, readFile as readFile4, rm as rm2, stat as stat3, utimes as utimes3, writeFile as writeFile5 } from "fs/promises"; @@ -107798,7 +108034,7 @@ var init_flock = __esm(async () => { init_hash(); await init_global(); ((Flock) => { - const root = path10.join(Global.Path.state, "locks"); + const root = path11.join(Global.Path.state, "locks"); const defaultOpts = { staleMs: 60000, timeoutMs: 5 * 60000, @@ -107874,8 +108110,8 @@ var init_flock = __esm(async () => { } async function tryAcquireLockDir(lockDir, opts) { const token = randomUUID?.() ?? randomBytes5(16).toString("hex"); - const metaPath = path10.join(lockDir, "meta.json"); - const heartbeatPath = path10.join(lockDir, "heartbeat"); + const metaPath = path11.join(lockDir, "meta.json"); + const heartbeatPath = path11.join(lockDir, "heartbeat"); try { await mkdir3(lockDir, { mode: 448 }); } catch (err2) { @@ -108020,7 +108256,7 @@ var init_flock = __esm(async () => { }; const dir2 = input.dir ?? root; await mkdir3(dir2, { recursive: true }); - const lockfile = path10.join(dir2, Hash.fast(key) + ".lock"); + const lockfile = path11.join(dir2, Hash.fast(key) + ".lock"); const lock = await acquireLockDir(lockfile, { key, onWait: input.onWait, @@ -109289,11 +109525,11 @@ var require_commonjs3 = __commonJS((exports) => { return (f4) => f4.length === len && f4 !== "." && f4 !== ".."; }; var defaultPlatform2 = typeof process === "object" && process ? typeof process.env === "object" && process.env && process.env.__MINIMATCH_TESTING_PLATFORM__ || process.platform : "posix"; - var path11 = { + var path12 = { win32: { sep: "\\" }, posix: { sep: "/" } }; - exports.sep = defaultPlatform2 === "win32" ? path11.win32.sep : path11.posix.sep; + exports.sep = defaultPlatform2 === "win32" ? path12.win32.sep : path12.posix.sep; exports.minimatch.sep = exports.sep; exports.GLOBSTAR = Symbol("globstar **"); exports.minimatch.GLOBSTAR = exports.GLOBSTAR; @@ -111035,13 +111271,13 @@ var require_hosts = __commonJS((exports, module2) => { var defaults2 = { sshtemplate: ({ domain: domain3, user, project, committish }) => `git@${domain3}:${user}/${project}.git${maybeJoin("#", committish)}`, sshurltemplate: ({ domain: domain3, user, project, committish }) => `git+ssh://git@${domain3}/${user}/${project}.git${maybeJoin("#", committish)}`, - edittemplate: ({ domain: domain3, user, project, committish, editpath, path: path11 }) => `https://${domain3}/${user}/${project}${maybeJoin("/", editpath, "/", maybeEncode(committish || "HEAD"), "/", path11)}`, + edittemplate: ({ domain: domain3, user, project, committish, editpath, path: path12 }) => `https://${domain3}/${user}/${project}${maybeJoin("/", editpath, "/", maybeEncode(committish || "HEAD"), "/", path12)}`, browsetemplate: ({ domain: domain3, user, project, committish, treepath }) => `https://${domain3}/${user}/${project}${maybeJoin("/", treepath, "/", maybeEncode(committish))}`, - browsetreetemplate: ({ domain: domain3, user, project, committish, treepath, path: path11, fragment, hashformat }) => `https://${domain3}/${user}/${project}/${treepath}/${maybeEncode(committish || "HEAD")}/${path11}${maybeJoin("#", hashformat(fragment || ""))}`, - browseblobtemplate: ({ domain: domain3, user, project, committish, blobpath, path: path11, fragment, hashformat }) => `https://${domain3}/${user}/${project}/${blobpath}/${maybeEncode(committish || "HEAD")}/${path11}${maybeJoin("#", hashformat(fragment || ""))}`, + browsetreetemplate: ({ domain: domain3, user, project, committish, treepath, path: path12, fragment, hashformat }) => `https://${domain3}/${user}/${project}/${treepath}/${maybeEncode(committish || "HEAD")}/${path12}${maybeJoin("#", hashformat(fragment || ""))}`, + browseblobtemplate: ({ domain: domain3, user, project, committish, blobpath, path: path12, fragment, hashformat }) => `https://${domain3}/${user}/${project}/${blobpath}/${maybeEncode(committish || "HEAD")}/${path12}${maybeJoin("#", hashformat(fragment || ""))}`, docstemplate: ({ domain: domain3, user, project, treepath, committish }) => `https://${domain3}/${user}/${project}${maybeJoin("/", treepath, "/", maybeEncode(committish))}#readme`, httpstemplate: ({ auth, domain: domain3, user, project, committish }) => `git+https://${maybeJoin(auth, "@")}${domain3}/${user}/${project}.git${maybeJoin("#", committish)}`, - filetemplate: ({ domain: domain3, user, project, committish, path: path11 }) => `https://${domain3}/${user}/${project}/raw/${maybeEncode(committish || "HEAD")}/${path11}`, + filetemplate: ({ domain: domain3, user, project, committish, path: path12 }) => `https://${domain3}/${user}/${project}/raw/${maybeEncode(committish || "HEAD")}/${path12}`, shortcuttemplate: ({ type: type3, user, project, committish }) => `${type3}:${user}/${project}${maybeJoin("#", committish)}`, pathtemplate: ({ user, project, committish }) => `${user}/${project}${maybeJoin("#", committish)}`, bugstemplate: ({ domain: domain3, user, project }) => `https://${domain3}/${user}/${project}/issues`, @@ -111054,7 +111290,7 @@ var require_hosts = __commonJS((exports, module2) => { treepath: "tree", blobpath: "blob", editpath: "edit", - filetemplate: ({ auth, user, project, committish, path: path11 }) => `https://${maybeJoin(auth, "@")}raw.githubusercontent.com/${user}/${project}/${maybeEncode(committish || "HEAD")}/${path11}`, + filetemplate: ({ auth, user, project, committish, path: path12 }) => `https://${maybeJoin(auth, "@")}raw.githubusercontent.com/${user}/${project}/${maybeEncode(committish || "HEAD")}/${path12}`, gittemplate: ({ auth, domain: domain3, user, project, committish }) => `git://${maybeJoin(auth, "@")}${domain3}/${user}/${project}.git${maybeJoin("#", committish)}`, tarballtemplate: ({ domain: domain3, user, project, committish }) => `https://codeload.${domain3}/${user}/${project}/tar.gz/${maybeEncode(committish || "HEAD")}`, extract: (url3) => { @@ -111080,7 +111316,7 @@ var require_hosts = __commonJS((exports, module2) => { treepath: "src", blobpath: "src", editpath: "?mode=edit", - edittemplate: ({ domain: domain3, user, project, committish, treepath, path: path11, editpath }) => `https://${domain3}/${user}/${project}${maybeJoin("/", treepath, "/", maybeEncode(committish || "HEAD"), "/", path11, editpath)}`, + edittemplate: ({ domain: domain3, user, project, committish, treepath, path: path12, editpath }) => `https://${domain3}/${user}/${project}${maybeJoin("/", treepath, "/", maybeEncode(committish || "HEAD"), "/", path12, editpath)}`, tarballtemplate: ({ domain: domain3, user, project, committish }) => `https://${domain3}/${user}/${project}/get/${maybeEncode(committish || "HEAD")}.tar.gz`, extract: (url3) => { let [, user, project, aux] = url3.pathname.split("/", 4); @@ -111104,11 +111340,11 @@ var require_hosts = __commonJS((exports, module2) => { editpath: "-/edit", tarballtemplate: ({ domain: domain3, user, project, committish }) => `https://${domain3}/api/v4/projects/${maybeEncode(user + "/" + project)}/repository/archive.tar.gz?sha=${maybeEncode(committish || "HEAD")}`, extract: (url3) => { - const path11 = url3.pathname.slice(1); - if (path11.includes("/-/") || path11.includes("/archive.tar.gz")) { + const path12 = url3.pathname.slice(1); + if (path12.includes("/-/") || path12.includes("/archive.tar.gz")) { return; } - const segments = path11.split("/"); + const segments = path12.split("/"); let project = segments.pop(); if (project.endsWith(".git")) { project = project.slice(0, -4); @@ -111128,11 +111364,11 @@ var require_hosts = __commonJS((exports, module2) => { sshurltemplate: ({ domain: domain3, project, committish }) => `git+ssh://git@${domain3}/${project}.git${maybeJoin("#", committish)}`, edittemplate: ({ domain: domain3, user, project, committish, editpath }) => `https://${domain3}/${user}/${project}${maybeJoin("/", maybeEncode(committish))}/${editpath}`, browsetemplate: ({ domain: domain3, project, committish }) => `https://${domain3}/${project}${maybeJoin("/", maybeEncode(committish))}`, - browsetreetemplate: ({ domain: domain3, project, committish, path: path11, hashformat }) => `https://${domain3}/${project}${maybeJoin("/", maybeEncode(committish))}${maybeJoin("#", hashformat(path11))}`, - browseblobtemplate: ({ domain: domain3, project, committish, path: path11, hashformat }) => `https://${domain3}/${project}${maybeJoin("/", maybeEncode(committish))}${maybeJoin("#", hashformat(path11))}`, + browsetreetemplate: ({ domain: domain3, project, committish, path: path12, hashformat }) => `https://${domain3}/${project}${maybeJoin("/", maybeEncode(committish))}${maybeJoin("#", hashformat(path12))}`, + browseblobtemplate: ({ domain: domain3, project, committish, path: path12, hashformat }) => `https://${domain3}/${project}${maybeJoin("/", maybeEncode(committish))}${maybeJoin("#", hashformat(path12))}`, docstemplate: ({ domain: domain3, project, committish }) => `https://${domain3}/${project}${maybeJoin("/", maybeEncode(committish))}`, httpstemplate: ({ domain: domain3, project, committish }) => `git+https://${domain3}/${project}.git${maybeJoin("#", committish)}`, - filetemplate: ({ user, project, committish, path: path11 }) => `https://gist.githubusercontent.com/${user}/${project}/raw${maybeJoin("/", maybeEncode(committish))}/${path11}`, + filetemplate: ({ user, project, committish, path: path12 }) => `https://gist.githubusercontent.com/${user}/${project}/raw${maybeJoin("/", maybeEncode(committish))}/${path12}`, shortcuttemplate: ({ type: type3, project, committish }) => `${type3}:${project}${maybeJoin("#", committish)}`, pathtemplate: ({ project, committish }) => `${project}${maybeJoin("#", committish)}`, bugstemplate: ({ domain: domain3, project }) => `https://${domain3}/${project}`, @@ -111164,7 +111400,7 @@ var require_hosts = __commonJS((exports, module2) => { domain: "git.sr.ht", treepath: "tree", blobpath: "tree", - filetemplate: ({ domain: domain3, user, project, committish, path: path11 }) => `https://${domain3}/${user}/${project}/blob/${maybeEncode(committish) || "HEAD"}/${path11}`, + filetemplate: ({ domain: domain3, user, project, committish, path: path12 }) => `https://${domain3}/${user}/${project}/blob/${maybeEncode(committish) || "HEAD"}/${path12}`, httpstemplate: ({ domain: domain3, user, project, committish }) => `https://${domain3}/${user}/${project}${maybeJoin("#", committish)}`, tarballtemplate: ({ domain: domain3, user, project, committish }) => `https://${domain3}/${user}/${project}/archive/${maybeEncode(committish) || "HEAD"}.tar.gz`, bugstemplate: () => null, @@ -111345,8 +111581,8 @@ var require_lib6 = __commonJS((exports, module2) => { return null; } const proto = /(?:git\+)http:$/.test(protocol) ? "http:" : "https:"; - const path11 = pathname.replace(/\.git$/, ""); - return `${proto}//${hostname3}${path11}`; + const path12 = pathname.replace(/\.git$/, ""); + return `${proto}//${hostname3}${path12}`; } catch { return null; } @@ -111439,20 +111675,20 @@ var require_lib6 = __commonJS((exports, module2) => { sshurl(opts) { return this.#fill(this.sshurltemplate, opts); } - browse(path11, ...args3) { - if (typeof path11 !== "string") { - return this.#fill(this.browsetemplate, path11); + browse(path12, ...args3) { + if (typeof path12 !== "string") { + return this.#fill(this.browsetemplate, path12); } if (typeof args3[0] !== "string") { - return this.#fill(this.browsetreetemplate, { ...args3[0], path: path11 }); + return this.#fill(this.browsetreetemplate, { ...args3[0], path: path12 }); } - return this.#fill(this.browsetreetemplate, { ...args3[1], fragment: args3[0], path: path11 }); + return this.#fill(this.browsetreetemplate, { ...args3[1], fragment: args3[0], path: path12 }); } - browseFile(path11, ...args3) { + browseFile(path12, ...args3) { if (typeof args3[0] !== "string") { - return this.#fill(this.browseblobtemplate, { ...args3[0], path: path11 }); + return this.#fill(this.browseblobtemplate, { ...args3[0], path: path12 }); } - return this.#fill(this.browseblobtemplate, { ...args3[1], fragment: args3[0], path: path11 }); + return this.#fill(this.browseblobtemplate, { ...args3[1], fragment: args3[0], path: path12 }); } docs(opts) { return this.#fill(this.docstemplate, opts); @@ -111475,11 +111711,11 @@ var require_lib6 = __commonJS((exports, module2) => { tarball(opts) { return this.#fill(this.tarballtemplate, { ...opts, noCommittish: false }); } - file(path11, opts) { - return this.#fill(this.filetemplate, { ...opts, path: path11 }); + file(path12, opts) { + return this.#fill(this.filetemplate, { ...opts, path: path12 }); } - edit(path11, opts) { - return this.#fill(this.edittemplate, { ...opts, path: path11 }); + edit(path12, opts) { + return this.#fill(this.edittemplate, { ...opts, path: path12 }); } getDefaultRepresentation() { return this.default; @@ -111960,7 +112196,7 @@ var require_index_min3 = __commonJS((exports) => { var H3 = R3((g2) => { Object.defineProperty(g2, "__esModule", { value: true }); g2.unescape = g2.escape = g2.AST = g2.Minimatch = g2.match = g2.makeRe = g2.braceExpand = g2.defaults = g2.filter = g2.GLOBSTAR = g2.sep = g2.minimatch = undefined; - var Si2 = Ke2(), jt2 = Xe2(), is8 = pe2(), vi2 = me2(), Ei2 = kt2(), _i2 = (n10, t2, e2 = {}) => ((0, jt2.assertValidPattern)(t2), !e2.nocomment && t2.charAt(0) === "#" ? false : new J2(t2, e2).match(n10)); + var Si2 = Ke2(), jt2 = Xe2(), is7 = pe2(), vi2 = me2(), Ei2 = kt2(), _i2 = (n10, t2, e2 = {}) => ((0, jt2.assertValidPattern)(t2), !e2.nocomment && t2.charAt(0) === "#" ? false : new J2(t2, e2).match(n10)); g2.minimatch = _i2; var Oi2 = /^\*+([^+@!?\*\[\(]*)$/, xi2 = (n10) => (t2) => !t2.startsWith(".") && t2.endsWith(n10), Ti2 = (n10) => (t2) => t2.endsWith(n10), Ci2 = (n10) => (n10 = n10.toLowerCase(), (t2) => !t2.startsWith(".") && t2.toLowerCase().endsWith(n10)), Ri2 = (n10) => (n10 = n10.toLowerCase(), (t2) => t2.toLowerCase().endsWith(n10)), Ai2 = /^\*+\.\*+$/, ki2 = (n10) => !n10.startsWith(".") && n10.includes("."), Mi2 = (n10) => n10 !== "." && n10 !== ".." && n10.includes("."), Pi2 = /^\.\*+$/, Di2 = (n10) => n10 !== "." && n10 !== ".." && n10.startsWith("."), Fi2 = /^\*+$/, ji2 = (n10) => n10.length !== 0 && !n10.startsWith("."), Ni2 = (n10) => n10.length !== 0 && n10 !== "." && n10 !== "..", Li2 = /^\?+([^+@!?\*\[\(]*)?$/, Wi2 = ([n10, t2 = ""]) => { let e2 = rs2([n10]); @@ -112271,7 +112507,7 @@ globstar while`, t2, d4, e2, u6, m3), this.matchOne(t2.slice(d4), e2.slice(u6), return ""; let s5, i6 = null; (s5 = t2.match(Fi2)) ? i6 = e2.dot ? Ni2 : ji2 : (s5 = t2.match(Oi2)) ? i6 = (e2.nocase ? e2.dot ? Ri2 : Ci2 : e2.dot ? Ti2 : xi2)(s5[1]) : (s5 = t2.match(Li2)) ? i6 = (e2.nocase ? e2.dot ? Bi2 : Wi2 : e2.dot ? Ii2 : Gi)(s5) : (s5 = t2.match(Ai2)) ? i6 = e2.dot ? Mi2 : ki2 : (s5 = t2.match(Pi2)) && (i6 = Di2); - let r4 = is8.AST.fromGlob(t2, this.options).toMMPattern(); + let r4 = is7.AST.fromGlob(t2, this.options).toMMPattern(); return i6 && typeof r4 == "object" && Reflect.defineProperty(r4, "test", { value: i6 }), r4; } makeRe() { @@ -112352,7 +112588,7 @@ globstar while`, t2, d4, e2, u6, m3), this.matchOne(t2.slice(d4), e2.slice(u6), Object.defineProperty(g2, "unescape", { enumerable: true, get: function() { return tr2.unescape; } }); - g2.minimatch.AST = is8.AST; + g2.minimatch.AST = is7.AST; g2.minimatch.Minimatch = J2; g2.minimatch.escape = vi2.escape; g2.minimatch.unescape = Ei2.unescape; @@ -116742,9 +116978,9 @@ var require_ini = __commonJS((exports, module2) => { var require_opts = __commonJS((exports, module2) => { var fs6 = __require("fs"); var os6 = __require("os"); - var path11 = __require("path"); + var path12 = __require("path"); var ini = require_ini(); - var gitConfigPath = path11.join(os6.homedir(), ".gitconfig"); + var gitConfigPath = path12.join(os6.homedir(), ".gitconfig"); var cachedConfig = null; var loadGitConfig = () => { if (cachedConfig === null) { @@ -116761,10 +116997,10 @@ var require_opts = __commonJS((exports, module2) => { return cachedConfig; }; var checkGitConfigs = () => { - const config3 = loadGitConfig(); + const config2 = loadGitConfig(); return { - sshCommandSetInConfig: config3?.core?.sshCommand !== undefined, - askPassSetInConfig: config3?.core?.askpass !== undefined + sshCommandSetInConfig: config2?.core?.sshCommand !== undefined, + askPassSetInConfig: config2?.core?.askpass !== undefined }; }; var sshCommandSetInEnv = process.env.GIT_SSH_COMMAND !== undefined; @@ -117077,7 +117313,7 @@ var require_lib9 = __commonJS((exports, module2) => { var require_npa = __commonJS((exports, module2) => { var isWindows = process.platform === "win32"; var { URL: URL3 } = __require("url"); - var path11 = isWindows ? __require("path/win32") : __require("path"); + var path12 = isWindows ? __require("path/win32") : __require("path"); var { homedir } = __require("os"); var HostedGit = require_lib6(); var semver2 = require_semver2(); @@ -117333,7 +117569,7 @@ var require_npa = __commonJS((exports, module2) => { let resolvedUrl; let specUrl; try { - resolvedUrl = new URL3(rawSpec, `${pathToFileURL2(path11.resolve(where))}/`); + resolvedUrl = new URL3(rawSpec, `${pathToFileURL2(path12.resolve(where))}/`); specUrl = new URL3(rawSpec); } catch (originalError) { const er2 = new Error("Invalid file: URL, must comply with RFC 8089"); @@ -117352,13 +117588,13 @@ var require_npa = __commonJS((exports, module2) => { } if (/^\/~(\/|$)/.test(specPath)) { res.saveSpec = `file:${specPath.substr(1)}`; - resolvedPath = path11.resolve(homedir(), specPath.substr(3)); - } else if (!path11.isAbsolute(rawSpec.slice(5))) { - res.saveSpec = `file:${path11.relative(where, resolvedPath)}`; + resolvedPath = path12.resolve(homedir(), specPath.substr(3)); + } else if (!path12.isAbsolute(rawSpec.slice(5))) { + res.saveSpec = `file:${path12.relative(where, resolvedPath)}`; } else { - res.saveSpec = `file:${path11.resolve(resolvedPath)}`; + res.saveSpec = `file:${path12.resolve(resolvedPath)}`; } - res.fetchSpec = path11.resolve(where, resolvedPath); + res.fetchSpec = path12.resolve(where, resolvedPath); res.saveSpec = res.saveSpec.split("\\").join("/"); if (res.saveSpec.startsWith("file://")) { res.saveSpec = `file:/${res.saveSpec.slice(7)}`; @@ -117964,7 +118200,7 @@ var require_clone = __commonJS((exports, module2) => { "bitbucket.org" ]); var { parse: parse11 } = __require("url"); - var path11 = __require("path"); + var path12 = __require("path"); var getRevs = require_revs(); var spawn = require_spawn(); var { isWindows } = require_utils2(); @@ -117977,7 +118213,7 @@ var require_clone = __commonJS((exports, module2) => { } return shallowHosts.has(parse11(repo).host); }; - var defaultTarget = (repo, cwd = process.cwd()) => path11.resolve(cwd, path11.basename(repo.replace(/[/\\]?\.git$/, ""))); + var defaultTarget = (repo, cwd = process.cwd()) => path12.resolve(cwd, path12.basename(repo.replace(/[/\\]?\.git$/, ""))); var clone3 = (repo, revs, ref, revDoc, target, opts) => { if (!revDoc) { return unresolved(repo, ref, target, opts); @@ -118077,11 +118313,11 @@ var require_is = __commonJS((exports, module2) => { // node_modules/@npmcli/git/lib/find.js var require_find = __commonJS((exports, module2) => { - var is8 = require_is(); + var is7 = require_is(); var { dirname: dirname6 } = __require("path"); module2.exports = async ({ cwd = process.cwd(), root } = {}) => { while (true) { - if (await is8({ cwd })) { + if (await is7({ cwd })) { return cwd; } const next3 = dirname6(cwd); @@ -118117,7 +118353,7 @@ var require_normalize = __commonJS((exports, module2) => { var valid = require_valid(); var clean = require_clean(); var fs6 = __require("fs/promises"); - var path11 = __require("path"); + var path12 = __require("path"); var { log: log7 } = require_lib5(); var moduleBuiltin = __require("module"); var _hostedGitInfo; @@ -118142,7 +118378,7 @@ var require_normalize = __commonJS((exports, module2) => { } else if (Array.isArray(pkg.bin)) { changes4?.push('"bin" was converted to an object'); pkg.bin = pkg.bin.reduce((acc, k3) => { - acc[path11.basename(k3)] = k3; + acc[path12.basename(k3)] = k3; return acc; }, {}); } @@ -118153,7 +118389,7 @@ var require_normalize = __commonJS((exports, module2) => { changes4?.push(`removed invalid "bin[${binKey}]"`); continue; } - const base2 = path11.basename(secureAndUnixifyPath(binKey)); + const base2 = path12.basename(secureAndUnixifyPath(binKey)); if (!base2) { delete pkg.bin[binKey]; changes4?.push(`removed invalid "bin[${binKey}]"`); @@ -118219,7 +118455,7 @@ var require_normalize = __commonJS((exports, module2) => { return ref.replace(/\\|:/g, "/"); } function secureAndUnixifyPath(ref) { - const secured = unixifyPath(path11.join(".", path11.join("/", unixifyPath(ref)))); + const secured = unixifyPath(path12.join(".", path12.join("/", unixifyPath(ref)))); return secured.startsWith("./") ? "" : secured; } function syncSteps(pkg, { strict, steps, changes: changes4, allowLegacyCase }) { @@ -118440,7 +118676,7 @@ var require_normalize = __commonJS((exports, module2) => { } if (steps.includes("serverjs") && !scripts.start) { try { - await fs6.access(path11.join(pkg.path, "server.js")); + await fs6.access(path12.join(pkg.path, "server.js")); scripts.start = "node server.js"; data2.scripts = scripts; changes4?.push('"scripts.start" was set to "node server.js"'); @@ -118448,7 +118684,7 @@ var require_normalize = __commonJS((exports, module2) => { } if (steps.includes("authors") && !data2.contributors) { try { - const authorData = await fs6.readFile(path11.join(pkg.path, "AUTHORS"), "utf8"); + const authorData = await fs6.readFile(path12.join(pkg.path, "AUTHORS"), "utf8"); const authors = authorData.split(/\r?\n/g).map((line2) => line2.replace(/^\s*#.*$/, "").trim()).filter((line2) => line2); data2.contributors = authors; changes4?.push('"contributors" was auto-populated with the contents of the "AUTHORS" file'); @@ -118463,7 +118699,7 @@ var require_normalize = __commonJS((exports, module2) => { }); let readmeFile; for (const file4 of files) { - if (!file4.endsWith(path11.sep)) { + if (!file4.endsWith(path12.sep)) { if (file4.match(mdre)) { readmeFile = file4; break; @@ -118474,7 +118710,7 @@ var require_normalize = __commonJS((exports, module2) => { } } if (readmeFile) { - const readmeData = await fs6.readFile(path11.join(pkg.path, readmeFile), "utf8"); + const readmeData = await fs6.readFile(path12.join(pkg.path, readmeFile), "utf8"); data2.readme = readmeData; data2.readmeFilename = readmeFile; changes4?.push(`"readme" was set to the contents of ${readmeFile}`); @@ -118487,18 +118723,18 @@ var require_normalize = __commonJS((exports, module2) => { if (steps.includes("mans")) { if (data2.directories?.man && !data2.man) { const manDir = secureAndUnixifyPath(data2.directories.man); - const cwd = path11.resolve(pkg.path, manDir); + const cwd = path12.resolve(pkg.path, manDir); const files = await lazyLoadGlob()("**/*.[0-9]", { cwd }); - data2.man = files.map((man) => path11.relative(pkg.path, path11.join(cwd, man)).split(path11.sep).join("/")); + data2.man = files.map((man) => path12.relative(pkg.path, path12.join(cwd, man)).split(path12.sep).join("/")); } normalizePackageMan(data2, changes4); } if (steps.includes("binDir") && data2.directories?.bin && !data2.bin && pkg.path) { const binPath = secureAndUnixifyPath(data2.directories.bin); - const bins = await lazyLoadGlob()("**", { cwd: path11.resolve(pkg.path, binPath) }); + const bins = await lazyLoadGlob()("**", { cwd: path12.resolve(pkg.path, binPath) }); data2.bin = bins.reduce((acc, binFile) => { if (binFile && !binFile.startsWith(".")) { - const binName = path11.basename(binFile); + const binName = path12.basename(binFile); acc[binName] = `${binPath}/${secureAndUnixifyPath(binFile)}`; } return acc; @@ -118512,20 +118748,20 @@ var require_normalize = __commonJS((exports, module2) => { let head7; if (gitRoot) { try { - head7 = await fs6.readFile(path11.resolve(gitRoot, ".git/HEAD"), "utf8"); + head7 = await fs6.readFile(path12.resolve(gitRoot, ".git/HEAD"), "utf8"); } catch (err2) {} } let headData; if (head7) { if (head7.startsWith("ref: ")) { const headRef = head7.replace(/^ref: /, "").trim(); - const headFile = path11.resolve(gitRoot, ".git", headRef); + const headFile = path12.resolve(gitRoot, ".git", headRef); try { headData = await fs6.readFile(headFile, "utf8"); headData = headData.replace(/^ref: /, "").trim(); } catch (err2) {} if (!headData) { - const packFile = path11.resolve(gitRoot, ".git/packed-refs"); + const packFile = path12.resolve(gitRoot, ".git/packed-refs"); try { let refs = await fs6.readFile(packFile, "utf8"); if (refs) { @@ -118554,20 +118790,20 @@ var require_normalize = __commonJS((exports, module2) => { if (typeof index3 !== "string") { throw new TypeError('The "main" attribute must be of type string.'); } - const extless = path11.join(path11.dirname(index3), path11.basename(index3, path11.extname(index3))); + const extless = path12.join(path12.dirname(index3), path12.basename(index3, path12.extname(index3))); const dts = `./${extless}.d.ts`; const hasDTSFields = "types" in data2 || "typings" in data2; if (!hasDTSFields) { try { - await fs6.access(path11.join(pkg.path, dts)); - data2.types = dts.split(path11.sep).join("/"); + await fs6.access(path12.join(pkg.path, dts)); + data2.types = dts.split(path12.sep).join("/"); } catch {} } } if (steps.includes("binRefs") && data2.bin instanceof Object) { for (const key in data2.bin) { try { - await fs6.access(path11.resolve(pkg.path, data2.bin[key])); + await fs6.access(path12.resolve(pkg.path, data2.bin[key])); } catch { log7.warn("package-json", pkgId, `No bin file found at ${data2.bin[key]}`); } @@ -118650,7 +118886,7 @@ var require_sort2 = __commonJS((exports, module2) => { files, workspaces, scripts, - config: config3, + config: config2, dependencies, devDependencies, peerDependencies, @@ -118693,7 +118929,7 @@ var require_sort2 = __commonJS((exports, module2) => { ...typeof files !== "undefined" ? { files } : {}, ...typeof workspaces !== "undefined" ? { workspaces } : {}, ...typeof scripts !== "undefined" ? { scripts } : {}, - ...typeof config3 !== "undefined" ? { config: config3 } : {}, + ...typeof config2 !== "undefined" ? { config: config2 } : {}, ...typeof dependencies !== "undefined" ? { dependencies } : {}, ...typeof devDependencies !== "undefined" ? { devDependencies } : {}, ...typeof peerDependencies !== "undefined" ? { peerDependencies } : {}, @@ -118778,49 +119014,49 @@ var require_lib14 = __commonJS((exports, module2) => { "normalizeData", "binRefs" ]); - static async create(path11, opts = {}) { + static async create(path12, opts = {}) { const p2 = new PackageJson; - await p2.create(path11); + await p2.create(path12); if (opts.data) { return p2.update(opts.data); } return p2; } - static async load(path11, opts = {}) { + static async load(path12, opts = {}) { const p2 = new PackageJson; if (!opts.create) { - return p2.load(path11); + return p2.load(path12); } try { - return await p2.load(path11); + return await p2.load(path12); } catch (err2) { if (!err2.message.startsWith("Could not read package.json")) { throw err2; } - return await p2.create(path11); + return await p2.create(path12); } } - static async fix(path11, opts) { + static async fix(path12, opts) { const p2 = new PackageJson; - await p2.load(path11, true); + await p2.load(path12, true); return p2.fix(opts); } - static async prepare(path11, opts) { + static async prepare(path12, opts) { const p2 = new PackageJson; - await p2.load(path11, true); + await p2.load(path12, true); return p2.prepare(opts); } - static async normalize(path11, opts) { + static async normalize(path12, opts) { const p2 = new PackageJson; - await p2.load(path11); + await p2.load(path12); return p2.normalize(opts); } #path; #manifest; #readFileContent = ""; #canSave = true; - async load(path11, parseIndex) { - this.#path = path11; + async load(path12, parseIndex) { + this.#path = path12; let parseErr; try { this.#readFileContent = await read3(this.filename); @@ -118887,8 +119123,8 @@ var require_lib14 = __commonJS((exports, module2) => { } return; } - create(path11) { - this.#path = path11; + create(path12) { + this.#path = path12; this.#manifest = {}; return this; } @@ -118957,7 +119193,7 @@ var require_lib14 = __commonJS((exports, module2) => { // node_modules/@npmcli/map-workspaces/lib/index.js var require_lib15 = __commonJS((exports, module2) => { - var path11 = __require("path"); + var path12 = __require("path"); var getName = require_lib3(); var { minimatch: minimatch2 } = require_commonjs3(); var pkgJson = require_lib14(); @@ -119050,7 +119286,7 @@ var require_lib15 = __commonJS((exports, module2) => { for (const match17 of orderedMatches) { let pkg; try { - pkg = await pkgJson.normalize(path11.join(opts.cwd, match17)); + pkg = await pkgJson.normalize(path12.join(opts.cwd, match17)); } catch (err2) { if (err2.code === "ENOENT" || err2.code === "ENOTDIR") { continue; @@ -119116,7 +119352,7 @@ var require_lib15 = __commonJS((exports, module2) => { } for (const pattern of patterns) { for (const packageKey of minimatch2.match(packageKeys, pattern)) { - const packagePathname = path11.join(opts.cwd, packageKey); + const packagePathname = path12.join(opts.cwd, packageKey); const name3 = getPackageName(packages[packageKey], packagePathname); results.set(packagePathname, name3); } @@ -121441,8 +121677,8 @@ var require_polyfill = __commonJS((exports, module2) => { return cpFn(toNamespacedPath(getValidatedPath(src)), toNamespacedPath(getValidatedPath(dest)), { ...defaultOptions2, ...opts }); } function getValidatedPath(fileURLOrPath) { - const path11 = fileURLOrPath != null && fileURLOrPath.href && fileURLOrPath.origin ? fileURLToPath3(fileURLOrPath) : fileURLOrPath; - return path11; + const path12 = fileURLOrPath != null && fileURLOrPath.href && fileURLOrPath.origin ? fileURLToPath3(fileURLOrPath) : fileURLOrPath; + return path12; } async function cpFn(src, dest, opts) { if (opts.preserveTimestamps && process.arch === "ia32") { @@ -121547,7 +121783,7 @@ var require_polyfill = __commonJS((exports, module2) => { } return checkParentPaths(src, srcStat, destParent); } - var normalizePathToArray = (path11) => resolve9(path11).split(sep2).filter(Boolean); + var normalizePathToArray = (path12) => resolve9(path12).split(sep2).filter(Boolean); function isSrcSubdir(src, dest) { const srcArr = normalizePathToArray(src); const destArr = normalizePathToArray(dest); @@ -121789,9 +122025,9 @@ var require_readdir_scoped = __commonJS((exports, module2) => { var require_move_file = __commonJS((exports, module2) => { var { dirname: dirname6, join: join12, resolve: resolve9, relative: relative4, isAbsolute } = __require("path"); var fs6 = __require("fs/promises"); - var pathExists = async (path11) => { + var pathExists = async (path12) => { try { - await fs6.access(path11); + await fs6.access(path12); return true; } catch (er2) { return er2.code !== "ENOENT"; @@ -121866,17 +122102,17 @@ var require_tmp = __commonJS((exports, module2) => { var crypto3 = __require("crypto"); var { withTempDir } = require_lib17(); var fs6 = __require("fs/promises"); - var path11 = __require("path"); + var path12 = __require("path"); exports.mkdir = mktmpdir; exports.tmpName = function tmpName(cache4, tmpPrefix) { const id2 = crypto3.randomUUID(); - return path11.join(cache4, "tmp", tmpPrefix ? `${tmpPrefix}-${id2}` : id2); + return path12.join(cache4, "tmp", tmpPrefix ? `${tmpPrefix}-${id2}` : id2); }; async function mktmpdir(cache4, opts = {}) { const { tmpPrefix } = opts; - const tmpDir = path11.join(cache4, "tmp"); + const tmpDir = path12.join(cache4, "tmp"); await fs6.mkdir(tmpDir, { recursive: true, owner: "inherit" }); - const target = `${tmpDir}${path11.sep}${tmpPrefix || ""}`; + const target = `${tmpDir}${path12.sep}${tmpPrefix || ""}`; return fs6.mkdtemp(target, { owner: "inherit" }); } exports.withTmp = withTmp; @@ -121885,7 +122121,7 @@ var require_tmp = __commonJS((exports, module2) => { cb = opts; opts = {}; } - return withTempDir(path11.join(cache4, "tmp"), cb, opts); + return withTempDir(path12.join(cache4, "tmp"), cb, opts); } }); @@ -121986,16 +122222,16 @@ var require_hash_to_segments = __commonJS((exports, module2) => { var require_path = __commonJS((exports, module2) => { var contentVer = require_package()["cache-version"].content; var hashToSegments = require_hash_to_segments(); - var path11 = __require("path"); + var path12 = __require("path"); var ssri = require_lib16(); module2.exports = contentPath; function contentPath(cache4, integrity) { const sri = ssri.parse(integrity, { single: true }); - return path11.join(contentDir(cache4), sri.algorithm, ...hashToSegments(sri.hexDigest())); + return path12.join(contentDir(cache4), sri.algorithm, ...hashToSegments(sri.hexDigest())); } module2.exports.contentDir = contentDir; function contentDir(cache4) { - return path11.join(cache4, `content-v${contentVer}`); + return path12.join(cache4, `content-v${contentVer}`); } }); @@ -122218,7 +122454,7 @@ var require_entry_index = __commonJS((exports, module2) => { writeFile: writeFile6 } = __require("fs/promises"); var { Minipass } = require_commonjs4(); - var path11 = __require("path"); + var path12 = __require("path"); var ssri = require_lib16(); var { tmpName } = require_tmp(); var contentPath = require_path(); @@ -122257,7 +122493,7 @@ var require_entry_index = __commonJS((exports, module2) => { `); const setup = async () => { const target = tmpName(cache4, opts.tmpPrefix); - await mkdir4(path11.dirname(target), { recursive: true }); + await mkdir4(path12.dirname(target), { recursive: true }); return { target, moved: false @@ -122270,7 +122506,7 @@ var require_entry_index = __commonJS((exports, module2) => { }; const write2 = async (tmp2) => { await writeFile6(tmp2.target, newIndex, { flag: "wx" }); - await mkdir4(path11.dirname(bucket), { recursive: true }); + await mkdir4(path12.dirname(bucket), { recursive: true }); await moveFile(tmp2.target, bucket); tmp2.moved = true; }; @@ -122294,7 +122530,7 @@ var require_entry_index = __commonJS((exports, module2) => { metadata: metadata2 }; try { - await mkdir4(path11.dirname(bucket), { recursive: true }); + await mkdir4(path12.dirname(bucket), { recursive: true }); const stringified = JSON.stringify(entry); await appendFile(bucket, ` ${hashEntry(stringified)} ${stringified}`); @@ -122342,13 +122578,13 @@ ${hashEntry(stringified)} ${stringified}`); const { default: pMap2 } = await Promise.resolve().then(() => (init_p_map(), exports_p_map)); const buckets = await readdirOrEmpty(indexDir); await pMap2(buckets, async (bucket) => { - const bucketPath2 = path11.join(indexDir, bucket); + const bucketPath2 = path12.join(indexDir, bucket); const subbuckets = await readdirOrEmpty(bucketPath2); await pMap2(subbuckets, async (subbucket) => { - const subbucketPath = path11.join(bucketPath2, subbucket); + const subbucketPath = path12.join(bucketPath2, subbucket); const subbucketEntries = await readdirOrEmpty(subbucketPath); await pMap2(subbucketEntries, async (entry) => { - const entryPath = path11.join(subbucketPath, entry); + const entryPath = path12.join(subbucketPath, entry); try { const entries10 = await bucketEntries(entryPath); const reduced = entries10.reduce((acc, entry2) => { @@ -122411,12 +122647,12 @@ ${hashEntry(stringified)} ${stringified}`); } exports.bucketDir = bucketDir; function bucketDir(cache4) { - return path11.join(cache4, `index-v${indexV}`); + return path12.join(cache4, `index-v${indexV}`); } exports.bucketPath = bucketPath; function bucketPath(cache4, key) { const hashed = hashKey(key); - return path11.join.apply(path11, [bucketDir(cache4)].concat(hashToSegments(hashed))); + return path12.join.apply(path12, [bucketDir(cache4)].concat(hashToSegments(hashed))); } exports.hashKey = hashKey; function hashKey(key) { @@ -122548,17 +122784,17 @@ var require_lib18 = __commonJS((exports) => { var _errored = Symbol("_errored"); class ReadStream extends Minipass { - constructor(path11, opt2) { + constructor(path12, opt2) { opt2 = opt2 || {}; super(opt2); this.readable = true; this.writable = false; - if (typeof path11 !== "string") { + if (typeof path12 !== "string") { throw new TypeError("path must be a string"); } this[_errored] = false; this[_fd] = typeof opt2.fd === "number" ? opt2.fd : null; - this[_path] = path11; + this[_path] = path12; this[_readSize] = opt2.readSize || 16 * 1024 * 1024; this[_reading] = false; this[_size2] = typeof opt2.size === "number" ? opt2.size : Infinity; @@ -122706,7 +122942,7 @@ var require_lib18 = __commonJS((exports) => { } class WriteStream extends EE { - constructor(path11, opt2) { + constructor(path12, opt2) { opt2 = opt2 || {}; super(opt2); this.readable = false; @@ -122716,7 +122952,7 @@ var require_lib18 = __commonJS((exports) => { this[_ended] = false; this[_needDrain] = false; this[_queue] = []; - this[_path] = path11; + this[_path] = path12; this[_fd] = typeof opt2.fd === "number" ? opt2.fd : null; this[_mode] = opt2.mode === undefined ? 438 : opt2.mode; this[_pos] = typeof opt2.start === "number" ? opt2.start : null; @@ -123002,11 +123238,11 @@ var require_read = __commonJS((exports, module2) => { err2.code = "EBADSIZE"; return err2; } - function integrityError(sri, path11) { - const err2 = new Error(`Integrity verification failed for ${sri} (${path11})`); + function integrityError(sri, path12) { + const err2 = new Error(`Integrity verification failed for ${sri} (${path12})`); err2.code = "EINTEGRITY"; err2.sri = sri; - err2.path = path11; + err2.path = path12; return err2; } }); @@ -123702,7 +123938,7 @@ var require_write = __commonJS((exports, module2) => { var { Minipass } = require_commonjs4(); var Pipeline = require_minipass_pipeline(); var Flush = require_minipass_flush(); - var path11 = __require("path"); + var path12 = __require("path"); var ssri = require_lib16(); var { tmpName } = require_tmp(); var fsm = require_lib18(); @@ -123811,7 +124047,7 @@ var require_write = __commonJS((exports, module2) => { } async function makeTmp(cache4, opts) { const tmpTarget = tmpName(cache4, opts.tmpPrefix); - await fs6.mkdir(path11.dirname(tmpTarget), { recursive: true }); + await fs6.mkdir(path12.dirname(tmpTarget), { recursive: true }); return { target: tmpTarget, moved: false @@ -123819,7 +124055,7 @@ var require_write = __commonJS((exports, module2) => { } async function moveToDestination(tmp, cache4, sri) { const destination = contentPath(cache4, sri); - const destDir = path11.dirname(destination); + const destDir = path12.dirname(destination); if (moveOperations.has(destination)) { return moveOperations.get(destination); } @@ -123919,9 +124155,9 @@ var require_put = __commonJS((exports, module2) => { // node_modules/cacache/lib/util/glob.js var require_glob = __commonJS((exports, module2) => { var { glob } = require_index_min3(); - var path11 = __require("path"); - var globify = (pattern) => pattern.split(path11.win32.sep).join(path11.posix.sep); - module2.exports = (path12, options4) => glob(globify(path12), options4); + var path12 = __require("path"); + var globify = (pattern) => pattern.split(path12.win32.sep).join(path12.posix.sep); + module2.exports = (path13, options4) => glob(globify(path13), options4); }); // node_modules/cacache/lib/content/rm.js @@ -123947,7 +124183,7 @@ var require_rm2 = __commonJS((exports, module2) => { var glob = require_glob(); var index3 = require_entry_index(); var memo2 = require_memoization(); - var path11 = __require("path"); + var path12 = __require("path"); var rmContent = require_rm(); module2.exports = entry; module2.exports.entry = entry; @@ -123963,7 +124199,7 @@ var require_rm2 = __commonJS((exports, module2) => { module2.exports.all = all7; async function all7(cache4) { memo2.clearMemoized(); - const paths = await glob(path11.join(cache4, "*(content-*|index-*)"), { silent: true, nosort: true }); + const paths = await glob(path12.join(cache4, "*(content-*|index-*)"), { silent: true, nosort: true }); return Promise.all(paths.map((p2) => rm3(p2, { recursive: true, force: true }))); } }); @@ -123982,7 +124218,7 @@ var require_verify = __commonJS((exports, module2) => { var fsm = require_lib18(); var glob = require_glob(); var index3 = require_entry_index(); - var path11 = __require("path"); + var path12 = __require("path"); var ssri = require_lib16(); var hasOwnProperty = (obj, key) => Object.prototype.hasOwnProperty.call(obj, key); var verifyOpts = (opts) => ({ @@ -124052,7 +124288,7 @@ var require_verify = __commonJS((exports, module2) => { indexStream.on("end", resolve9).on("error", reject); }); const contentDir = contentPath.contentDir(cache4); - const files = await glob(path11.join(contentDir, "**"), { + const files = await glob(path12.join(contentDir, "**"), { follow: false, nodir: true, nosort: true @@ -124164,16 +124400,16 @@ var require_verify = __commonJS((exports, module2) => { } function cleanTmp(cache4, opts) { opts.log.silly("verify", "cleaning tmp directory"); - return rm3(path11.join(cache4, "tmp"), { recursive: true, force: true }); + return rm3(path12.join(cache4, "tmp"), { recursive: true, force: true }); } async function writeVerifile(cache4, opts) { - const verifile = path11.join(cache4, "_lastverified"); + const verifile = path12.join(cache4, "_lastverified"); opts.log.silly("verify", "writing verifile to " + verifile); return writeFile6(verifile, `${Date.now()}`); } module2.exports.lastRun = lastRun; async function lastRun(cache4) { - const data2 = await readFile5(path11.join(cache4, "_lastverified"), { encoding: "utf8" }); + const data2 = await readFile5(path12.join(cache4, "_lastverified"), { encoding: "utf8" }); return new Date(+data2); } }); @@ -124217,7 +124453,7 @@ var require_lib19 = __commonJS((exports, module2) => { // node_modules/npm-bundled/lib/index.js var require_lib20 = __commonJS((exports, module2) => { var fs6 = __require("fs"); - var path11 = __require("path"); + var path12 = __require("path"); var EE = __require("events").EventEmitter; var normalizePackageBin = require_lib11(); @@ -124225,13 +124461,13 @@ var require_lib20 = __commonJS((exports, module2) => { constructor(opt2) { opt2 = opt2 || {}; super(opt2); - this.path = path11.resolve(opt2.path || process.cwd()); + this.path = path12.resolve(opt2.path || process.cwd()); this.parent = opt2.parent || null; if (this.parent) { this.result = this.parent.result; if (!this.parent.parent) { - const base2 = path11.basename(this.path); - const scope3 = path11.basename(path11.dirname(this.path)); + const base2 = path12.basename(this.path); + const scope3 = path12.basename(path12.dirname(this.path)); this.result.add(/^@/.test(scope3) ? scope3 + "/" + base2 : base2); } this.root = this.parent.root; @@ -124271,7 +124507,7 @@ var require_lib20 = __commonJS((exports, module2) => { } } start() { - const pj = path11.resolve(this.path, "package.json"); + const pj = path12.resolve(this.path, "package.json"); if (this.packageJsonCache.has(pj)) { this.onPackage(this.packageJsonCache.get(pj)); } else { @@ -124426,13 +124662,13 @@ var require_lib21 = __commonJS((exports, module2) => { var { readFile: readFile5, readdir: readdir2, stat: stat4 } = __require("fs/promises"); var { resolve: resolve9, basename: basename2, dirname: dirname6 } = __require("path"); var normalizePackageBin = require_lib11(); - var readPackage = ({ path: path11, packageJsonCache }) => packageJsonCache.has(path11) ? Promise.resolve(packageJsonCache.get(path11)) : readFile5(path11).then((json5) => { + var readPackage = ({ path: path12, packageJsonCache }) => packageJsonCache.has(path12) ? Promise.resolve(packageJsonCache.get(path12)) : readFile5(path12).then((json5) => { const pkg = normalizePackageBin(JSON.parse(json5)); - packageJsonCache.set(path11, pkg); + packageJsonCache.set(path12, pkg); return pkg; }).catch(() => null); var normalized = Symbol("package data has been normalized"); - var rpj = ({ path: path11, packageJsonCache }) => readPackage({ path: path11, packageJsonCache }).then((pkg) => { + var rpj = ({ path: path12, packageJsonCache }) => readPackage({ path: path12, packageJsonCache }).then((pkg) => { if (!pkg || pkg[normalized]) { return pkg; } @@ -124454,7 +124690,7 @@ var require_lib21 = __commonJS((exports, module2) => { return pkg; }); var pkgContents = async ({ - path: path11, + path: path12, depth = 1, currentDepth = 0, pkg = null, @@ -124468,8 +124704,8 @@ var require_lib21 = __commonJS((exports, module2) => { packageJsonCache = new Map; } if (pkg === true) { - return rpj({ path: path11 + "/package.json", packageJsonCache }).then((p2) => pkgContents({ - path: path11, + return rpj({ path: path12 + "/package.json", packageJsonCache }).then((p2) => pkgContents({ + path: path12, depth, currentDepth, pkg: p2, @@ -124479,7 +124715,7 @@ var require_lib21 = __commonJS((exports, module2) => { } if (pkg) { if (pkg.bin) { - const dir2 = dirname6(path11); + const dir2 = dirname6(path12); const scope3 = basename2(dir2); const nm = /^@.+/.test(scope3) ? dirname6(dir2) : dir2; const binFiles = []; @@ -124492,23 +124728,23 @@ var require_lib21 = __commonJS((exports, module2) => { } } if (currentDepth >= depth) { - result6.add(path11); + result6.add(path12); return result6; } const [dirEntries, bundleDeps] = await Promise.all([ - readdir2(path11, { withFileTypes: true }), - currentDepth === 0 && pkg && pkg.bundleDependencies ? bundled({ path: path11, packageJsonCache }) : null + readdir2(path12, { withFileTypes: true }), + currentDepth === 0 && pkg && pkg.bundleDependencies ? bundled({ path: path12, packageJsonCache }) : null ]).catch(() => []); if (!dirEntries) { return result6; } if (!dirEntries.length && !bundleDeps && currentDepth !== 0) { - result6.add(path11); + result6.add(path12); return result6; } const recursePromises = []; for (const entry of dirEntries) { - const p2 = resolve9(path11, entry.name); + const p2 = resolve9(path12, entry.name); if (entry.isDirectory() === false) { result6.add(p2); continue; @@ -124530,7 +124766,7 @@ var require_lib21 = __commonJS((exports, module2) => { } if (bundleDeps) { recursePromises.push(...bundleDeps.map((dep) => { - const p2 = resolve9(path11, "node_modules", dep); + const p2 = resolve9(path12, "node_modules", dep); return pkgContents({ path: p2, packageJsonCache, @@ -124546,8 +124782,8 @@ var require_lib21 = __commonJS((exports, module2) => { } return result6; }; - module2.exports = ({ path: path11, ...opts }) => pkgContents({ - path: resolve9(path11), + module2.exports = ({ path: path12, ...opts }) => pkgContents({ + path: resolve9(path12), ...opts, pkg: true }).then((results) => [...results]); @@ -124583,7 +124819,7 @@ var require_index_min4 = __commonJS((exports) => { end() { this.unpipe(), this.opts.end && this.dest.end(); } - }, is8 = class extends Gt2 { + }, is7 = class extends Gt2 { unpipe() { this.src.removeListener("error", this.proxyErrors), super.unpipe(); } @@ -124729,7 +124965,7 @@ var require_index_min4 = __commonJS((exports) => { return e2; this[x3] = false; let i6 = this[we2]; - return t2 = t2 || {}, e2 === kr2.stdout || e2 === kr2.stderr ? t2.end = false : t2.end = t2.end !== false, t2.proxyErrors = !!t2.proxyErrors, i6 ? t2.end && e2.end() : (this[I3].push(t2.proxyErrors ? new is8(this, e2, t2) : new Gt2(this, e2, t2)), this[J2] ? _t2(() => this[qe2]()) : this[qe2]()), e2; + return t2 = t2 || {}, e2 === kr2.stdout || e2 === kr2.stderr ? t2.end = false : t2.end = t2.end !== false, t2.proxyErrors = !!t2.proxyErrors, i6 ? t2.end && e2.end() : (this[I3].push(t2.proxyErrors ? new is7(this, e2, t2) : new Gt2(this, e2, t2)), this[J2] ? _t2(() => this[qe2]()) : this[qe2]()), e2; } unpipe(e2) { let t2 = this[I3].find((i6) => i6.dest === e2); @@ -128075,9 +128311,9 @@ var require_cache_dir = __commonJS((exports, module2) => { // node_modules/pacote/lib/util/is-package-bin.js var require_is_package_bin = __commonJS((exports, module2) => { var binObj = (name3, bin) => typeof bin === "string" ? { [name3]: bin } : bin; - var hasBin = (pkg, path11) => { + var hasBin = (pkg, path12) => { const bin = binObj(pkg.name, pkg.bin); - const p2 = path11.replace(/^[^\\/]*\//, ""); + const p2 = path12.replace(/^[^\\/]*\//, ""); for (const kv of Object.entries(bin)) { if (kv[1] === p2) { return true; @@ -128085,7 +128321,7 @@ var require_is_package_bin = __commonJS((exports, module2) => { } return false; }; - module2.exports = (pkg, path11) => pkg && pkg.bin ? hasBin(pkg, path11) : false; + module2.exports = (pkg, path12) => pkg && pkg.bin ? hasBin(pkg, path12) : false; }); // node_modules/pacote/lib/util/trailing-slashes.js @@ -128103,7 +128339,7 @@ var require_trailing_slashes = __commonJS((exports, module2) => { // node_modules/ignore-walk/lib/index.js var require_lib22 = __commonJS((exports, module2) => { var fs6 = __require("fs"); - var path11 = __require("path"); + var path12 = __require("path"); var EE = __require("events").EventEmitter; var Minimatch2 = require_commonjs3().Minimatch; @@ -128113,7 +128349,7 @@ var require_lib22 = __commonJS((exports, module2) => { super(opts); this.isSymbolicLink = opts.isSymbolicLink; this.path = opts.path || process.cwd(); - this.basename = path11.basename(this.path); + this.basename = path12.basename(this.path); this.ignoreFiles = opts.ignoreFiles || [".ignore"]; this.ignoreRules = {}; this.parent = opts.parent || null; @@ -128179,7 +128415,7 @@ var require_lib22 = __commonJS((exports, module2) => { newIg.forEach((e2) => this.addIgnoreFile(e2, then)); } addIgnoreFile(file4, then) { - const ig = path11.resolve(this.path, file4); + const ig = path12.resolve(this.path, file4); fs6.readFile(ig, "utf8", (er2, data2) => er2 ? this.emit("error", er2) : this.onReadIgnoreFile(file4, data2, then)); } onReadIgnoreFile(file4, data2, then) { @@ -128300,7 +128536,7 @@ var require_lib22 = __commonJS((exports, module2) => { return this; } addIgnoreFile(file4, then) { - const ig = path11.resolve(this.path, file4); + const ig = path12.resolve(this.path, file4); this.onReadIgnoreFile(file4, fs6.readFileSync(ig, "utf8"), then); } stat({ entry, file: file4, dir: dir2 }, then) { @@ -128366,7 +128602,7 @@ var require_lib23 = __commonJS((exports, module2) => { var strictDefaults = [ "/.git" ]; - var normalizePath = (path11) => path11.split("\\").join("/"); + var normalizePath = (path12) => path12.split("\\").join("/"); var readOutOfTreeIgnoreFiles = (root, rel, result6 = []) => { for (const file4 of [".npmignore", ".gitignore"]) { try { @@ -128410,13 +128646,13 @@ var require_lib23 = __commonJS((exports, module2) => { this.requiredFiles = options4.requiredFiles || []; const additionalDefaults = []; if (options4.prefix && options4.workspaces) { - const path11 = normalizePath(options4.path); + const path12 = normalizePath(options4.path); const prefix3 = normalizePath(options4.prefix); const workspaces = options4.workspaces.map((ws2) => normalizePath(ws2)); - if (path11 !== prefix3 && workspaces.includes(path11)) { + if (path12 !== prefix3 && workspaces.includes(path12)) { const relpath = relative4(options4.prefix, dirname6(options4.path)); additionalDefaults.push(...readOutOfTreeIgnoreFiles(options4.prefix, relpath)); - } else if (path11 === prefix3) { + } else if (path12 === prefix3) { additionalDefaults.push(...workspaces.map((w2) => normalizePath(relative4(options4.path, w2)))); } } @@ -128596,10 +128832,10 @@ var require_lib23 = __commonJS((exports, module2) => { if (!node) { continue; } - const path11 = node.path; + const path12 = node.path; const tree = node.target; const walkerOpts = { - path: path11, + path: path12, isPackage: true, ignoreFiles: [], seen: this.seen @@ -128642,7 +128878,7 @@ var require_lib23 = __commonJS((exports, module2) => { // node_modules/@npmcli/run-script/lib/set-path.js var require_set_path = __commonJS((exports, module2) => { - var __dirname = "D:\\App\\OpenCode\\opencode-unifia-rebrand\\node_modules\\@npmcli\\run-script\\lib"; + var __dirname = "D:\\App\\OpenCode\\opencode-work-design\\node_modules\\@npmcli\\run-script\\lib"; var { log: log7 } = require_lib5(); var { resolve: resolve9, dirname: dirname6, delimiter } = __require("path"); var nodeGypPath = resolve9(__dirname, "../lib/node-gyp-bin"); @@ -128680,40 +128916,40 @@ var require_set_path = __commonJS((exports, module2) => { // node_modules/env-paths/index.js var require_env_paths = __commonJS((exports, module2) => { - var path11 = __require("path"); + var path12 = __require("path"); var os6 = __require("os"); var homedir = os6.homedir(); var tmpdir2 = os6.tmpdir(); var { env: env3 } = process; var macos = (name3) => { - const library = path11.join(homedir, "Library"); + const library = path12.join(homedir, "Library"); return { - data: path11.join(library, "Application Support", name3), - config: path11.join(library, "Preferences", name3), - cache: path11.join(library, "Caches", name3), - log: path11.join(library, "Logs", name3), - temp: path11.join(tmpdir2, name3) + data: path12.join(library, "Application Support", name3), + config: path12.join(library, "Preferences", name3), + cache: path12.join(library, "Caches", name3), + log: path12.join(library, "Logs", name3), + temp: path12.join(tmpdir2, name3) }; }; var windows = (name3) => { - const appData = env3.APPDATA || path11.join(homedir, "AppData", "Roaming"); - const localAppData = env3.LOCALAPPDATA || path11.join(homedir, "AppData", "Local"); + const appData = env3.APPDATA || path12.join(homedir, "AppData", "Roaming"); + const localAppData = env3.LOCALAPPDATA || path12.join(homedir, "AppData", "Local"); return { - data: path11.join(localAppData, name3, "Data"), - config: path11.join(appData, name3, "Config"), - cache: path11.join(localAppData, name3, "Cache"), - log: path11.join(localAppData, name3, "Log"), - temp: path11.join(tmpdir2, name3) + data: path12.join(localAppData, name3, "Data"), + config: path12.join(appData, name3, "Config"), + cache: path12.join(localAppData, name3, "Cache"), + log: path12.join(localAppData, name3, "Log"), + temp: path12.join(tmpdir2, name3) }; }; var linux = (name3) => { - const username = path11.basename(homedir); + const username = path12.basename(homedir); return { - data: path11.join(env3.XDG_DATA_HOME || path11.join(homedir, ".local", "share"), name3), - config: path11.join(env3.XDG_CONFIG_HOME || path11.join(homedir, ".config"), name3), - cache: path11.join(env3.XDG_CACHE_HOME || path11.join(homedir, ".cache"), name3), - log: path11.join(env3.XDG_STATE_HOME || path11.join(homedir, ".local", "state"), name3), - temp: path11.join(tmpdir2, username, name3) + data: path12.join(env3.XDG_DATA_HOME || path12.join(homedir, ".local", "share"), name3), + config: path12.join(env3.XDG_CONFIG_HOME || path12.join(homedir, ".config"), name3), + cache: path12.join(env3.XDG_CACHE_HOME || path12.join(homedir, ".cache"), name3), + log: path12.join(env3.XDG_STATE_HOME || path12.join(homedir, ".local", "state"), name3), + temp: path12.join(tmpdir2, username, name3) }; }; var envPaths = (name3, options4) => { @@ -128794,7 +129030,7 @@ var require_debug2 = __commonJS((exports, module2) => { // node_modules/nopt/lib/type-defs.js var require_type_defs = __commonJS((exports, module2) => { var url3 = __require("url"); - var path11 = __require("path"); + var path12 = __require("path"); var Stream4 = __require("stream").Stream; var os6 = __require("os"); var debug2 = require_debug2(); @@ -128813,9 +129049,9 @@ var require_type_defs = __commonJS((exports, module2) => { const homePattern = isWin ? /^~(\/|\\)/ : /^~\//; const home = os6.homedir(); if (home && val.match(homePattern)) { - data2[k3] = path11.resolve(home, val.slice(2)); + data2[k3] = path12.resolve(home, val.slice(2)); } else { - data2[k3] = path11.resolve(val); + data2[k3] = path12.resolve(val); } return true; } @@ -128866,7 +129102,7 @@ var require_type_defs = __commonJS((exports, module2) => { Boolean: { type: Boolean, validate: validateBoolean }, url: { type: url3, validate: validateUrl }, Number: { type: Number, validate: validateNumber }, - path: { type: path11, validate: validatePath }, + path: { type: path12, validate: validatePath }, Stream: { type: Stream4, validate: validateStream }, Date: { type: Date, validate: validateDate }, Array: { type: Array } @@ -129506,8 +129742,8 @@ var require_package2 = __commonJS((exports, module2) => { // node_modules/node-gyp/lib/node-gyp.js var require_node_gyp = __commonJS((exports, module2) => { - var __dirname = "D:\\App\\OpenCode\\opencode-unifia-rebrand\\node_modules\\node-gyp\\lib"; - var path11 = __require("path"); + var __dirname = "D:\\App\\OpenCode\\opencode-work-design\\node_modules\\node-gyp\\lib"; + var path12 = __require("path"); var nopt = require_nopt(); var log7 = require_log(); var childProcess = __require("child_process"); @@ -129632,7 +129868,7 @@ var require_node_gyp = __commonJS((exports, module2) => { commands2.map((c2) => " - " + c2 + " - " + __require("./" + c2).usage).join(` `), "", - "node-gyp@" + this.version + " " + path11.resolve(__dirname, ".."), + "node-gyp@" + this.version + " " + path12.resolve(__dirname, ".."), "node@" + process.versions.node ].join(` `); @@ -129770,7 +130006,7 @@ var require_make_spawn_args = __commonJS((exports, module2) => { env: env3, event, nodeGyp, - path: path11, + path: path12, scriptShell = true, stdio, stdioString @@ -129780,12 +130016,12 @@ var require_make_spawn_args = __commonJS((exports, module2) => { } else if (env3.npm_config_node_gyp) { npm_config_node_gyp = env3.npm_config_node_gyp; } else { - npm_config_node_gyp = __require.resolve("D:\\App\\OpenCode\\opencode-unifia-rebrand\\node_modules\\node-gyp\\bin\\node-gyp.js"); + npm_config_node_gyp = __require.resolve("D:\\App\\OpenCode\\opencode-work-design\\node_modules\\node-gyp\\bin\\node-gyp.js"); } - const spawnEnv = setPATH(path11, binPaths, { + const spawnEnv = setPATH(path12, binPaths, { ...process.env, ...env3, - npm_package_json: resolve9(path11, "package.json"), + npm_package_json: resolve9(path12, "package.json"), npm_lifecycle_event: event, npm_lifecycle_script: cmd, npm_config_node_gyp @@ -129794,7 +130030,7 @@ var require_make_spawn_args = __commonJS((exports, module2) => { env: spawnEnv, stdioString, stdio, - cwd: path11, + cwd: path12, shell: scriptShell }; return [cmd, args3, spawnOpts]; @@ -129838,8 +130074,8 @@ var require_lib25 = __commonJS((exports, module2) => { var util3 = __require("util"); var fs6 = __require("fs"); var { stat: stat4 } = fs6.promises || { stat: util3.promisify(fs6.stat) }; - async function isNodeGypPackage(path11) { - return await stat4(`${path11}/binding.gyp`).then((st2) => st2.isFile()).catch(() => false); + async function isNodeGypPackage(path12) { + return await stat4(`${path12}/binding.gyp`).then((st2) => st2.isFile()).catch(() => false); } module2.exports = { isNodeGypPackage, @@ -129895,9 +130131,9 @@ var require_signal_manager = __commonJS((exports, module2) => { var require_is_server_package = __commonJS((exports, module2) => { var { stat: stat4 } = __require("fs/promises"); var { resolve: resolve9 } = __require("path"); - module2.exports = async (path11) => { + module2.exports = async (path12) => { try { - const st2 = await stat4(resolve9(path11, "server.js")); + const st2 = await stat4(resolve9(path12, "server.js")); return st2.isFile(); } catch (er2) { return false; @@ -129920,7 +130156,7 @@ var require_run_script_pkg = __commonJS((exports, module2) => { env: env3 = {}, event, nodeGyp, - path: path11, + path: path12, pkg, scriptShell, signalTimeout = 500, @@ -129933,9 +130169,9 @@ var require_run_script_pkg = __commonJS((exports, module2) => { cmd = options4.cmd; } else if (pkg.scripts && pkg.scripts[event]) { cmd = pkg.scripts[event]; - } else if (event === "install" && !scripts.install && !scripts.preinstall && gypfile !== false && await isNodeGypPackage(path11)) { + } else if (event === "install" && !scripts.install && !scripts.preinstall && gypfile !== false && await isNodeGypPackage(path12)) { cmd = defaultGypInstallScript; - } else if (event === "start" && await isServerPackage(path11)) { + } else if (event === "start" && await isServerPackage(path12)) { cmd = "node server.js"; } if (!cmd) { @@ -129971,7 +130207,7 @@ var require_run_script_pkg = __commonJS((exports, module2) => { env: { ...env3, ...packageEnvs(pkg) }, event, nodeGyp, - path: path11, + path: path12, scriptShell, stdio, stdioString @@ -129980,7 +130216,7 @@ var require_run_script_pkg = __commonJS((exports, module2) => { event, script: cmd, pkgid: pkg._id, - path: path11 + path: path12 }); if (stdio === "inherit") { signalManager.add(p2.process); @@ -130009,7 +130245,7 @@ var require_validate_options = __commonJS((exports, module2) => { } const { event, - path: path11, + path: path12, scriptShell, env: env3 = {}, stdio = "pipe", @@ -130019,7 +130255,7 @@ var require_validate_options = __commonJS((exports, module2) => { if (!event || typeof event !== "string") { throw new TypeError("valid event not provided to runScript"); } - if (!path11 || typeof path11 !== "string") { + if (!path12 || typeof path12 !== "string") { throw new TypeError("valid path not provided to runScript"); } if (scriptShell !== undefined && typeof scriptShell !== "string") { @@ -130139,8 +130375,8 @@ var require_tar_create_options = __commonJS((exports, module2) => { gzip: { level: 9 }, - filter: (path11, stat4) => { - if (isPackageBin(manifest, path11)) { + filter: (path12, stat4) => { + if (isPackageBin(manifest, path12)) { stat4.mode |= 73; } return true; @@ -135777,22 +136013,22 @@ var require_matchers = __commonJS((exports, module2) => { }; var DEEP_HEADER_AUTHORIZATION = { type: TYPE_PATH, - predicate: ({ path: path11 }) => path11.endsWith(".headers.authorization"), + predicate: ({ path: path12 }) => path12.endsWith(".headers.authorization"), replacement: "[REDACTED_HEADER_AUTHORIZATION]" }; var DEEP_HEADER_SET_COOKIE = { type: TYPE_PATH, - predicate: ({ path: path11 }) => path11.endsWith(".headers.set-cookie"), + predicate: ({ path: path12 }) => path12.endsWith(".headers.set-cookie"), replacement: "[REDACTED_HEADER_SET_COOKIE]" }; var DEEP_HEADER_COOKIE = { type: TYPE_PATH, - predicate: ({ path: path11 }) => path11.endsWith(".headers.cookie"), + predicate: ({ path: path12 }) => path12.endsWith(".headers.cookie"), replacement: "[REDACTED_HEADER_COOKIE]" }; var REWRITE_REQUEST = { type: TYPE_PATH, - predicate: ({ path: path11 }) => path11.endsWith(".request"), + predicate: ({ path: path12 }) => path12.endsWith(".request"), replacement: (input) => ({ method: input?.method, path: input?.path, @@ -135802,7 +136038,7 @@ var require_matchers = __commonJS((exports, module2) => { }; var REWRITE_RESPONSE = { type: TYPE_PATH, - predicate: ({ path: path11 }) => path11.endsWith(".response"), + predicate: ({ path: path12 }) => path12.endsWith(".response"), replacement: (input) => ({ data: input?.data, status: input?.status, @@ -135916,12 +136152,12 @@ var require_utils3 = __commonJS((exports, module2) => { }, [TYPE_PATH]: (matcher) => (value8, ctx) => { const rawPath = ctx?.path; - const path11 = rawPath.join(".").toLowerCase(); + const path12 = rawPath.join(".").toLowerCase(); const { predicate, replacement } = matcher; const replace5 = typeof replacement === "function" ? replacement : () => replacement; - const shouldRun = predicate({ rawPath, path: path11 }); + const shouldRun = predicate({ rawPath, path: path12 }); if (shouldRun) { - value8 = replace5(value8, { rawPath, path: path11 }); + value8 = replace5(value8, { rawPath, path: path12 }); } return value8; } @@ -137023,7 +137259,7 @@ var require_mediaType = __commonJS((exports, module2) => { module2.exports = preferredMediaTypes; module2.exports.preferredMediaTypes = preferredMediaTypes; var simpleMediaTypeRegExp = /^\s*([^\s\/;]+)\/([^;\s]+)\s*(?:;(.*))?$/; - function parseAccept(accept2) { + function parseAccept2(accept2) { var accepts = splitMediaTypes(accept2); for (var i6 = 0, j2 = 0;i6 < accepts.length; i6++) { var mediaType = parseMediaType(accepts[i6].trim(), i6); @@ -137108,7 +137344,7 @@ var require_mediaType = __commonJS((exports, module2) => { }; } function preferredMediaTypes(accept2, provided) { - var accepts = parseAccept(accept2 === undefined ? "*/*" : accept2 || ""); + var accepts = parseAccept2(accept2 === undefined ? "*/*" : accept2 || ""); if (!provided) { return accepts.filter(isQuality).sort(compareSpecs).map(getFullType); } @@ -139567,8 +139803,10 @@ var require_address_error = __commonJS((exports) => { var require_common3 = __commonJS((exports) => { Object.defineProperty(exports, "__esModule", { value: true }); exports.isInSubnet = isInSubnet; + exports.isHostInSubnet = isHostInSubnet; exports.isCorrect = isCorrect; exports.prefixLengthFromMask = prefixLengthFromMask; + exports.assertByteArray = assertByteArray; exports.numberToPaddedHex = numberToPaddedHex; exports.stringToPaddedHex = stringToPaddedHex; exports.testBit = testBit; @@ -139577,13 +139815,13 @@ var require_common3 = __commonJS((exports) => { if (this.subnetMask < address.subnetMask) { return false; } - if (this.mask(address.subnetMask) === address.mask()) { - return true; - } - return false; + return isHostInSubnet.call(this, address); + } + function isHostInSubnet(address) { + return this.mask(address.subnetMask) === address.mask(); } function isCorrect(defaultBits) { - return function() { + return function isCorrectForm() { if (this.addressMinusSuffix !== this.correctForm()) { return false; } @@ -139607,6 +139845,16 @@ var require_common3 = __commonJS((exports) => { } return firstZero; } + function assertByteArray(bytes, byteCount, family, minimum) { + if (bytes.length !== byteCount) { + throw new address_error_1.AddressError(`${family} addresses require exactly ${byteCount} bytes`); + } + for (let i6 = 0;i6 < bytes.length; i6++) { + if (!Number.isInteger(bytes[i6]) || bytes[i6] < minimum || bytes[i6] > 255) { + throw new address_error_1.AddressError(`All bytes must be integers between ${minimum} and 255`); + } + } + } function numberToPaddedHex(number10) { return number10.toString(16).padStart(2, "0"); } @@ -139629,7 +139877,7 @@ var require_constants4 = __commonJS((exports) => { exports.RE_SUBNET_STRING = exports.RE_ADDRESS = exports.GROUPS = exports.BITS = undefined; exports.BITS = 32; exports.GROUPS = 4; - exports.RE_ADDRESS = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/g; + exports.RE_ADDRESS = /^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])$/g; exports.RE_SUBNET_STRING = /\/\d{1,2}$/; }); @@ -139676,6 +139924,7 @@ var require_ipv4 = __commonJS((exports) => { class Address4 { constructor(address) { + this.addressMinusSuffix = ""; this.groups = constants2.GROUPS; this.parsedAddress = []; this.parsedSubnet = ""; @@ -139684,6 +139933,7 @@ var require_ipv4 = __commonJS((exports) => { this.v4 = true; this.isCorrect = isCorrect4; this.isInSubnet = common.isInSubnet; + this.isHostInSubnet = common.isHostInSubnet; this.address = address; const subnet = constants2.RE_SUBNET_STRING.exec(address); if (subnet) { @@ -139702,12 +139952,15 @@ var require_ipv4 = __commonJS((exports) => { try { new Address4(address); return true; - } catch (e2) { + } catch { return false; } } parse(address) { const groups = address.split("."); + if (groups.some((group4) => /^0\d/.test(group4))) { + throw new address_error_1.AddressError("IPv4 addresses can't have leading zeroes."); + } if (!address.match(constants2.RE_ADDRESS)) { throw new address_error_1.AddressError("Invalid IPv4 address."); } @@ -139816,20 +140069,13 @@ var require_ipv4 = __commonJS((exports) => { return `${this.startAddress().correctForm()}/${this.subnetMask}`; } static fromBigInt(bigInt3) { - if (bigInt3 < 0n || bigInt3 > 0xffffffffn) { + if (bigInt3 < BigInt(0) || bigInt3 > BigInt(4294967295)) { throw new address_error_1.AddressError("IPv4 BigInt must be in the range 0 to 2**32 - 1"); } return Address4.fromHex(bigInt3.toString(16).padStart(8, "0")); } static fromByteArray(bytes) { - if (bytes.length !== 4) { - throw new address_error_1.AddressError("IPv4 addresses require exactly 4 bytes"); - } - for (let i6 = 0;i6 < bytes.length; i6++) { - if (!Number.isInteger(bytes[i6]) || bytes[i6] < 0 || bytes[i6] > 255) { - throw new address_error_1.AddressError("All bytes must be integers between 0 and 255"); - } - } + common.assertByteArray(bytes, 4, "IPv4", 0); return this.fromUnsignedByteArray(bytes); } static fromUnsignedByteArray(bytes) { @@ -139859,25 +140105,25 @@ var require_ipv4 = __commonJS((exports) => { return `${reversed}.in-addr.arpa.`; } isMulticast() { - return this.isInSubnet(MULTICAST_V4); + return this.isHostInSubnet(MULTICAST_V4); } isPrivate() { - return PRIVATE_V4.some((subnet) => this.isInSubnet(subnet)); + return PRIVATE_V4.some((subnet) => this.isHostInSubnet(subnet)); } isLoopback() { - return this.isInSubnet(LOOPBACK_V4); + return this.isHostInSubnet(LOOPBACK_V4); } isLinkLocal() { - return this.isInSubnet(LINK_LOCAL_V4); + return this.isHostInSubnet(LINK_LOCAL_V4); } isUnspecified() { - return this.isInSubnet(UNSPECIFIED_V4); + return this.isHostInSubnet(UNSPECIFIED_V4); } isBroadcast() { - return this.isInSubnet(BROADCAST_V4); + return this.isHostInSubnet(BROADCAST_V4); } isCGNAT() { - return this.isInSubnet(CGNAT_V4); + return this.isHostInSubnet(CGNAT_V4); } binaryZeroPad() { if (this._binaryZeroPad === undefined) { @@ -139887,7 +140133,7 @@ var require_ipv4 = __commonJS((exports) => { } groupForV6() { const segments = this.parsedAddress; - return this.address.replace(constants2.RE_ADDRESS, `${segments.slice(0, 2).join(".")}.${segments.slice(2, 4).join(".")}`); + return this.correctForm().replace(constants2.RE_ADDRESS, `${segments.slice(0, 2).join(".")}.${segments.slice(2, 4).join(".")}`); } } exports.Address4 = Address4; @@ -139941,6 +140187,7 @@ var require_constants5 = __commonJS((exports) => { "ff05::1:3/128": "Multicast (All DHCP servers in this site)", "::/128": "Unspecified", "::1/128": "Loopback", + "::ffff:0:0/96": "IPv4-mapped", "ff00::/8": "Multicast", "fe80::/10": "Link-local unicast", "fc00::/7": "Unique local", @@ -139953,8 +140200,8 @@ var require_constants5 = __commonJS((exports) => { exports.RE_BAD_ADDRESS = /([0-9a-f]{5,}|:{3,}|[^:]:$|^:[^:]|\/$)/gi; exports.RE_SUBNET_STRING = /\/\d{1,3}(?=%|$)/; exports.RE_ZONE_STRING = /%.*$/; - exports.RE_URL = /^\[{0,1}([0-9a-f:]+)\]{0,1}/; - exports.RE_URL_WITH_PORT = /\[([0-9a-f:]+)\]:([0-9]{1,5})/; + exports.RE_URL = /^(?:\[([0-9a-f:.]+)\]|([0-9a-f:.]+))(?:[/?#].*)?$/i; + exports.RE_URL_WITH_PORT = /^\[([0-9a-f:.]+)\]:([0-9]{1,5})(?:[/?#].*)?$/i; }); // node_modules/ip-address/dist/v6/helpers.js @@ -140178,6 +140425,7 @@ var require_ipv6 = __commonJS((exports) => { this.v4 = false; this.zone = ""; this.isInSubnet = common.isInSubnet; + this.isHostInSubnet = common.isHostInSubnet; this.isCorrect = isCorrect6; if (optionalGroups === undefined) { this.groups = constants6.GROUPS; @@ -140194,7 +140442,8 @@ var require_ipv6 = __commonJS((exports) => { throw new address_error_1.AddressError("Invalid subnet mask."); } address = address.replace(constants6.RE_SUBNET_STRING, ""); - } else if (/\//.test(address)) { + } + if (/\//.test(address)) { throw new address_error_1.AddressError("Invalid subnet mask."); } const zone = constants6.RE_ZONE_STRING.exec(address); @@ -140209,12 +140458,12 @@ var require_ipv6 = __commonJS((exports) => { try { new Address6(address); return true; - } catch (e2) { + } catch { return false; } } static fromBigInt(bigInt3) { - if (bigInt3 < 0n || bigInt3 > (1n << BigInt(constants6.BITS)) - 1n) { + if (bigInt3 < BigInt(0) || bigInt3 > (BigInt(1) << BigInt(constants6.BITS)) - BigInt(1)) { throw new address_error_1.AddressError("IPv6 BigInt must be in the range 0 to 2**128 - 1"); } const hex3 = bigInt3.toString(16).padStart(32, "0"); @@ -140225,46 +140474,43 @@ var require_ipv6 = __commonJS((exports) => { return new Address6(groups.join(":")); } static fromURL(url3) { + var _a3; let host; let port2 = null; let result6; - if (url3.indexOf("[") !== -1 && url3.indexOf("]:") !== -1) { - result6 = constants6.RE_URL_WITH_PORT.exec(url3); + let error46; + const stripped = url3.replace(/^[a-z][a-z0-9+.-]*:\/\//i, ""); + if (stripped.indexOf("[") !== -1 && stripped.indexOf("]:") !== -1) { + error46 = "failed to parse address with port"; + result6 = constants6.RE_URL_WITH_PORT.exec(stripped); if (result6 === null) { - return { - error: "failed to parse address with port", - address: null, - port: null - }; + return { error: error46, address: null, port: null }; } host = result6[1]; port2 = result6[2]; - } else if (url3.indexOf("/") !== -1) { - url3 = url3.replace(/^[a-z0-9]+:\/\//, ""); - result6 = constants6.RE_URL.exec(url3); + } else { + error46 = "failed to parse address from URL"; + result6 = constants6.RE_URL.exec(stripped); if (result6 === null) { - return { - error: "failed to parse address from URL", - address: null, - port: null - }; + return { error: error46, address: null, port: null }; } - host = result6[1]; - } else { - host = url3; + host = (_a3 = result6[1]) !== null && _a3 !== undefined ? _a3 : result6[2]; } if (port2) { port2 = parseInt(port2, 10); - if (port2 < 0 || port2 > 65536) { + if (port2 < 0 || port2 > 65535) { port2 = null; } } else { port2 = null; } - return { - address: new Address6(host), - port: port2 - }; + let address; + try { + address = new Address6(host); + } catch { + return { error: error46, address: null, port: null }; + } + return { address, port: port2 }; } static fromAddressAndMask(address, mask2) { const bits = common.prefixLengthFromMask(new Address6(mask2).bigInt(), constants6.BITS); @@ -140395,7 +140641,7 @@ var require_ipv6 = __commonJS((exports) => { getType() { for (let i6 = 0;i6 < TYPE_SUBNETS.length; i6++) { const entry = TYPE_SUBNETS[i6]; - if (this.isInSubnet(entry[0])) { + if (this.isHostInSubnet(entry[0])) { return entry[1]; } } @@ -140484,18 +140730,20 @@ var require_ipv6 = __commonJS((exports) => { } const groups = address.split(":"); const lastGroup = groups.slice(-1)[0]; + const v4Octets = lastGroup.split("."); + if (v4Octets.length === constants4.GROUPS && v4Octets.every((octet) => /^\d{1,3}$/.test(octet))) { + if (v4Octets.some((octet) => /^0\d/.test(octet))) { + const highlighted = v4Octets.map(spanLeadingZeroes4).join("."); + const prefix3 = groups.slice(0, -1).map(helpers.escapeHtml).join(":"); + const separator = groups.length > 1 ? ":" : ""; + throw new address_error_1.AddressError("IPv4 addresses can't have leading zeroes.", `${prefix3}${separator}${highlighted}`); + } + } const address4 = lastGroup.match(constants4.RE_ADDRESS); if (address4) { this.parsedAddress4 = address4[0]; - this.address4 = new ipv4_1.Address4(this.parsedAddress4); - for (let i6 = 0;i6 < this.address4.groups; i6++) { - if (/^0[0-9]+/.test(this.address4.parsedAddress[i6])) { - const highlighted = this.address4.parsedAddress.map(spanLeadingZeroes4).join("."); - const prefix3 = groups.slice(0, -1).map(helpers.escapeHtml).join(":"); - const separator = groups.length > 1 ? ":" : ""; - throw new address_error_1.AddressError("IPv4 addresses can't have leading zeroes.", `${prefix3}${separator}${highlighted}`); - } - } + const v4Suffix = this.subnetMask >= 96 ? `/${this.subnetMask - 96}` : ""; + this.address4 = new ipv4_1.Address4(`${this.parsedAddress4}${v4Suffix}`); this.v4 = true; groups[groups.length - 1] = this.address4.toGroup6(); address = groups.join(":"); @@ -140558,7 +140806,16 @@ var require_ipv6 = __commonJS((exports) => { } to4() { const binary2 = this.binaryZeroPad().split(""); - return ipv4_1.Address4.fromHex(BigInt(`0b${binary2.slice(96, 128).join("")}`).toString(16).padStart(8, "0")); + const hex3 = BigInt(`0b${binary2.slice(96, 128).join("")}`).toString(16).padStart(8, "0"); + if (this.subnetMask >= 96) { + const v4Mask = this.subnetMask - 96; + const groups = []; + for (let i6 = 0;i6 < 8; i6 += 2) { + groups.push(parseInt(hex3.slice(i6, i6 + 2), 16)); + } + return new ipv4_1.Address4(`${groups.join(".")}/${v4Mask}`); + } + return ipv4_1.Address4.fromHex(hex3); } to4in6() { const address4 = this.to4(); @@ -140568,7 +140825,7 @@ var require_ipv6 = __commonJS((exports) => { if (!/:$/.test(correct)) { infix = ":"; } - return correct + infix + address4.address; + return correct + infix + address4.correctForm(); } inspectTeredo() { const prefix3 = this.getBitsBase16(0, 32); @@ -140633,7 +140890,13 @@ var require_ipv6 = __commonJS((exports) => { bits = prefixBits.slice(0, 96) + v4Bits; } else { const beforeU = 64 - pl; - bits = prefixBits.slice(0, pl) + v4Bits.slice(0, beforeU) + "00000000" + v4Bits.slice(beforeU) + "0".repeat(128 - 72 - (32 - beforeU)); + bits = [ + prefixBits.slice(0, pl), + v4Bits.slice(0, beforeU), + "00000000", + v4Bits.slice(beforeU), + "0".repeat(128 - 72 - (32 - beforeU)) + ].join(""); } const hex3 = BigInt(`0b${bits}`).toString(16).padStart(32, "0"); const groups = []; @@ -140648,7 +140911,7 @@ var require_ipv6 = __commonJS((exports) => { if (pl !== 32 && pl !== 40 && pl !== 48 && pl !== 56 && pl !== 64 && pl !== 96) { throw new address_error_1.AddressError("NAT64 prefix length must be 32, 40, 48, 56, 64, or 96"); } - if (!this.isInSubnet(prefix6)) { + if (!this.isHostInSubnet(prefix6)) { return null; } const bits = this.binaryZeroPad(); @@ -140666,9 +140929,7 @@ var require_ipv6 = __commonJS((exports) => { return new ipv4_1.Address4(octets.join(".")); } toByteArray() { - const valueWithoutPadding = this.bigInt().toString(16); - const leadingPad = "0".repeat(valueWithoutPadding.length % 2); - const value8 = `${leadingPad}${valueWithoutPadding}`; + const value8 = this.bigInt().toString(16).padStart(constants6.BITS / 4, "0"); const bytes = []; for (let i6 = 0, length3 = value8.length;i6 < length3; i6 += 2) { bytes.push(parseInt(value8.substring(i6, i6 + 2), 16)); @@ -140679,9 +140940,11 @@ var require_ipv6 = __commonJS((exports) => { return this.toByteArray().map(unsignByte); } static fromByteArray(bytes) { + common.assertByteArray(bytes, 16, "IPv6", -128); return this.fromUnsignedByteArray(bytes.map(unsignByte)); } static fromUnsignedByteArray(bytes) { + common.assertByteArray(bytes, 16, "IPv6", 0); const BYTE_MAX = BigInt("256"); let result6 = BigInt("0"); let multiplier = BigInt("1"); @@ -140695,12 +140958,20 @@ var require_ipv6 = __commonJS((exports) => { return this.addressMinusSuffix === this.canonicalForm(); } isLinkLocal() { + const embedded = this.embeddedIPv4(); + if (embedded) { + return embedded.isLinkLocal(); + } if (this.getBitsBase2(0, 64) === "1111111010000000000000000000000000000000000000000000000000000000") { return true; } return false; } isMulticast() { + const embedded = this.embeddedIPv4(); + if (embedded) { + return embedded.isMulticast(); + } const type3 = this.getType(); return type3 === "Multicast" || type3.startsWith("Multicast "); } @@ -140708,25 +140979,60 @@ var require_ipv6 = __commonJS((exports) => { return this.v4; } isMapped4() { - return this.isInSubnet(IPV4_MAPPED_SUBNET); + return this.isHostInSubnet(IPV4_MAPPED_SUBNET); + } + embeddedIPv4() { + if (this.isMapped4() || this.isHostInSubnet(NAT64_WELL_KNOWN_SUBNET)) { + return this.to4(); + } + return null; } isTeredo() { - return this.isInSubnet(TEREDO_SUBNET); + return this.isHostInSubnet(TEREDO_SUBNET); } is6to4() { - return this.isInSubnet(SIX_TO_FOUR_SUBNET); + return this.isHostInSubnet(SIX_TO_FOUR_SUBNET); } isLoopback() { + const embedded = this.embeddedIPv4(); + if (embedded) { + return embedded.isLoopback(); + } return this.getType() === "Loopback"; } isULA() { - return this.isInSubnet(ULA_SUBNET); + return this.isHostInSubnet(ULA_SUBNET); + } + isPrivate() { + const embedded = this.embeddedIPv4(); + if (embedded) { + return embedded.isPrivate(); + } + return this.isULA(); + } + isCGNAT() { + const embedded = this.embeddedIPv4(); + if (embedded) { + return embedded.isCGNAT(); + } + return false; + } + isBroadcast() { + const embedded = this.embeddedIPv4(); + if (embedded) { + return embedded.isBroadcast(); + } + return false; } isUnspecified() { + const embedded = this.embeddedIPv4(); + if (embedded) { + return embedded.isUnspecified(); + } return this.getType() === "Unspecified"; } isDocumentation() { - return this.isInSubnet(DOCUMENTATION_SUBNET); + return this.isHostInSubnet(DOCUMENTATION_SUBNET); } href(optionalPort) { if (optionalPort === undefined) { @@ -140838,6 +141144,7 @@ var require_ipv6 = __commonJS((exports) => { var ULA_SUBNET = new Address6("fc00::/7"); var DOCUMENTATION_SUBNET = new Address6("2001:db8::/32"); var IPV4_MAPPED_SUBNET = new Address6("::ffff:0:0/96"); + var NAT64_WELL_KNOWN_SUBNET = new Address6("64:ff9b::/96"); }); // node_modules/ip-address/dist/ip-address.js @@ -143469,8 +143776,8 @@ var require_json_stream = __commonJS((exports, module2) => { static get JSONStreamError() { return JSONStreamError; } - static parse(path11, map32) { - return new JSONStream({ path: path11, map: map32 }); + static parse(path12, map32) { + return new JSONStream({ path: path12, map: map32 }); } } module2.exports = JSONStream; @@ -149226,7 +149533,7 @@ var require_file2 = __commonJS((exports) => { ...this.unrecognizedFields }; } - static fromJSON(path11, data2) { + static fromJSON(path12, data2) { const { length: length3, hashes, ...rest } = data2; if (typeof length3 !== "number") { throw new TypeError("length must be a number"); @@ -149236,7 +149543,7 @@ var require_file2 = __commonJS((exports) => { } return new TargetFile({ length: length3, - path: path11, + path: path12, hashes, unrecognizedFields: rest }); @@ -149936,9 +150243,9 @@ var require_snapshot = __commonJS((exports) => { } exports.Snapshot = Snapshot; function metaToJSON(meta) { - return Object.entries(meta).reduce((acc, [path11, metadata2]) => ({ + return Object.entries(meta).reduce((acc, [path12, metadata2]) => ({ ...acc, - [path11]: metadata2.toJSON() + [path12]: metadata2.toJSON() }), {}); } function metaFromJSON(data2) { @@ -149947,9 +150254,9 @@ var require_snapshot = __commonJS((exports) => { if (!utils_1.guard.isObjectRecord(data2)) { throw new TypeError("meta field is malformed"); } else { - meta = Object.entries(data2).reduce((acc, [path11, metadata2]) => ({ + meta = Object.entries(data2).reduce((acc, [path12, metadata2]) => ({ ...acc, - [path11]: file_1.MetaFile.fromJSON(metadata2) + [path12]: file_1.MetaFile.fromJSON(metadata2) }), {}); } } @@ -150127,9 +150434,9 @@ var require_targets = __commonJS((exports) => { } exports.Targets = Targets; function targetsToJSON(targets) { - return Object.entries(targets).reduce((acc, [path11, target]) => ({ + return Object.entries(targets).reduce((acc, [path12, target]) => ({ ...acc, - [path11]: target.toJSON() + [path12]: target.toJSON() }), {}); } function targetsFromJSON(data2) { @@ -150138,9 +150445,9 @@ var require_targets = __commonJS((exports) => { if (!utils_1.guard.isObjectRecord(data2)) { throw new TypeError("targets must be an object"); } else { - targets = Object.entries(data2).reduce((acc, [path11, target]) => ({ + targets = Object.entries(data2).reduce((acc, [path12, target]) => ({ ...acc, - [path11]: file_1.TargetFile.fromJSON(path11, target) + [path12]: file_1.TargetFile.fromJSON(path12, target) }), {}); } } @@ -150805,14 +151112,14 @@ var require_url = __commonJS((exports) => { Object.defineProperty(exports, "__esModule", { value: true }); exports.join = join12; var url_1 = __require("url"); - function join12(base2, path11) { - return new url_1.URL(ensureTrailingSlash(base2) + removeLeadingSlash(path11)).toString(); + function join12(base2, path12) { + return new url_1.URL(ensureTrailingSlash(base2) + removeLeadingSlash(path12)).toString(); } - function ensureTrailingSlash(path11) { - return path11.endsWith("/") ? path11 : path11 + "/"; + function ensureTrailingSlash(path12) { + return path12.endsWith("/") ? path12 : path12 + "/"; } - function removeLeadingSlash(path11) { - return path11.startsWith("/") ? path11.slice(1) : path11; + function removeLeadingSlash(path12) { + return path12.startsWith("/") ? path12.slice(1) : path12; } }); @@ -150870,7 +151177,7 @@ var require_updater = __commonJS((exports) => { var models_1 = require_dist9(); var debug_1 = __importDefault(require_src()); var fs6 = __importStar(__require("fs")); - var path11 = __importStar(__require("path")); + var path12 = __importStar(__require("path")); var package_json_1 = require_package8(); var config_1 = require_config2(); var error_1 = require_error7(); @@ -150889,7 +151196,7 @@ var require_updater = __commonJS((exports) => { config; fetcher; constructor(options4) { - const { metadataDir, metadataBaseUrl, targetDir, targetBaseUrl, fetcher, config: config3 } = options4; + const { metadataDir, metadataBaseUrl, targetDir, targetBaseUrl, fetcher, config: config2 } = options4; this.dir = metadataDir; this.metadataBaseUrl = metadataBaseUrl; this.targetDir = targetDir; @@ -150897,8 +151204,8 @@ var require_updater = __commonJS((exports) => { this.forceCache = options4.forceCache ?? false; const data2 = this.loadLocalMetadata(models_1.MetadataKind.Root); this.trustedSet = new store_1.TrustedMetadataStore(data2); - this.config = { ...config_1.defaultConfig, ...config3 }; - const userAgent = config3?.userAgent ? `${config3.userAgent} tuf-js/${package_json_1.version}` : `tuf-js/${package_json_1.version}`; + this.config = { ...config_1.defaultConfig, ...config2 }; + const userAgent = config2?.userAgent ? `${config2.userAgent} tuf-js/${package_json_1.version}` : `tuf-js/${package_json_1.version}`; this.fetcher = fetcher || new fetcher_1.DefaultFetcher({ userAgent, timeout: this.config.fetchTimeout, @@ -150938,7 +151245,7 @@ var require_updater = __commonJS((exports) => { const consistentSnapshot = this.trustedSet.root.signed.consistentSnapshot; if (consistentSnapshot && this.config.prefixTargetsWithHash) { const hashes = Object.values(targetInfo.hashes); - const { dir: dir2, base: base2 } = path11.parse(targetFilePath); + const { dir: dir2, base: base2 } = path12.parse(targetFilePath); const filename = `${hashes[0]}.${base2}`; targetFilePath = dir2 ? `${dir2}/${filename}` : filename; } @@ -150965,7 +151272,7 @@ var require_updater = __commonJS((exports) => { return; } loadLocalMetadata(fileName) { - const filePath = path11.join(this.dir, `${fileName}.json`); + const filePath = path12.join(this.dir, `${fileName}.json`); log7("READ %s", filePath); return fs6.readFileSync(filePath); } @@ -151102,12 +151409,12 @@ var require_updater = __commonJS((exports) => { throw new error_1.ValueError("Target directory not set"); } const filePath = encodeURIComponent(targetInfo.path); - return path11.join(this.targetDir, filePath); + return path12.join(this.targetDir, filePath); } persistMetadata(metaDataName, bytesData) { const encodedName = encodeURIComponent(metaDataName); try { - const filePath = path11.join(this.dir, `${encodedName}.json`); + const filePath = path12.join(this.dir, `${encodedName}.json`); log7("WRITE %s", filePath); fs6.writeFileSync(filePath, bytesData.toString("utf8")); } catch (error46) { @@ -151209,13 +151516,13 @@ var require_target = __commonJS((exports) => { var fs_1 = __importDefault(__require("fs")); var error_1 = require_error8(); async function readTarget(tuf, targetPath) { - const path11 = await getTargetPath(tuf, targetPath); + const path12 = await getTargetPath(tuf, targetPath); return new Promise((resolve9, reject) => { - fs_1.default.readFile(path11, "utf-8", (err2, data2) => { + fs_1.default.readFile(path12, "utf-8", (err2, data2) => { if (err2) { reject(new error_1.TUFError({ code: "TUF_READ_TARGET_ERROR", - message: `error reading target ${path11}`, + message: `error reading target ${path12}`, cause: err2 })); } else { @@ -151241,19 +151548,19 @@ var require_target = __commonJS((exports) => { message: `target ${target} not found` }); } - let path11 = await tuf.findCachedTarget(targetInfo); - if (!path11) { + let path12 = await tuf.findCachedTarget(targetInfo); + if (!path12) { try { - path11 = await tuf.downloadTarget(targetInfo); + path12 = await tuf.downloadTarget(targetInfo); } catch (err2) { throw new error_1.TUFError({ code: "TUF_DOWNLOAD_TARGET_ERROR", - message: `error downloading target ${path11}`, + message: `error downloading target ${path12}`, cause: err2 }); } } - return path11; + return path12; } }); @@ -151337,7 +151644,7 @@ var require_client3 = __commonJS((exports) => { } } function initClient(options4) { - const config3 = { + const config2 = { fetchTimeout: options4.timeout, fetchRetry: options4.retry, userAgent: `${encodeURIComponent(package_json_1.name)}/${package_json_1.version}` @@ -151348,7 +151655,7 @@ var require_client3 = __commonJS((exports) => { metadataDir: options4.cachePath, targetDir: path_1.default.join(options4.cachePath, TARGETS_DIR_NAME), forceCache: options4.forceCache, - config: config3 + config: config2 }); } }); @@ -151696,15 +152003,15 @@ var require_certificate = __commonJS((exports) => { sort() { const leafCert = this.untrustedCert; let paths = this.buildPaths(leafCert); - paths = paths.filter((path12) => path12.some((cert) => this.trustedCerts.includes(cert))); + paths = paths.filter((path13) => path13.some((cert) => this.trustedCerts.includes(cert))); if (paths.length === 0) { throw new error_1.VerificationError({ code: "CERTIFICATE_ERROR", message: "no trusted certificate path found" }); } - const path11 = paths.reduce((prev2, curr) => prev2.length < curr.length ? prev2 : curr); - return [leafCert, ...path11].slice(0, -1); + const path12 = paths.reduce((prev2, curr) => prev2.length < curr.length ? prev2 : curr); + return [leafCert, ...path12].slice(0, -1); } buildPaths(certificate) { const paths = []; @@ -151761,30 +152068,30 @@ var require_certificate = __commonJS((exports) => { }); return issuers; } - checkPath(path11) { - if (path11.length < 1) { + checkPath(path12) { + if (path12.length < 1) { throw new error_1.VerificationError({ code: "CERTIFICATE_ERROR", message: "certificate chain must contain at least one certificate" }); } - const validCAs = path11.slice(1).every((cert) => cert.isCA); + const validCAs = path12.slice(1).every((cert) => cert.isCA); if (!validCAs) { throw new error_1.VerificationError({ code: "CERTIFICATE_ERROR", message: "intermediate certificate is not a CA" }); } - for (let i6 = path11.length - 2;i6 >= 0; i6--) { - if (!path11[i6].issuer.equals(path11[i6 + 1].subject)) { + for (let i6 = path12.length - 2;i6 >= 0; i6--) { + if (!path12[i6].issuer.equals(path12[i6 + 1].subject)) { throw new error_1.VerificationError({ code: "CERTIFICATE_ERROR", message: "incorrect certificate name chaining" }); } } - for (let i6 = 0;i6 < path11.length; i6++) { - const cert = path11[i6]; + for (let i6 = 0;i6 < path12.length; i6++) { + const cert = path12[i6]; if (cert.extBasicConstraints?.isCA) { const pathLength = cert.extBasicConstraints.pathLenConstraint; if (pathLength !== undefined && pathLength < i6 - 1) { @@ -151882,13 +152189,13 @@ var require_key4 = __commonJS((exports) => { return { key: key.publicKey }; } function verifyCertificate(leaf, timestamps, trustMaterial) { - let path11 = []; + let path12 = []; timestamps.forEach((timestamp2) => { - path11 = (0, certificate_1.verifyCertificateChain)(timestamp2, leaf, trustMaterial.certificateAuthorities); + path12 = (0, certificate_1.verifyCertificateChain)(timestamp2, leaf, trustMaterial.certificateAuthorities); }); return { - scts: (0, sct_1.verifySCTs)(path11[0], path11[1], trustMaterial.ctlogs), - signer: getSigner(path11[0]) + scts: (0, sct_1.verifySCTs)(path12[0], path12[1], trustMaterial.ctlogs), + signer: getSigner(path12[0]) }; } function getSigner(cert) { @@ -152842,14 +153149,14 @@ var require_sigstore = __commonJS((exports) => { var bundle_1 = require_dist6(); var tuf = __importStar(require_dist11()); var verify_1 = require_dist12(); - var config3 = __importStar(require_config3()); + var config2 = __importStar(require_config3()); async function sign4(payload, options4 = {}) { - const bundler = config3.createBundleBuilder("messageSignature", options4); + const bundler = config2.createBundleBuilder("messageSignature", options4); const bundle = await bundler.create({ data: payload }); return (0, bundle_1.bundleToJSON)(bundle); } async function attest(payload, payloadType, options4 = {}) { - const bundler = config3.createBundleBuilder("dsseEnvelope", options4); + const bundler = config2.createBundleBuilder("dsseEnvelope", options4); const bundle = await bundler.create({ data: payload, type: payloadType }); return (0, bundle_1.bundleToJSON)(bundle); } @@ -152869,17 +153176,17 @@ var require_sigstore = __commonJS((exports) => { rootPath: options4.tufRootPath, cachePath: options4.tufCachePath, forceCache: options4.tufForceCache, - retry: options4.retry ?? config3.DEFAULT_RETRY, - timeout: options4.timeout ?? config3.DEFAULT_TIMEOUT + retry: options4.retry ?? config2.DEFAULT_RETRY, + timeout: options4.timeout ?? config2.DEFAULT_TIMEOUT }); - const keyFinder = options4.keySelector ? config3.createKeyFinder(options4.keySelector) : undefined; + const keyFinder = options4.keySelector ? config2.createKeyFinder(options4.keySelector) : undefined; const trustMaterial = (0, verify_1.toTrustMaterial)(trustedRoot, keyFinder); const verifierOptions = { ctlogThreshold: options4.ctLogThreshold, tlogThreshold: options4.tlogThreshold }; const verifier = new verify_1.Verifier(trustMaterial, verifierOptions); - const policy = config3.createVerificationPolicy(options4); + const policy = config2.createVerificationPolicy(options4); return { verify: (bundle, payload) => { const deserializedBundle = (0, bundle_1.bundleFromJSON)(bundle); @@ -153362,8 +153669,8 @@ var require_fetcher2 = __commonJS((exports, module2) => { cleanupCached() { return cacache.rm.content(this.cache, this.integrity, this.opts); } - #empty(path11) { - return getContents({ path: path11, depth: 1 }).then((contents) => Promise.all(contents.map((entry) => rm3(entry, { recursive: true, force: true })))); + #empty(path12) { + return getContents({ path: path12, depth: 1 }).then((contents) => Promise.all(contents.map((entry) => rm3(entry, { recursive: true, force: true })))); } async#mkdir(dest) { await this.#empty(dest); @@ -153411,9 +153718,9 @@ var require_fetcher2 = __commonJS((exports, module2) => { tarball.pipe(extractor); return p2; } - #entryMode(path11, mode, type3) { + #entryMode(path12, mode, type3) { const m3 = /Directory|GNUDumpDir/.test(type3) ? this.dmode : /File$/.test(type3) ? this.fmode : 0; - const exe = isPackageBin(this.package, path11) ? 73 : 0; + const exe = isPackageBin(this.package, path12) ? 73 : 0; return (mode | m3) & ~this.umask | exe | 384; } #tarxOptions({ cwd }) { @@ -154591,16 +154898,16 @@ var require_commonjs7 = __commonJS((exports) => { var require_realpath = __commonJS((exports, module2) => { var { lstat, readlink: readlink2 } = __require("fs/promises"); var { resolve: resolve9, basename: basename2, dirname: dirname6 } = __require("path"); - var realpathCached = (path11, rpcache, stcache, depth) => { + var realpathCached = (path12, rpcache, stcache, depth) => { if (depth > 2000) { - throw eloop(path11); + throw eloop(path12); } - path11 = resolve9(path11); - if (rpcache.has(path11)) { - return Promise.resolve(rpcache.get(path11)); + path12 = resolve9(path12); + if (rpcache.has(path12)) { + return Promise.resolve(rpcache.get(path12)); } - const dir2 = dirname6(path11); - const base2 = basename2(path11); + const dir2 = dirname6(path12); + const base2 = basename2(path12); if (base2 && rpcache.has(dir2)) { return realpathChild(dir2, base2, rpcache, stcache, depth); } @@ -154608,24 +154915,24 @@ var require_realpath = __commonJS((exports, module2) => { rpcache.set(dir2, dir2); return Promise.resolve(dir2); } - return realpathCached(dir2, rpcache, stcache, depth + 1).then(() => realpathCached(path11, rpcache, stcache, depth + 1)); + return realpathCached(dir2, rpcache, stcache, depth + 1).then(() => realpathCached(path12, rpcache, stcache, depth + 1)); }; - var lstatCached = (path11, stcache) => { - if (stcache.has(path11)) { - return Promise.resolve(stcache.get(path11)); + var lstatCached = (path12, stcache) => { + if (stcache.has(path12)) { + return Promise.resolve(stcache.get(path12)); } - const p2 = lstat(path11).then((st2) => { - stcache.set(path11, st2); + const p2 = lstat(path12).then((st2) => { + stcache.set(path12, st2); return st2; }); - stcache.set(path11, p2); + stcache.set(path12, p2); return p2; }; - var eloop = (path11) => Object.assign(new Error(`ELOOP: too many symbolic links encountered, stat '${path11}'`), { + var eloop = (path12) => Object.assign(new Error(`ELOOP: too many symbolic links encountered, stat '${path12}'`), { errno: -62, syscall: "stat", code: "ELOOP", - path: path11 + path: path12 }); var realpathChild = (dir2, base2, rpcache, stcache, depth) => { const realdir = rpcache.get(dir2); @@ -154655,7 +154962,7 @@ var require_realpath = __commonJS((exports, module2) => { // node_modules/@npmcli/arborist/lib/debug.js var require_debug3 = __commonJS((exports, module2) => { - var __dirname = "D:\\App\\OpenCode\\opencode-unifia-rebrand\\node_modules\\@npmcli\\arborist\\lib"; + var __dirname = "D:\\App\\OpenCode\\opencode-work-design\\node_modules\\@npmcli\\arborist\\lib"; var debug2 = process.env.ARBORIST_DEBUG !== "0" && (process.env.ARBORIST_DEBUG === "1" || /\barborist\b/.test(process.env.NODE_DEBUG || "") || process.env.npm_package_name === "@npmcli/arborist" && ["test", "snap"].includes(process.env.npm_lifecycle_event) || process.cwd() === __require("path").resolve(__dirname, "..")); module2.exports = debug2 ? (fn3) => fn3() : () => {}; var red = process.stderr.isTTY ? (msg) => `\x1B[31m${msg}\x1B[39m` : (m3) => m3; @@ -155076,8 +155383,8 @@ var require_can_place_dep = __commonJS((exports, module2) => { get top() { return this.parent ? this.parent.top : this; } - canPlacePeers(state2) { - this.canPlaceSelf = state2; + canPlacePeers(state) { + this.canPlaceSelf = state; if (this._canPlacePeers) { return this._canPlacePeers; } @@ -155107,7 +155414,7 @@ var require_can_place_dep = __commonJS((exports, module2) => { sawConflict = true; } } - this._canPlacePeers = sawConflict ? CONFLICT : state2; + this._canPlacePeers = sawConflict ? CONFLICT : state; return this._canPlacePeers; } get peerSetSource() { @@ -155146,13 +155453,13 @@ var require_is_windows = __commonJS((exports, module2) => { var require_get_node_modules = __commonJS((exports, module2) => { var { dirname: dirname6, basename: basename2 } = __require("path"); var memo2 = new Map; - module2.exports = (path11) => { - if (memo2.has(path11)) { - return memo2.get(path11); + module2.exports = (path12) => { + if (memo2.has(path12)) { + return memo2.get(path12); } - const scopeOrNm = dirname6(path11); + const scopeOrNm = dirname6(path12); const nm = basename2(scopeOrNm) === "node_modules" ? scopeOrNm : dirname6(scopeOrNm); - memo2.set(path11, nm); + memo2.set(path12, nm); return nm; }; }); @@ -155161,7 +155468,7 @@ var require_get_node_modules = __commonJS((exports, module2) => { var require_get_prefix = __commonJS((exports, module2) => { var { dirname: dirname6 } = __require("path"); var getNodeModules = require_get_node_modules(); - module2.exports = (path11) => dirname6(getNodeModules(path11)); + module2.exports = (path12) => dirname6(getNodeModules(path12)); }); // node_modules/bin-links/lib/bin-target.js @@ -155170,7 +155477,7 @@ var require_bin_target = __commonJS((exports, module2) => { var getPrefix = require_get_prefix(); var getNodeModules = require_get_node_modules(); var { dirname: dirname6 } = __require("path"); - module2.exports = ({ top: top2, path: path11 }) => !top2 ? getNodeModules(path11) + "/.bin" : isWindows ? getPrefix(path11) : dirname6(getPrefix(path11)) + "/bin"; + module2.exports = ({ top: top2, path: path12 }) => !top2 ? getNodeModules(path12) + "/.bin" : isWindows ? getPrefix(path12) : dirname6(getPrefix(path12)) + "/bin"; }); // node_modules/cmd-shim/lib/to-batch-syntax.js @@ -155237,7 +155544,7 @@ var require_lib36 = __commonJS((exports, module2) => { var toBatchSyntax = require_to_batch_syntax(); var shebangExpr = /^#!\s*(?:\/usr\/bin\/env\s+(?:-S\s+)?((?:[^ \t=]+=[^ \t=]+\s+)*))?([^ \t]+)(.*)$/; var cmdShimIfExists = (from, to2) => stat4(from).then(() => cmdShim(from, to2), () => {}); - var rm3 = (path11) => unlink(path11).catch(() => {}); + var rm3 = (path12) => unlink(path12).catch(() => {}); var cmdShim = (from, to2) => stat4(from).then(() => cmdShim_(from, to2)); var cmdShim_ = (from, to2) => Promise.all([ rm3(to2), @@ -155392,10 +155699,10 @@ var require_lib37 = __commonJS((exports, module2) => { var { promisify } = __require("util"); var { readFileSync: readFileSync5 } = fs6; var readFile5 = promisify(fs6.readFile); - var extractPath = (path11, cmdshimContents) => { - if (/[.]cmd$/.test(path11)) { + var extractPath = (path12, cmdshimContents) => { + if (/[.]cmd$/.test(path12)) { return extractPathFromCmd(cmdshimContents); - } else if (/[.]ps1$/.test(path11)) { + } else if (/[.]ps1$/.test(path12)) { return extractPathFromPowershell(cmdshimContents); } else { return extractPathFromCygwin(cmdshimContents); @@ -155419,33 +155726,33 @@ var require_lib37 = __commonJS((exports, module2) => { newError.path = thrown.path; return newError; }; - var notaShim = (path11, er2) => { + var notaShim = (path12, er2) => { if (!er2) { er2 = new Error; Error.captureStackTrace(er2, notaShim); } er2.code = "ENOTASHIM"; - er2.message = `Can't read shim path from '${path11}', ` + `it doesn't appear to be a cmd-shim`; + er2.message = `Can't read shim path from '${path12}', ` + `it doesn't appear to be a cmd-shim`; return er2; }; - var readCmdShim = (path11) => { + var readCmdShim = (path12) => { const er2 = new Error; Error.captureStackTrace(er2, readCmdShim); - return readFile5(path11).then((contents) => { - const destination = extractPath(path11, contents.toString()); + return readFile5(path12).then((contents) => { + const destination = extractPath(path12, contents.toString()); if (destination) { return destination; } - throw notaShim(path11, er2); + throw notaShim(path12, er2); }, (readFileEr) => { throw wrapError(readFileEr, er2); }); }; - var readCmdShimSync = (path11) => { - const contents = readFileSync5(path11); - const destination = extractPath(path11, contents.toString()); + var readCmdShimSync = (path12) => { + const contents = readFileSync5(path12); + const destination = extractPath(path12, contents.toString()); if (!destination) { - throw notaShim(path11); + throw notaShim(path12); } return destination; }; @@ -155672,7 +155979,7 @@ var require_cjs = __commonJS((exports) => { // node_modules/write-file-atomic/lib/index.js var require_lib38 = __commonJS((exports, module2) => { - var __filename = "D:\\App\\OpenCode\\opencode-unifia-rebrand\\node_modules\\write-file-atomic\\lib\\index.js"; + var __filename = "D:\\App\\OpenCode\\opencode-work-design\\node_modules\\write-file-atomic\\lib\\index.js"; module2.exports = writeFile6; module2.exports.sync = writeFileSync; module2.exports._getTmpname = getTmpname; @@ -155680,7 +155987,7 @@ var require_lib38 = __commonJS((exports, module2) => { var fs6 = __require("fs"); var crypto3 = __require("crypto"); var { onExit: onExit6 } = require_cjs(); - var path11 = __require("path"); + var path12 = __require("path"); var { promisify } = __require("util"); var activeFiles = {}; var threadId = function getId() { @@ -155732,7 +156039,7 @@ var require_lib38 = __commonJS((exports, module2) => { let fd; let tmpfile; const removeOnExitHandler = onExit6(cleanupOnExit(() => tmpfile)); - const absoluteName = path11.resolve(filename); + const absoluteName = path12.resolve(filename); try { await serializeActiveFile(absoluteName); const truename = await promisify(fs6.realpath)(filename).catch(() => filename); @@ -155928,7 +156235,7 @@ var require_shim_bin = __commonJS((exports, module2) => { })); var handleReadCmdShimError = ({ er: er2, from, to: to2 }) => er2.code === "ENOENT" ? null : er2.code === "ENOTASHIM" ? failEEXIST({ from, to: to2 }) : Promise.reject(er2); var SKIP = Symbol("skip - missing or already installed"); - var shimBin = ({ path: path11, to: to2, from, absFrom, force }) => { + var shimBin = ({ path: path12, to: to2, from, absFrom, force }) => { const shims = [ to2, to2 + ".cmd", @@ -155957,9 +156264,9 @@ var require_shim_bin = __commonJS((exports, module2) => { } return readCmdShim(s5).then((target) => { target = resolve9(dirname6(to2), target); - const base2 = resolve9(path11); + const base2 = resolve9(path12); if (target !== base2 && !target.startsWith(base2 + sep2)) { - return failEEXIST({ from, to: to2, path: path11 }); + return failEEXIST({ from, to: to2, path: path12 }); } return false; }, (er2) => handleReadCmdShimError({ er: er2, from, to: to2 })); @@ -155997,7 +156304,7 @@ var require_link_gently = __commonJS((exports, module2) => { var seen = new Set; var SKIP = Symbol("skip - missing or already installed"); var CLOBBER = Symbol("clobber - ours or in forceful mode"); - var linkGently = async ({ path: path11, to: to2, from, absFrom, force }) => { + var linkGently = async ({ path: path12, to: to2, from, absFrom, force }) => { if (seen.has(to2)) { return false; } @@ -156018,7 +156325,7 @@ var require_link_gently = __commonJS((exports, module2) => { return SKIP; } target = resolve9(dirname6(to2), target); - if (target === path11 || target.startsWith(path11 + sep2) || force) { + if (target === path12 || target.startsWith(path12 + sep2) || force) { return rm3(to2, rmOpts).then(() => CLOBBER); } return false; @@ -156050,7 +156357,7 @@ var require_link_gently = __commonJS((exports, module2) => { var require_link_bin = __commonJS((exports, module2) => { var linkGently = require_link_gently(); var fixBin = require_fix_bin(); - var linkBin = ({ path: path11, to: to2, from, absFrom, force }) => linkGently({ path: path11, to: to2, from, absFrom, force }).then((linked) => linked && fixBin(absFrom)); + var linkBin = ({ path: path12, to: to2, from, absFrom, force }) => linkGently({ path: path12, to: to2, from, absFrom, force }).then((linked) => linked && fixBin(absFrom)); module2.exports = linkBin; }); @@ -156061,18 +156368,18 @@ var require_link_bins = __commonJS((exports, module2) => { var { dirname: dirname6, resolve: resolve9, relative: relative4 } = __require("path"); var linkBin = isWindows ? require_shim_bin() : require_link_bin(); var normalize4 = require_lib11(); - var linkBins = ({ path: path11, pkg, top: top2, force }) => { + var linkBins = ({ path: path12, pkg, top: top2, force }) => { pkg = normalize4(pkg); if (!pkg.bin) { return Promise.resolve([]); } const promises2 = []; - const target = binTarget({ path: path11, top: top2 }); + const target = binTarget({ path: path12, top: top2 }); for (const [key, val] of Object.entries(pkg.bin)) { const to2 = resolve9(target, key); - const absFrom = resolve9(path11, val); + const absFrom = resolve9(path12, val); const from = relative4(dirname6(to2), absFrom); - promises2.push(linkBin({ path: path11, from, to: to2, absFrom, force })); + promises2.push(linkBin({ path: path12, from, to: to2, absFrom, force })); } return Promise.all(promises2); }; @@ -156084,7 +156391,7 @@ var require_man_target = __commonJS((exports, module2) => { var isWindows = require_is_windows(); var getPrefix = require_get_prefix(); var { dirname: dirname6 } = __require("path"); - module2.exports = ({ top: top2, path: path11 }) => !top2 || isWindows ? null : dirname6(getPrefix(path11)) + "/share/man"; + module2.exports = ({ top: top2, path: path12 }) => !top2 || isWindows ? null : dirname6(getPrefix(path12)) + "/share/man"; }); // node_modules/bin-links/lib/link-mans.js @@ -156092,8 +156399,8 @@ var require_link_mans = __commonJS((exports, module2) => { var { dirname: dirname6, relative: relative4, join: join12, resolve: resolve9, basename: basename2 } = __require("path"); var linkGently = require_link_gently(); var manTarget = require_man_target(); - var linkMans = async ({ path: path11, pkg, top: top2, force }) => { - const target = manTarget({ path: path11, top: top2 }); + var linkMans = async ({ path: path12, pkg, top: top2, force }) => { + const target = manTarget({ path: path12, top: top2 }); if (!target || !Array.isArray(pkg?.man) || !pkg.man.length) { return []; } @@ -156108,25 +156415,25 @@ var require_link_mans = __commonJS((exports, module2) => { throw Object.assign(new Error(`invalid man entry name ` + "Man files must end with a number, " + "and optionally a .gz suffix if they are compressed."), { code: "EBADMAN", - path: path11, + path: path12, pkgid: pkg._id, man }); } const section = parseMan[1]; const base2 = basename2(man); - const absFrom = resolve9(path11, man); - if (absFrom.indexOf(path11) !== 0) { + const absFrom = resolve9(path12, man); + if (absFrom.indexOf(path12) !== 0) { throw Object.assign(new Error("invalid man entry"), { code: "EBADMAN", - path: path11, + path: path12, pkgid: pkg._id, man }); } const to2 = resolve9(target, "man" + section, base2); const from = relative4(dirname6(to2), absFrom); - links.push(linkGently({ from, to: to2, path: path11, absFrom, force })); + links.push(linkGently({ from, to: to2, path: path12, absFrom, force })); } return Promise.all(links); }; @@ -156140,23 +156447,23 @@ var require_check_bin = __commonJS((exports, module2) => { var { resolve: resolve9, dirname: dirname6, sep: sep2 } = __require("path"); var readCmdShim = require_lib37(); var { readlink: readlink2 } = __require("fs/promises"); - var checkBin = async ({ bin, path: path11, top: top2, global: global2, force }) => { + var checkBin = async ({ bin, path: path12, top: top2, global: global2, force }) => { if (force || !global2 || !top2) { return; } - const target = resolve9(binTarget({ path: path11, top: top2 }), bin); - path11 = resolve9(path11); - return isWindows ? checkShim({ target, path: path11 }) : checkLink({ target, path: path11 }); + const target = resolve9(binTarget({ path: path12, top: top2 }), bin); + path12 = resolve9(path12); + return isWindows ? checkShim({ target, path: path12 }) : checkLink({ target, path: path12 }); }; var handleReadLinkError = async ({ er: er2, target }) => er2.code === "ENOENT" ? null : failEEXIST({ target }); - var checkLink = async ({ target, path: path11 }) => { + var checkLink = async ({ target, path: path12 }) => { const current = await readlink2(target).catch((er2) => handleReadLinkError({ er: er2, target })); if (!current) { return; } const resolved = resolve9(dirname6(target), current); const resolvedLower = resolved.toLowerCase(); - const pathLower = path11.toLowerCase(); + const pathLower = path12.toLowerCase(); if (resolvedLower !== pathLower && !resolvedLower.startsWith(pathLower + sep2)) { return failEEXIST({ target }); } @@ -156166,7 +156473,7 @@ var require_check_bin = __commonJS((exports, module2) => { path: target, code: "EEXIST" })); - var checkShim = async ({ target, path: path11 }) => { + var checkShim = async ({ target, path: path12 }) => { const shims = [ target, target + ".cmd", @@ -156179,7 +156486,7 @@ var require_check_bin = __commonJS((exports, module2) => { } const resolved = resolve9(dirname6(shim3), current.replace(/\\/g, "/")); const resolvedLower = resolved.toLowerCase(); - const pathLower = path11.toLowerCase(); + const pathLower = path12.toLowerCase(); if (resolvedLower !== pathLower && !resolvedLower.startsWith(pathLower + sep2)) { return failEEXIST({ target: shim3 }); } @@ -156192,7 +156499,7 @@ var require_check_bin = __commonJS((exports, module2) => { var require_check_bins = __commonJS((exports, module2) => { var checkBin = require_check_bin(); var normalize4 = require_lib11(); - var checkBins = async ({ pkg, path: path11, top: top2, global: global2, force }) => { + var checkBins = async ({ pkg, path: path12, top: top2, global: global2, force }) => { if (force || !global2 || !top2) { return; } @@ -156200,7 +156507,7 @@ var require_check_bins = __commonJS((exports, module2) => { if (!pkg.bin) { return; } - await Promise.all(Object.keys(pkg.bin).map((bin) => checkBin({ bin, path: path11, top: top2, global: global2, force }))); + await Promise.all(Object.keys(pkg.bin).map((bin) => checkBin({ bin, path: path12, top: top2, global: global2, force }))); }; module2.exports = checkBins; }); @@ -156211,12 +156518,12 @@ var require_get_paths = __commonJS((exports, module2) => { var manTarget = require_man_target(); var { resolve: resolve9, basename: basename2, extname: extname3 } = __require("path"); var isWindows = require_is_windows(); - module2.exports = ({ path: path11, pkg, global: global2, top: top2 }) => { + module2.exports = ({ path: path12, pkg, global: global2, top: top2 }) => { if (top2 && !global2) { return []; } const binSet = []; - const binTarg = binTarget({ path: path11, top: top2 }); + const binTarg = binTarget({ path: path12, top: top2 }); if (pkg.bin) { for (const bin of Object.keys(pkg.bin)) { const b2 = resolve9(binTarg, bin); @@ -156227,7 +156534,7 @@ var require_get_paths = __commonJS((exports, module2) => { } } } - const manTarg = manTarget({ path: path11, top: top2 }); + const manTarg = manTarget({ path: path12, top: top2 }); const manSet = []; if (manTarg && pkg.man && Array.isArray(pkg.man) && pkg.man.length) { for (const man of pkg.man) { @@ -156248,13 +156555,13 @@ var require_lib39 = __commonJS((exports, module2) => { var linkBins = require_link_bins(); var linkMans = require_link_mans(); var binLinks = (opts) => { - const { path: path11, pkg, force, global: global2, top: top2 } = opts; + const { path: path12, pkg, force, global: global2, top: top2 } = opts; if (top2 && !global2) { return Promise.resolve(); } return Promise.all([ - linkBins({ path: path11, pkg, top: top2, force: force || !top2 }), - linkMans({ path: path11, pkg, top: top2, force }) + linkBins({ path: path12, pkg, top: top2, force: force || !top2 }), + linkMans({ path: path12, pkg, top: top2, force }) ]); }; var shimBin = require_shim_bin(); @@ -156277,14 +156584,14 @@ var require_commonjs8 = __commonJS((exports) => { Object.defineProperty(exports, "__esModule", { value: true }); exports.walkUp = undefined; var path_1 = __require("path"); - var walkUp = function* (path11) { - for (path11 = (0, path_1.resolve)(path11);path11; ) { - yield path11; - const pp = (0, path_1.dirname)(path11); - if (pp === path11) { + var walkUp = function* (path12) { + for (path12 = (0, path_1.resolve)(path12);path12; ) { + yield path12; + const pp = (0, path_1.dirname)(path12); + if (pp === path12) { break; } else { - path11 = pp; + path12 = pp; } } }; @@ -157144,7 +157451,7 @@ var require_printable = __commonJS((exports, module2) => { var relpath = require_relpath(); class ArboristNode { - constructor(tree, path11) { + constructor(tree, path12) { this.name = tree.name; if (tree.packageName && tree.packageName !== this.name) { this.packageName = tree.packageName; @@ -157212,33 +157519,33 @@ var require_printable = __commonJS((exports, module2) => { this.edgesIn = new Set([...tree.edgesIn].sort((a4, b2) => localeCompare2(a4.from.location, b2.from.location)).map((edge) => new EdgeIn(edge))); } if (tree.workspaces && tree.workspaces.size) { - this.workspaces = new Map([...tree.workspaces.entries()].map(([name3, path12]) => [name3, relpath(tree.root.realpath, path12)])); + this.workspaces = new Map([...tree.workspaces.entries()].map(([name3, path13]) => [name3, relpath(tree.root.realpath, path13)])); } if (tree.fsChildren.size) { - this.fsChildren = new Set([...tree.fsChildren].sort(({ path: a4 }, { path: b2 }) => localeCompare2(a4, b2)).map((tree2) => printableTree(tree2, path11))); + this.fsChildren = new Set([...tree.fsChildren].sort(({ path: a4 }, { path: b2 }) => localeCompare2(a4, b2)).map((tree2) => printableTree(tree2, path12))); } if (tree.children.size) { - this.children = new Map([...tree.children.entries()].sort(([a4], [b2]) => localeCompare2(a4, b2)).map(([name3, tree2]) => [name3, printableTree(tree2, path11)])); + this.children = new Map([...tree.children.entries()].sort(([a4], [b2]) => localeCompare2(a4, b2)).map(([name3, tree2]) => [name3, printableTree(tree2, path12)])); } } } class ArboristVirtualNode extends ArboristNode { - constructor(tree, path11) { - super(tree, path11); - this.sourceReference = printableTree(tree.sourceReference, path11); + constructor(tree, path12) { + super(tree, path12); + this.sourceReference = printableTree(tree.sourceReference, path12); } } class ArboristLink extends ArboristNode { - constructor(tree, path11) { - super(tree, path11); - this.target = printableTree(tree.target, path11); + constructor(tree, path12) { + super(tree, path12); + this.target = printableTree(tree.target, path12); } } - var treeError = ({ code, path: path11 }) => ({ + var treeError = ({ code, path: path12 }) => ({ code, - ...path11 ? { path: path11 } : {} + ...path12 ? { path: path12 } : {} }); class Edge2 { @@ -157277,17 +157584,17 @@ var require_printable = __commonJS((exports, module2) => { return `{ ${this.from || '""'} ${this.type} ${this.name}@${this.spec}${this.error ? " " + this.error : ""}${this.peerConflicted ? " peerConflicted" : ""} }`; } } - var printableTree = (tree, path11 = []) => { + var printableTree = (tree, path12 = []) => { if (!tree) { return tree; } const Cls = tree.isLink ? ArboristLink : tree.sourceReference ? ArboristVirtualNode : ArboristNode; - if (path11.includes(tree)) { + if (path12.includes(tree)) { const obj = Object.create(Cls.prototype); return Object.assign(obj, { location: tree.location }); } - path11.push(tree); - return new Cls(tree, path11); + path12.push(tree); + return new Cls(tree, path12); }; module2.exports = printableTree; }); @@ -161696,7 +162003,7 @@ var require_node5 = __commonJS((exports, module2) => { constructor(options4) { const { root, - path: path11, + path: path12, realpath: realpath2, parent, error: error46, @@ -161742,8 +162049,8 @@ var require_node5 = __commonJS((exports, module2) => { pkg.syncNormalize(); this[_package] = pkg.content; } - this.name = name3 || nameFromFolder(path11 || this.package.name || realpath2) || this.package.name || null; - this.path = path11 ? resolve9(path11) : null; + this.name = name3 || nameFromFolder(path12 || this.package.name || realpath2) || this.package.name || null; + this.path = path12 ? resolve9(path12) : null; if (!this.name && (!this.path || this.path !== dirname6(this.path))) { throw new TypeError("could not detect node name from path or package"); } @@ -161989,16 +162296,16 @@ var require_node5 = __commonJS((exports, module2) => { } return this.peer && omitSet.has("peer") || this.dev && omitSet.has("dev") || this.optional && omitSet.has("optional") || this.devOptional && omitSet.has("optional") && omitSet.has("dev"); } - getBundler(path11 = []) { - if (path11.includes(this)) { + getBundler(path12 = []) { + if (path12.includes(this)) { return null; } - path11.push(this); + path12.push(this); const parent = this[_parent]; if (!parent) { return null; } - const pBundler = parent.getBundler(path11); + const pBundler = parent.getBundler(path12); if (pBundler) { return pBundler; } @@ -162008,7 +162315,7 @@ var require_node5 = __commonJS((exports, module2) => { return parent; } for (const edge of this.edgesIn) { - const eBundler = edge.from.getBundler(path11); + const eBundler = edge.from.getBundler(path12); if (!eBundler) { continue; } @@ -162256,8 +162563,8 @@ var require_node5 = __commonJS((exports, module2) => { if (!this.#workspaces) { return; } - for (const [name3, path11] of this.#workspaces.entries()) { - new Edge2({ from: this, name: name3, spec: `file:${path11}`, type: "workspace" }); + for (const [name3, path12] of this.#workspaces.entries()) { + new Edge2({ from: this, name: name3, spec: `file:${path12}`, type: "workspace" }); } } [_loadDeps]() { @@ -162279,13 +162586,13 @@ var require_node5 = __commonJS((exports, module2) => { } this.#loadDepType(this.package.dependencies, "prod", ad); this.#loadDepType(this.package.optionalDependencies, "optional", ad); - const { globalTop, isTop, path: path11, sourceReference } = this; + const { globalTop, isTop, path: path12, sourceReference } = this; const { globalTop: srcGlobalTop, isTop: srcTop, path: srcPath } = sourceReference || {}; - const thisDev = isTop && !globalTop && path11; + const thisDev = isTop && !globalTop && path12; const srcDev = !sourceReference || srcTop && !srcGlobalTop && srcPath; if (thisDev && srcDev) { this.#loadDepType(this.package.devDependencies, "dev", ad); @@ -163602,16 +163909,16 @@ var require_just_diff = __commonJS((exports, module2) => { var obj1KeysLength = obj1Keys.length; var obj2Keys = Object.keys(obj22); var obj2KeysLength = obj2Keys.length; - var path11; + var path12; var lengthDelta = obj12.length - obj22.length; if (trimFromRight(obj12, obj22)) { for (var i6 = 0;i6 < obj1KeysLength; i6++) { var key = Array.isArray(obj12) ? Number(obj1Keys[i6]) : obj1Keys[i6]; if (!(key in obj22)) { - path11 = basePathForRemoves.concat(key); + path12 = basePathForRemoves.concat(key); diffs2.remove.push({ op: "remove", - path: pathConverter(path11) + path: pathConverter(path12) }); } } @@ -163628,10 +163935,10 @@ var require_just_diff = __commonJS((exports, module2) => { } } else { for (var i6 = 0;i6 < lengthDelta; i6++) { - path11 = basePathForRemoves.concat(i6); + path12 = basePathForRemoves.concat(i6); diffs2.remove.push({ op: "remove", - path: pathConverter(path11) + path: pathConverter(path12) }); } var obj1Trimmed = obj12.slice(lengthDelta); @@ -163656,27 +163963,27 @@ var require_just_diff = __commonJS((exports, module2) => { diffs }); return diffs.remove.reverse().concat(diffs.replace).concat(diffs.add); - function pushReplaces({ key, obj1: obj12, obj2: obj22, path: path11, pathForRemoves, diffs: diffs2 }) { + function pushReplaces({ key, obj1: obj12, obj2: obj22, path: path12, pathForRemoves, diffs: diffs2 }) { var obj1AtKey = obj12[key]; var obj2AtKey = obj22[key]; if (!(key in obj12) && key in obj22) { var obj2Value = obj2AtKey; diffs2.add.push({ op: "add", - path: pathConverter(path11), + path: pathConverter(path12), value: obj2Value }); } else if (obj1AtKey !== obj2AtKey) { if (Object(obj1AtKey) !== obj1AtKey || Object(obj2AtKey) !== obj2AtKey || differentTypes(obj1AtKey, obj2AtKey)) { - pushReplace(path11, diffs2, obj2AtKey); + pushReplace(path12, diffs2, obj2AtKey); } else { if (!Object.keys(obj1AtKey).length && !Object.keys(obj2AtKey).length && String(obj1AtKey) != String(obj2AtKey)) { - pushReplace(path11, diffs2, obj2AtKey); + pushReplace(path12, diffs2, obj2AtKey); } else { getDiff({ obj1: obj12[key], obj2: obj22[key], - basePath: path11, + basePath: path12, basePathForRemoves: pathForRemoves, diffs: diffs2 }); @@ -163684,10 +163991,10 @@ var require_just_diff = __commonJS((exports, module2) => { } } } - function pushReplace(path11, diffs2, newValue) { + function pushReplace(path12, diffs2, newValue) { diffs2.replace.push({ op: "replace", - path: pathConverter(path11), + path: pathConverter(path12), value: newValue }); } @@ -163781,9 +164088,9 @@ var require_just_diff_apply = __commonJS((exports, module2) => { subObject = subObject[thisProp]; } if (thisOp === REMOVE || thisOp === REPLACE || thisOp === MOVE) { - var path11 = thisOp === MOVE ? thisDiff.from : thisDiff.path; + var path12 = thisOp === MOVE ? thisDiff.from : thisDiff.path; if (!subObject.hasOwnProperty(lastProp)) { - throw new Error(["expected to find property", path11, "in object", obj].join(" ")); + throw new Error(["expected to find property", path12, "in object", obj].join(" ")); } } if (thisOp === REMOVE || thisOp === MOVE) { @@ -163891,10 +164198,10 @@ var require_lib41 = __commonJS((exports, module2) => { return prefer === "ours" ? resolve9(parent, ours, theirs) : resolve9(parent, theirs, ours); }; var isObj = (obj) => obj && typeof obj === "object"; - var copyPath = (to2, from, path11, i6) => { - const p2 = path11[i6]; + var copyPath = (to2, from, path12, i6) => { + const p2 = path12[i6]; if (isObj(to2[p2]) && isObj(from[p2]) && Array.isArray(to2[p2]) === Array.isArray(from[p2])) { - return copyPath(to2[p2], from[p2], path11, i6 + 1); + return copyPath(to2[p2], from[p2], path12, i6 + 1); } to2[p2] = from[p2]; }; @@ -164034,16 +164341,16 @@ var require_shrinkwrap = __commonJS((exports, module2) => { } return null; }; - var assertNoNewer = async (path11, data2, lockTime, dir2, seen) => { + var assertNoNewer = async (path12, data2, lockTime, dir2, seen) => { const base2 = basename2(dir2); - const isNM = dir2 !== path11 && base2 === "node_modules"; - const isScope = dir2 !== path11 && base2.startsWith("@"); - const isParent = dir2 === path11 || isNM || isScope; + const isNM = dir2 !== path12 && base2 === "node_modules"; + const isScope = dir2 !== path12 && base2.startsWith("@"); + const isParent = dir2 === path12 || isNM || isScope; const parent = isParent ? dir2 : resolve9(dir2, "node_modules"); - const rel = relpath(path11, dir2); + const rel = relpath(path12, dir2); seen.add(rel); let entries10; - if (dir2 === path11) { + if (dir2 === path12) { entries10 = [{ name: "node_modules", isDirectory: () => true }]; } else { const { mtime: dirTime } = await stat4(dir2); @@ -164058,17 +164365,17 @@ var require_shrinkwrap = __commonJS((exports, module2) => { await Promise.all(entries10.map(async (dirent) => { const child = resolve9(parent, dirent.name); if (dirent.isDirectory() && !dirent.name.startsWith(".")) { - await assertNoNewer(path11, data2, lockTime, child, seen); + await assertNoNewer(path12, data2, lockTime, child, seen); } else if (dirent.isSymbolicLink()) { const target = resolve9(parent, await readlink2(child)); const tstat = await stat4(target).catch(() => null); - seen.add(relpath(path11, child)); - if (tstat?.isDirectory() && !seen.has(relpath(path11, target))) { - await assertNoNewer(path11, data2, lockTime, target, seen); + seen.add(relpath(path12, child)); + if (tstat?.isDirectory() && !seen.has(relpath(path12, target))) { + await assertNoNewer(path12, data2, lockTime, target, seen); } } })); - if (dir2 !== path11) { + if (dir2 !== path12) { return; } for (const loc in data2.packages) { @@ -164103,10 +164410,10 @@ var require_shrinkwrap = __commonJS((exports, module2) => { s5.type = basename2(s5.filename); return s5; } - static metaFromNode(node, path11, options4 = {}) { + static metaFromNode(node, path12, options4 = {}) { if (node.isLink) { return { - resolved: relpath(path11, node.realpath), + resolved: relpath(path12, node.realpath), link: true }; } @@ -164129,7 +164436,7 @@ var require_shrinkwrap = __commonJS((exports, module2) => { meta[key] = node[key]; } } - const resolved = consistentResolve(node.resolved, node.path, path11, true); + const resolved = consistentResolve(node.resolved, node.path, path12, true); if (!resolved) {} else if (node.isRegistryDependency) { meta.resolved = overrideResolves(resolved, options4); } else { @@ -164156,7 +164463,7 @@ var require_shrinkwrap = __commonJS((exports, module2) => { #awaitingUpdate = new Map; constructor(options4 = {}) { const { - path: path11, + path: path12, indent = 2, newline = ` `, @@ -164173,7 +164480,7 @@ var require_shrinkwrap = __commonJS((exports, module2) => { this.lockfileVersion = null; } this.tree = null; - this.path = resolve9(path11 || "."); + this.path = resolve9(path12 || "."); this.filename = null; this.data = null; this.indent = indent; @@ -164377,34 +164684,34 @@ var require_shrinkwrap = __commonJS((exports, module2) => { } } #resolveMetaNode(loc, name3) { - for (let path11 = loc;; path11 = path11.replace(/(^|\/)[^/]*$/, "")) { - const check6 = `${path11}${path11 ? "/" : ""}node_modules/${name3}`; + for (let path12 = loc;; path12 = path12.replace(/(^|\/)[^/]*$/, "")) { + const check6 = `${path12}${path12 ? "/" : ""}node_modules/${name3}`; if (this.data.packages[check6]) { return this.data.packages[check6]; } - if (!path11) { + if (!path12) { break; } } return null; } - #lockFromLoc(lock, path11, i6 = 0) { + #lockFromLoc(lock, path12, i6 = 0) { if (!lock) { return null; } - if (path11[i6] === "") { + if (path12[i6] === "") { i6++; } - if (i6 >= path11.length) { + if (i6 >= path12.length) { return lock; } if (!lock.dependencies) { return null; } - return this.#lockFromLoc(lock.dependencies[path11[i6]], path11, i6 + 1); + return this.#lockFromLoc(lock.dependencies[path12[i6]], path12, i6 + 1); } - #pathToLoc(path11) { - return relpath(this.path, resolve9(this.path, path11)); + #pathToLoc(path12) { + return relpath(this.path, resolve9(this.path, path12)); } delete(nodePath2) { if (!this.data) { @@ -164413,9 +164720,9 @@ var require_shrinkwrap = __commonJS((exports, module2) => { const location2 = this.#pathToLoc(nodePath2); this.#awaitingUpdate.delete(location2); delete this.data.packages[location2]; - const path11 = location2.split(/(?:^|\/)node_modules\//); - const name3 = path11.pop(); - const pLock = this.#lockFromLoc(this.data, path11); + const path12 = location2.split(/(?:^|\/)node_modules\//); + const name3 = path12.pop(); + const pLock = this.#lockFromLoc(this.data, path12); if (pLock && pLock.dependencies) { delete pLock.dependencies[name3]; } @@ -164431,9 +164738,9 @@ var require_shrinkwrap = __commonJS((exports, module2) => { if (this.data.packages[location2]) { return this.data.packages[location2]; } - const path11 = location2.split(/(?:^|\/)node_modules\//); - const name3 = path11[path11.length - 1]; - const lock = this.#lockFromLoc(this.data, path11); + const path12 = location2.split(/(?:^|\/)node_modules\//); + const name3 = path12[path12.length - 1]; + const lock = this.#lockFromLoc(this.data, path12); return this.#metaFromLock(location2, name3, lock); } #metaFromLock(location2, name3, lock) { @@ -164628,7 +164935,7 @@ var require_shrinkwrap = __commonJS((exports, module2) => { return { ...this.data }; } } - #buildLegacyLockfile(node, lock, path11 = []) { + #buildLegacyLockfile(node, lock, path12 = []) { if (node === this.tree) { lock.name = node.packageName || node.name; if (node.version) { @@ -164716,11 +165023,11 @@ var require_shrinkwrap = __commonJS((exports, module2) => { if (!children.size) { delete lock.dependencies; } else { - const kidPath = [...path11, node.realpath]; + const kidPath = [...path12, node.realpath]; const dependencies = {}; let found = false; for (const [name3, kid] of children.entries()) { - if (path11.includes(kid.realpath)) { + if (path12.includes(kid.realpath)) { continue; } dependencies[name3] = this.#buildLegacyLockfile(kid, {}, kidPath); @@ -165168,7 +165475,7 @@ var require_build_ideal_tree = __commonJS((exports, module2) => { this.#depsQueue.push(tree); } async#add(tree, { add: add10, saveType = null, saveBundle = false }) { - const path11 = tree.target.path; + const path12 = tree.target.path; await Promise.all(add10.map(async (rawSpec) => { let spec = npa(rawSpec); const isTag = spec.rawSpec && spec.type === "tag"; @@ -165182,12 +165489,12 @@ var require_build_ideal_tree = __commonJS((exports, module2) => { } const { name: name3 } = spec; if (spec.type === "file") { - spec = npa(`file:${relpath(path11, spec.fetchSpec)}`, path11); + spec = npa(`file:${relpath(path12, spec.fetchSpec)}`, path12); spec.name = name3; } else if (spec.type === "directory") { try { const real4 = await realpath2(spec.fetchSpec, this[_rpcache], this[_stcache]); - spec = npa(`file:${relpath(path11, real4)}`, path11); + spec = npa(`file:${relpath(path12, real4)}`, path12); spec.name = name3; } catch {} } @@ -165299,10 +165606,10 @@ This is a one-time fix-up, please be patient... } queue.push(async () => { log7.silly("inflate", node.location); - const { resolved, version: version4, path: path11, name: name3, location: location2, integrity } = node; + const { resolved, version: version4, path: path12, name: name3, location: location2, integrity } = node; const useResolved = resolved && (!version4 || resolved.startsWith("file:")); const id2 = useResolved ? resolved : version4; - const spec = npa.resolve(name3, id2, dirname6(path11)); + const spec = npa.resolve(name3, id2, dirname6(path12)); const t2 = `idealTree:inflate:${location2}`; this.addTracker(t2); try { @@ -165362,18 +165669,18 @@ This is a one-time fix-up, please be patient... if (crackOpen) { const Arborist = this.constructor; const opt2 = { ...this.options }; - await cacache.tmp.withTmp(this.cache, opt2, async (path11) => { - await pacote.extract(node.resolved, path11, { + await cacache.tmp.withTmp(this.cache, opt2, async (path12) => { + await pacote.extract(node.resolved, path12, { ...opt2, Arborist, resolved: node.resolved, integrity: node.integrity }); if (hasShrinkwrap) { - await new Arborist({ ...this.options, path: path11 }).loadVirtual({ root: node }); + await new Arborist({ ...this.options, path: path12 }).loadVirtual({ root: node }); } if (hasBundle) { - await new Arborist({ ...this.options, path: path11 }).loadActual({ root: node, ignoreMissing: true }); + await new Arborist({ ...this.options, path: path12 }).loadActual({ root: node, ignoreMissing: true }); } }); } @@ -165904,9 +166211,9 @@ var require_load_actual = __commonJS((exports, module2) => { await this[_setWorkspaces](this.#actualTree); if (this.#actualTree.workspaces && this.#actualTree.workspaces.size) { const promises2 = []; - for (const path11 of this.#actualTree.workspaces.values()) { - if (!this.#cache.has(path11)) { - const p2 = this.#loadFSNode({ path: path11, root: this.#actualTree, useRootOverrides: true }).then((node) => this.#loadFSTree(node)); + for (const path12 of this.#actualTree.workspaces.values()) { + if (!this.#cache.has(path12)) { + const p2 = this.#loadFSNode({ path: path12, root: this.#actualTree, useRootOverrides: true }).then((node) => this.#loadFSTree(node)); promises2.push(p2); } } @@ -165915,10 +166222,10 @@ var require_load_actual = __commonJS((exports, module2) => { if (!ignoreMissing) { await this.#findMissingEdges(); } - for (const path11 of this.#topNodes) { - const node = this.#cache.get(path11); + for (const path12 of this.#topNodes) { + const node = this.#cache.get(path12); if (node && !node.parent && !node.fsParent) { - for (const p2 of walkUp(dirname6(path11))) { + for (const p2 of walkUp(dirname6(path12))) { if (this.#cache.has(p2)) { node.fsParent = this.#cache.get(p2); break; @@ -165955,22 +166262,22 @@ var require_load_actual = __commonJS((exports, module2) => { } this.#actualTree = root; } - async#loadFSNode({ path: path11, parent, real: real4, root, loadOverrides, useRootOverrides }) { + async#loadFSNode({ path: path12, parent, real: real4, root, loadOverrides, useRootOverrides }) { if (!real4) { try { - real4 = await realpath2(path11, this[_rpcache], this[_stcache]); + real4 = await realpath2(path12, this[_rpcache], this[_stcache]); } catch (error46) { return new Node4({ error: error46, - path: path11, - realpath: path11, + path: path12, + realpath: path12, parent, root, loadOverrides }); } } - const cached4 = this.#cache.get(path11); + const cached4 = this.#cache.get(path12); let node; if (cached4 && !cached4.dummy) { cached4.parent = parent; @@ -165979,7 +166286,7 @@ var require_load_actual = __commonJS((exports, module2) => { const params = { installLinks: this.installLinks, legacyPeerDeps: this.legacyPeerDeps, - path: path11, + path: path12, realpath: real4, parent, root, @@ -165997,13 +166304,13 @@ var require_load_actual = __commonJS((exports, module2) => { } params.error = err2; } - if (normalize4(path11) === real4) { + if (normalize4(path12) === real4) { node = this.#newNode(params); } else { node = await this.#newLink(params); } } - this.#cache.set(path11, node); + this.#cache.set(path12, node); return node; } #newNode(options4) { @@ -166200,8 +166507,8 @@ var require_load_virtual = __commonJS((exports, module2) => { cwd: this.path, lockfile: s5.data }); - for (const [name3, path11] of workspaces.entries()) { - lockWS[name3] = `file:${path11}`; + for (const [name3, path12] of workspaces.entries()) { + lockWS[name3] = `file:${path12}`; } const rootNames = new Set(root.edgesOut.keys()); const lockByType = { dev, optional: optional4, peer, peerOptional, prod, workspace: lockWS }; @@ -166262,18 +166569,18 @@ To fix: } #loadNode(location2, sw, loadOverrides) { const p2 = this.virtualTree ? this.virtualTree.realpath : this.path; - const path11 = resolve9(p2, location2); + const path12 = resolve9(p2, location2); if (!sw.name) { - sw.name = nameFromFolder(path11); + sw.name = nameFromFolder(path12); } const node = new Node4({ installLinks: this.installLinks, legacyPeerDeps: this.legacyPeerDeps, root: this.virtualTree, - path: path11, - realpath: path11, + path: path12, + realpath: path12, integrity: sw.integrity, - resolved: consistentResolve(sw.resolved, this.path, path11), + resolved: consistentResolve(sw.resolved, this.path, path12), pkg: sw, hasShrinkwrap: sw.hasShrinkwrap, loadOverrides, @@ -166286,11 +166593,11 @@ To fix: return node; } #loadLink(location2, targetLoc, target) { - const path11 = resolve9(this.path, location2); + const path12 = resolve9(this.path, location2); const link4 = new Link2({ installLinks: this.installLinks, legacyPeerDeps: this.legacyPeerDeps, - path: path11, + path: path12, realpath: resolve9(this.path, targetLoc), target, pkg: target && target.package @@ -166483,8 +166790,8 @@ var require_rebuild = __commonJS((exports, module2) => { if (!node.globalTop || this.options.force) { return; } - const { path: path11, package: pkg } = node; - await binLinks.checkBins({ pkg, path: path11, top: true, global: true }); + const { path: path12, package: pkg } = node; + await binLinks.checkBins({ pkg, path: path12, top: true, global: true }); } async#addToBuildSet(node, set24, refreshed = false) { if (set24.has(node)) { @@ -166530,7 +166837,7 @@ var require_rebuild = __commonJS((exports, module2) => { const limit = this.options.foregroundScripts ? 1 : undefined; await promiseCallLimit(queue.map((node) => async () => { const { - path: path11, + path: path12, integrity, resolved, optional: optional4, @@ -166540,7 +166847,7 @@ var require_rebuild = __commonJS((exports, module2) => { package: pkg, location: location2 } = node.target; - if (this[_trashList].has(path11) || node.isLink && node.target?.isInStore) { + if (this[_trashList].has(path12) || node.isLink && node.target?.isInStore) { return; } const timeEndLocation = time5.start(`build:run:${event}:${location2}`); @@ -166548,7 +166855,7 @@ var require_rebuild = __commonJS((exports, module2) => { const env3 = { npm_package_resolved: resolved, npm_package_integrity: integrity, - npm_package_json: resolve9(path11, "package.json"), + npm_package_json: resolve9(path12, "package.json"), npm_package_optional: boolEnv(optional4), npm_package_dev: boolEnv(dev), npm_package_peer: boolEnv(peer), @@ -166556,7 +166863,7 @@ var require_rebuild = __commonJS((exports, module2) => { }; const runOpts = { event, - path: path11, + path: path12, pkg, stdio, env: env3, @@ -166569,7 +166876,7 @@ var require_rebuild = __commonJS((exports, module2) => { }).then(({ args: args3, code, signal, stdout, stderr }) => { this.scriptsRun.add({ pkg, - path: path11, + path: path12, event, cmd: args3 && args3[args3.length - 1], env: env3, @@ -166711,7 +167018,7 @@ var require_diff2 = __commonJS((exports, module2) => { if (ideal.version !== actual.version) { return "CHANGE"; } - const binsExist = ideal.binPaths.every((path11) => existsSync4(path11)); + const binsExist = ideal.binPaths.every((path12) => existsSync4(path12)); const noIntegrity = !ideal.integrity && !actual.integrity; const noResolved = !ideal.resolved && !actual.resolved; const resolvedMatch = ideal.resolved && ideal.resolved === actual.resolved; @@ -166757,9 +167064,9 @@ var require_diff2 = __commonJS((exports, module2) => { return children; } const paths = new Set([...actualKids.keys(), ...idealKids.keys()]); - for (const path11 of paths) { - const actual2 = actualKids.get(path11); - const ideal2 = idealKids.get(path11); + for (const path12 of paths) { + const actual2 = actualKids.get(path12); + const ideal2 = idealKids.get(path12); diffNode({ actual: actual2, ideal: ideal2, @@ -167022,8 +167329,8 @@ var require_reify = __commonJS((exports, module2) => { node.parent = null; } } - for (const path11 of this[_trashList]) { - const loc = relpath(this.idealTree.realpath, path11); + for (const path12 of this[_trashList]) { + const loc = relpath(this.idealTree.realpath, path12); const node = this.idealTree.inventory.get(loc); if (node && node.root === this.idealTree) { node.parent = null; @@ -167083,7 +167390,7 @@ var require_reify = __commonJS((exports, module2) => { await this.actualTree.meta.save(); const ignoreScripts = !!this.options.ignoreScripts; if (!this.options.dryRun && !ignoreScripts && this.diff && this.diff.children.length) { - const { path: path11, package: pkg } = this.actualTree.target; + const { path: path12, package: pkg } = this.actualTree.target; const stdio = this.options.foregroundScripts ? "inherit" : "pipe"; const { scripts = {} } = pkg; for (const event of ["predependencies", "dependencies", "postdependencies"]) { @@ -167091,7 +167398,7 @@ var require_reify = __commonJS((exports, module2) => { log7.info("run", pkg._id, event, scripts[event]); await time5.start(`reify:run:${event}`, () => runScript({ event, - path: path11, + path: path12, pkg, stdio, scriptShell: this.options.scriptShell @@ -167246,13 +167553,13 @@ var require_reify = __commonJS((exports, module2) => { const paths = [node.path, ...node.binPaths]; const moves = this.#retiredPaths; log7.silly("reify", "mark", retire ? "retired" : "deleted", paths); - for (const path11 of paths) { + for (const path12 of paths) { if (retire) { - const retired = retirePath(path11); - moves[path11] = retired; + const retired = retirePath(path12); + moves[path12] = retired; this[_trashList].add(retired); } else { - this[_trashList].add(path11); + this[_trashList].add(path12); } } } @@ -167322,7 +167629,7 @@ var require_reify = __commonJS((exports, module2) => { const roots = this.#sparseTreeRoots; const failures = []; const targets = [...roots, ...Object.keys(this.#retiredPaths)]; - const unlinks = targets.map((path11) => rm3(path11, { recursive: true, force: true }).catch((er3) => failures.push([path11, er3]))); + const unlinks = targets.map((path12) => rm3(path12, { recursive: true, force: true }).catch((er3) => failures.push([path12, er3]))); return promiseAllRejectLate(unlinks).then(() => { if (failures.length) { log7.warn("cleanup", "Failed to remove some directories", failures); @@ -167682,10 +167989,10 @@ var require_reify = __commonJS((exports, module2) => { path: fromPath, depth: 1, packageJsonCache: new Map([[fromPath + "/package.json", node.package]]) - }).then((res) => promiseAllRejectLate(res.map((path11) => { - const rel = relative4(fromPath, path11); + }).then((res) => promiseAllRejectLate(res.map((path12) => { + const rel = relative4(fromPath, path12); const to2 = resolve9(node.path, rel); - return this[_renamePath](path11, to2); + return this[_renamePath](path12, to2); }))); } [_rollbackMoveBackRetiredUnchanged](er2) { @@ -167725,9 +168032,9 @@ var require_reify = __commonJS((exports, module2) => { const timeEnd = time5.start("reify:trash"); const promises2 = []; const failures = []; - const _rm = (path11) => rm3(path11, { recursive: true, force: true }).catch((er2) => failures.push([path11, er2])); - for (const path11 of this[_trashList]) { - promises2.push(_rm(path11)); + const _rm = (path12) => rm3(path12, { recursive: true, force: true }).catch((er2) => failures.push([path12, er2])); + for (const path12 of this[_trashList]) { + promises2.push(_rm(path12)); } await promiseAllRejectLate(promises2); if (failures.length) { @@ -168382,12 +168689,12 @@ var require_arborist = __commonJS((exports, module2) => { } const nodes2 = []; for (const name3 of workspaces) { - const path11 = wsMap.get(name3); - if (!path11) { + const path12 = wsMap.get(name3); + if (!path12) { log7.warn("workspaces", `${name3} in filter set, but not in workspaces`); continue; } - const loc = relpath(tree.realpath, path11); + const loc = relpath(tree.realpath, path12); const node = tree.inventory.get(loc); if (!node) { log7.warn("workspaces", `${name3} in filter set, but no workspace folder present`); @@ -168518,7 +168825,7 @@ var require_lib42 = __commonJS((exports, module2) => { }); // packages/unifia/src/npm/index.ts -import path11 from "path"; +import path12 from "path"; import { readdir as readdir2, rm as rm3 } from "fs/promises"; var import_semver2, import_arborist, Npm; var init_npm = __esm(async () => { @@ -168538,7 +168845,7 @@ var init_npm = __esm(async () => { pkg: zod_default.string() })); function directory(pkg) { - return path11.join(Global.Path.cache, "packages", pkg); + return path12.join(Global.Path.cache, "packages", pkg); } function resolveEntryPoint(name3, dir2) { let entrypoint; @@ -168615,15 +168922,15 @@ var init_npm = __esm(async () => { savePrefix: "", ignoreScripts: true }); - await arb.reify().catch(() => {}); + await arb.reify(); }; - if (!await Filesystem.exists(path11.join(dir2, "node_modules"))) { + if (!await Filesystem.exists(path12.join(dir2, "node_modules"))) { log7.info("node_modules missing, reifying"); await reify(); return; } - const pkg = await Filesystem.readJson(path11.join(dir2, "package.json")).catch(() => ({})); - const lock = await Filesystem.readJson(path11.join(dir2, "package-lock.json")).catch(() => ({})); + const pkg = await Filesystem.readJson(path12.join(dir2, "package.json")).catch(() => ({})); + const lock = await Filesystem.readJson(path12.join(dir2, "package-lock.json")).catch(() => ({})); const declared = new Set([ ...Object.keys(pkg.dependencies || {}), ...Object.keys(pkg.devDependencies || {}), @@ -168649,14 +168956,14 @@ var init_npm = __esm(async () => { Npm.install = install; async function which2(pkg) { const dir2 = directory(pkg); - const binDir = path11.join(dir2, "node_modules", ".bin"); + const binDir = path12.join(dir2, "node_modules", ".bin"); const pick5 = async () => { const files = await readdir2(binDir).catch(() => []); if (files.length === 0) return; if (files.length === 1) return files[0]; - const pkgJson = await Filesystem.readJson(path11.join(dir2, "node_modules", pkg, "package.json")).catch(() => { + const pkgJson = await Filesystem.readJson(path12.join(dir2, "node_modules", pkg, "package.json")).catch(() => { return; }); if (pkgJson?.bin) { @@ -168673,20 +168980,20 @@ var init_npm = __esm(async () => { }; const bin = await pick5(); if (bin) - return path11.join(binDir, bin); - await rm3(path11.join(dir2, "package-lock.json"), { force: true }); + return path12.join(binDir, bin); + await rm3(path12.join(dir2, "package-lock.json"), { force: true }); await add10(pkg); const resolved = await pick5(); if (!resolved) return; - return path11.join(binDir, resolved); + return path12.join(binDir, resolved); } Npm.which = which2; })(Npm ||= {}); }); // packages/unifia/src/plugin/shared.ts -import path12 from "path"; +import path13 from "path"; import { fileURLToPath as fileURLToPath3, pathToFileURL as pathToFileURL2 } from "url"; function isDeprecatedPlugin(spec) { return DEPRECATED_PLUGIN_PACKAGES.some((pkg) => spec.includes(pkg)); @@ -168705,12 +169012,12 @@ function pluginSource(spec) { function resolveExportPath(raw3, dir2) { if (raw3.startsWith("file://")) return fileURLToPath3(raw3); - if (path12.isAbsolute(raw3)) + if (path13.isAbsolute(raw3)) return raw3; - return path12.resolve(dir2, raw3); + return path13.resolve(dir2, raw3); } function isAbsolutePath(raw3) { - return path12.isAbsolute(raw3) || /^[A-Za-z]:[\\/]/.test(raw3); + return path13.isAbsolute(raw3) || /^[A-Za-z]:[\\/]/.test(raw3); } function extractExportValue(value8) { if (typeof value8 === "string") @@ -168762,12 +169069,12 @@ function resolvePackageEntrypoint(spec, kind, pkg) { function targetPath(target) { if (target.startsWith("file://")) return fileURLToPath3(target); - if (path12.isAbsolute(target)) + if (path13.isAbsolute(target)) return target; } async function resolveDirectoryIndex(dir2) { for (const name3 of INDEX_FILES) { - const file4 = path12.join(dir2, name3); + const file4 = path13.join(dir2, name3); if (await Filesystem.exists(file4)) return file4; } @@ -168819,14 +169126,14 @@ function isPathPluginSpec(spec) { } async function resolvePathPluginTarget(spec) { const raw3 = spec.startsWith("file://") ? fileURLToPath3(spec) : spec; - const file4 = path12.isAbsolute(raw3) || /^[A-Za-z]:[\\/]/.test(raw3) ? raw3 : path12.resolve(raw3); + const file4 = path13.isAbsolute(raw3) || /^[A-Za-z]:[\\/]/.test(raw3) ? raw3 : path13.resolve(raw3); const stat4 = await Filesystem.statAsync(file4); if (!stat4?.isDirectory()) { if (spec.startsWith("file://")) return spec; return pathToFileURL2(file4).href; } - if (await Filesystem.exists(path12.join(file4, "package.json"))) { + if (await Filesystem.exists(path13.join(file4, "package.json"))) { return pathToFileURL2(file4).href; } const index3 = await resolveDirectoryIndex(file4); @@ -168861,8 +169168,8 @@ async function resolvePluginTarget(spec, parsed = parsePluginSpecifier(spec)) { async function readPluginPackage(target) { const file4 = target.startsWith("file://") ? fileURLToPath3(target) : target; const stat4 = await Filesystem.statAsync(file4); - const dir2 = stat4?.isDirectory() ? file4 : path12.dirname(file4); - const pkg = path12.join(dir2, "package.json"); + const dir2 = stat4?.isDirectory() ? file4 : path13.dirname(file4); + const pkg = path13.join(dir2, "package.json"); const json5 = await Filesystem.readJson(pkg); return { dir: dir2, pkg, json: json5 }; } @@ -168941,18 +169248,8 @@ var init_shared = __esm(async () => { INDEX_FILES = ["index.ts", "index.tsx", "index.js", "index.mjs", "index.cjs"]; }); -// packages/unifia/src/provider/models-snapshot.js -var exports_models_snapshot = {}; -__export(exports_models_snapshot, { - snapshot: () => snapshot3 -}); -var snapshot3; -var init_models_snapshot = __esm(() => { - snapshot3 = { zhipuai: { id: "zhipuai", env: ["ZHIPU_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://open.bigmodel.cn/api/paas/v4", name: "Zhipu AI", doc: "https://docs.z.ai/guides/overview/pricing", models: { "glm-5": { id: "glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.2, cache_write: 0 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-27", last_updated: "2026-03-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26, cache_write: 0 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26, cache_write: 0 } }, "glm-5v-turbo": { id: "glm-5v-turbo", name: "GLM-5V-Turbo", description: "Fast GLM vision model for screenshots, documents, and multimodal agent tasks", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 5, output: 22, cache_read: 1.2, cache_write: 0 } }, "glm-4.5-flash": { id: "glm-4.5-flash", name: "GLM-4.5-Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-4.7": { id: "glm-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "glm-4.5v": { id: "glm-4.5v", name: "GLM-4.5V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 64000, output: 16384 }, cost: { input: 0.6, output: 1.8 } }, "glm-4.5": { id: "glm-4.5", name: "GLM-4.5", description: "Hybrid-reasoning GLM release that made the 4.5 line broadly useful", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "glm-4.6": { id: "glm-4.6", name: "GLM-4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "glm-4.7-flashx": { id: "glm-4.7-flashx", name: "GLM-4.7-FlashX", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0.07, output: 0.4, cache_read: 0.01, cache_write: 0 } }, "glm-4.7-flash": { id: "glm-4.7-flash", name: "GLM-4.7-Flash", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-4.5-air": { id: "glm-4.5-air", name: "GLM-4.5-Air", description: "Lighter GLM-4.5 variant for fast coding assistance and cheaper agents", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.2, output: 1.1, cache_read: 0.03, cache_write: 0 } }, "glm-4.6v": { id: "glm-4.6v", name: "GLM-4.6V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.3, output: 0.9 } } } }, lucidquery: { id: "lucidquery", env: ["LUCIDQUERY_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.lucidquery.com/v1", name: "LucidQuery", doc: "https://lucidquery.com/docs", models: { "lucidquery-agi-01-frontier": { id: "lucidquery-agi-01-frontier", name: "AGI-01 Frontier", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "agi", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2026-06-05", release_date: "2026-06-16", last_updated: "2026-06-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 120000 }, cost: { input: 4.5, output: 22 } }, "lucidnova-rf1-100b": { id: "lucidnova-rf1-100b", name: "LucidNova RF1 100B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "nova", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2025-09-16", release_date: "2024-12-28", last_updated: "2025-09-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 120000, output: 8000 }, cost: { input: 2, output: 5 } }, "lucidquery-agi-01-swift": { id: "lucidquery-agi-01-swift", name: "AGI-01 Swift", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "agi", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2026-06-05", release_date: "2026-06-16", last_updated: "2026-06-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 120000 }, cost: { input: 2.5, output: 15 } }, "lucidquery-nexus-coder": { id: "lucidquery-nexus-coder", name: "LucidQuery Nexus Coder", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "lucid", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2025-08-01", release_date: "2025-09-01", last_updated: "2025-09-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 250000, output: 60000 }, cost: { input: 2, output: 5 } } } }, anyapi: { id: "anyapi", env: ["ANYAPI_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.anyapi.ai/v1", name: "AnyAPI", doc: "https://docs.anyapi.ai", models: { "cohere/command-r-plus-08-2024": { id: "cohere/command-r-plus-08-2024", name: "Command R+", description: "Cohere's RAG workhorse for long-context enterprise search and tool use", family: "command-r", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-08-30", last_updated: "2024-08-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 } }, "google/gemini-3-flash-preview": { id: "google/gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 } }, "google/gemini-3-pro-preview": { id: "google/gemini-3-pro-preview", name: "Gemini 3 Pro Preview", description: "Preview Gemini flagship for complex reasoning, coding, and rich multimodal prompts", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 } }, "google/gemini-2.5-flash-lite": { id: "google/gemini-2.5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 } }, "mistralai/devstral-2512": { id: "mistralai/devstral-2512", name: "Devstral 2", description: "Mistral's coding-agent model for repository work, terminal tasks, and software fixes", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-12", release_date: "2025-12-09", last_updated: "2025-12-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated" }, "mistralai/mistral-large-2512": { id: "mistralai/mistral-large-2512", name: "Mistral Large 3", description: "Mistral's largest general model for enterprise agents, coding, and multilingual reasoning", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 } }, "xai/grok-4.3": { id: "xai/grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 } }, "deepseek/deepseek-r1": { id: "deepseek/deepseek-r1", name: "DeepSeek Reasoner", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-09", release_date: "2025-12-01", last_updated: "2026-02-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 } }, "deepseek/deepseek-chat": { id: "deepseek/deepseek-chat", name: "DeepSeek Chat", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-12-01", last_updated: "2026-02-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 } }, "anthropic/claude-sonnet-4-6": { id: "anthropic/claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 } }, "anthropic/claude-haiku-4-5": { id: "anthropic/claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 } }, "anthropic/claude-opus-4-6": { id: "anthropic/claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024, max: 127999 }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } } }, "anthropic/claude-sonnet-4-5": { id: "anthropic/claude-sonnet-4-5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 } }, "anthropic/claude-opus-4-7": { id: "anthropic/claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } } }, "perplexity/sonar-pro": { id: "perplexity/sonar-pro", name: "Sonar Pro", description: "Deeper Sonar search model with broader retrieval and stronger synthesis", family: "sonar-pro", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 } }, "perplexity/sonar-reasoning-pro": { id: "perplexity/sonar-reasoning-pro", name: "Sonar Reasoning Pro", description: "Web-grounded Sonar for multi-step research questions that need cited reasoning", family: "sonar-reasoning", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 } }, "openai/gpt-4.1-mini": { id: "openai/gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 } }, "openai/o3-mini": { id: "openai/o3-mini", name: "o3-mini", description: "Smaller o-series reasoner for economical coding, math, and planning tasks", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 5, output: 30, cache_read: 0.5 }, provider: { body: { service_tier: "priority" } } } } } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 } }, "openai/o3": { id: "openai/o3", name: "o3", description: "Deliberate o-series reasoner for hard math, coding, and multi-step analysis", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 } }, "openai/gpt-4.1": { id: "openai/gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 } }, "openai/o4-mini": { id: "openai/o4-mini", name: "o4-mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 } } } }, impossibl: { id: "impossibl", env: ["IMPOSSIBL_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.impossibl.com/v1", name: "Impossibl", doc: "https://impossibl.com/docs/models", models: { "google/gemini-3.5-flash": { id: "google/gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15 } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "google/gemini-3.5-flash-lite": { id: "google/gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "google/gemini-3.6-flash": { id: "google/gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15 } }, "google/gemini-3.1-flash-lite": { id: "google/gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025 } }, "google/gemini-3.1-pro-preview": { id: "google/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "google/gemini-2.5-flash-lite": { id: "google/gemini-2.5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 512, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01 } }, "thinkingmachines/inkling": { id: "thinkingmachines/inkling", name: "Inkling", description: "Multimodal MoE reasoning model (975B total, 41B active) for text, image, and audio", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 1.87, output: 4.68, cache_read: 0.374 } }, "qwen/qwen3.7-plus": { id: "qwen/qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.4, output: 1.6, cache_read: 0.08, tiers: [{ input: 1.2, output: 4.8, cache_read: 0.24, tier: { type: "context", size: 262144 } }], context_over_200k: { input: 1.2, output: 4.8, cache_read: 0.24 } } }, "qwen/qwen3.8-max-preview": { id: "qwen/qwen3.8-max-preview", name: "Qwen3.8 Max Preview", description: "Preview Qwen flagship for million-token multimodal reasoning and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "xhigh"] }], tool_call: true, temperature: true, release_date: "2026-07-19", last_updated: "2026-07-19", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 2.5, output: 7.5 } }, "qwen/qwen3.7-max": { id: "qwen/qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5 } }, "qwen/qwen3.6-flash": { id: "qwen/qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.05, tiers: [{ input: 1, output: 4, cache_read: 0.2, tier: { type: "context", size: 262144 } }], context_over_200k: { input: 1, output: 4, cache_read: 0.2 } } }, "xai/grok-4.3": { id: "xai/grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "xai/grok-4.20-0309-non-reasoning": { id: "xai/grok-4.20-0309-non-reasoning", name: "Grok 4.20 (Non-Reasoning)", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "xai/grok-4.5": { id: "xai/grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.3 } }, "xai/grok-build-0.1": { id: "xai/grok-build-0.1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1, output: 2, cache_read: 0.2 } }, "xai/grok-4.20-0309-reasoning": { id: "xai/grok-4.20-0309-reasoning", name: "Grok 4.20 (Reasoning)", description: "Reasoning Grok for document-heavy analysis and long-horizon tool use", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "fireworks/gpt-oss-20b": { id: "fireworks/gpt-oss-20b", name: "GPT OSS 20B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.07, output: 0.3, cache_read: 0.035 } }, "fireworks/glm-5.2": { id: "fireworks/glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.14 } }, "fireworks/gpt-oss-120b": { id: "fireworks/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015 } }, "groq/gpt-oss-20b": { id: "groq/gpt-oss-20b", name: "GPT OSS 20B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.075, output: 0.3, cache_read: 0.0375 } }, "groq/gpt-oss-120b": { id: "groq/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.19, output: 0.51, cache_read: 0.028 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 1.74, output: 3.48, cache_read: 0.145 } }, "xiaomi/mimo-v2.5": { id: "xiaomi/mimo-v2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.003 } }, "anthropic/claude-sonnet-4-6": { id: "anthropic/claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024 }, { type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-haiku-4-5": { id: "anthropic/claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "anthropic/claude-opus-4-6": { id: "anthropic/claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024 }, { type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-fable-5": { id: "anthropic/claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4-8": { id: "anthropic/claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-4-5": { id: "anthropic/claude-sonnet-4-5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-opus-4-7": { id: "anthropic/claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4-5": { id: "anthropic/claude-opus-4-5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024 }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-5": { id: "anthropic/claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "cerebras/gpt-oss-120b": { id: "cerebras/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.35, output: 0.75 } }, "moonshotai/kimi-k3": { id: "moonshotai/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "openai/gpt-5.1-codex-mini": { id: "openai/gpt-5.1-codex-mini", name: "GPT-5.1 Codex mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/gpt-5.5-pro": { id: "openai/gpt-5.5-pro", name: "GPT-5.5 Pro", description: "Highest-accuracy GPT-5.5 tier for slower, precision-heavy reasoning and coding", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, cache_read: 3, tiers: [{ input: 60, output: 270, cache_read: 3, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270, cache_read: 3 } } }, "openai/gpt-4.1-mini": { id: "openai/gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "openai/gpt-4o": { id: "openai/gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.4-pro": { id: "openai/gpt-5.4-pro", name: "GPT-5.4 Pro", description: "More exact GPT-5.4 tier for demanding professional reasoning and agent tasks", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, cache_read: 3, tiers: [{ input: 60, output: 270, cache_read: 3, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270, cache_read: 3 } } }, "openai/gpt-5.6-sol": { id: "openai/gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 45, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1, cache_write: 12.5 } } }, "openai/gpt-4.1-nano": { id: "openai/gpt-4.1-nano", name: "GPT-4.1 nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "openai/o3-mini": { id: "openai/o3-mini", name: "o3-mini", description: "Smaller o-series reasoner for economical coding, math, and planning tasks", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "openai/gpt-4o-mini": { id: "openai/gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-5-codex": { id: "openai/gpt-5-codex", name: "GPT-5-Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-3.5-turbo": { id: "openai/gpt-3.5-turbo", name: "GPT-3.5-turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2021-09-01", release_date: "2023-03-01", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16385, output: 4096 }, cost: { input: 0.5, output: 1.5 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "openai/gpt-5.2-codex": { id: "openai/gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Code-specialist GPT for repository edits, reviews, and long-running software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "openai/gpt-5-pro": { id: "openai/gpt-5-pro", name: "GPT-5 Pro", description: "Higher-accuracy GPT-5 tier for tough analysis, coding reviews, and planning", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 272000 }, cost: { input: 15, output: 120 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "openai/o1": { id: "openai/o1", name: "o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2023-09", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 15, output: 60, cache_read: 7.5 } }, "openai/gpt-5.6-luna": { id: "openai/gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, cache_write: 0.25, tiers: [{ input: 0.4, output: 1.8, cache_read: 0.04, cache_write: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 0.4, output: 1.8, cache_read: 0.04, cache_write: 0.5 } } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.3-codex": { id: "openai/gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4-turbo": { id: "openai/gpt-4-turbo", name: "GPT-4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-12", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 10, output: 30 } }, "openai/gpt-5.1-codex": { id: "openai/gpt-5.1-codex", name: "GPT-5.1 Codex", description: "Codex GPT for repository edits, code review, and practical software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-5-nano": { id: "openai/gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "openai/o3": { id: "openai/o3", name: "o3", description: "Deliberate o-series reasoner for hard math, coding, and multi-step analysis", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/gpt-5.6-terra": { id: "openai/gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 2.5, tiers: [{ input: 4, output: 18, cache_read: 0.4, cache_write: 5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4, cache_write: 5 } } }, "openai/gpt-4.1": { id: "openai/gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/o4-mini": { id: "openai/o4-mini", name: "o4-mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.275 } }, "zai/glm-5": { id: "zai/glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.2 } }, "zai/glm-4.5-air": { id: "zai/glm-4.5-air", name: "GLM-4.5-Air", description: "Lighter GLM-4.5 variant for fast coding assistance and cheaper agents", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.2, output: 1.1, cache_read: 0.03 } }, "zai/glm-5.1": { id: "zai/glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "zai/glm-5.2": { id: "zai/glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "zai/glm-4.6": { id: "zai/glm-4.6", name: "GLM-4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "zai/glm-4.5": { id: "zai/glm-4.5", name: "GLM-4.5", description: "Hybrid-reasoning GLM release that made the 4.5 line broadly useful", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "zai/glm-4.7": { id: "zai/glm-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "zai/glm-5-turbo": { id: "zai/glm-5-turbo", name: "GLM-5-Turbo", description: "Faster GLM-5 lane for coding agents that need lower latency", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24 } } } }, blueclaw: { id: "blueclaw", env: ["BLUECLAW_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://openai.blueclaw.network/v1", name: "Blue Claw", doc: "https://blueclaw.network", models: { "Qwen3.6-27B": { id: "Qwen3.6-27B", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 65536 }, status: "beta" }, "Qwen/Qwen3.6-35B-A3B-FP8": { id: "Qwen/Qwen3.6-35B-A3B-FP8", name: "Qwen3.6 35B A3B FP8", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, status: "beta" } } }, "tencent-tokenhub": { id: "tencent-tokenhub", env: ["TENCENT_TOKENHUB_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://tokenhub.tencentmaas.com/v1", name: "Tencent TokenHub", doc: "https://cloud.tencent.com/document/product/1823/130050", models: { hy3: { id: "hy3", name: "Hy3", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "hy3-preview": { id: "hy3-preview", name: "Hy3 preview", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, "fireworks-ai": { id: "fireworks-ai", env: ["FIREWORKS_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.fireworks.ai/inference/v1/", name: "Fireworks AI", doc: "https://fireworks.ai/docs/", models: { "accounts/fireworks/routers/glm-5p2-fast": { id: "accounts/fireworks/routers/glm-5p2-fast", name: "GLM 5.2 Fast", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-06-26", last_updated: "2026-06-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048575, output: 131072 }, cost: { input: 2.1, output: 6.6, cache_read: 0.21 } }, "accounts/fireworks/routers/kimi-k2p6-fast": { id: "accounts/fireworks/routers/kimi-k2p6-fast", name: "Kimi K2.6 Fast", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-17", last_updated: "2026-06-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 2, output: 8, cache_read: 0.3 } }, "accounts/fireworks/routers/kimi-k2p6-turbo": { id: "accounts/fireworks/routers/kimi-k2p6-turbo", name: "Kimi K2.6 Turbo", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 2, output: 8, cache_read: 0.3 } }, "accounts/fireworks/routers/kimi-k2p7-code-fast": { id: "accounts/fireworks/routers/kimi-k2p7-code-fast", name: "Kimi K2.7 Code Fast", description: "Kimi coding model for software agents, refactors, and repository reasoning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-06-12", last_updated: "2026-06-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 1.9, output: 8, cache_read: 0.38 } }, "accounts/fireworks/routers/kimi-k3-fast": { id: "accounts/fireworks/routers/kimi-k3-fast", name: "Kimi K3 Fast", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-27", last_updated: "2026-07-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 4.5, output: 22.5, cache_read: 0.45 } }, "accounts/fireworks/models/qwen3p7-plus": { id: "accounts/fireworks/models/qwen3p7-plus", name: "Qwen 3.7 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1 }], tool_call: true, temperature: true, release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.4, output: 1.6, cache_read: 0.08 } }, "accounts/fireworks/models/deepseek-v4-flash": { id: "accounts/fireworks/models/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-06-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "accounts/fireworks/models/gpt-oss-20b": { id: "accounts/fireworks/models/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.07, output: 0.3, cache_read: 0.035 } }, "accounts/fireworks/models/minimax-m2p7": { id: "accounts/fireworks/models/minimax-m2p7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-12", last_updated: "2026-04-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 196608 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "accounts/fireworks/models/kimi-k2p6": { id: "accounts/fireworks/models/kimi-k2p6", name: "Kimi K2.6", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "accounts/fireworks/models/minimax-m3": { id: "accounts/fireworks/models/minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal coding model for long-context reasoning and agent tasks", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 512000, output: 512000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "accounts/fireworks/models/deepseek-v4-pro": { id: "accounts/fireworks/models/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 1.74, output: 3.48, cache_read: 0.145 } }, "accounts/fireworks/models/deepseek-v4-flash-0731": { id: "accounts/fireworks/models/deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "accounts/fireworks/models/kimi-k2p7-code": { id: "accounts/fireworks/models/kimi-k2p7-code", name: "Kimi K2.7 Code", description: "Kimi coding model for software agents, refactors, and repository reasoning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-06-12", last_updated: "2026-06-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "accounts/fireworks/models/gpt-oss-120b": { id: "accounts/fireworks/models/gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-08-05", last_updated: "2026-06-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015 } }, "accounts/fireworks/models/glm-5p2": { id: "accounts/fireworks/models/glm-5p2", name: "GLM 5.2", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-06-16", last_updated: "2026-06-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048575, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.14 } }, "accounts/fireworks/models/kimi-k3": { id: "accounts/fireworks/models/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-27", last_updated: "2026-07-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } } } }, greenpt: { id: "greenpt", env: ["GREENPT_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.greenpt.ai/v1", name: "GreenPT", doc: "https://docs.greenpt.ai", models: { "mistral-medium-3.5-128b": { id: "mistral-medium-3.5-128b", name: "Mistral Medium 3.5", description: "Balanced Mistral model for enterprise assistants, multilingual work, and tools", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 2.052, output: 10.26 } }, "glm-5.2-ponytail": { id: "glm-5.2-ponytail", name: "GLM-5.2 Ponytail", description: "glm-5.2 carrying a built-in ruleset that compresses generated code, preferring platform features over custom code. The middle tier, and the ruleset as its authors wrote it. Same upstream model and price per token as glm-5.2, with fewer output tokens.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.254, output: 5.016, cache_read: 0.3135 } }, "qwen3.6-35b-a3b": { id: "qwen3.6-35b-a3b", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.342, output: 2.052 } }, "holo2-30b-a3b": { id: "holo2-30b-a3b", name: "Holo2 30B A3B", description: "H Company Holo2 vision model for GUI navigation and computer-use agents", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-11", last_updated: "2025-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 22016, output: 16384 }, cost: { input: 0.399, output: 0.969 } }, "glm-5.2-caveman": { id: "glm-5.2-caveman", name: "GLM-5.2 Caveman", description: "glm-5.2 carrying a built-in ruleset that compresses prose, keeping code and technical detail verbatim. The middle tier, and the ruleset as its authors wrote it. Same upstream model and price per token as glm-5.2, with fewer output tokens.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.254, output: 5.016, cache_read: 0.3135 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, status: "deprecated", cost: { input: 1.756, output: 5.518 } }, "glm-5.2-ponytail-ultra": { id: "glm-5.2-ponytail-ultra", name: "GLM-5.2 Ponytail Ultra", description: "glm-5.2 carrying a built-in ruleset that compresses generated code, preferring platform features over custom code. The most aggressive tier, close to answer-only. Same upstream model and price per token as glm-5.2, with fewer output tokens.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.254, output: 5.016, cache_read: 0.3135 } }, "qwen3-coder-30b-a3b-instruct": { id: "qwen3-coder-30b-a3b-instruct", name: "Qwen3-Coder 30B-A3B Instruct", description: "Smaller Qwen coder for efficient local agents and repo-level fixes", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.285, output: 1.083 } }, "green-l": { id: "green-l", name: "Green L", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-06-20", last_updated: "2025-06-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.285, output: 0.912 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.254, output: 5.016, cache_read: 0.3135 } }, "devstral-2-123b-instruct-2512": { id: "devstral-2-123b-instruct-2512", name: "Devstral 2", description: "Mistral's coding-agent model for repository work, terminal tasks, and software fixes", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-12", release_date: "2025-12-09", last_updated: "2025-12-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 16384 }, cost: { input: 0.57, output: 2.736 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.7524, output: 4.275, cache_read: 0.2508 } }, "pixtral-12b-2409": { id: "pixtral-12b-2409", name: "Pixtral 12B", description: "Mistral vision-language model for image understanding and multimodal chat", family: "pixtral", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2024-09-01", last_updated: "2024-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.285, output: 0.285 } }, "green-s": { id: "green-s", name: "Green S", description: "GreenPT speech-to-text model for pre-recorded and live transcription", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-01", last_updated: "2025-01", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 8192 }, cost: { input: 0.00437, output: 0 } }, "glm-5.2-caveman-ultra": { id: "glm-5.2-caveman-ultra", name: "GLM-5.2 Caveman Ultra", description: "glm-5.2 carrying a built-in ruleset that compresses prose, keeping code and technical detail verbatim. The most aggressive tier, close to answer-only. Same upstream model and price per token as glm-5.2, with fewer output tokens.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.254, output: 5.016, cache_read: 0.3135 } }, "glm-5.2-ponytail-lite": { id: "glm-5.2-ponytail-lite", name: "GLM-5.2 Ponytail Lite", description: "glm-5.2 carrying a built-in ruleset that compresses generated code, preferring platform features over custom code. The gentlest tier: it cuts filler only and keeps the explanation intact. Same upstream model and price per token as glm-5.2, with fewer output tokens.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.254, output: 5.016, cache_read: 0.3135 } }, "green-s-pro": { id: "green-s-pro", name: "Green S Pro", description: "GreenPT advanced speech-to-text model with multilingual transcription support", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-02", last_updated: "2025-02", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 8192 }, cost: { input: 0.00437, output: 0 } }, "llama-3.3-70b-instruct": { id: "llama-3.3-70b-instruct", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e5, output: 16384 }, cost: { input: 1.254, output: 1.254 } }, "green-r-raw": { id: "green-r-raw", name: "Green R Raw", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.399, output: 1.083 } }, "gemma-3-27b-it": { id: "gemma-3-27b-it", name: "Gemma 3 27B", description: "Google Gemma 3 multimodal model for chat, reasoning, and image understanding", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-08", release_date: "2025-03-12", last_updated: "2025-03-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 40000, output: 8192 }, cost: { input: 0.342, output: 0.684 } }, "deepseek-v4-flash-0731": { id: "deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.1596, output: 0.399, cache_read: 0.0456 } }, "glm-5.2-honey-ultra": { id: "glm-5.2-honey-ultra", name: "GLM-5.2 Honey Ultra", description: "glm-5.2 carrying a built-in ruleset that compresses both generated code and prose. The most aggressive tier, close to answer-only. Same upstream model and price per token as glm-5.2, with fewer output tokens.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.254, output: 5.016, cache_read: 0.3135 } }, "qwen3-235b-a22b-instruct-2507": { id: "qwen3-235b-a22b-instruct-2507", name: "Qwen3 235B A22B Instruct 2507", description: "Qwen3 235B MoE instruct model for long-context multilingual chat and reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-21", last_updated: "2025-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 1.026, output: 3.078 } }, "glm-5.2-honey": { id: "glm-5.2-honey", name: "GLM-5.2 Honey", description: "glm-5.2 carrying a built-in ruleset that compresses both generated code and prose. The middle tier, and the ruleset as its authors wrote it. Same upstream model and price per token as glm-5.2, with fewer output tokens.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.254, output: 5.016, cache_read: 0.3135 } }, "voxtral-small-24b-2507": { id: "voxtral-small-24b-2507", name: "Voxtral Small 24B", description: "Mistral Voxtral audio-understanding model for speech and transcription tasks", family: "mistral", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2025-07", release_date: "2025-07-15", last_updated: "2025-07-15", modalities: { input: ["text", "audio"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 16384 }, cost: { input: 0.228, output: 0.513 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.228, output: 0.798 } }, "minimax-m2.5": { id: "minimax-m2.5", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.1938, output: 1.129, cache_read: 0.0627 } }, gemma4: { id: "gemma4", name: "gemma4", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.57, output: 1.71 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.9006, output: 4.389, cache_read: 0.1881 } }, "mistral-small-3.2-24b-instruct-2506": { id: "mistral-small-3.2-24b-instruct-2506", name: "Mistral Small 3.2", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-06-20", last_updated: "2025-06-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.228, output: 0.456 } }, "green-l-raw": { id: "green-l-raw", name: "Green L Raw", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-06-20", last_updated: "2025-06-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.285, output: 0.912 } }, "kimi-k2.6-fast": { id: "kimi-k2.6-fast", name: "Kimi K2.6 Fast", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 1.655, output: 8.778 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3.762, output: 18.81, cache_read: 0.9405 } }, "qwen3.5-397b-a17b": { id: "qwen3.5-397b-a17b", name: "Qwen3.5 397B-A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.798, output: 4.959 } }, "glm-5.2-honey-lite": { id: "glm-5.2-honey-lite", name: "GLM-5.2 Honey Lite", description: "glm-5.2 carrying a built-in ruleset that compresses both generated code and prose. The gentlest tier: it cuts filler only and keeps the explanation intact. Same upstream model and price per token as glm-5.2, with fewer output tokens.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.254, output: 5.016, cache_read: 0.3135 } }, "glm-5.2-caveman-lite": { id: "glm-5.2-caveman-lite", name: "GLM-5.2 Caveman Lite", description: "glm-5.2 carrying a built-in ruleset that compresses prose, keeping code and technical detail verbatim. The gentlest tier: it cuts filler only and keeps the explanation intact. Same upstream model and price per token as glm-5.2, with fewer output tokens.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.254, output: 5.016, cache_read: 0.3135 } }, "green-r": { id: "green-r", name: "Green R", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.399, output: 1.083 } } } }, wandb: { id: "wandb", env: ["WANDB_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.inference.wandb.ai/v1", name: "Weights & Biases", doc: "https://docs.wandb.ai/guides/integrations/inference/", models: { "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-FP8": { id: "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-FP8", name: "Nemotron 3 Super", description: "Nemotron 3 is a LatentMoE model designed to deliver strong agentic, reasoning, and conversational capabilities.", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.2, output: 0.8, cache_read: 0.2 } }, "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B": { id: "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B", name: "Nemotron 3 Ultra", description: "Nemotron 3 Ultra is a powerful MoE model designed for long-running agents across coding, deep research, and enterprise automation.", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.75, output: 2.75, cache_read: 0.15 } }, "google/gemma-4-31B-it": { id: "google/gemma-4-31B-it", name: "Gemma 4 31B", description: "Gemma 4 31B Dense is designed for advanced reasoning, agentic workflows, and longer context and is natively trained on 140+ languages.", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.1, output: 0.34, cache_read: 0.1 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM 5.2", description: "GLM-5.2 is a Mixture-of-Experts language model featuring 40 billion activated parameters and a total of 744 billion parameters.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-16", last_updated: "2026-06-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.76, output: 2.42, cache_read: 0.14 } }, "zai-org/GLM-5.1": { id: "zai-org/GLM-5.1", name: "GLM 5.1", description: "Powerful MoE model for long-horizon agentic engineering and advanced reasoning.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "JetBrains/Mellum2-12B-A2.5B-Instruct": { id: "JetBrains/Mellum2-12B-A2.5B-Instruct", name: "Mellum2 12B A2.5B", description: "Mellum2-12B-A2.5B-Instruct is a fast MoE model with 131K context built for coding, tool use, and low-latency AI workflows.", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.05, output: 0.1, cache_read: 0.05 } }, "Qwen/Qwen3.5-35B-A3B": { id: "Qwen/Qwen3.5-35B-A3B", name: "Qwen3.5-35B-A3B", description: "Qwen3.5-35B-A3B is an open-weights multimodal MoE model built for efficient, high-throughput inference across chat, reasoning, and agentic tasks.", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-24", last_updated: "2026-02-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.25, output: 1.25, cache_read: 0.25 } }, "Qwen/Qwen3.6-27B": { id: "Qwen/Qwen3.6-27B", name: "Qwen3.6 27B", description: "Qwen3.6-27B is a 27B dense multimodal model with 262K context built for flagship-level agentic coding.", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3.6, cache_read: 0.12 } }, "Qwen/Qwen3.6-35B-A3B": { id: "Qwen/Qwen3.6-35B-A3B", name: "Qwen3.6 35B A3B", description: "Qwen3.6-35B-A3B is an MoE multimodal model with 262K context optimized for agentic coding workflows.", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-15", last_updated: "2026-04-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.25, output: 1.25, cache_read: 0.25 } }, "Qwen/Qwen3-30B-A3B-Instruct-2507": { id: "Qwen/Qwen3-30B-A3B-Instruct-2507", name: "Qwen3 30B A3B Instruct 2507", description: "Qwen3-30B-A3B-Instruct-2507 is a 30.5B MoE instruction-tuned model with enhanced reasoning, coding, and long-context understanding.", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-29", last_updated: "2025-07-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.1, output: 0.3, cache_read: 0.1 } }, "Qwen/Qwen3-Coder-480B-A35B-Instruct": { id: "Qwen/Qwen3-Coder-480B-A35B-Instruct", name: "Qwen3 Coder 480B A35B", description: "Mixture-of-Experts model optimized for agentic coding tasks such as function calling, tool use, and long-context reasoning.", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-22", last_updated: "2025-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1, output: 1.5, cache_read: 1 } }, "MiniMaxAI/MiniMax-M2.5": { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax M2.5", description: "MoE model with a highly sparse architecture designed for high-throughput and low latency with strong coding capabilities.", family: "minimax-m2.5", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 196608 }, cost: { input: 0.3, output: 1.2, cache_read: 0.3 } }, "MiniMaxAI/MiniMax-M3": { id: "MiniMaxAI/MiniMax-M3", name: "MiniMax M3", description: "MiniMax M3 is a multimodal MoE model with 23B active parameters optimized for coding and agentic workflows.", family: "minimax-m3", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.23, output: 0.96, cache_read: 0.05 } }, "ibm-granite/granite-4.1-8b": { id: "ibm-granite/granite-4.1-8b", name: "Granite 4.1 8B", description: "Granite 4.1 8B is a long-context instruct model capable of enhanced tool calling, instruction following, and chat capabilities.", family: "granite", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.05, output: 0.1, cache_read: 0.05 } }, "deepseek-ai/DeepSeek-V4-Flash-0731": { id: "deepseek-ai/DeepSeek-V4-Flash-0731", name: "DeepSeek V4 Flash 0731", description: "DeepSeek V4-Flash-0731 is an MoE model great for coding, reasoning, and agentic workloads.", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.13, output: 0.28, cache_read: 0.07 } }, "deepseek-ai/DeepSeek-V3.1": { id: "deepseek-ai/DeepSeek-V3.1", name: "DeepSeek V3.1", description: "A large hybrid model that supports both thinking and non-thinking modes via prompt templates.", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 161000, output: 161000 }, cost: { input: 0.55, output: 1.65, cache_read: 0.55 } }, "deepseek-ai/DeepSeek-V4-Flash": { id: "deepseek-ai/DeepSeek-V4-Flash", name: "DeepSeek V4 Flash", description: "DeepSeek V4-Flash is an MoE model with 1M context length great for coding, reasoning, and agentic workloads.", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 0.14, output: 0.28, cache_read: 0.07 } }, "deepseek-ai/DeepSeek-V4-Pro": { id: "deepseek-ai/DeepSeek-V4-Pro", name: "DeepSeek V4 Pro", description: "DeepSeek V4-Pro is a 1.6T-parameter MoE model with 49B active parameters excelling at advanced reasoning, coding, and complex agentic workloads.", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 1.15, output: 2.55, cache_read: 0.2 } }, "OpenPipe/Qwen3-14B-Instruct": { id: "OpenPipe/Qwen3-14B-Instruct", name: "Qwen3 14B Instruct", description: "An efficient multilingual, dense, instruction-tuned model, optimized by OpenPipe for building agents with finetuning.", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-29", last_updated: "2025-04-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.05, output: 0.22, cache_read: 0.05 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Kimi K2.6 is a multimodal Mixture-of-Experts language model featuring 32 billion activated parameters and a total of 1 trillion parameters.", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.65, output: 3.41, cache_read: 0.15 } }, "moonshotai/Kimi-K2.7-Code": { id: "moonshotai/Kimi-K2.7-Code", name: "Kimi K2.7 Code", description: "Kimi K2.7 Code is a 1T-parameter MoE model with 32B active parameters purpose-built for long-horizon agentic coding and software engineering.", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.71, output: 3.5, cache_read: 0.15 } }, "moonshotai/Kimi-K3": { id: "moonshotai/Kimi-K3", name: "Kimi K3", description: "Kimi K3 is a 2.8T-parameter multimodal MoE model with 104B active parameters built for long-horizon coding and agentic workflows.", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "gpt-oss-20b", description: "Lower latency Mixture-of-Experts model trained on OpenAI's Harmony response format with reasoning capabilities.", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.03, output: 0.13, cache_read: 0.03 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "gpt-oss-120b", description: "Efficient Mixture-of-Experts model designed for high-reasoning, agentic and general-purpose use cases.", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.03, output: 0.17, cache_read: 0.03 } }, "meta-llama/Llama-3.3-70B-Instruct": { id: "meta-llama/Llama-3.3-70B-Instruct", name: "Llama 3.3 70B", description: "Multilingual model excelling in conversational tasks, detailed instruction-following, and coding.", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.71, output: 0.71, cache_read: 0.71 } }, "meta-llama/Llama-3.1-8B-Instruct": { id: "meta-llama/Llama-3.1-8B-Instruct", name: "Llama 3.1 8B", description: "Efficient conversational model optimized for responsive multilingual chatbot interactions.", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.22, output: 0.22, cache_read: 0.22 } }, "meta-llama/Llama-3.1-70B-Instruct": { id: "meta-llama/Llama-3.1-70B-Instruct", name: "Llama 3.1 70B", description: "Efficient conversational model optimized for responsive multilingual chatbot interactions.", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.8, output: 0.8, cache_read: 0.8 } } } }, crossmodel: { id: "crossmodel", env: ["CROSSMODEL_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.crossmodel.ai/v1", name: "CrossModel", doc: "https://www.crossmodel.ai/docs", models: { "gemini/gemini-3.5-flash": { id: "gemini/gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, cache_write: 1.5 } }, "gemini/gemini-2.5-flash": { id: "gemini/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, cache_write: 0.3 } }, "gemini/gemini-3.5-flash-lite": { id: "gemini/gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, cache_write: 0.3 } }, "gemini/gemini-3-flash-preview": { id: "gemini/gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 0.5 } }, "gemini/gemini-3.6-flash": { id: "gemini/gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15, cache_write: 1.5 } }, "gemini/gemini-3.1-pro-preview": { id: "gemini/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 2, tiers: [{ input: 4, output: 18, cache_read: 0.4, cache_write: 4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4, cache_write: 4 } } }, "gemini/gemini-2.5-pro": { id: "gemini/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, cache_write: 1.25, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, cache_write: 2.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 2.5 } } }, "gemini/gemini-2.5-flash-lite": { id: "gemini/gemini-2.5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01, cache_write: 0.1 } }, "qwen/qwen3.7-flash": { id: "qwen/qwen3.7-flash", name: "Qwen3.7 Flash", description: "Lightweight multimodal Qwen model for high-throughput text, image, and video tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 991000, output: 65536 }, cost: { input: 0.04, output: 0.13, cache_read: 0.01, cache_write: 0.04, tiers: [{ input: 0.1, output: 0.37, cache_read: 0.02, cache_write: 0.12, tier: { type: "context", size: 32000 } }, { input: 0.19, output: 0.74, cache_read: 0.04, cache_write: 0.24, tier: { type: "context", size: 256000 } }] } }, "qwen/qwen3.7-plus": { id: "qwen/qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.288, output: 1.125, cache_read: 0.0288, cache_write: 0.36, tiers: [{ input: 0.864, output: 3.375, cache_read: 0.0864, cache_write: 1.08, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.864, output: 3.375, cache_read: 0.0864, cache_write: 1.08 } } }, "qwen/qwen3.7-max": { id: "qwen/qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 1.504, output: 4.504, cache_read: 0.3, cache_write: 1.88 } }, "qwen/qwen3.8-max": { id: "qwen/qwen3.8-max", name: "Qwen3.8 Max", description: "2.4-trillion-parameter MoE flagship for coding, professional work, multimodal understanding, and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 1.88, output: 5.63, cache_read: 0.23, cache_write: 2.35 } }, "qwen/qwen3.6-flash": { id: "qwen/qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.19, output: 1.13, cache_read: 0.019, cache_write: 0.24, tiers: [{ input: 0.75, output: 4.5, cache_read: 0.075, cache_write: 0.94, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.75, output: 4.5, cache_read: 0.075, cache_write: 0.94 } } }, "qwen/qwen3.6-plus": { id: "qwen/qwen3.6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.32, output: 1.88, cache_read: 0.032, cache_write: 0.4, tiers: [{ input: 1.25, output: 7.5, cache_read: 0.124, cache_write: 1.57, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 1.25, output: 7.5, cache_read: 0.124, cache_write: 1.57 } } }, "tencent/hy3": { id: "tencent/hy3", name: "Hy3", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.16, output: 0.64, cache_read: 0.04, cache_write: 0.16 } }, "tencent/hy3-preview": { id: "tencent/hy3-preview", name: "Hy3 preview", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.19, output: 0.63, cache_read: 0.063, cache_write: 0.19, tiers: [{ input: 0.25, output: 1, cache_read: 0.094, cache_write: 0.25, tier: { type: "context", size: 16000 } }, { input: 0.32, output: 1.25, cache_read: 0.125, cache_write: 0.32, tier: { type: "context", size: 32000 } }] } }, "moonshot/kimi-k2.5": { id: "moonshot/kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.62, output: 3.3, cache_read: 0.11, cache_write: 0.62 } }, "moonshot/kimi-k2.6": { id: "moonshot/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 1, output: 4.16, cache_read: 0.18, cache_write: 1 } }, "moonshot/kimi-k2.7-code": { id: "moonshot/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 1, output: 4.16, cache_read: 0.18, cache_write: 1 } }, "moonshot/kimi-k3": { id: "moonshot/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3 } }, "minimax/minimax-m2.7": { id: "minimax/minimax-m2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.33, output: 1.32, cache_read: 0.066, cache_write: 0.42 } }, "minimax/minimax-m3": { id: "minimax/minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1024000, output: 512000 }, cost: { input: 0.33, output: 1.32, cache_read: 0.066, cache_write: 0.33, tiers: [{ input: 0.66, output: 2.63, cache_read: 0.132, cache_write: 0.66, tier: { type: "context", size: 512000 } }], context_over_200k: { input: 0.66, output: 2.63, cache_read: 0.132, cache_write: 0.66 } } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 65000 }, cost: { input: 0.16, output: 0.32, cache_read: 0.004, cache_write: 0.16 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 65000 }, cost: { input: 0.47, output: 0.94, cache_read: 0.005, cache_write: 0.47 } }, "x-ai/grok-4.3": { id: "x-ai/grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, cache_write: 1.25, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, cache_write: 2.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4, cache_write: 2.5 } } }, "x-ai/grok-4.5": { id: "x-ai/grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.5, cache_write: 2, tiers: [{ input: 4, output: 12, cache_read: 1, cache_write: 4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 12, cache_read: 1, cache_write: 4 } } }, "x-ai/grok-build-0.1": { id: "x-ai/grok-build-0.1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1, output: 2, cache_read: 0.2, cache_write: 1, tiers: [{ input: 2, output: 4, cache_read: 0.4, cache_write: 2, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2, output: 4, cache_read: 0.4, cache_write: 2 } } }, "xiaomi/mimo-v2.5": { id: "xiaomi/mimo-v2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 0.16, output: 0.32, cache_read: 0.004, cache_write: 0.16 } }, "xiaomi/mimo-v2.5-pro": { id: "xiaomi/mimo-v2.5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 0.47, output: 0.94, cache_read: 0.005, cache_write: 0.47 } }, "anthropic/claude-sonnet-4-6": { id: "anthropic/claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-haiku-4-5": { id: "anthropic/claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "anthropic/claude-fable-5": { id: "anthropic/claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4-8": { id: "anthropic/claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4-7": { id: "anthropic/claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-5": { id: "anthropic/claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "anthropic/claude-opus-5": { id: "anthropic/claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "z-ai/glm-5": { id: "z-ai/glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.6, output: 3, cache_read: 0.16, cache_write: 0.6, tiers: [{ input: 0.8, output: 3.4, cache_read: 0.2, cache_write: 0.8, tier: { type: "context", size: 32000 } }] } }, "z-ai/glm-5.1": { id: "z-ai/glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 1, output: 3.8, cache_read: 0.2, cache_write: 1, tiers: [{ input: 1.2, output: 4.4, cache_read: 0.3, cache_write: 1.2, tier: { type: "context", size: 32000 } }] } }, "z-ai/glm-5.2": { id: "z-ai/glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 1.2, output: 4.4, cache_read: 0.3, cache_write: 1.2 } }, "z-ai/glm-4.7": { id: "z-ai/glm-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.47, output: 2.16, cache_read: 0.1, cache_write: 0.47, tiers: [{ input: 0.62, output: 2.47, cache_read: 0.13, cache_write: 0.62, tier: { type: "context", size: 32000 } }] } }, "z-ai/glm-5-turbo": { id: "z-ai/glm-5-turbo", name: "GLM-5-Turbo", description: "Faster GLM-5 lane for coding agents that need lower latency", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 0.9, output: 3.7, cache_read: 0.18, cache_write: 0.9, tiers: [{ input: 1.1, output: 4.3, cache_read: 0.27, cache_write: 1.1, tier: { type: "context", size: 32000 } }] } }, "openai/gpt-5.5-pro": { id: "openai/gpt-5.5-pro", name: "GPT-5.5 Pro", description: "Highest-accuracy GPT-5.5 tier for slower, precision-heavy reasoning and coding", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "openai/gpt-5.6-sol": { id: "openai/gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 45, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1, cache_write: 12.5 } } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 5, tiers: [{ input: 10, output: 45, cache_read: 1, cache_write: 10, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1, cache_write: 10 } } }, "openai/gpt-4o-mini": { id: "openai/gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075, cache_write: 0.15 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 2.5, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, cache_write: 5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5, cache_write: 5 } } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02, cache_write: 0.2 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075, cache_write: 0.75 } }, "openai/gpt-5.6-luna": { id: "openai/gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, cache_write: 0.25, tiers: [{ input: 0.4, output: 1.8, cache_read: 0.04, cache_write: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 0.4, output: 1.8, cache_read: 0.04, cache_write: 0.5 } } }, "openai/gpt-5.6-terra": { id: "openai/gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 2.5, tiers: [{ input: 4, output: 18, cache_read: 0.4, cache_write: 5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4, cache_write: 5 } } } } }, llmtr: { id: "llmtr", env: ["LLMTR_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://llmtr.com/v1", name: "LLMTR", doc: "https://llmtr.com/docs", models: { sincap: { id: "sincap", name: "Sincap", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-05-05", last_updated: "2026-05-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "medgemma-4b": { id: "medgemma-4b", name: "MedGemma 4B", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-26", last_updated: "2026-04-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 4096 }, cost: { input: 3, output: 5 } }, "magibu-11b-v8": { id: "magibu-11b-v8", name: "Magibu 11B v8", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-06-05", last_updated: "2026-06-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 4096 }, cost: { input: 0, output: 0 } }, "qwen3-6-35b": { id: "qwen3-6-35b", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 16384, output: 65536 }, cost: { input: 5, output: 10 } }, "trendyol-7b": { id: "trendyol-7b", name: "Trendyol 7B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-06-06", last_updated: "2026-06-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 0, output: 0 } }, "gemma-4": { id: "gemma-4", name: "Gemma 4", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 5, output: 10 } } } }, claudinio: { id: "claudinio", env: ["CLAUDINIO_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.claudin.io/v1", name: "Claudinio", doc: "https://claudin.io", models: { claudinio: { id: "claudinio", name: "Claudinio", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, knowledge: "2026-05", release_date: "2026-05-12", last_updated: "2026-06-02", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 0.5, output: 2, cache_read: 0.15 } }, claudius: { id: "claudius", name: "Claudius", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, knowledge: "2026-05", release_date: "2026-05-12", last_updated: "2026-05-12", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 3, output: 8, cache_read: 0.9 } } } }, "snowflake-cortex": { id: "snowflake-cortex", env: ["SNOWFLAKE_ACCOUNT", "SNOWFLAKE_CORTEX_PAT"], npm: "@ai-sdk/openai-compatible", api: "https://${SNOWFLAKE_ACCOUNT}.snowflakecomputing.com/api/v2/cortex/v1", name: "Snowflake Cortex", doc: "https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-rest-api", models: { "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 16384 } }, "openai-gpt-5.6-terra": { id: "openai-gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, status: "beta" }, "openai-gpt-4.1": { id: "openai-gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 16384 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 } }, "gemini-3.1-pro": { id: "gemini-3.1-pro", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 } }, "openai-gpt-5.1": { id: "openai-gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 } }, "openai-gpt-5.4": { id: "openai-gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, status: "beta", experimental: { modes: { fast: { cost: { input: 5, output: 30, cache_read: 0.5 }, provider: { body: { service_tier: "priority" } } } } } }, "claude-sonnet-4-5": { id: "claude-sonnet-4-5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 16384 } }, "openai-gpt-5-mini": { id: "openai-gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 272000, input: 272000, output: 8192 }, status: "beta" }, "openai-gpt-5.5": { id: "openai-gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, status: "beta" }, "openai-gpt-5-nano": { id: "openai-gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, status: "beta" }, "deepseek-r1": { id: "deepseek-r1", name: "DeepSeek-R1", description: "Classic open reasoning model for transparent math, coding, and deliberate problem solving", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 } }, "openai-gpt-5.6-sol": { id: "openai-gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, status: "beta" }, "mistral-large2": { id: "mistral-large2", name: "Mistral Large (latest)", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, status: "beta", experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } } }, "snowflake-llama3.3-70b": { id: "snowflake-llama3.3-70b", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 } }, "openai-gpt-5.6-luna": { id: "openai-gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, status: "beta" }, "openai-gpt-5": { id: "openai-gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, status: "beta" }, "openai-gpt-5.2": { id: "openai-gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 } } } }, cohere: { id: "cohere", env: ["COHERE_API_KEY"], npm: "@ai-sdk/cohere", name: "Cohere", doc: "https://docs.cohere.com/docs/models", models: { "command-r7b-arabic-02-2025": { id: "command-r7b-arabic-02-2025", name: "Command R7B Arabic", description: "Open Command R model optimized for Arabic enterprise chat, RAG, and cultural knowledge", family: "command-r", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06-01", release_date: "2025-02-27", last_updated: "2025-02-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 0.0375, output: 0.15 } }, "command-r-08-2024": { id: "command-r-08-2024", name: "Command R", description: "Cohere retrieval model for long-context chat and enterprise RAG workflows", family: "command-r", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-08-30", last_updated: "2024-08-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 0.15, output: 0.6 } }, "command-a-plus-05-2026": { id: "command-a-plus-05-2026", name: "Command A Plus", description: "Cohere's stronger command model for multilingual agents and enterprise workflows", family: "command-a", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04-01", release_date: "2026-05-20", last_updated: "2026-06-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 64000 }, cost: { input: 2.5, output: 10 } }, "command-a-translate-08-2025": { id: "command-a-translate-08-2025", name: "Command A Translate", description: "Translation model for multilingual conversion, localization, and cross-language workflows", family: "command-a", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06-01", release_date: "2025-08-28", last_updated: "2025-08-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8000, output: 8000 }, cost: { input: 2.5, output: 10 } }, "c4ai-aya-expanse-8b": { id: "c4ai-aya-expanse-8b", name: "Aya Expanse 8B", description: "Compact open multilingual model optimized for generation across 23 languages", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-10-24", last_updated: "2024-10-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8000, output: 4000 } }, "c4ai-aya-vision-32b": { id: "c4ai-aya-vision-32b", name: "Aya Vision 32B", description: "Open multilingual vision model for OCR, visual reasoning, and image question answering", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-03-04", last_updated: "2025-05-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 16000, output: 4000 } }, "command-a-03-2025": { id: "command-a-03-2025", name: "Command A", description: "Cohere command model for multilingual enterprise agents, tools, and chat", family: "command-a", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06-01", release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8000 }, cost: { input: 2.5, output: 10 } }, "command-r-plus-08-2024": { id: "command-r-plus-08-2024", name: "Command R+", description: "Cohere's RAG workhorse for long-context enterprise search and tool use", family: "command-r", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-08-30", last_updated: "2024-08-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 2.5, output: 10 } }, "command-a-reasoning-08-2025": { id: "command-a-reasoning-08-2025", name: "Command A Reasoning", description: "Cohere reasoning model for multilingual enterprise agents, tools, and complex workflows", family: "command-a", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1 }], tool_call: true, temperature: true, knowledge: "2024-06-01", release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 32000 }, cost: { input: 2.5, output: 10 } }, "command-a-vision-07-2025": { id: "command-a-vision-07-2025", name: "Command A Vision", description: "Cohere vision model for multilingual document analysis, OCR, and image understanding", family: "command-a", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-06-01", release_date: "2025-07-31", last_updated: "2025-07-31", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8000 }, cost: { input: 2.5, output: 10 } }, "command-r7b-12-2024": { id: "command-r7b-12-2024", name: "Command R7B", description: "Cohere retrieval model for long-context chat and enterprise RAG workflows", family: "command-r", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-12-02", last_updated: "2024-12-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 0.0375, output: 0.15 } }, "c4ai-aya-vision-8b": { id: "c4ai-aya-vision-8b", name: "Aya Vision 8B", description: "Compact open multilingual vision model for OCR and visual question answering", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-03-04", last_updated: "2025-05-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 16000, output: 4000 } }, "north-mini-code-1-0": { id: "north-mini-code-1-0", name: "North Mini Code", description: "Cohere coding model for practical software engineering and agentic edits", family: "north", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-09-23", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://api.cohere.ai/compatibility/v1" }, cost: { input: 0, output: 0 } }, "c4ai-aya-expanse-32b": { id: "c4ai-aya-expanse-32b", name: "Aya Expanse 32B", description: "Open multilingual model optimized for generation across 23 languages", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-10-24", last_updated: "2024-10-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 } } } }, "opencode-go": { id: "opencode-go", env: ["OPENCODE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://opencode.ai/zen/go/v1", name: "OpenCode Go", doc: "https://opencode.ai/docs/zen", models: { "qwen3.7-plus": { id: "qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "qwen3.7-plus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 262144 }], tool_call: true, temperature: true, release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0.4, output: 1.6, cache_read: 0.04, cache_write: 0.5, tiers: [{ input: 1.2, output: 4.8, cache_read: 0.12, cache_write: 1.5, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 1.2, output: 4.8, cache_read: 0.12, cache_write: 1.5 } } }, "glm-5": { id: "glm-5", name: "GLM-5", description: "Legacy model retained for compatibility with older integrations", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 32768 }, status: "deprecated", cost: { input: 1, output: 3.2, cache_read: 0.2 } }, "qwen3.5-plus": { id: "qwen3.5-plus", name: "Qwen3.5 Plus", description: "Legacy model retained for compatibility with older integrations", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, status: "deprecated", provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, cache_write: 0.25 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 32768 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "mimo-v2-omni": { id: "mimo-v2-omni", name: "MiMo V2 Omni", description: "Legacy model retained for compatibility with older integrations", family: "mimo-v2-omni", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 128000 }, status: "deprecated", cost: { input: 0.4, output: 2, cache_read: 0.08 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash (2x usage)", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.07, output: 0.14, cache_read: 0.0014 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Legacy model retained for compatibility with older integrations", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-10", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, status: "deprecated", cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "minimax-m2.7": { id: "minimax-m2.7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax-m2.7", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "qwen3.7-max": { id: "qwen3.7-max", name: "Qwen3.7 Max", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "qwen3.7-max", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 262144 }], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 2.5, output: 7.5, cache_read: 0.5, cache_write: 3.125 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-10", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "mimo-v2-pro": { id: "mimo-v2-pro", name: "MiMo V2 Pro", description: "Legacy model retained for compatibility with older integrations", family: "mimo-v2-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 128000 }, status: "deprecated", cost: { input: 1, output: 3, cache_read: 0.2, tiers: [{ input: 2, output: 6, cache_read: 0.4, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.4 } } }, "minimax-m3": { id: "minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal coding model for long-context reasoning and agent tasks", family: "minimax-m3", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-31", last_updated: "2026-05-31", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0.3, output: 1.2, cache_read: 0.06, tiers: [{ input: 0.6, output: 2.4, cache_read: 0.12, tier: { type: "context", size: 512000 } }], context_over_200k: { input: 0.6, output: 2.4, cache_read: 0.12 } } }, hy3: { id: "hy3", name: "Hy3", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, temperature: true, release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0.14, output: 0.58, cache_read: 0.035 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "qwen3.8-max": { id: "qwen3.8-max", name: "Qwen3.8 Max", description: "2.4-trillion-parameter multimodal flagship for coding, professional work, and long-horizon agentic workflows", family: "qwen3.8-max", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 262144 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 2, output: 6, cache_read: 0.25, cache_write: 2.5 } }, "mimo-v2.5": { id: "mimo-v2.5", name: "MiMo V2.5", description: "MiMo omni model for text, image, video, audio, and agents", family: "mimo-v2.5", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "minimax-m2.5": { id: "minimax-m2.5", name: "MiniMax-M2.5", description: "Legacy model retained for compatibility with older integrations", family: "minimax-m2.5", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 65536 }, status: "deprecated", provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna (2x usage)", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 0.1, output: 0.6, cache_read: 0.01, cache_write: 0.125, tiers: [{ input: 0.2, output: 0.9, cache_read: 0.02, cache_write: 0.25, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 0.2, output: 0.9, cache_read: 0.02, cache_write: 0.25 } } }, "grok-4.5": { id: "grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 2, output: 6, cache_read: 0.5, tiers: [{ input: 4, output: 12, cache_read: 1, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 12, cache_read: 1 } } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "mimo-v2.5-pro": { id: "mimo-v2.5-pro", name: "MiMo V2.5 Pro", description: "MiMo pro model for strong multimodal reasoning and agent execution", family: "mimo-v2.5-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 128000 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "qwen3.6-plus": { id: "qwen3.6-plus", name: "Qwen3.6 Plus", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 0.625, tiers: [{ input: 2, output: 6, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.2, cache_write: 2.5 } } } } }, poe: { id: "poe", env: ["POE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.poe.com/v1", name: "Poe", doc: "https://creator.poe.com/docs/external-applications/openai-compatible-api", models: { "stabilityai/stablediffusionxl": { id: "stabilityai/stablediffusionxl", name: "StableDiffusionXL", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "stable-diffusion", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2023-07-09", last_updated: "2023-07-09", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 200, output: 0 } }, "fireworks-ai/kimi-k2.5-fw": { id: "fireworks-ai/kimi-k2.5-fw", name: "Kimi-K2.5-FW", description: "Kimi multimodal agent model for visual understanding, coding, and planning", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, input: 245760, output: 16384 }, cost: { input: 0, output: 0 } }, "topazlabs-co/topazlabs": { id: "topazlabs-co/topazlabs", name: "TopazLabs", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "topazlabs", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-12-03", last_updated: "2024-12-03", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 204, output: 0 } }, "google/imagen-4-fast": { id: "google/imagen-4-fast", name: "Imagen-4-Fast", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "imagen", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-06-25", last_updated: "2025-06-25", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/gemini-3.5-flash": { id: "google/gemini-3.5-flash", name: "Gemini-3.5-Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5152, output: 9.0909, cache_read: 0.1515 } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini-2.5-Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, temperature: false, release_date: "2025-04-26", last_updated: "2025-04-26", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1065535, output: 65535 }, cost: { input: 0.21, output: 1.8, cache_read: 0.021 } }, "google/imagen-3": { id: "google/imagen-3", name: "Imagen-3", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "imagen", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-10-15", last_updated: "2024-10-15", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/gemini-3.1-pro": { id: "google/gemini-3.1-pro", name: "Gemini-3.1-Pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, temperature: false, release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2 } }, "google/veo-3": { id: "google/veo-3", name: "Veo-3", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-05-21", last_updated: "2025-05-21", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/imagen-4-ultra": { id: "google/imagen-4-ultra", name: "Imagen-4-Ultra", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "imagen", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-05-24", last_updated: "2025-05-24", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/gemini-3-flash": { id: "google/gemini-3-flash", name: "Gemini-3-Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "high"] }], tool_call: true, temperature: false, release_date: "2025-10-07", last_updated: "2025-10-07", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.4, output: 2.4, cache_read: 0.04 } }, "google/veo-3.1-fast": { id: "google/veo-3.1-fast", name: "Veo-3.1-Fast", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/veo-3-fast": { id: "google/veo-3-fast", name: "Veo-3-Fast", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-10-13", last_updated: "2025-10-13", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/gemini-deep-research": { id: "google/gemini-deep-research", name: "gemini-deep-research", description: "Legacy model retained for compatibility with older integrations", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 0 }, status: "deprecated", cost: { input: 1.6, output: 9.6 } }, "google/gemma-4-31b": { id: "google/gemma-4-31b", name: "Gemma-4-31B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 8192 }, cost: { input: 0, output: 0 } }, "google/gemini-3-pro": { id: "google/gemini-3-pro", name: "Gemini-3-Pro", description: "Legacy model retained for compatibility with older integrations", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-10-22", last_updated: "2025-10-22", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, status: "deprecated", cost: { input: 1.6, output: 9.6, cache_read: 0.16 } }, "google/imagen-3-fast": { id: "google/imagen-3-fast", name: "Imagen-3-Fast", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "imagen", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-10-17", last_updated: "2024-10-17", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/veo-2": { id: "google/veo-2", name: "Veo-2", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-12-02", last_updated: "2024-12-02", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/nano-banana-pro": { id: "google/nano-banana-pro", name: "Nano-Banana-Pro", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "nano-banana", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-11-19", last_updated: "2025-11-19", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 65536, output: 0 }, cost: { input: 2, output: 12, cache_read: 0.2 } }, "google/gemini-2.0-flash": { id: "google/gemini-2.0-flash", name: "Gemini-2.0-Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 990000, output: 8192 }, cost: { input: 0.1, output: 0.42 } }, "google/nano-banana": { id: "google/nano-banana", name: "Nano-Banana", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "nano-banana", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 0 }, cost: { input: 0.21, output: 1.8, cache_read: 0.021 } }, "google/gemini-3.1-flash-lite": { id: "google/gemini-3.1-flash-lite", name: "Gemini-3.1-Flash-Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "high"] }], tool_call: true, temperature: false, release_date: "2026-02-18", last_updated: "2026-02-18", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5 } }, "google/imagen-4": { id: "google/imagen-4", name: "Imagen-4", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "imagen", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini-2.5-Pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 0, max: 32768 }], tool_call: true, temperature: false, release_date: "2025-02-05", last_updated: "2025-02-05", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1065535, output: 65535 }, cost: { input: 0.87, output: 7, cache_read: 0.087 } }, "google/veo-3.1": { id: "google/veo-3.1", name: "Veo-3.1", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/gemini-2.5-flash-lite": { id: "google/gemini-2.5-flash-lite", name: "Gemini-2.5-Flash-Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, temperature: false, release_date: "2025-06-19", last_updated: "2025-06-19", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1024000, output: 64000 }, cost: { input: 0.07, output: 0.28 } }, "google/gemini-2.0-flash-lite": { id: "google/gemini-2.0-flash-lite", name: "Gemini-2.0-Flash-Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-02-05", last_updated: "2025-02-05", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 990000, output: 8192 }, cost: { input: 0.052, output: 0.21 } }, "google/lyria": { id: "google/lyria", name: "Lyria", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "lyria", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-06-04", last_updated: "2025-06-04", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "poetools/claude-code": { id: "poetools/claude-code", name: "claude-code", description: "Claude model for careful reasoning, writing, coding, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-11-27", last_updated: "2025-11-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 } }, "ideogramai/ideogram-v2": { id: "ideogramai/ideogram-v2", name: "Ideogram-v2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "ideogram", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-08-21", last_updated: "2024-08-21", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 150, output: 0 } }, "ideogramai/ideogram-v2a": { id: "ideogramai/ideogram-v2a", name: "Ideogram-v2a", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "ideogram", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-02-27", last_updated: "2025-02-27", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 150, output: 0 } }, "ideogramai/ideogram": { id: "ideogramai/ideogram", name: "Ideogram", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "ideogram", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-04-03", last_updated: "2024-04-03", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 150, output: 0 } }, "ideogramai/ideogram-v2a-turbo": { id: "ideogramai/ideogram-v2a-turbo", name: "Ideogram-v2a-Turbo", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "ideogram", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-02-27", last_updated: "2025-02-27", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 150, output: 0 } }, "empiriolabs/deepseek-v4-flash-el": { id: "empiriolabs/deepseek-v4-flash-el", name: "DeepSeek-V4-Flash-EL", description: "Fast DeepSeek model for efficient chat, coding help, and agent loops", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, release_date: "2026-04-24", last_updated: "2026-05-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, input: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28 } }, "empiriolabs/deepseek-v4-pro-el": { id: "empiriolabs/deepseek-v4-pro-el", name: "DeepSeek-V4-Pro-EL", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, release_date: "2026-04-24", last_updated: "2026-05-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, input: 1e6, output: 384000 }, cost: { input: 1.67, output: 3.33 } }, "xai/grok-4": { id: "xai/grok-4", name: "Grok-4", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-07-10", last_updated: "2025-07-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 3, output: 15, cache_read: 0.75 } }, "xai/grok-4.1-fast-reasoning": { id: "xai/grok-4.1-fast-reasoning", name: "Grok-4.1-Fast-Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-11-19", last_updated: "2025-11-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 } }, "xai/grok-4.20-multi-agent": { id: "xai/grok-4.20-multi-agent", name: "Grok-4.20-Multi-Agent", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2026-03-13", last_updated: "2026-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 0 }, cost: { input: 2, output: 6, cache_read: 0.2 } }, "xai/grok-4-fast-reasoning": { id: "xai/grok-4-fast-reasoning", name: "Grok-4-Fast-Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-09-16", last_updated: "2025-09-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 128000 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "xai/grok-code-fast-1": { id: "xai/grok-code-fast-1", name: "Grok Code Fast 1", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-08-22", last_updated: "2025-08-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 0.2, output: 1.5, cache_read: 0.02 } }, "xai/grok-4-fast-non-reasoning": { id: "xai/grok-4-fast-non-reasoning", name: "Grok-4-Fast-Non-Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-09-16", last_updated: "2025-09-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 128000 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "xai/grok-4.1-fast-non-reasoning": { id: "xai/grok-4.1-fast-non-reasoning", name: "Grok-4.1-Fast-Non-Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-11-19", last_updated: "2025-11-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 } }, "xai/grok-3-mini": { id: "xai/grok-3-mini", name: "Grok 3 Mini", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-04-11", last_updated: "2025-04-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.3, output: 0.5, cache_read: 0.075 } }, "xai/grok-3": { id: "xai/grok-3", name: "Grok 3", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-04-11", last_updated: "2025-04-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 3, output: 15, cache_read: 0.75 } }, "lumalabs/ray2": { id: "lumalabs/ray2", name: "Ray2", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "ray", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-02-20", last_updated: "2025-02-20", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 5000, output: 0 } }, "trytako/tako": { id: "trytako/tako", name: "Tako", description: "Tool-capable chat model for instruction following and agentic application workflows", family: "tako", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-08-15", last_updated: "2024-08-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 2048, output: 0 } }, "runwayml/runway-gen-4-turbo": { id: "runwayml/runway-gen-4-turbo", name: "Runway-Gen-4-Turbo", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "runway", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-05-09", last_updated: "2025-05-09", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 256, output: 0 } }, "runwayml/runway": { id: "runwayml/runway", name: "Runway", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "runway", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-10-11", last_updated: "2024-10-11", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 256, output: 0 } }, "anthropic/claude-sonnet-4.6": { id: "anthropic/claude-sonnet-4.6", name: "Claude-Sonnet-4.6", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, temperature: false, release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 983040, output: 128000 }, cost: { input: 2.6, output: 13, cache_read: 0.26, cache_write: 3.2 } }, "anthropic/claude-opus-4.1": { id: "anthropic/claude-opus-4.1", name: "Claude-Opus-4.1", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 0, max: 31999 }], tool_call: true, temperature: false, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 196608, output: 32000 }, cost: { input: 13, output: 64, cache_read: 1.3, cache_write: 16 } }, "anthropic/claude-opus-4.5": { id: "anthropic/claude-opus-4.5", name: "Claude-Opus-4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 0, max: 63999 }], tool_call: true, temperature: false, release_date: "2025-11-21", last_updated: "2025-11-21", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 196608, output: 64000 }, cost: { input: 4.3, output: 21, cache_read: 0.43, cache_write: 5.3 } }, "anthropic/claude-opus-4.7": { id: "anthropic/claude-opus-4.7", name: "Claude-Opus-4.7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, release_date: "2026-04-15", last_updated: "2026-04-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 128000 }, cost: { input: 4.3, output: 21, cache_read: 0.43, cache_write: 5.4 } }, "anthropic/claude-sonnet-4.5": { id: "anthropic/claude-sonnet-4.5", name: "Claude-Sonnet-4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 0, max: 31999 }], tool_call: true, temperature: false, release_date: "2025-09-26", last_updated: "2025-09-26", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 983040, output: 32768 }, cost: { input: 2.6, output: 13, cache_read: 0.26, cache_write: 3.2 } }, "anthropic/claude-sonnet-3.5": { id: "anthropic/claude-sonnet-3.5", name: "Claude-Sonnet-3.5", description: "Legacy model retained for compatibility with older integrations", family: "claude-sonnet", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-06-05", last_updated: "2024-06-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 189096, output: 8192 }, status: "deprecated", cost: { input: 2.6, output: 13, cache_read: 0.26, cache_write: 3.2 } }, "anthropic/claude-haiku-3.5": { id: "anthropic/claude-haiku-3.5", name: "Claude-Haiku-3.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-10-01", last_updated: "2024-10-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 189096, output: 8192 }, cost: { input: 0.68, output: 3.4, cache_read: 0.068, cache_write: 0.85 } }, "anthropic/claude-sonnet-4": { id: "anthropic/claude-sonnet-4", name: "Claude-Sonnet-4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-05-21", last_updated: "2025-05-21", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 983040, output: 64000 }, cost: { input: 2.6, output: 13, cache_read: 0.26, cache_write: 3.2 } }, "anthropic/claude-haiku-4.5": { id: "anthropic/claude-haiku-4.5", name: "Claude-Haiku-4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 0, max: 63999 }], tool_call: true, temperature: false, release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 192000, output: 64000 }, cost: { input: 0.85, output: 4.3, cache_read: 0.085, cache_write: 1.1 } }, "anthropic/claude-sonnet-3.7": { id: "anthropic/claude-sonnet-3.7", name: "Claude-Sonnet-3.7", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-02-19", last_updated: "2025-02-19", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 196608, output: 128000 }, cost: { input: 2.6, output: 13, cache_read: 0.26, cache_write: 3.2 } }, "anthropic/claude-sonnet-3.5-june": { id: "anthropic/claude-sonnet-3.5-june", name: "Claude-Sonnet-3.5-June", description: "Legacy model retained for compatibility with older integrations", family: "claude-sonnet", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-11-18", last_updated: "2024-11-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 189096, output: 8192 }, status: "deprecated", cost: { input: 2.6, output: 13, cache_read: 0.26, cache_write: 3.2 } }, "anthropic/claude-opus-4": { id: "anthropic/claude-opus-4", name: "Claude-Opus-4", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-05-21", last_updated: "2025-05-21", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 192512, output: 28672 }, cost: { input: 13, output: 64, cache_read: 1.3, cache_write: 16 } }, "anthropic/claude-opus-4.8": { id: "anthropic/claude-opus-4.8", name: "Claude-Opus-4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 128000 }, cost: { input: 4.2929, output: 21.4646 } }, "anthropic/claude-haiku-3": { id: "anthropic/claude-haiku-3", name: "Claude-Haiku-3", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-03-09", last_updated: "2024-03-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 189096, output: 8192 }, cost: { input: 0.21, output: 1.1, cache_read: 0.021, cache_write: 0.26 } }, "anthropic/claude-opus-4.6": { id: "anthropic/claude-opus-4.6", name: "Claude-Opus-4.6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, temperature: false, release_date: "2026-02-04", last_updated: "2026-02-04", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 983040, output: 128000 }, cost: { input: 4.3, output: 21, cache_read: 0.43, cache_write: 5.3 } }, "cerebras/qwen3-235b-2507-cs": { id: "cerebras/qwen3-235b-2507-cs", name: "qwen3-235b-2507-cs", description: "Legacy model retained for compatibility with older integrations", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-08-06", last_updated: "2025-08-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 }, status: "deprecated" }, "cerebras/llama-3.1-8b-cs": { id: "cerebras/llama-3.1-8b-cs", name: "Llama-3.1-8B-CS", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-05-13", last_updated: "2025-05-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 0 }, cost: { input: 0.1, output: 0.1 } }, "cerebras/qwen3-32b-cs": { id: "cerebras/qwen3-32b-cs", name: "qwen3-32b-cs", description: "Legacy model retained for compatibility with older integrations", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-05-15", last_updated: "2025-05-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 }, status: "deprecated" }, "cerebras/gpt-oss-120b-cs": { id: "cerebras/gpt-oss-120b-cs", name: "GPT-OSS-120B-CS", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-08-06", last_updated: "2025-08-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 0 }, cost: { input: 0.35, output: 0.75 } }, "cerebras/llama-3.3-70b-cs": { id: "cerebras/llama-3.3-70b-cs", name: "llama-3.3-70b-cs", description: "Legacy model retained for compatibility with older integrations", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-05-13", last_updated: "2025-05-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 }, status: "deprecated" }, "openai/gpt-5.1-codex-mini": { id: "openai/gpt-5.1-codex-mini", name: "GPT-5.1-Codex-Mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-11-12", last_updated: "2025-11-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.22, output: 1.8, cache_read: 0.022 } }, "openai/gpt-image-2": { id: "openai/gpt-image-2", name: "GPT-Image-2", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 5.0505, output: 32.3232, cache_read: 1.2626 } }, "openai/gpt-5.2-pro": { id: "openai/gpt-5.2-pro", name: "GPT-5.2-Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, temperature: false, release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 19, output: 150 } }, "openai/gpt-5.5-pro": { id: "openai/gpt-5.5-pro", name: "GPT-5.5-Pro", description: "Highest-accuracy GPT-5.5 tier for slower, precision-heavy reasoning and coding", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-08", last_updated: "2026-04-08", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 27.2727, output: 163.6364 } }, "openai/gpt-4.1-mini": { id: "openai/gpt-4.1-mini", name: "GPT-4.1-mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.36, output: 1.4, cache_read: 0.09 } }, "openai/gpt-4o": { id: "openai/gpt-4o", name: "GPT-4o", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-05-13", last_updated: "2024-05-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 } }, "openai/sora-2-pro": { id: "openai/sora-2-pro", name: "Sora-2-Pro", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "sora", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "openai/gpt-5-chat": { id: "openai/gpt-5-chat", name: "GPT-5-Chat", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-codex", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.1, output: 9, cache_read: 0.11 } }, "openai/gpt-5.3-codex-spark": { id: "openai/gpt-5.3-codex-spark", name: "GPT-5.3-Codex-Spark", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2026-03-04", last_updated: "2026-03-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "openai/gpt-4o-aug": { id: "openai/gpt-4o-aug", name: "GPT-4o-Aug", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-11-21", last_updated: "2024-11-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 2.2, output: 9, cache_read: 1.1 } }, "openai/gpt-5.4-pro": { id: "openai/gpt-5.4-pro", name: "GPT-5.4-Pro", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, temperature: false, release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 27, output: 160 } }, "openai/o3-mini-high": { id: "openai/o3-mini-high", name: "o3-mini-high", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-01-31", last_updated: "2025-01-31", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 0.99, output: 4 } }, "openai/gpt-4.1-nano": { id: "openai/gpt-4.1-nano", name: "GPT-4.1-nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.09, output: 0.36, cache_read: 0.022 } }, "openai/gpt-4o-search": { id: "openai/gpt-4o-search", name: "GPT-4o-Search", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-03-11", last_updated: "2025-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 2.2, output: 9 } }, "openai/chatgpt-4o-latest": { id: "openai/chatgpt-4o-latest", name: "ChatGPT-4o-Latest", description: "Legacy model retained for compatibility with older integrations", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-08-14", last_updated: "2024-08-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, status: "deprecated", cost: { input: 4.5, output: 14 } }, "openai/gpt-5.1-instant": { id: "openai/gpt-5.1-instant", name: "GPT-5.1-Instant", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-11-12", last_updated: "2025-11-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.1, output: 9, cache_read: 0.11 } }, "openai/o3-mini": { id: "openai/o3-mini", name: "o3-mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-01-31", last_updated: "2025-01-31", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 0.99, output: 4 } }, "openai/gpt-4-classic": { id: "openai/gpt-4-classic", name: "GPT-4-Classic", description: "Legacy model retained for compatibility with older integrations", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-03-25", last_updated: "2024-03-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 4096 }, status: "deprecated", cost: { input: 27, output: 54 } }, "openai/gpt-image-1-mini": { id: "openai/gpt-image-1-mini", name: "GPT-Image-1-Mini", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-08", last_updated: "2026-04-08", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 4.5455, output: 27.2727, cache_read: 0.4545 } }, "openai/gpt-5.3-instant": { id: "openai/gpt-5.3-instant", name: "GPT-5.3-Instant", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 111616, output: 16384 }, cost: { input: 1.6, output: 13, cache_read: 0.16 } }, "openai/o3-pro": { id: "openai/o3-pro", name: "o3-pro", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-06-10", last_updated: "2025-06-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 18, output: 72 } }, "openai/gpt-4o-mini": { id: "openai/gpt-4o-mini", name: "GPT-4o-mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 124096, output: 4096 }, cost: { input: 0.14, output: 0.54, cache_read: 0.068 } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT-5", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.1, output: 9, cache_read: 0.11 } }, "openai/dall-e-3": { id: "openai/dall-e-3", name: "DALL-E-3", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "dall-e", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2023-11-06", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 800, output: 0 } }, "openai/o4-mini-deep-research": { id: "openai/o4-mini-deep-research", name: "o4-mini-deep-research", description: "Research model for long-horizon investigation, synthesis, and analytical reports", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-06-27", last_updated: "2025-06-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.8, output: 7.2, cache_read: 0.45 } }, "openai/o3-deep-research": { id: "openai/o3-deep-research", name: "o3-deep-research", description: "Research model for long-horizon investigation, synthesis, and analytical reports", family: "o", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-06-27", last_updated: "2025-06-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 9, output: 36, cache_read: 2.2 } }, "openai/gpt-5-codex": { id: "openai/gpt-5-codex", name: "GPT-5-Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.1, output: 9 } }, "openai/gpt-3.5-turbo": { id: "openai/gpt-3.5-turbo", name: "GPT-3.5-Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2023-09-13", last_updated: "2023-09-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 2048 }, cost: { input: 0.45, output: 1.4 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT-5.4", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, temperature: false, release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image", "pdf"], output: ["image"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.2, output: 14, cache_read: 0.22 } }, "openai/gpt-4-classic-0314": { id: "openai/gpt-4-classic-0314", name: "GPT-4-Classic-0314", description: "Legacy model retained for compatibility with older integrations", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-08-26", last_updated: "2024-08-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 4096 }, status: "deprecated", cost: { input: 27, output: 54 } }, "openai/gpt-image-1.5": { id: "openai/gpt-image-1.5", name: "gpt-image-1.5", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 128000, output: 0 } }, "openai/gpt-5.2-codex": { id: "openai/gpt-5.2-codex", name: "GPT-5.2-Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, temperature: false, release_date: "2026-01-14", last_updated: "2026-01-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.6, output: 13, cache_read: 0.16 } }, "openai/gpt-3.5-turbo-raw": { id: "openai/gpt-3.5-turbo-raw", name: "GPT-3.5-Turbo-Raw", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2023-09-27", last_updated: "2023-09-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 4524, output: 2048 }, cost: { input: 0.45, output: 1.4 } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT-5.4-Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, temperature: false, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.18, output: 1.1, cache_read: 0.018 } }, "openai/gpt-5-pro": { id: "openai/gpt-5-pro", name: "GPT-5-Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 14, output: 110 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT-5.4-Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, temperature: false, release_date: "2026-03-12", last_updated: "2026-03-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.68, output: 4, cache_read: 0.068 } }, "openai/o1": { id: "openai/o1", name: "o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2024-12-18", last_updated: "2024-12-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 14, output: 54 } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, temperature: false, release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.6, output: 13, cache_read: 0.16 } }, "openai/gpt-5.3-codex": { id: "openai/gpt-5.3-codex", name: "GPT-5.3-Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, temperature: false, release_date: "2026-02-10", last_updated: "2026-02-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.6, output: 13, cache_read: 0.16 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT-5-mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-06-25", last_updated: "2025-06-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.22, output: 1.8, cache_read: 0.022 } }, "openai/o1-pro": { id: "openai/o1-pro", name: "o1-pro", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-03-19", last_updated: "2025-03-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 140, output: 540 } }, "openai/sora-2": { id: "openai/sora-2", name: "Sora-2", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "sora", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT-5.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-11-12", last_updated: "2025-11-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.1, output: 9, cache_read: 0.11 } }, "openai/gpt-4-turbo": { id: "openai/gpt-4-turbo", name: "GPT-4-Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2023-09-13", last_updated: "2023-09-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 9, output: 27 } }, "openai/gpt-5.1-codex": { id: "openai/gpt-5.1-codex", name: "GPT-5.1-Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-11-12", last_updated: "2025-11-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.1, output: 9, cache_read: 0.11 } }, "openai/gpt-5-nano": { id: "openai/gpt-5-nano", name: "GPT-5-nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.045, output: 0.36, cache_read: 0.0045 } }, "openai/o3": { id: "openai/o3", name: "o3", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.8, output: 7.2, cache_read: 0.45 } }, "openai/gpt-3.5-turbo-instruct": { id: "openai/gpt-3.5-turbo-instruct", name: "GPT-3.5-Turbo-Instruct", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2023-09-20", last_updated: "2023-09-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 3500, output: 1024 }, cost: { input: 1.4, output: 1.8 } }, "openai/gpt-image-1": { id: "openai/gpt-image-1", name: "GPT-Image-1", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-03-31", last_updated: "2025-03-31", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 128000, output: 0 } }, "openai/gpt-4o-mini-search": { id: "openai/gpt-4o-mini-search", name: "GPT-4o-mini-Search", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-03-11", last_updated: "2025-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.14, output: 0.54 } }, "openai/gpt-5.2-instant": { id: "openai/gpt-5.2-instant", name: "GPT-5.2-Instant", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.6, output: 13, cache_read: 0.16 } }, "openai/gpt-4.1": { id: "openai/gpt-4.1", name: "GPT-4.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 1.8, output: 7.2, cache_read: 0.45 } }, "openai/o4-mini": { id: "openai/o4-mini", name: "o4-mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 0.99, output: 4, cache_read: 0.25 } }, "openai/gpt-5.1-codex-max": { id: "openai/gpt-5.1-codex-max", name: "GPT-5.1-Codex-Max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, temperature: false, release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.1, output: 9, cache_read: 0.11 } }, "novita/glm-4.6v": { id: "novita/glm-4.6v", name: "glm-4.6v", description: "GLM vision model for visual reasoning, documents, and multimodal agents", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: false, release_date: "2025-12-09", last_updated: "2025-12-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 32768 } }, "novita/glm-5": { id: "novita/glm-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 205000, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.2 } }, "novita/kimi-k2.5": { id: "novita/kimi-k2.5", name: "Kimi-K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 262144 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "novita/glm-4.7-flash": { id: "novita/glm-4.7-flash", name: "glm-4.7-flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: false, release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 65500 } }, "novita/kimi-k2.6": { id: "novita/kimi-k2.6", name: "Kimi-K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-20", last_updated: "2026-05-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 262144 }, cost: { input: 0.96, output: 4.04, cache_read: 0.16 } }, "novita/glm-4.6": { id: "novita/glm-4.6", name: "GLM-4.6", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 } }, "novita/deepseek-v3.2": { id: "novita/deepseek-v3.2", name: "DeepSeek-V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 0 }, cost: { input: 0.27, output: 0.4, cache_read: 0.13 } }, "novita/glm-4.7": { id: "novita/glm-4.7", name: "glm-4.7", description: "Legacy model retained for compatibility with older integrations", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 205000, output: 131072 }, status: "deprecated" }, "novita/kimi-k2-thinking": { id: "novita/kimi-k2-thinking", name: "kimi-k2-thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: false, release_date: "2025-11-07", last_updated: "2025-11-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 0 } }, "novita/minimax-m2.1": { id: "novita/minimax-m2.1", name: "minimax-m2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: false, release_date: "2025-12-26", last_updated: "2025-12-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 205000, output: 131072 } }, "novita/glm-4.7-n": { id: "novita/glm-4.7-n", name: "glm-4.7-n", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: false, release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 205000, output: 131072 } }, "elevenlabs/elevenlabs-v2.5-turbo": { id: "elevenlabs/elevenlabs-v2.5-turbo", name: "ElevenLabs-v2.5-Turbo", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "elevenlabs", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2024-10-28", last_updated: "2024-10-28", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 128000, output: 0 } }, "elevenlabs/elevenlabs-v3": { id: "elevenlabs/elevenlabs-v3", name: "ElevenLabs-v3", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "elevenlabs", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-06-05", last_updated: "2025-06-05", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 128000, output: 0 } }, "elevenlabs/elevenlabs-music": { id: "elevenlabs/elevenlabs-music", name: "ElevenLabs-Music", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "elevenlabs", attachment: true, reasoning: false, tool_call: true, temperature: false, release_date: "2025-08-29", last_updated: "2025-08-29", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 2000, output: 0 } } } }, baseten: { id: "baseten", env: ["BASETEN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://inference.baseten.co/v1", name: "Baseten", doc: "https://docs.baseten.co/inference/model-apis/overview", models: { "nvidia/Nemotron-120B-A12B": { id: "nvidia/Nemotron-120B-A12B", name: "Nemotron Super", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2026-02", release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202800, output: 202800 }, cost: { input: 0.3, output: 0.75, cache_read: 0.06 } }, "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B": { id: "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B", name: "Nemotron Ultra", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202800, output: 202800 }, cost: { input: 0.6, output: 2.4, cache_read: 0.12 } }, "thinkingmachines/inkling-small": { id: "thinkingmachines/inkling-small", name: "Inkling Small", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-07-30", last_updated: "2026-07-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 32768 }, cost: { input: 0.5, output: 1.2, cache_read: 0.1 } }, "thinkingmachines/inkling": { id: "thinkingmachines/inkling", name: "Inkling", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 32768 }, cost: { input: 1, output: 4.05 } }, "zai-org/GLM-5": { id: "zai-org/GLM-5", name: "GLM 5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2026-01", release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202800, output: 202800 }, cost: { input: 0.95, output: 3.15, cache_read: 0.2 } }, "zai-org/GLM-5.2-Fast": { id: "zai-org/GLM-5.2-Fast", name: "GLM 5.2 Fast", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 262144 }, cost: { input: 2.1, output: 6.6, cache_read: 0.21 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 262144 }, cost: { input: 1.4, output: 4.4, cache_read: 0.3 } }, "zai-org/GLM-5.1": { id: "zai-org/GLM-5.1", name: "GLM 5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202800, output: 202800 }, cost: { input: 1.3, output: 4.3, cache_read: 0.26 } }, "zai-org/GLM-4.7": { id: "zai-org/GLM-4.7", name: "GLM 4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 200000 }, cost: { input: 0.6, output: 2.2, cache_read: 0.12 } }, "MiniMaxAI/MiniMax-M2.5": { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax-M2.5", description: "Legacy model retained for compatibility with older integrations", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2026-01", release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204000, output: 204000 }, status: "deprecated", cost: { input: 0.3, output: 1.2 } }, "deepseek-ai/DeepSeek-V4-Flash-0731": { id: "deepseek-ai/DeepSeek-V4-Flash-0731", name: "Deepseek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 0.13, output: 0.26, cache_read: 0.028 } }, "deepseek-ai/DeepSeek-V3.1": { id: "deepseek-ai/DeepSeek-V3.1", name: "DeepSeek V3.1", description: "Legacy model retained for compatibility with older integrations", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-08-25", last_updated: "2025-08-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 164000, output: 131000 }, status: "deprecated", cost: { input: 0.5, output: 1.5 } }, "deepseek-ai/DeepSeek-V4-Pro": { id: "deepseek-ai/DeepSeek-V4-Pro", name: "Deepseek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.74, output: 3.48, cache_read: 0.145 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "moonshotai/Kimi-K2.5": { id: "moonshotai/Kimi-K2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-12", release_date: "2026-01-30", last_updated: "2026-02-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.6, output: 3, cache_read: 0.12 } }, "moonshotai/Kimi-K2.7-Code": { id: "moonshotai/Kimi-K2.7-Code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "moonshotai/Kimi-K3": { id: "moonshotai/Kimi-K3", name: "Kimi K3", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 262144 }, cost: { input: 3, output: 15 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "OpenAI GPT 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128072, output: 128072 }, cost: { input: 0.1, output: 0.5 } } } }, nvidia: { id: "nvidia", env: ["NVIDIA_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://integrate.api.nvidia.com/v1", name: "Nvidia", doc: "https://docs.api.nvidia.com/nim/", models: { "microsoft/phi-4-mini-instruct": { id: "microsoft/phi-4-mini-instruct", name: "Phi-4-Mini", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "phi", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2024-12-01", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0, output: 0 } }, "microsoft/phi-4-multimodal-instruct": { id: "microsoft/phi-4-multimodal-instruct", name: "Phi 4 Multimodal", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-26", last_updated: "2025-07-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "nvidia/magpie-tts-zeroshot": { id: "nvidia/magpie-tts-zeroshot", name: "magpie-tts-zeroshot", description: "Speech generation model for controllable voice, narration, and audio delivery", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-05-22", last_updated: "2025-06-12", modalities: { input: ["text", "audio"], output: ["audio"] }, open_weights: true, limit: { context: 0, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/nv-embedcode-7b-v1": { id: "nvidia/nv-embedcode-7b-v1", name: "nv-embedcode-7b-v1", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-03-17", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 2048 }, cost: { input: 0, output: 0 } }, "nvidia/studiovoice": { id: "nvidia/studiovoice", name: "studiovoice", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-10-03", last_updated: "2025-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "nvidia/sparsedrive": { id: "nvidia/sparsedrive", name: "sparsedrive", description: "Nemotron multimodal model for visual reasoning and agentic AI workflows", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-03-18", last_updated: "2025-07-20", modalities: { input: ["video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "nvidia/cosmos-reason2-8b": { id: "nvidia/cosmos-reason2-8b", name: "Cosmos Reason2 8B", description: "Vision language model for physical-world understanding with structured reasoning on video and images", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-nano-12b-v2-vl": { id: "nvidia/nemotron-nano-12b-v2-vl", name: "Nemotron Nano 12B v2 VL", description: "Nemotron multimodal model for visual reasoning and agentic AI workflows", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-10-28", last_updated: "2025-10-28", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0, output: 0 } }, "nvidia/bevformer": { id: "nvidia/bevformer", name: "bevformer", description: "Nemotron multimodal model for visual reasoning and agentic AI workflows", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-03-18", last_updated: "2025-07-20", modalities: { input: ["video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-nano-30b-a3b": { id: "nvidia/nemotron-3-nano-30b-a3b", name: "nemotron-3-nano-30b-a3b", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2024-12", last_updated: "2024-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0, output: 0 } }, "nvidia/llama-3.3-nemotron-super-49b-v1.5": { id: "nvidia/llama-3.3-nemotron-super-49b-v1.5", name: "Llama 3.3 Nemotron Super 49B v1.5", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0, output: 0 } }, "nvidia/cosmos-transfer2_5-2b": { id: "nvidia/cosmos-transfer2_5-2b", name: "cosmos-transfer2.5-2b", description: "Video model for prompt-guided generation, editing, and motion workflows", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image", "video"], output: ["video"] }, open_weights: true, limit: { context: 0, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/llama-3.1-nemotron-nano-8b-v1": { id: "nvidia/llama-3.1-nemotron-nano-8b-v1", name: "Llama 3.1 Nemotron Nano 8B v1", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2025-03-18", last_updated: "2025-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0, output: 0 } }, "nvidia/active-speaker-detection": { id: "nvidia/active-speaker-detection", name: "Active Speaker Detection", description: "Nemotron multimodal model for visual reasoning and agentic AI workflows", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["video"], output: ["text"] }, open_weights: true, limit: { context: 0, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/usdvalidate": { id: "nvidia/usdvalidate", name: "usdvalidate", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-07-24", last_updated: "2025-01-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 0, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/llama-3.1-nemotron-safety-guard-8b-v3": { id: "nvidia/llama-3.1-nemotron-safety-guard-8b-v3", name: "llama-3.1-nemotron-safety-guard-8b-v3", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "nemotron", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-10-28", last_updated: "2025-10-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/llama-3.3-nemotron-super-49b-v1": { id: "nvidia/llama-3.3-nemotron-super-49b-v1", name: "Llama 3.3 Nemotron Super 49B v1", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2025-04-07", last_updated: "2025-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0, output: 0 } }, "nvidia/llama-3.1-nemotron-70b-instruct": { id: "nvidia/llama-3.1-nemotron-70b-instruct", name: "Llama 3.1 Nemotron 70B Instruct", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", family: "nemotron", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-super-120b-a12b": { id: "nvidia/nemotron-3-super-120b-a12b", name: "Nemotron 3 Super", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.2, output: 0.8 } }, "nvidia/nemotron-3-content-safety": { id: "nvidia/nemotron-3-content-safety", name: "nemotron-3-content-safety", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "nemotron", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/cosmos-transfer1-7b": { id: "nvidia/cosmos-transfer1-7b", name: "cosmos-transfer1-7b", description: "Video model for prompt-guided generation, editing, and motion workflows", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-06-13", last_updated: "2025-06-30", modalities: { input: ["text", "image", "video"], output: ["video"] }, open_weights: true, limit: { context: 0, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/llama-3.1-nemotron-ultra-253b-v1": { id: "nvidia/llama-3.1-nemotron-ultra-253b-v1", name: "Llama 3.1 Nemotron Ultra 253B", description: "Flagship Nemotron model for high-throughput reasoning and complex agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2025-04-07", last_updated: "2025-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "nvidia/llama-3_2-nemoretriever-300m-embed-v1": { id: "nvidia/llama-3_2-nemoretriever-300m-embed-v1", name: "llama-3_2-nemoretriever-300m-embed-v1", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-07-24", last_updated: "2025-07-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 2048 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning": { id: "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning", name: "Nemotron 3 Nano Omni", description: "Open Nemotron omni model combining reasoning with text, vision, and audio", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: -1, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-28", last_updated: "2026-04-28", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 65536 }, cost: { input: 0, output: 0 } }, "nvidia/gliner-pii": { id: "nvidia/gliner-pii", name: "gliner-pii", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/rerank-qa-mistral-4b": { id: "nvidia/rerank-qa-mistral-4b", name: "rerank-qa-mistral-4b", description: "Reranking model for improving retrieval quality in search and recommendation systems", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-03-17", last_updated: "2025-01-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/llama-3.1-nemotron-nano-vl-8b-v1": { id: "nvidia/llama-3.1-nemotron-nano-vl-8b-v1", name: "Llama 3.1 Nemotron Nano VL 8B v1", description: "Nemotron multimodal model for visual reasoning and agentic AI workflows", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-04-10", last_updated: "2025-04-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 16384 }, cost: { input: 0, output: 0 } }, "nvidia/synthetic-video-detector": { id: "nvidia/synthetic-video-detector", name: "synthetic-video-detector", description: "Video model for prompt-guided generation, editing, and motion workflows", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["video"], output: ["text"] }, open_weights: true, limit: { context: 0, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/streampetr": { id: "nvidia/streampetr", name: "streampetr", description: "Nemotron multimodal model for visual reasoning and agentic AI workflows", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-voicechat": { id: "nvidia/nemotron-voicechat", name: "nemotron-voicechat", description: "Nemotron multimodal model for visual reasoning and agentic AI workflows", family: "nemotron", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "audio"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "nvidia/llama-nemotron-embed-vl-1b-v2": { id: "nvidia/llama-nemotron-embed-vl-1b-v2", name: "llama-nemotron-embed-vl-1b-v2", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "nemotron", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-02-10", last_updated: "2026-02-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 2048 }, cost: { input: 0, output: 0 } }, "nvidia/nvidia-nemotron-nano-9b-v2": { id: "nvidia/nvidia-nemotron-nano-9b-v2", name: "nvidia-nemotron-nano-9b-v2", description: "Compact Nemotron model for efficient reasoning and deployable AI agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2025-08-18", last_updated: "2025-08-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0, output: 0 } }, "nvidia/riva-translate-4b-instruct-v1.1": { id: "nvidia/riva-translate-4b-instruct-v1.1", name: "riva-translate-4b-instruct-v1_1", description: "Translation model for multilingual conversion, localization, and cross-language workflows", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-12-12", last_updated: "2025-12-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-content-safety-reasoning-4b": { id: "nvidia/nemotron-content-safety-reasoning-4b", name: "nemotron-content-safety-reasoning-4b", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: false, release_date: "2026-01-22", last_updated: "2026-01-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-ultra-550b-a55b": { id: "nvidia/nemotron-3-ultra-550b-a55b", name: "Nemotron 3 Ultra 550B A55B", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 65536 }, cost: { input: 0.5, output: 2.5, cache_read: 0.15 } }, "nvidia/llama-nemotron-rerank-vl-1b-v2": { id: "nvidia/llama-nemotron-rerank-vl-1b-v2", name: "llama-nemotron-rerank-vl-1b-v2", description: "Reranking model for improving retrieval quality in search and recommendation systems", family: "nemotron", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-03-31", last_updated: "2026-03-31", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/nv-embed-v1": { id: "nvidia/nv-embed-v1", name: "nv-embed-v1", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-06-07", last_updated: "2025-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 2048 }, cost: { input: 0, output: 0 } }, "nvidia/cosmos-predict1-5b": { id: "nvidia/cosmos-predict1-5b", name: "cosmos-predict1-5b", description: "Video model for prompt-guided generation, editing, and motion workflows", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-03-18", last_updated: "2025-03-18", modalities: { input: ["text", "image", "video"], output: ["video"] }, open_weights: true, limit: { context: 0, output: 4096 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-mini-4b-instruct": { id: "nvidia/nemotron-mini-4b-instruct", name: "nemotron-mini-4b-instruct", description: "Compact Nemotron model for efficient reasoning and deployable AI agents", family: "nemotron", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-08-21", last_updated: "2024-08-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "nvidia/usdcode": { id: "nvidia/usdcode", name: "usdcode", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-01", last_updated: "2026-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "google/google-paligemma": { id: "google/google-paligemma", name: "paligemma", description: "Gemini multimodal model for text, image, audio, video, and document tasks", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2024-05-14", last_updated: "2024-08-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "google/gemma-3-4b-it": { id: "google/gemma-3-4b-it", name: "Gemma 3 4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-03-12", last_updated: "2025-03-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0, output: 0 } }, "google/gemma-2-2b-it": { id: "google/gemma-2-2b-it", name: "Gemma 2 2b It", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-07-16", last_updated: "2024-07-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "google/gemma-3-12b-it": { id: "google/gemma-3-12b-it", name: "Gemma 3 12B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-03-12", last_updated: "2025-03-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0, output: 0 } }, "google/gemma-4-31b-it": { id: "google/gemma-4-31b-it", name: "Gemma-4-31B-IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 0, output: 0 } }, "google/gemma-3n-e4b-it": { id: "google/gemma-3n-e4b-it", name: "Gemma 3n E4b It", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06", release_date: "2025-06-03", last_updated: "2025-06-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "google/gemma-3n-e2b-it": { id: "google/gemma-3n-e2b-it", name: "Gemma 3n E2b It", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06", release_date: "2025-06-12", last_updated: "2025-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "thinkingmachines/inkling": { id: "thinkingmachines/inkling", name: "Inkling", description: "Multimodal MoE reasoning model (975B total, 41B active) for text, image, and audio", family: "ling", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 16384 }, cost: { input: 0, output: 0 } }, "baai/bge-m3": { id: "baai/bge-m3", name: "BGE M3", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "bge", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-01-30", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 1024 }, cost: { input: 0, output: 0 } }, "qwen/qwen3-coder-480b-a35b-instruct": { id: "qwen/qwen3-coder-480b-a35b-instruct", name: "Qwen3 Coder 480B A35B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 66536 }, cost: { input: 0, output: 0 } }, "qwen/qwen-image-edit": { id: "qwen/qwen-image-edit", name: "Qwen Image Edit", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-19", last_updated: "2025-08-19", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 0, output: 0 } }, "qwen/qwen2.5-coder-32b-instruct": { id: "qwen/qwen2.5-coder-32b-instruct", name: "Qwen2.5 Coder 32b Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-11-06", last_updated: "2024-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "qwen/qwen-image": { id: "qwen/qwen-image", name: "Qwen Image", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 0, output: 0 } }, "qwen/qwen3.5-397b-a17b": { id: "qwen/qwen3.5-397b-a17b", name: "Qwen3.5-397B-A17B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-01", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 8192 }, cost: { input: 0, output: 0 } }, "qwen/qwen3.5-122b-a10b": { id: "qwen/qwen3.5-122b-a10b", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0, output: 0 } }, "qwen/qwen3-next-80b-a3b-instruct": { id: "qwen/qwen3-next-80b-a3b-instruct", name: "Qwen3-Next-80B-A3B-Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2024-12-01", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 16384 }, cost: { input: 0, output: 0 } }, "abacusai/dracarys-llama-3.1-70b-instruct": { id: "abacusai/dracarys-llama-3.1-70b-instruct", name: "dracarys-llama-3.1-70b-instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-09-11", last_updated: "2025-05-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "upstage/solar-10.7b-instruct": { id: "upstage/solar-10.7b-instruct", name: "solar-10.7b-instruct", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-06-05", last_updated: "2025-04-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "black-forest-labs/flux_2-klein-4b": { id: "black-forest-labs/flux_2-klein-4b", name: "FLUX.2 Klein 4B", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-06", release_date: "2026-01-14", last_updated: "2026-01-31", modalities: { input: ["image", "text"], output: ["image"] }, open_weights: true, limit: { context: 40960, output: 40960 }, cost: { input: 0, output: 0 } }, "black-forest-labs/flux_1-schnell": { id: "black-forest-labs/flux_1-schnell", name: "FLUX.1-schnell", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, knowledge: "2024-07", release_date: "2024-08-01", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["image"] }, open_weights: true, limit: { context: 77, input: 77, output: 0 }, cost: { input: 0, output: 0 } }, "black-forest-labs/flux_1-kontext-dev": { id: "black-forest-labs/flux_1-kontext-dev", name: "FLUX.1-Kontext-dev", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-08-12", last_updated: "2025-08-12", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: true, limit: { context: 40960, output: 40960 }, cost: { input: 0, output: 0 } }, "black-forest-labs/flux.1-dev": { id: "black-forest-labs/flux.1-dev", name: "FLUX.1-dev", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-08", release_date: "2024-08-01", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 4096, output: 0 }, cost: { input: 0, output: 0 } }, "mistralai/mistral-medium-3.5-128b": { id: "mistralai/mistral-medium-3.5-128b", name: "Mistral Medium 3.5", description: "Balanced Mistral model for enterprise assistants, multilingual work, and tools", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "mistralai/mistral-nemotron": { id: "mistralai/mistral-nemotron", name: "mistral-nemotron", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "nemotron", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-06-11", last_updated: "2025-06-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "mistralai/mistral-medium-3-instruct": { id: "mistralai/mistral-medium-3-instruct", name: "Mistral Medium 3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, input: 131072, output: 32768 }, cost: { input: 0, output: 0 } }, "mistralai/mistral-small-4-119b-2603": { id: "mistralai/mistral-small-4-119b-2603", name: "mistral-small-4-119b-2603", description: "Efficient Mistral model for fast chat, extraction, and production assistants", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "mistralai/mistral-large-3-675b-instruct-2512": { id: "mistralai/mistral-large-3-675b-instruct-2512", name: "Mistral Large 3 675B Instruct 2512", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0 } }, "mistralai/ministral-14b-instruct-2512": { id: "mistralai/ministral-14b-instruct-2512", name: "Ministral 3 14B Instruct 2512", description: "Compact Mistral VLM for chat and instruction-based workloads", family: "ministral", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0, output: 0 } }, "mistralai/mixtral-8x22b-instruct": { id: "mistralai/mixtral-8x22b-instruct", name: "Mistral: Mixtral 8x22B Instruct", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-04-17", last_updated: "2024-04-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 13108 }, cost: { input: 0, output: 0 } }, "mistralai/magistral-small-2506": { id: "mistralai/magistral-small-2506", name: "Magistral Small 2506", description: "Mistral reasoning model for transparent analysis, math, and complex decisions", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 32768 }, cost: { input: 0, output: 0 } }, "mistralai/mixtral-8x7b-instruct": { id: "mistralai/mixtral-8x7b-instruct", name: "Mistral: Mixtral 8x7B Instruct", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2023-12-10", last_updated: "2026-03-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 16384 }, cost: { input: 0, output: 0 } }, "mistralai/mistral-7b-instruct-v0.3": { id: "mistralai/mistral-7b-instruct-v0.3", name: "Mistral-7B-Instruct-v0.3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-01", last_updated: "2025-04-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 0, output: 0 } }, "bytedance/seed-oss-36b-instruct": { id: "bytedance/seed-oss-36b-instruct", name: "ByteDance-Seed/Seed-OSS-36B-Instruct", description: "Tool-capable chat model for instruction following and agentic application workflows", family: "seed", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-04", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0, output: 0 } }, "meta/llama-3.1-70b-instruct": { id: "meta/llama-3.1-70b-instruct", name: "Llama 3.1 70b Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-07-16", last_updated: "2024-07-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "meta/llama-4-maverick-17b-128e-instruct": { id: "meta/llama-4-maverick-17b-128e-instruct", name: "Llama 4 Maverick 17b 128e Instruct", description: "Open multimodal Llama model for strong reasoning and fast responses", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-02", release_date: "2025-04-01", last_updated: "2025-04-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "meta/llama-guard-4-12b": { id: "meta/llama-guard-4-12b", name: "Llama Guard 4 12B", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "llama", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-05", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "meta/llama-3.2-1b-instruct": { id: "meta/llama-3.2-1b-instruct", name: "Llama 3.2 1b Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2024-09-18", last_updated: "2024-09-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "meta/llama-3.3-70b-instruct": { id: "meta/llama-3.3-70b-instruct", name: "Llama 3.3 70b Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-11-26", last_updated: "2024-11-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "meta/llama-3.2-3b-instruct": { id: "meta/llama-3.2-3b-instruct", name: "Llama 3.2 3B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-09-18", last_updated: "2024-09-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32000 }, cost: { input: 0, output: 0 } }, "meta/llama-3.2-90b-vision-instruct": { id: "meta/llama-3.2-90b-vision-instruct", name: "Llama-3.2-90B-Vision-Instruct", description: "Open Llama multimodal model for image understanding and text reasoning", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "meta/esmfold": { id: "meta/esmfold", name: "esmfold", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-03-15", last_updated: "2025-06-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "meta/llama-3.1-8b-instruct": { id: "meta/llama-3.1-8b-instruct", name: "Llama 3.1 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16000, output: 4096 }, cost: { input: 0, output: 0 } }, "meta/llama-3.2-11b-vision-instruct": { id: "meta/llama-3.2-11b-vision-instruct", name: "Llama 3.2 11b Vision Instruct", description: "Open Llama multimodal model for image understanding and text reasoning", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2024-09-18", last_updated: "2024-09-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "meta/esm2-650m": { id: "meta/esm2-650m", name: "esm2-650m", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-08-29", last_updated: "2025-03-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "poolside/laguna-xs-2.1": { id: "poolside/laguna-xs-2.1", name: "Laguna XS 2.1", description: "Agentic coding model from Poolside in the XS size class for local deployment", family: "laguna", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-02", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0, output: 0 } }, "deepseek-ai/deepseek-v4-flash": { id: "deepseek-ai/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 393216 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "deepseek-ai/deepseek-v4-pro": { id: "deepseek-ai/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 393216 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "stepfun-ai/step-3.5-flash": { id: "stepfun-ai/step-3.5-flash", name: "Step 3.5 Flash", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2026-02-02", last_updated: "2026-02-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 0, output: 0 } }, "stepfun-ai/step-3.7-flash": { id: "stepfun-ai/step-3.7-flash", name: "Step 3.7 Flash", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 0, output: 0 } }, "z-ai/glm-5.2": { id: "z-ai/glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0 } }, "moonshotai/kimi-k2.6": { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0, output: 0 } }, "moonshotai/kimi-k2-instruct-0905": { id: "moonshotai/kimi-k2-instruct-0905", name: "Kimi K2 0905", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0, output: 0 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0, output: 0 } }, "openai/whisper-large-v3": { id: "openai/whisper-large-v3", name: "Whisper Large v3", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "whisper", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2023-09", release_date: "2023-09-01", last_updated: "2025-09-05", modalities: { input: ["audio"], output: ["text"] }, open_weights: true, limit: { context: 0, output: 4096 }, cost: { input: 0, output: 0 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT-OSS-120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08", release_date: "2025-08-04", last_updated: "2025-08-14", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "minimaxai/minimax-m2.7": { id: "minimaxai/minimax-m2.7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-04-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0 } }, "minimaxai/minimax-m3": { id: "minimaxai/minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 16384 }, cost: { input: 0, output: 0 } }, "sarvamai/sarvam-m": { id: "sarvamai/sarvam-m", name: "sarvam-m", description: "Efficient Indian-language reasoning model for chat, coding, and multilingual work", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } } } }, nebius: { id: "nebius", env: ["NEBIUS_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.tokenfactory.nebius.com/v1", name: "Nebius Token Factory", doc: "https://docs.tokenfactory.nebius.com/", models: { "nvidia/nemotron-3-super-120b-a12b": { id: "nvidia/nemotron-3-super-120b-a12b", name: "Nemotron-3-Super-120B-A12B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-02", release_date: "2026-03-11", last_updated: "2026-03-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 32768 }, cost: { input: 0.3, output: 0.9 } }, "nvidia/Nemotron-3-Nano-Omni": { id: "nvidia/Nemotron-3-Nano-Omni", name: "Nemotron-3-Nano-Omni", description: "Open Nemotron omni model combining reasoning with text, vision, and audio", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-01-20", last_updated: "2026-05-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, input: 60000, output: 8192 }, cost: { input: 0.06, output: 0.24, cache_read: 0.006, cache_write: 0.075 } }, "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B": { id: "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B", name: "Nemotron-3-Nano-30B-A3B", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-08-10", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, input: 30000, output: 4096 }, cost: { input: 0.06, output: 0.24, cache_read: 0.006, cache_write: 0.075 } }, "nvidia/Llama-3_1-Nemotron-Ultra-253B-v1": { id: "nvidia/Llama-3_1-Nemotron-Ultra-253B-v1", name: "Llama-3.1-Nemotron-Ultra-253B-v1", description: "Flagship Nemotron model for high-throughput reasoning and complex agents", family: "nemotron", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-15", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 120000, output: 4096 }, cost: { input: 0.6, output: 1.8, cache_read: 0.06, cache_write: 0.75 } }, "google/gemma-3-27b-it": { id: "google/gemma-3-27b-it", name: "Gemma-3-27b-it", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-10", release_date: "2026-01-20", last_updated: "2026-02-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 110000, input: 1e5, output: 8192 }, cost: { input: 0.1, output: 0.3, cache_read: 0.01, cache_write: 0.125 } }, "zai-org/GLM-5": { id: "zai-org/GLM-5", name: "GLM-5", description: "Legacy model retained for compatibility with older integrations", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2026-01", release_date: "2026-03-01", last_updated: "2026-03-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 16384 }, status: "deprecated", cost: { input: 1, output: 3.2, cache_read: 0.1, cache_write: 1 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 432000, output: 432000 }, cost: { input: 1.4, output: 4.4 } }, "Qwen/Qwen3-235B-A22B-Instruct-2507": { id: "Qwen/Qwen3-235B-A22B-Instruct-2507", name: "Qwen3 235B A22B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-25", last_updated: "2025-10-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 8192 }, cost: { input: 0.2, output: 0.6 } }, "Qwen/Qwen3-Next-80B-A3B-Thinking-fast": { id: "Qwen/Qwen3-Next-80B-A3B-Thinking-fast", name: "Qwen3-Next-80B-A3B-Thinking-fast", description: "Legacy model retained for compatibility with older integrations", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-25", last_updated: "2026-05-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8000, input: 7000, output: 8192 }, status: "deprecated", cost: { input: 0.15, output: 1.2, cache_read: 0.015, cache_write: 0.1875 } }, "Qwen/Qwen3-235B-A22B-Thinking-2507-fast": { id: "Qwen/Qwen3-235B-A22B-Thinking-2507-fast", name: "Qwen3-235B-A22B-Thinking-2507-fast", description: "Legacy model retained for compatibility with older integrations", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-25", last_updated: "2026-05-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8000, input: 7000, output: 8192 }, status: "deprecated", cost: { input: 0.5, output: 2, cache_read: 0.05, cache_write: 0.625 } }, "Qwen/Qwen3.5-397B-A17B": { id: "Qwen/Qwen3.5-397B-A17B", name: "Qwen3.5-397B-A17B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-15", last_updated: "2026-05-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 250000, output: 8192 }, cost: { input: 0.6, output: 3.6, cache_read: 0.06, cache_write: 0.75 } }, "Qwen/Qwen3-Embedding-8B": { id: "Qwen/Qwen3-Embedding-8B", name: "Qwen3-Embedding-8B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, knowledge: "2025-10", release_date: "2026-01-10", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, input: 32768, output: 0 }, cost: { input: 0.01, output: 0 } }, "Qwen/Qwen3-Next-80B-A3B-Thinking": { id: "Qwen/Qwen3-Next-80B-A3B-Thinking", name: "Qwen3-Next-80B-A3B-Thinking", description: "Qwen reasoning model for deliberate problem solving, math, and coding", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-12", release_date: "2026-01-28", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 120000, output: 16384 }, cost: { input: 0.15, output: 1.2, reasoning: 1.2, cache_read: 0.015, cache_write: 0.18 } }, "Qwen/Qwen3-30B-A3B-Instruct-2507": { id: "Qwen/Qwen3-30B-A3B-Instruct-2507", name: "Qwen3-30B-A3B-Instruct-2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-12", release_date: "2026-01-28", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 120000, output: 8192 }, cost: { input: 0.1, output: 0.3, cache_read: 0.01, cache_write: 0.125 } }, "Qwen/Qwen2.5-VL-72B-Instruct": { id: "Qwen/Qwen2.5-VL-72B-Instruct", name: "Qwen2.5-VL-72B-Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-20", last_updated: "2026-02-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 120000, output: 8192 }, cost: { input: 0.25, output: 0.75, cache_read: 0.025, cache_write: 0.31 } }, "Qwen/Qwen3-32B": { id: "Qwen/Qwen3-32B", name: "Qwen3-32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-12", release_date: "2026-01-28", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 120000, output: 8192 }, cost: { input: 0.1, output: 0.3, cache_read: 0.01, cache_write: 0.125 } }, "Qwen/Qwen3.5-397B-A17B-fast": { id: "Qwen/Qwen3.5-397B-A17B-fast", name: "Qwen3.5-397B-A17B-fast", description: "Legacy model retained for compatibility with older integrations", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-15", last_updated: "2026-05-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8000, input: 7000, output: 8192 }, status: "deprecated", cost: { input: 0.6, output: 3.6, cache_read: 0.06, cache_write: 0.75 } }, "MiniMaxAI/MiniMax-M2.5-fast": { id: "MiniMaxAI/MiniMax-M2.5-fast", name: "MiniMax-M2.5-fast", description: "Legacy model retained for compatibility with older integrations", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-01-20", last_updated: "2026-05-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8000, input: 7000, output: 8192 }, status: "deprecated", cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "MiniMaxAI/MiniMax-M2.5": { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-01-20", last_updated: "2026-05-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, input: 190000, output: 8192 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "MiniMaxAI/MiniMax-M3": { id: "MiniMaxAI/MiniMax-M3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 0.3, output: 1.2 } }, "deepseek-ai/DeepSeek-V3.2-fast": { id: "deepseek-ai/DeepSeek-V3.2-fast", name: "DeepSeek-V3.2-fast", description: "Legacy model retained for compatibility with older integrations", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-01-27", last_updated: "2026-05-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8000, input: 7000, output: 8192 }, status: "deprecated", cost: { input: 0.4, output: 2, cache_read: 0.04, cache_write: 0.5 } }, "deepseek-ai/DeepSeek-V3.2": { id: "deepseek-ai/DeepSeek-V3.2", name: "DeepSeek-V3.2", description: "Legacy model retained for compatibility with older integrations", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-11", release_date: "2026-01-20", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163000, input: 160000, output: 16384 }, status: "deprecated", cost: { input: 0.3, output: 0.45, reasoning: 0.45, cache_read: 0.03, cache_write: 0.375 } }, "deepseek-ai/DeepSeek-V4-Flash": { id: "deepseek-ai/DeepSeek-V4-Flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.14 } }, "deepseek-ai/DeepSeek-V4-Pro": { id: "deepseek-ai/DeepSeek-V4-Pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 1.75, output: 3.5, cache_read: 0.15 } }, "NousResearch/Hermes-4-70B": { id: "NousResearch/Hermes-4-70B", name: "Hermes-4-70B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-11", release_date: "2026-01-30", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 120000, output: 8192 }, cost: { input: 0.13, output: 0.4, reasoning: 0.4, cache_read: 0.013, cache_write: 0.16 } }, "NousResearch/Hermes-4-405B": { id: "NousResearch/Hermes-4-405B", name: "Hermes-4-405B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-11", release_date: "2026-01-30", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 120000, output: 8192 }, cost: { input: 1, output: 3, reasoning: 3, cache_read: 0.1, cache_write: 1.25 } }, "PrimeIntellect/INTELLECT-3": { id: "PrimeIntellect/INTELLECT-3", name: "INTELLECT-3", description: "Legacy model retained for compatibility with older integrations", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-10", release_date: "2026-01-25", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 120000, output: 8192 }, status: "deprecated", cost: { input: 0.2, output: 1.1, cache_read: 0.02, cache_write: 0.25 } }, "moonshotai/Kimi-K2.5-fast": { id: "moonshotai/Kimi-K2.5-fast", name: "Kimi-K2.5-fast", description: "Legacy model retained for compatibility with older integrations", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-06", release_date: "2025-12-15", last_updated: "2026-02-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 8192 }, status: "deprecated", cost: { input: 0.5, output: 2.5, cache_read: 0.05, cache_write: 0.625 } }, "moonshotai/Kimi-K2.5": { id: "moonshotai/Kimi-K2.5", name: "Kimi-K2.5", description: "Legacy model retained for compatibility with older integrations", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-06", release_date: "2025-12-15", last_updated: "2026-02-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 8192 }, status: "deprecated", cost: { input: 0.5, output: 2.5, reasoning: 2.5, cache_read: 0.05, cache_write: 0.625 } }, "moonshotai/Kimi-K2.7-Code": { id: "moonshotai/Kimi-K2.7-Code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 8000 }, cost: { input: 0.95, output: 4 } }, "moonshotai/Kimi-K3": { id: "moonshotai/Kimi-K3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 8000 }, cost: { input: 3, output: 15, cache_read: 3 } }, "openai/gpt-oss-120b-fast": { id: "openai/gpt-oss-120b-fast", name: "gpt-oss-120b-fast", description: "Legacy model retained for compatibility with older integrations", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-06", release_date: "2025-06-10", last_updated: "2026-05-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8000, input: 7000, output: 8192 }, status: "deprecated", cost: { input: 0.1, output: 0.5, cache_read: 0.01, cache_write: 0.125 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "gpt-oss-120b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-09", release_date: "2026-01-10", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 124000, output: 8192 }, cost: { input: 0.15, output: 0.6, reasoning: 0.6, cache_read: 0.015, cache_write: 0.18 } }, "meta-llama/Llama-3.3-70B-Instruct": { id: "meta-llama/Llama-3.3-70B-Instruct", name: "Llama-3.3-70B-Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08", release_date: "2025-12-05", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 120000, output: 8192 }, cost: { input: 0.13, output: 0.4, cache_read: 0.013, cache_write: 0.16 } } } }, vivgrid: { id: "vivgrid", env: ["VIVGRID_API_KEY"], npm: "@ai-sdk/openai", api: "https://api.vivgrid.com/v1", name: "Vivgrid", doc: "https://docs.vivgrid.com/models", models: { "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT 5.6 Sol", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.15, output: 0.3, reasoning: 0.3, cache_read: 0.03 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 1.2, output: 4.2, cache_read: 0.3 } }, "gemini-3.1-flash-lite-preview": { id: "gemini-3.1-flash-lite-preview", name: "Gemini 3.1 Flash Lite Preview", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, cache_write: 1 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 2.5, output: 15, cache_read: 0.25 } }, "gpt-5.2-codex": { id: "gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-01-14", last_updated: "2026-01-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5.4-nano": { id: "gpt-5.4-nano", name: "GPT-5.4 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "deepseek-v3.2": { id: "deepseek-v3.2", name: "DeepSeek-V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.28, output: 0.42 } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT 5.6 Luna", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 1, output: 6, cache_read: 0.1, cache_write: 1.25 } }, "gpt-5.3-codex": { id: "gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-24", last_updated: "2026-02-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "GPT-5 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.25, output: 2, cache_read: 0.03 } }, "gemini-3.1-pro-preview": { id: "gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "gpt-5.1-codex": { id: "gpt-5.1-codex", name: "GPT-5.1 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT 5.6 Terra", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 3.125 } }, "gpt-5.1-codex-max": { id: "gpt-5.1-codex-max", name: "GPT-5.1 Codex Max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } } } }, google: { id: "google", env: ["GOOGLE_API_KEY", "GOOGLE_GENERATIVE_AI_API_KEY", "GEMINI_API_KEY"], npm: "@ai-sdk/google", name: "Google", doc: "https://ai.google.dev/gemini-api/docs/models", models: { "gemini-2.5-computer-use-preview-10-2025": { id: "gemini-2.5-computer-use-preview-10-2025", name: "Gemini 2.5 Computer Use Preview 10-2025", description: "Specialized Gemini 2.5 model for browser-control agents that automate UI tasks", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-10-07", last_updated: "2025-10-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 65536 }, cost: { input: 1.25, output: 10, tiers: [{ input: 2.5, output: 15, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15 } } }, "deep-research-preview-04-2026": { id: "deep-research-preview-04-2026", name: "Deep Research Preview (Apr-21-2026)", description: "Agentic model for autonomous multi-step research, synthesis, and cited reports", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 131072, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "gemini-3.1-flash-tts-preview": { id: "gemini-3.1-flash-tts-preview", name: "Gemini 3.1 Flash TTS Preview", description: "Low-latency speech generation with steerable prompts and expressive audio tags", family: "gemini-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2026-04-15", last_updated: "2026-04-15", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 8192, output: 16384 }, cost: { input: 1, output: 20 } }, "gemini-flash-latest": { id: "gemini-flash-latest", name: "Gemini Flash Latest", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, input_audio: 1.5 } }, "gemini-embedding-2": { id: "gemini-embedding-2", name: "Gemini Embedding 2", description: "Multimodal embedding model mapping text, images, video, audio, and PDFs into a unified embedding space", family: "gemini", attachment: true, reasoning: false, tool_call: false, temperature: false, knowledge: "2025-11", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1 }, cost: { input: 0.2, output: 0, input_audio: 6.5 } }, "lyria-3-pro-preview": { id: "lyria-3-pro-preview", name: "Lyria 3 Pro Preview", description: "Music generation model for full-length songs from text or images with vocals and structure", family: "lyria", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-03-25", last_updated: "2026-03-25", modalities: { input: ["text", "image"], output: ["text", "audio"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0, output: 0 } }, "gemini-3.5-flash": { id: "gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, input_audio: 1.5 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, input_audio: 1 } }, "gemini-3.5-flash-lite": { id: "gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "lyria-3-clip-preview": { id: "lyria-3-clip-preview", name: "Lyria 3 Clip Preview", description: "Music generation model for short 30-second clips, loops, and previews from text or image prompts", family: "lyria", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-03-25", last_updated: "2026-03-25", modalities: { input: ["text", "image"], output: ["text", "audio"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0, output: 0 } }, "gemini-omni-flash-preview": { id: "gemini-omni-flash-preview", name: "Gemini Omni Flash Preview", description: "Video generation and editing model for fast, conversational text- and image-to-video workflows", family: "gemini", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "video"], output: ["video"] }, open_weights: false, limit: { context: 131072, output: 65536 }, cost: { input: 1.5, output: 17.5 } }, "veo-3.1-generate-preview": { id: "veo-3.1-generate-preview", name: "Veo 3.1", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-10-15", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 480, output: 8192 }, status: "beta" }, "deep-research-max-preview-04-2026": { id: "deep-research-max-preview-04-2026", name: "Deep Research Max Preview (Apr-21-2026)", description: "Maximum-comprehensiveness agentic researcher for multi-step investigation, synthesis, and cited reports", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 131072, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "gemini-3-pro-image-preview": { id: "gemini-3-pro-image-preview", name: "Nano Banana Pro", description: "Nano Banana Pro for higher-fidelity image generation and design-heavy edits", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 2, output: 120 } }, "gemini-3.1-flash-lite-preview": { id: "gemini-3.1-flash-lite-preview", name: "Gemini 3.1 Flash Lite Preview", description: "Legacy model retained for compatibility with older integrations", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, status: "deprecated", cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "gemini-3.5-live-translate-preview": { id: "gemini-3.5-live-translate-preview", name: "Gemini 3.5 Live Translate Preview", description: "Low-latency audio-to-audio model for real-time speech translation across 70+ languages", family: "gemini-pro", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["audio"], output: ["audio", "text"] }, open_weights: false, limit: { context: 16384, output: 32768 }, cost: { input: 3.5, output: 21, input_audio: 3.5, output_audio: 21 } }, "gemini-3-flash-preview": { id: "gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, input_audio: 1 } }, "gemini-3.1-pro-preview-customtools": { id: "gemini-3.1-pro-preview-customtools", name: "Gemini 3.1 Pro Preview Custom Tools", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "gemini-3.1-flash-lite-image": { id: "gemini-3.1-flash-lite-image", name: "Nano Banana 2 Lite", description: "Fastest, most cost-efficient Gemini image model for high-volume 1K generation and editing", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "high"] }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 65536 }, cost: { input: 0.25, output: 30 } }, "gemini-3.1-flash-image-preview": { id: "gemini-3.1-flash-image-preview", name: "Nano Banana 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "high"] }], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 65536 }, cost: { input: 0.5, output: 60 } }, "gemini-robotics-er-1.6-preview": { id: "gemini-robotics-er-1.6-preview", name: "Gemini Robotics-ER 1.6 Preview", description: "Vision-language model for embodied reasoning: spatial understanding, task planning, and physical-world agentic robotics", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 0 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-14", last_updated: "2026-04-14", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 65536 }, cost: { input: 1, output: 5, input_audio: 2 } }, "gemma-4-26b-a4b-it": { id: "gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 } }, "gemini-embedding-001": { id: "gemini-embedding-001", name: "Gemini Embedding 001", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "gemini", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2025-05", release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 2048, output: 1 }, cost: { input: 0.15, output: 0 } }, "veo-3.1-lite-generate-preview": { id: "veo-3.1-lite-generate-preview", name: "Veo 3.1 lite", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-03-31", last_updated: "2026-03-31", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 480, output: 8192 } }, "gemini-2.0-flash": { id: "gemini-2.0-flash", name: "Gemini 2.0 Flash", description: "Earlier Gemini Flash workhorse for responsive multimodal apps and tool use", family: "gemini-flash", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 8192 }, status: "deprecated", cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "gemini-3.6-flash": { id: "gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15, input_audio: 1.5 } }, "veo-3.1-fast-generate-preview": { id: "veo-3.1-fast-generate-preview", name: "Veo 3.1 fast", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-10-15", last_updated: "2026-01-01", modalities: { input: ["text", "image", "video"], output: ["video"] }, open_weights: false, limit: { context: 480, output: 8192 } }, "gemini-3.1-flash-lite": { id: "gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "gemma-4-31b-it": { id: "gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 } }, "gemini-3.1-flash-image": { id: "gemini-3.1-flash-image", name: "Nano Banana 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "high"] }], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "video", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 65536 }, cost: { input: 0.5, output: 60 } }, "gemini-2.5-flash-image": { id: "gemini-2.5-flash-image", name: "Nano Banana", description: "Nano Banana image model for fast generation, edits, and character-consistent assets", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2024-06", release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.3, output: 30, cache_read: 0.075 } }, "gemini-2.5-flash-preview-tts": { id: "gemini-2.5-flash-preview-tts", name: "Gemini 2.5 Flash Preview TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gemini-flash", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-05-01", last_updated: "2025-05-01", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 8192, output: 16384 }, cost: { input: 0.5, output: 10 } }, "gemini-3-pro-image": { id: "gemini-3-pro-image", name: "Nano Banana Pro", description: "Nano Banana Pro for higher-fidelity image generation and design-heavy edits", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 2, output: 120 } }, "gemini-3.1-pro-preview": { id: "gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "gemini-flash-lite-latest": { id: "gemini-flash-lite-latest", name: "Gemini Flash-Lite Latest", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "gemini-3-pro-preview": { id: "gemini-3-pro-preview", name: "Gemini 3 Pro Preview", description: "Preview Gemini flagship for complex reasoning, coding, and rich multimodal prompts", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, status: "deprecated", cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "gemini-2.5-flash-lite": { id: "gemini-2.5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 512, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01, input_audio: 0.3 } }, "gemini-2.5-pro-preview-tts": { id: "gemini-2.5-pro-preview-tts", name: "Gemini 2.5 Pro Preview TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gemini-flash", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-05-01", last_updated: "2025-05-01", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 8192, output: 16384 }, cost: { input: 1, output: 20 } }, "gemini-2.0-flash-lite": { id: "gemini-2.0-flash-lite", name: "Gemini 2.0 Flash-Lite", description: "Legacy model retained for compatibility with older integrations", family: "gemini-flash-lite", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 8192 }, status: "deprecated", cost: { input: 0.075, output: 0.3 } }, "gemini-3.1-flash-live-preview": { id: "gemini-3.1-flash-live-preview", name: "Gemini 3.1 Flash Live Preview", description: "High-quality, low-latency Live API model for real-time dialogue and voice-first AI applications", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-03-26", last_updated: "2026-03-26", modalities: { input: ["text", "image", "video", "audio"], output: ["text", "audio"] }, open_weights: false, limit: { context: 131072, output: 65536 }, cost: { input: 0.75, output: 4.5, input_audio: 3, output_audio: 12 } } } }, thinkingmachines: { id: "thinkingmachines", env: ["TINKER_API_KEY"], npm: "@ai-sdk/anthropic", api: "https://tinker.thinkingmachines.dev/services/tinker-prod/anthropic/api/v1", name: "Thinking Machines", doc: "https://tinker-docs.thinkingmachines.ai/tinker/compatible-apis/anthropic/", models: { "thinkingmachines/Inkling:peft:262144": { id: "thinkingmachines/Inkling:peft:262144", name: "Inkling (256K)", description: "Multimodal MoE reasoning model (975B total, 41B active) for text, image, and audio", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 3.74, output: 9.36, cache_read: 0.748 } }, "thinkingmachines/Inkling": { id: "thinkingmachines/Inkling", name: "Inkling", description: "Multimodal MoE reasoning model (975B total, 41B active) for text, image, and audio", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 1.87, output: 4.68, cache_read: 0.374 } } } }, lilac: { id: "lilac", env: ["LILAC_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.getlilac.com/v1", name: "Lilac", doc: "https://docs.getlilac.com/inference/models", models: { "google/gemma-4-31b-it": { id: "google/gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262100, output: 262100 }, cost: { input: 0.11, output: 0.35 } }, "zai-org/glm-5.2": { id: "zai-org/glm-5.2", name: "GLM 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 524288 }, cost: { input: 0.9, output: 3, cache_read: 0.27 } }, "moonshotai/kimi-k2.6": { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.7, output: 3.5, cache_read: 0.2 } }, "minimaxai/minimax-m3": { id: "minimaxai/minimax-m3", name: "MiniMax M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax-m3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 0.28, output: 1.1, cache_read: 0.05 } } } }, "stepfun-ai-step-plan": { id: "stepfun-ai-step-plan", env: ["STEPFUN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.stepfun.ai/step_plan/v1", name: "StepFun Step Plan (Global)", doc: "https://platform.stepfun.ai/docs/en/step-plan/integrations/reasoning-api", models: { "step-3.5-flash": { id: "step-3.5-flash", name: "Step 3.5 Flash", description: "StepFun flash lane for quick multimodal reasoning and coding assistance", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-01-29", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 } }, "step-3.7-flash": { id: "step-3.7-flash", name: "Step 3.7 Flash", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 } }, "step-3.5-flash-2603": { id: "step-3.5-flash-2603", name: "Step 3.5 Flash 2603", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 } } } }, "zhipuai-coding-plan": { id: "zhipuai-coding-plan", env: ["ZHIPU_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://open.bigmodel.cn/api/coding/paas/v4", name: "Zhipu AI Coding Plan", doc: "https://docs.bigmodel.cn/cn/coding-plan/overview", models: { "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-27", last_updated: "2026-03-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5v-turbo": { id: "glm-5v-turbo", name: "GLM-5V-Turbo", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5-turbo": { id: "glm-5-turbo", name: "GLM-5-Turbo", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-4.7": { id: "glm-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5.2-highspeed": { id: "glm-5.2-highspeed", name: "GLM-5.2 Highspeed", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-4.6v": { id: "glm-4.6v", name: "GLM-4.6V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.3, output: 0.9 } } } }, "nano-gpt": { id: "nano-gpt", env: ["NANO_GPT_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://nano-gpt.com/api/v1", name: "NanoGPT", doc: "https://docs.nano-gpt.com", models: { "ernie-5.0-thinking-preview": { id: "ernie-5.0-thinking-preview", name: "Ernie 5.0 Thinking Preview", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "ernie", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 1, output: 3.5, cache_read: 0.5 } }, "Baichuan4-Turbo": { id: "Baichuan4-Turbo", name: "Baichuan 4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "baichuan", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-08-19", last_updated: "2025-08-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 32768 }, cost: { input: 2.42, output: 2.42, cache_read: 1.21 } }, "qwen3.7-flash": { id: "qwen3.7-flash", name: "Qwen3.7 Flash", description: "Lightweight multimodal Qwen model for high-throughput text, image, and video tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 991808, input: 991808, output: 65536 }, cost: { input: 0.03, output: 0.13, cache_read: 0.006, cache_write: 0.038 } }, "Gemma-4-31B-DarkIdol": { id: "Gemma-4-31B-DarkIdol", name: "Gemma 4 31B DarkIdol", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: false, release_date: "2026-05-01", last_updated: "2026-05-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "qwen3.7-plus": { id: "qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 991808, input: 991808, output: 65536 }, cost: { input: 0.4, output: 1.6, cache_read: 0.08, cache_write: 0.5 } }, "step-2-16k-exp": { id: "step-2-16k-exp", name: "Step-2 16k Exp", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "step", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-10-15", last_updated: "2024-07-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16000, input: 16000, output: 8192 }, cost: { input: 7.004, output: 19.992, cache_read: 3.502 } }, "Qwen3.5-27B-Omega-Evolution-v2.2-Derestricted-Lite": { id: "Qwen3.5-27B-Omega-Evolution-v2.2-Derestricted-Lite", name: "Qwen3.5 27B Omega Evolution v2.2 Derestricted Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-05-02", last_updated: "2026-05-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "Qwen3.5-27B-earica-Derestricted": { id: "Qwen3.5-27B-earica-Derestricted", name: "Qwen3.5 27B earica Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "gemini-2.5-flash-lite-preview-06-17": { id: "gemini-2.5-flash-lite-preview-06-17", name: "Gemini 2.5 Flash Lite Preview", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015 } }, "deepseek-r1-sambanova": { id: "deepseek-r1-sambanova", name: "DeepSeek R1 Fast", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "deepseek", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-02-20", last_updated: "2025-02-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 4096 }, cost: { input: 4.998, output: 6.987, cache_read: 2.499 } }, "Gemma-4-31B-GarnetV2": { id: "Gemma-4-31B-GarnetV2", name: "Gemma 4 31B Garnet V2", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: false, release_date: "2026-05-01", last_updated: "2026-05-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "claude-sonnet-4-thinking:8192": { id: "claude-sonnet-4-thinking:8192", name: "Claude 4 Sonnet Thinking (8K)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "qwen3.8-max-preview": { id: "qwen3.8-max-preview", name: "Qwen3.8 Max Preview", description: "Preview Qwen flagship for million-token multimodal reasoning and long-horizon agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-19", last_updated: "2026-07-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 991000, input: 991000, output: 64000 }, cost: { input: 1.5, output: 5, cache_read: 0.15, cache_write: 2 } }, "holo3-35b-a3b:thinking": { id: "holo3-35b-a3b:thinking", name: "Holo3-35B-A3B Thinking", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, input: 65536, output: 65536 }, cost: { input: 0.25, output: 1.8, cache_read: 0.125 } }, "jamba-large-1.7": { id: "jamba-large-1.7", name: "Jamba Large 1.7", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "jamba", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 4096 }, cost: { input: 1.989, output: 7.99, cache_read: 0.9945 } }, "qwen3.5-omni-flash": { id: "qwen3.5-omni-flash", name: "Qwen3.5 Omni Flash", description: "Omni-modal model for text, vision, audio, and multimodal agent tasks", family: "qwen3.5", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-03-30", last_updated: "2026-03-30", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 49152, input: 49152, output: 16384 }, cost: { input: 0, output: 0 } }, "Qwen3.5-27B-Marvin-DPO-V2-Derestricted": { id: "Qwen3.5-27B-Marvin-DPO-V2-Derestricted", name: "Qwen3.5 27B Marvin DPO V2 Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "Qwen3.5-27B-BlueStar-v3-Derestricted-Lite": { id: "Qwen3.5-27B-BlueStar-v3-Derestricted-Lite", name: "Qwen3.5 27B BlueStar v3 Derestricted Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "gemini-exp-1206": { id: "gemini-exp-1206", name: "Gemini 2.0 Pro 1206", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 2097152, input: 2097152, output: 8192 }, cost: { input: 1.258, output: 4.998, cache_read: 0.629 } }, "Qwen3.5-27B-Marvin-V2-Derestricted": { id: "Qwen3.5-27B-Marvin-V2-Derestricted", name: "Qwen3.5 27B Marvin V2 Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "claude-sonnet-4-thinking:1024": { id: "claude-sonnet-4-thinking:1024", name: "Claude 4 Sonnet Thinking (1K)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "pokee-isaac": { id: "pokee-isaac", name: "Pokee-Isaac 28B", description: "Pokee-Isaac is a 28B agentic model with a roughly 10-million-token context window, function calling, and OpenAI-compatible structured output. Pokee bills in $0.01 increments, rounding each non-zero request up to the next cent.", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-08-04", last_updated: "2026-08-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e7, input: 1e7, output: 60000 }, cost: { input: 0.15, output: 1, cache_read: 0.075 } }, "hunyuan-turbos-20250226": { id: "hunyuan-turbos-20250226", name: "Hunyuan Turbo S", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "hunyuan", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-02-27", last_updated: "2025-02-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 24000, input: 24000, output: 8192 }, cost: { input: 0.187, output: 0.374, cache_read: 0.0935 } }, "qwen3.7-max:thinking": { id: "qwen3.7-max:thinking", name: "Qwen3.7 Max Thinking", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5, cache_write: 3.125 } }, "Qwen3.5-27B-RpRMax-v1": { id: "Qwen3.5-27B-RpRMax-v1", name: "Qwen3.5 27B RpRMax v1", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "claude-opus-4-1-thinking:1024": { id: "claude-opus-4-1-thinking:1024", name: "Claude 4.1 Opus Thinking (1K)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5 } }, "claw-high": { id: "claw-high", name: "Claw High", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-05-11", last_updated: "2026-05-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 2.5 } }, "qwen-max": { id: "qwen-max", name: "Qwen 2.5 Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-04", release_date: "2024-04-03", last_updated: "2025-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, input: 32000, output: 8192 }, cost: { input: 1.5997, output: 6.392, cache_read: 0.79985 } }, "holo3-35b-a3b": { id: "holo3-35b-a3b", name: "Holo3-35B-A3B", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, input: 65536, output: 65536 }, cost: { input: 0.25, output: 1.8, cache_read: 0.125 } }, "gemma-4-e4b-it": { id: "gemma-4-e4b-it", name: "Gemma 4 E4B Instruct", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 16384 }, cost: { input: 0.04, output: 0.2, cache_read: 0.02 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "universal-summarizer": { id: "universal-summarizer", name: "Universal Summarizer", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-23", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 32768 }, cost: { input: 30, output: 30 } }, "phi-4-mini-instruct": { id: "phi-4-mini-instruct", name: "Phi 4 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "phi", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-26", last_updated: "2025-07-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0.17, output: 0.68, cache_read: 0.085 } }, "mercury-coder-small": { id: "mercury-coder-small", name: "Mercury Coder Small", description: "Model by Inception AI. A diffusion large language model that runs incredibly quickly (500+ tokens/second) while matching Claude 3.5 Haiku and GPT-4o-mini. 1st in speed on Copilot arena, and matching 2nd in quality.", family: "mercury", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 16384 }, cost: { input: 0.25, output: 1, cache_read: 0.125 } }, "doubao-seed-1-6-250615": { id: "doubao-seed-1-6-250615", name: "Doubao Seed 1.6", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-06-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 16384 }, cost: { input: 0.204, output: 0.51, cache_read: 0.102 } }, "qwen3.5-122b-a10b:thinking": { id: "qwen3.5-122b-a10b:thinking", name: "Qwen3.5 122B A10B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 81920 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 32768 }, cost: { input: 0.437, output: 3.496, cache_read: 0.103788 } }, "Qwen3.5-27B-Writer-V2-Derestricted": { id: "Qwen3.5-27B-Writer-V2-Derestricted", name: "Qwen3.5 27B Writer V2 Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-06", last_updated: "2026-04-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "Qwen3.5-27B-earica-Derestricted-Lite": { id: "Qwen3.5-27B-earica-Derestricted-Lite", name: "Qwen3.5 27B earica Derestricted Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "command-a-plus-05-2026": { id: "command-a-plus-05-2026", name: "Cohere Command A+ (05/2026)", description: "Cohere's stronger command model for multilingual agents and enterprise workflows", family: "command-a", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: true, temperature: true, knowledge: "2025-04-01", release_date: "2026-05-20", last_updated: "2026-06-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 64000 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "Qwen3.5-27B-BlueStar-Derestricted-Lite": { id: "Qwen3.5-27B-BlueStar-Derestricted-Lite", name: "Qwen3.5 27B BlueStar Derestricted Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-06", last_updated: "2026-04-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "gemini-2.5-flash-preview-04-17": { id: "gemini-2.5-flash-preview-04-17", name: "Gemini 2.5 Flash Preview", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, release_date: "2025-04-17", last_updated: "2025-04-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015 } }, "claude-sonnet-4-thinking:32768": { id: "claude-sonnet-4-thinking:32768", name: "Claude 4 Sonnet Thinking (32K)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "qwen3-coder-30b-a3b-instruct": { id: "qwen3-coder-30b-a3b-instruct", name: "Qwen3 Coder 30B A3B Instruct", description: "Smaller Qwen coder for efficient local agents and repo-level fixes", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.05 } }, "gemini-2.5-flash-preview-05-20:thinking": { id: "gemini-2.5-flash-preview-05-20:thinking", name: "Gemini 2.5 Flash 0520 Thinking", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1048000, input: 1048000, output: 65536 }, cost: { input: 0.15, output: 3.5, cache_read: 0.015 } }, "Qwen3.5-27B-Writer-V2-Derestricted-Lite": { id: "Qwen3.5-27B-Writer-V2-Derestricted-Lite", name: "Qwen3.5 27B Writer V2 Derestricted Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-06", last_updated: "2026-04-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "jamba-large": { id: "jamba-large", name: "Jamba Large", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "jamba", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 4096 }, cost: { input: 1.989, output: 7.99, cache_read: 0.9945 } }, fastgpt: { id: "fastgpt", name: "Web Answer", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-23", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 32768 }, cost: { input: 7.5, output: 7.5 } }, "claude-opus-4-thinking": { id: "claude-opus-4-thinking", name: "Claude 4 Opus Thinking", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5 } }, "Qwen3.5-27B-Infracelestial": { id: "Qwen3.5-27B-Infracelestial", name: "Qwen3.5 27B Infracelestial", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "qwen3.5-27b": { id: "qwen3.5-27b", name: "Qwen3.5 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 260096, input: 260096, output: 65536 }, cost: { input: 0.27, output: 2.16, cache_read: 0.135 } }, "step-r1-v-mini": { id: "step-r1-v-mini", name: "Step R1 V Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "step", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-04-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 2.5, output: 11, cache_read: 1.25 } }, "Qwen3.5-27B-BlueStar-Derestricted": { id: "Qwen3.5-27B-BlueStar-Derestricted", name: "Qwen3.5 27B BlueStar Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-06", last_updated: "2026-04-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "Qwen3.5-27B-Omega-Evolution-v2.2-Derestricted": { id: "Qwen3.5-27B-Omega-Evolution-v2.2-Derestricted", name: "Qwen3.5 27B Omega Evolution v2.2 Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-05-02", last_updated: "2026-05-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "glm-4-air-0111": { id: "glm-4-air-0111", name: "GLM 4 Air 0111", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-01-11", last_updated: "2025-01-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 4096 }, cost: { input: 0.1394, output: 0.1394, cache_read: 0.0697 } }, "learnlm-1.5-pro-experimental": { id: "learnlm-1.5-pro-experimental", name: "Gemini LearnLM Experimental", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-05-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32767, input: 32767, output: 8192 }, cost: { input: 3.502, output: 10.506, cache_read: 1.751 } }, "qwen3.7-max": { id: "qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5, cache_write: 3.125 } }, "gemini-3-pro-image-preview": { id: "gemini-3-pro-image-preview", name: "Gemini 3 Pro Image", description: "Nano Banana Pro for higher-fidelity image generation and design-heavy edits", family: "gemini-pro", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2 } }, "doubao-1.5-pro-32k": { id: "doubao-1.5-pro-32k", name: "Doubao 1.5 Pro 32k", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-11-20", last_updated: "2025-01-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, input: 32000, output: 8192 }, cost: { input: 0.1343, output: 0.3349, cache_read: 0.06715 } }, "Gemma-4-31B-Cognitive-Unshackled": { id: "Gemma-4-31B-Cognitive-Unshackled", name: "Gemma 4 31B Cognitive Unshackled", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: false, release_date: "2026-05-01", last_updated: "2026-05-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "MiniMax-M2": { id: "MiniMax-M2", name: "MiniMax M2", description: "Efficient open MiniMax model built for coding agents and tool-heavy workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 131072 }, cost: { input: 0.17, output: 1.53, cache_read: 0.085 } }, "deepseek-reasoner-cheaper": { id: "deepseek-reasoner-cheaper", name: "Deepseek R1 Cheaper", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "deepseek", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 0.4, output: 1.7, cache_read: 0.2 } }, "Qwen3.5-27B-Musica-v1": { id: "Qwen3.5-27B-Musica-v1", name: "Qwen3.5 27B Musica v1", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-03-27", last_updated: "2026-03-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "hermes-high": { id: "hermes-high", name: "Hermes High", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "hermes", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-05-11", last_updated: "2026-05-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 2.5 } }, "azure-o1": { id: "azure-o1", name: "Azure o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-17", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 1e5 }, cost: { input: 15, output: 60, cache_read: 7.5 } }, "qvq-max": { id: "qvq-max", name: "Qwen: QvQ Max", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-03-28", last_updated: "2025-03-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 1.2, output: 4.8, cache_read: 0.6 } }, "kimi-k2-instruct-fast": { id: "kimi-k2-instruct-fast", name: "Kimi K2 0711 Fast", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "kimi-k2", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-15", last_updated: "2025-07-15", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 16384 }, cost: { input: 0.4, output: 1.8, cache_read: 0.2 } }, "deepseek-chat-cheaper": { id: "deepseek-chat-cheaper", name: "DeepSeek V3/Chat Cheaper", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "deepseek", attachment: true, reasoning: false, tool_call: true, structured_output: true, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 0.1, output: 0.425, cache_read: 0.05 } }, "sonar-deep-research": { id: "sonar-deep-research", name: "Perplexity Deep Research", description: "Research model for long-horizon investigation, synthesis, and analytical reports", family: "sonar-deep-research", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-02-25", last_updated: "2025-02-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 60000, input: 60000, output: 128000 }, cost: { input: 3.4, output: 13.6, cache_read: 1.7 } }, "qwen3.5-omni-plus": { id: "qwen3.5-omni-plus", name: "Qwen3.5 Omni Plus", description: "Omni-modal model for text, vision, audio, and multimodal agent tasks", family: "qwen3.5", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-03-30", last_updated: "2026-03-30", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 983616, input: 983616, output: 65536 }, cost: { input: 0, output: 0 } }, "doubao-seed-2-0-mini-260215": { id: "doubao-seed-2-0-mini-260215", name: "Doubao Seed 2.0 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 32000 }, cost: { input: 0.0493, output: 0.4845, cache_read: 0.02465 } }, "MiniMax-M1": { id: "MiniMax-M1", name: "MiniMax M1", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "minimax", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-01-08", last_updated: "2025-06-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, input: 1e6, output: 131072 }, cost: { input: 0.1394, output: 1.3328, cache_read: 0.0697 } }, "qwen3.5-flash:thinking": { id: "qwen3.5-flash:thinking", name: "Qwen3.5 Flash Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 991808, input: 991808, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.05 } }, "doubao-1.5-vision-pro-32k": { id: "doubao-1.5-vision-pro-32k", name: "Doubao 1.5 Vision Pro 32k", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-11-20", last_updated: "2025-01-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 32000, input: 32000, output: 8192 }, cost: { input: 0.459, output: 1.377, cache_read: 0.2295 } }, sonar: { id: "sonar", name: "Perplexity Simple", description: "Fast web-grounded Sonar for current answers, citations, and lightweight retrieval", family: "sonar", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 127000, input: 127000, output: 128000 }, cost: { input: 1, output: 1, cache_read: 0.5 } }, "glm-zero-preview": { id: "glm-zero-preview", name: "GLM Zero Preview", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-12-20", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8000, input: 8000, output: 4096 }, cost: { input: 1.802, output: 1.802, cache_read: 0.901 } }, "qwen3.5-35b-a3b": { id: "qwen3.5-35b-a3b", name: "Qwen3.5 35B A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 260096, input: 260096, output: 65536 }, cost: { input: 0.225, output: 1.8, cache_read: 0.1125 } }, "sonar-pro": { id: "sonar-pro", name: "Perplexity Pro", description: "Deeper Sonar search model with broader retrieval and stronger synthesis", family: "sonar-pro", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 128000 }, cost: { input: 3, output: 15, cache_read: 1.5 } }, "glm-4-long": { id: "glm-4-long", name: "GLM-4 Long", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 4096 }, cost: { input: 0.2006, output: 0.2006, cache_read: 0.1003 } }, "gemini-2.5-flash-nothinking": { id: "gemini-2.5-flash-nothinking", name: "Gemini 2.5 Flash (No Thinking)", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-06-05", last_updated: "2025-06-05", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "doubao-seed-2-0-pro-260215": { id: "doubao-seed-2-0-pro-260215", name: "Doubao Seed 2.0 Pro", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 128000 }, cost: { input: 0.782, output: 3.876, cache_read: 0.391 } }, "gemini-2.0-pro-exp-02-05": { id: "gemini-2.0-pro-exp-02-05", name: "Gemini 2.0 Pro 0205", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-02-05", last_updated: "2025-02-05", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 2097152, input: 2097152, output: 8192 }, cost: { input: 1.989, output: 7.956, cache_read: 0.49725 } }, "ernie-5.1": { id: "ernie-5.1", name: "ERNIE 5.1", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "ernie", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-05-10", last_updated: "2026-05-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 119000, input: 119000, output: 64000 }, cost: { input: 0.75, output: 3, cache_read: 0.75 } }, "claude-opus-4-5-20251101:thinking": { id: "claude-opus-4-5-20251101:thinking", name: "Claude 4.5 Opus Thinking", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-01", last_updated: "2025-11-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "gemma-4-e2b-it": { id: "gemma-4-e2b-it", name: "Gemma 4 E2B Instruct", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 16384 }, cost: { input: 0.02, output: 0.1, cache_read: 0.01 } }, "exa-answer": { id: "exa-answer", name: "Exa (Answer)", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-23", last_updated: "2025-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 4096, input: 4096, output: 4096 }, cost: { input: 2.5, output: 2.5 } }, "doubao-seed-2-0-lite-260215": { id: "doubao-seed-2-0-lite-260215", name: "Doubao Seed 2.0 Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 32000 }, cost: { input: 0.1462, output: 0.8738, cache_read: 0.0731 } }, "gemini-2.5-flash-lite-preview-09-2025-thinking": { id: "gemini-2.5-flash-lite-preview-09-2025-thinking", name: "Gemini 2.5 Flash Lite Preview (09/2025) \u2013 Thinking", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01 } }, "gemini-2.5-flash-preview-09-2025-thinking": { id: "gemini-2.5-flash-preview-09-2025-thinking", name: "Gemini 2.5 Flash Preview (09/2025) \u2013 Thinking", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "azure-gpt-4o": { id: "azure-gpt-4o", name: "Azure gpt-4o", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, release_date: "2024-01-01", last_updated: "2024-05-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "ernie-5.1:thinking": { id: "ernie-5.1:thinking", name: "ERNIE 5.1 Thinking", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "ernie", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2026-05-10", last_updated: "2026-05-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 119000, input: 119000, output: 64000 }, cost: { input: 0.75, output: 3, cache_read: 0.75 } }, "gemini-2.0-pro-reasoner": { id: "gemini-2.0-pro-reasoner", name: "Gemini 2.0 Pro Reasoner", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-02-05", modalities: { input: ["text", "audio"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 1.292, output: 4.998, cache_read: 0.323 } }, "qwen3.5-flash": { id: "qwen3.5-flash", name: "Qwen3.5 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 991808, input: 991808, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.05 } }, "Qwen3.5-27B-BlueStar-v2-Derestricted": { id: "Qwen3.5-27B-BlueStar-v2-Derestricted", name: "Qwen3.5 27B BlueStar v2 Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-06", last_updated: "2026-04-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "Qwen3.5-27B-Marvin-DPO-V2-Derestricted-Lite": { id: "Qwen3.5-27B-Marvin-DPO-V2-Derestricted-Lite", name: "Qwen3.5 27B Marvin DPO V2 Derestricted Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, deepclaude: { id: "deepclaude", name: "DeepClaude", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-03-10", last_updated: "2025-02-01", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "glm-4-plus-0111": { id: "glm-4-plus-0111", name: "GLM 4 Plus 0111", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-02-19", last_updated: "2025-02-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 4096 }, cost: { input: 9.996, output: 9.996, cache_read: 4.998 } }, "Qwen3.5-27B-NaNovel-Derestricted-Lite": { id: "Qwen3.5-27B-NaNovel-Derestricted-Lite", name: "Qwen3.5 27B NaNovel Derestricted Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "gemini-2.5-flash-preview-09-2025": { id: "gemini-2.5-flash-preview-09-2025", name: "Gemini 2.5 Flash Preview (09/2025)", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "GLM-4.6-Derestricted-v5": { id: "GLM-4.6-Derestricted-v5", name: "GLM 4.6 Derestricted v5", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 8192 }, cost: { input: 0.4, output: 1.5, cache_read: 0.2 } }, "claude-opus-4-thinking:1024": { id: "claude-opus-4-thinking:1024", name: "Claude 4 Opus Thinking (1K)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5 } }, "auto-model-standard": { id: "auto-model-standard", name: "Auto model (Standard)", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-04-16", last_updated: "2024-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 1e6 }, cost: { input: 9.996, output: 19.992, cache_read: 4.998 } }, "gemini-2.5-pro-exp-03-25": { id: "gemini-2.5-pro-exp-03-25", name: "Gemini 2.5 Pro Experimental 0325", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, release_date: "2025-03-25", last_updated: "2025-03-25", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 2.5, output: 10, cache_read: 0.25 } }, "qwen3.5-27b:thinking": { id: "qwen3.5-27b:thinking", name: "Qwen3.5 27B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 260096, input: 260096, output: 65536 }, cost: { input: 0.27, output: 2.16, cache_read: 0.135 } }, "glm-4-plus": { id: "glm-4-plus", name: "GLM-4 Plus", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-09-20", last_updated: "2024-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 4096 }, cost: { input: 7.497, output: 7.497, cache_read: 3.7485 } }, "auto-model-premium": { id: "auto-model-premium", name: "Auto model (Premium)", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-04-16", last_updated: "2024-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 1e6 }, cost: { input: 9.996, output: 19.992, cache_read: 4.998 } }, "brave-research": { id: "brave-research", name: "Brave (Research)", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-02-10", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 5, output: 5 } }, "longcat-2.0:thinking": { id: "longcat-2.0:thinking", name: "LongCat 2.0 Thinking", description: "Meituan LongCat-2.0, a reasoning model with tool calling and a 1M-token context window", family: "longcat", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 262144 }, cost: { input: 0.75, output: 3, cache_read: 0.015 } }, "qwen3.8-max": { id: "qwen3.8-max", name: "Qwen3.8 Max", description: "2.4-trillion-parameter MoE flagship for coding, professional work, multimodal understanding, and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 991000, input: 991000, output: 65536 }, cost: { input: 2, output: 6, cache_read: 0.25, cache_write: 2.5 } }, "Qwen3.5-27B-Writer-Derestricted": { id: "Qwen3.5-27B-Writer-Derestricted", name: "Qwen3.5 27B Writer Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-06", last_updated: "2026-04-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "azure-o3-mini": { id: "azure-o3-mini", name: "Azure o3-mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-01-31", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 65536 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "qwen3-vl-235b-a22b-instruct-original": { id: "qwen3-vl-235b-a22b-instruct-original", name: "Qwen3 VL 235B A22B Instruct Original", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 32768 }, cost: { input: 0.5, output: 1.2, cache_read: 0.25 } }, "claude-sonnet-4-5-20250929": { id: "claude-sonnet-4-5-20250929", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "Qwen3.5-27B-Omega-Evolution-v2.0-Derestricted": { id: "Qwen3.5-27B-Omega-Evolution-v2.0-Derestricted", name: "Qwen3.5 27B Omega Evolution v2.0 Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-06", last_updated: "2026-04-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "deepseek-v3-0324": { id: "deepseek-v3-0324", name: "DeepSeek Chat 0324", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2024-01-01", last_updated: "2025-03-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 0.2, output: 0.77, cache_read: 0.135 } }, "qwen3.8-max:thinking": { id: "qwen3.8-max:thinking", name: "Qwen3.8 Max Thinking", description: "2.4-trillion-parameter MoE flagship for coding, professional work, multimodal understanding, and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 991000, input: 991000, output: 131072 }, cost: { input: 2, output: 6, cache_read: 0.25, cache_write: 2.5 } }, "mirothinker-1-7-deepresearch-mini": { id: "mirothinker-1-7-deepresearch-mini", name: "MiroThinker 1.7 Deep Research Mini", description: "Research model for long-horizon investigation, synthesis, and analytical reports", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2026-05-11", last_updated: "2026-05-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 1.25, output: 10, cache_read: 0.625 } }, "Qwen3.5-27B-Vivid-Durian": { id: "Qwen3.5-27B-Vivid-Durian", name: "Qwen3.5 27B Vivid Durian", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "claude-opus-4-5-20251101": { id: "claude-opus-4-5-20251101", name: "Claude 4.5 Opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-01", last_updated: "2025-11-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "command-a-reasoning-08-2025": { id: "command-a-reasoning-08-2025", name: "Cohere Command A (08/2025)", description: "Cohere reasoning model for multilingual enterprise agents, tools, and complex workflows", family: "command-a", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-06-01", release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 8192 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "jamba-mini": { id: "jamba-mini", name: "Jamba Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "jamba", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 4096 }, cost: { input: 0.1989, output: 0.408, cache_read: 0.09945 } }, "asi1-mini": { id: "asi1-mini", name: "ASI1 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-03-25", last_updated: "2025-03-25", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 1, output: 1, cache_read: 0.5 } }, "perplexity-academic-researcher": { id: "perplexity-academic-researcher", name: "Perplexity Academic Researcher", description: "Sonar Reasoning Pro with Perplexity's academic search mode. Prioritizes scholarly and peer-reviewed sources from academic repositories and returns cited research synthesis.", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2026-07-10", last_updated: "2026-07-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 127000, input: 127000, output: 128000 }, cost: { input: 2, output: 8, cache_read: 1 } }, "glm-4-flash": { id: "glm-4-flash", name: "GLM-4 Flash", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 4096 }, cost: { input: 0.1003, output: 0.1003, cache_read: 0.05015 } }, "glm-4-air": { id: "glm-4-air", name: "GLM-4 Air", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-06-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 4096 }, cost: { input: 0.2006, output: 0.2006, cache_read: 0.1003 } }, "claude-opus-4-thinking:8192": { id: "claude-opus-4-thinking:8192", name: "Claude 4 Opus Thinking (8K)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5 } }, "Gemma-4-31B-Claude-4.6-Opus-Reasoning-Distilled": { id: "Gemma-4-31B-Claude-4.6-Opus-Reasoning-Distilled", name: "Gemma 4 31B Claude 4.6 Opus Reasoning Distilled", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "claude", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2026-05-01", last_updated: "2026-05-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.0306 } }, "celeris-1": { id: "celeris-1", name: "Celeris 1", description: "Celeris 1 is a diffusion language model built for ultra-low-latency classification, extraction, judging, query rewriting, and other short structured responses.", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-07-25", last_updated: "2026-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, input: 8192, output: 8192 }, cost: { input: 2, output: 6, cache_read: 1 } }, "Qwen3.5-27B-BlueStar-v2-Derestricted-Lite": { id: "Qwen3.5-27B-BlueStar-v2-Derestricted-Lite", name: "Qwen3.5 27B BlueStar v2 Derestricted Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-06", last_updated: "2026-04-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "mistral-code-agent-latest": { id: "mistral-code-agent-latest", name: "Mistral Code Agent Latest", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "mistral", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 32768 }, cost: { input: 0.4, output: 2, cache_read: 0.2 } }, "claude-opus-4-thinking:32768": { id: "claude-opus-4-thinking:32768", name: "Claude 4 Opus Thinking (32K)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5 } }, "Qwen3.5-27B-Queen-Derestricted": { id: "Qwen3.5-27B-Queen-Derestricted", name: "Qwen3.5 27B Queen Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "Baichuan4-Air": { id: "Baichuan4-Air", name: "Baichuan 4 Air", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "baichuan", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-08-19", last_updated: "2025-08-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 32768 }, cost: { input: 0.157, output: 0.157, cache_read: 0.0785 } }, "claude-sonnet-4-thinking:64000": { id: "claude-sonnet-4-thinking:64000", name: "Claude 4 Sonnet Thinking (64K)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "claw-low": { id: "claw-low", name: "Claw Low", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-05-11", last_updated: "2026-05-11", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, input: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, cache_write: 0.08333 } }, "qwen-long": { id: "qwen-long", name: "Qwen Long 10M", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-08-01", last_updated: "2025-01-25", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e7, input: 1e7, output: 8192 }, cost: { input: 0.1003, output: 0.408, cache_read: 0.05015 } }, "auto-model": { id: "auto-model", name: "Auto model", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-04-16", last_updated: "2024-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 1e6 }, cost: { input: 0, output: 0 } }, "Qwen3.5-27B-NaNovel-Derestricted": { id: "Qwen3.5-27B-NaNovel-Derestricted", name: "Qwen3.5 27B NaNovel Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "azure-gpt-4o-mini": { id: "azure-gpt-4o-mini", name: "Azure gpt-4o-mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, release_date: "2024-01-01", last_updated: "2024-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "claude-haiku-4-5-20251001-thinking": { id: "claude-haiku-4-5-20251001-thinking", name: "Claude Haiku 4.5 Thinking", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1 } }, "claude-sonnet-4-5-20250929-thinking": { id: "claude-sonnet-4-5-20250929-thinking", name: "Claude Sonnet 4.5 Thinking", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "qwen-plus": { id: "qwen-plus", name: "Qwen Plus", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, temperature: true, knowledge: "2024-04", release_date: "2024-01-25", last_updated: "2025-09-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 995904, input: 995904, output: 32768 }, cost: { input: 0.3995, output: 1.2002, cache_read: 0.19975 } }, "gemini-2.5-pro-preview-05-06": { id: "gemini-2.5-pro-preview-05-06", name: "Gemini 2.5 Pro Preview 0506", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, release_date: "2025-05-06", last_updated: "2025-05-06", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 2.5, output: 10, cache_read: 0.25 } }, "claude-opus-4-1-thinking:8192": { id: "claude-opus-4-1-thinking:8192", name: "Claude 4.1 Opus Thinking (8K)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5 } }, "Gemma-4-31B-Musica-v1": { id: "Gemma-4-31B-Musica-v1", name: "Gemma 4 31B Musica v1", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: false, release_date: "2026-05-01", last_updated: "2026-05-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "Qwen3.5-27B-Derestricted": { id: "Qwen3.5-27B-Derestricted", name: "Qwen3.5 27B Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "venice-uncensored": { id: "venice-uncensored", name: "Venice Uncensored", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "venice", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-10-01", last_updated: "2025-02-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0.4, output: 0.4, cache_read: 0.2 } }, "jamba-mini-1.7": { id: "jamba-mini-1.7", name: "Jamba Mini 1.7", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "jamba", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 4096 }, cost: { input: 0.1989, output: 0.408, cache_read: 0.09945 } }, "claude-sonnet-4-thinking": { id: "claude-sonnet-4-thinking", name: "Claude 4 Sonnet Thinking", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "step-3": { id: "step-3", name: "Step-3", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "step", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-31", last_updated: "2025-07-31", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, input: 65536, output: 8192 }, cost: { input: 0.2499, output: 0.6494, cache_read: 0.12495 } }, "qwen-3.6-plus": { id: "qwen-3.6-plus", name: "Qwen 3.6 Plus", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.6", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 991808, input: 991808, output: 65536 }, cost: { input: 0.325, output: 1.95, cache_read: 0.0325, cache_write: 0.40625 } }, "qwen3-max-2026-01-23": { id: "qwen3-max-2026-01-23", name: "Qwen3 Max 2026-01-23", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-01-26", last_updated: "2026-01-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 32768 }, cost: { input: 1.2002, output: 6.001, cache_read: 0.6001 } }, "hermes-low": { id: "hermes-low", name: "Hermes Low", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "hermes", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-05-11", last_updated: "2026-05-11", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, input: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, cache_write: 0.08333 } }, "deepseek-r1": { id: "deepseek-r1", name: "DeepSeek R1", description: "Classic open reasoning model for transparent math, coding, and deliberate problem solving", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 0.4, output: 1.7, cache_read: 0.2 } }, "gemini-2.5-pro-preview-06-05": { id: "gemini-2.5-pro-preview-06-05", name: "Gemini 2.5 Pro Preview 0605", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, release_date: "2025-06-05", last_updated: "2025-06-05", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 2.5, output: 10, cache_read: 0.25 } }, "Qwen3.5-27B-Writer-Derestricted-Lite": { id: "Qwen3.5-27B-Writer-Derestricted-Lite", name: "Qwen3.5 27B Writer Derestricted Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-06", last_updated: "2026-04-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "claude-haiku-4-5-20251001": { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1 } }, "glm-4": { id: "glm-4", name: "GLM-4", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-01-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 4096 }, cost: { input: 14.994, output: 14.994, cache_read: 7.497 } }, "deepseek-chat": { id: "deepseek-chat", name: "DeepSeek V3/Deepseek Chat", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-09", release_date: "2025-12-01", last_updated: "2026-02-28", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 0.1, output: 0.425, cache_read: 0.05 } }, "gemini-2.5-flash-preview-05-20": { id: "gemini-2.5-flash-preview-05-20", name: "Gemini 2.5 Flash 0520", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1048000, input: 1048000, output: 65536 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015 } }, "qwen-turbo": { id: "qwen-turbo", name: "Qwen Turbo", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-04", release_date: "2024-11-01", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 8192 }, cost: { input: 0.04998, output: 0.2006, cache_read: 0.02499 } }, "doubao-seed-1-8-251215": { id: "doubao-seed-1-8-251215", name: "Doubao Seed 1.8", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 0.612, output: 6.12, cache_read: 0.306 } }, "gemini-2.5-flash-lite-preview-09-2025": { id: "gemini-2.5-flash-lite-preview-09-2025", name: "Gemini 2.5 Flash Lite Preview (09/2025)", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01 } }, "glm-4.1v-thinking-flashx": { id: "glm-4.1v-thinking-flashx", name: "GLM 4.1V Thinking FlashX", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 64000, input: 64000, output: 8192 }, cost: { input: 0.3, output: 0.3, cache_read: 0.15 } }, "glm-z1-air": { id: "glm-z1-air", name: "GLM Z1 Air", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, input: 32000, output: 16384 }, cost: { input: 0.07, output: 0.07, cache_read: 0.035 } }, "Qwen3.5-27B-Omega-Evolution-v2.0-Derestricted-Lite": { id: "Qwen3.5-27B-Omega-Evolution-v2.0-Derestricted-Lite", name: "Qwen3.5 27B Omega Evolution v2.0 Derestricted Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-06", last_updated: "2026-04-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "Gemma-4-31B-Gemopus": { id: "Gemma-4-31B-Gemopus", name: "Gemma 4 31B Gemopus", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: false, release_date: "2026-05-01", last_updated: "2026-05-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "Baichuan-M2": { id: "Baichuan-M2", name: "Baichuan M2 32B Medical", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "baichuan", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-08-19", last_updated: "2025-08-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 32768 }, cost: { input: 15.73, output: 15.73, cache_read: 7.865 } }, "mirothinker-1-7-deepresearch": { id: "mirothinker-1-7-deepresearch", name: "MiroThinker 1.7 Deep Research", description: "Research model for long-horizon investigation, synthesis, and analytical reports", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2026-05-11", last_updated: "2026-05-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 4, output: 25, cache_read: 2 } }, "claude-opus-4-thinking:32000": { id: "claude-opus-4-thinking:32000", name: "Claude 4 Opus Thinking (32K)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5 } }, "claude-opus-4-1-thinking:32768": { id: "claude-opus-4-1-thinking:32768", name: "Claude 4.1 Opus Thinking (32K)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5 } }, "hermes-medium": { id: "hermes-medium", name: "Hermes Medium", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "hermes", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-05-11", last_updated: "2026-05-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, input: 204800, output: 131072 }, cost: { input: 0.315, output: 1.26, cache_read: 0.1575 } }, "qwen3-30b-a3b-instruct-2507": { id: "qwen3-30b-a3b-instruct-2507", name: "Qwen3 30B A3B Instruct 2507", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-02-20", last_updated: "2025-02-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 32768 }, cost: { input: 0.2, output: 0.5, cache_read: 0.1 } }, "doubao-seed-1-6-flash-250615": { id: "doubao-seed-1-6-flash-250615", name: "Doubao Seed 1.6 Flash", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-06-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 16384 }, cost: { input: 0.0374, output: 0.374, cache_read: 0.0187 } }, "mistral-small-31-24b-instruct": { id: "mistral-small-31-24b-instruct", name: "Mistral Small 31 24b Instruct", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "mistral-small", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 131072 }, cost: { input: 0.1, output: 0.3, cache_read: 0.05 } }, brave: { id: "brave", name: "Brave (Answers)", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-02-13", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, input: 8192, output: 8192 }, cost: { input: 5, output: 5 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, cache_write: 0.375 } }, "auto-model-basic": { id: "auto-model-basic", name: "Auto model (Basic)", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-04-16", last_updated: "2024-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 1e6 }, cost: { input: 9.996, output: 19.992, cache_read: 4.998 } }, "Qwen3.5-27B-Anko": { id: "Qwen3.5-27B-Anko", name: "Qwen3.5 27B Anko", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "jamba-large-1.6": { id: "jamba-large-1.6", name: "Jamba Large 1.6", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "jamba", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-03-12", last_updated: "2025-03-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 4096 }, cost: { input: 1.989, output: 7.99, cache_read: 0.9945 } }, "gemma-4-12b-it": { id: "gemma-4-12b-it", name: "Gemma 4 12B Instruct", description: "Google's Gemma 4 12B Instruct is an open-weight multimodal model for text, image, audio, and video understanding, with tool calling and structured output support.", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-08-01", last_updated: "2026-08-01", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 32768 }, cost: { input: 0.06, output: 0.3, cache_read: 0.03 } }, "gemini-2.5-flash-lite": { id: "gemini-2.5-flash-lite", name: "Gemini 2.5 Flash Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01 } }, "claude-sonnet-4-20250514": { id: "claude-sonnet-4-20250514", name: "Claude 4 Sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "phi-4-multimodal-instruct": { id: "phi-4-multimodal-instruct", name: "Phi 4 Multimodal", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "phi", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-26", last_updated: "2025-07-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0.07, output: 0.11, cache_read: 0.035 } }, "claude-opus-4-1-thinking:32000": { id: "claude-opus-4-1-thinking:32000", name: "Claude 4.1 Opus Thinking (32K)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5 } }, "glm-4.1v-thinking-flash": { id: "glm-4.1v-thinking-flash", name: "GLM 4.1V Thinking Flash", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 64000, input: 64000, output: 8192 }, cost: { input: 0.3, output: 0.3, cache_read: 0.15 } }, "claude-opus-4-1-thinking": { id: "claude-opus-4-1-thinking", name: "Claude 4.1 Opus Thinking", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5 } }, "jamba-mini-1.6": { id: "jamba-mini-1.6", name: "Jamba Mini 1.6", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "jamba", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-03-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 4096 }, cost: { input: 0.1989, output: 0.408, cache_read: 0.09945 } }, "Qwen3.5-27B-Queen-Derestricted-Lite": { id: "Qwen3.5-27B-Queen-Derestricted-Lite", name: "Qwen3.5 27B Queen Derestricted Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "qwen3.7-plus:thinking": { id: "qwen3.7-plus:thinking", name: "Qwen3.7 Plus Thinking", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 983616, input: 983616, output: 65536 }, cost: { input: 0.4, output: 1.6, cache_read: 0.08, cache_write: 0.5 } }, "glm-4-airx": { id: "glm-4-airx", name: "GLM-4 AirX", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-06-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8000, input: 8000, output: 4096 }, cost: { input: 2.006, output: 2.006, cache_read: 1.003 } }, "yi-lightning": { id: "yi-lightning", name: "Yi Lightning", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "yi", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-06-15", last_updated: "2024-10-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 12000, input: 12000, output: 4096 }, cost: { input: 0.2006, output: 0.2006, cache_read: 0.1003 } }, "qwen3-vl-235b-a22b-thinking": { id: "qwen3-vl-235b-a22b-thinking", name: "Qwen3 VL 235B A22B Thinking", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32768, input: 32768, output: 32768 }, cost: { input: 0.5, output: 6, cache_read: 0.25 } }, "Gemma-4-31B-Queen": { id: "Gemma-4-31B-Queen", name: "Gemma 4 31B Queen", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: false, release_date: "2026-05-01", last_updated: "2026-05-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "qwen3.5-35b-a3b:thinking": { id: "qwen3.5-35b-a3b:thinking", name: "Qwen3.5 35B A3B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 260096, input: 260096, output: 65536 }, cost: { input: 0.225, output: 1.8, cache_read: 0.1125 } }, "qwen3.6-max-preview": { id: "qwen3.6-max-preview", name: "Qwen3.6 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 245760, input: 245760, output: 65536 }, cost: { input: 1.04, output: 6.24, cache_read: 0.52 } }, "yi-large": { id: "yi-large", name: "Yi Large", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "yi", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-05-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, input: 32000, output: 4096 }, cost: { input: 3.196, output: 3.196, cache_read: 1.598 } }, "sarvam-30b": { id: "sarvam-30b", name: "Sarvam 30B", description: "Efficient Indian-language reasoning model for chat, coding, and multilingual work", family: "sarvam", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-18", last_updated: "2026-02-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, input: 65536, output: 4096 }, cost: { input: 0.028, output: 0.111, cache_read: 0.017 } }, "Qwen3.5-27B-Marvin-V2-Derestricted-Lite": { id: "Qwen3.5-27B-Marvin-V2-Derestricted-Lite", name: "Qwen3.5 27B Marvin V2 Derestricted Lite", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "mistral-code-latest": { id: "mistral-code-latest", name: "Mistral Code Latest", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "mistral", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 32768 }, cost: { input: 0.3, output: 0.9, cache_read: 0.15 } }, "nano-gpt-help": { id: "nano-gpt-help", name: "NanoGPT Help", description: "Text-only NanoGPT support assistant. Questions are processed by the Help inference provider; do not paste secrets or account credentials. Covers the website, models, API, pricing, memory, media generation, and support.", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-06-06", last_updated: "2026-06-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 6000, input: 6000, output: 512 }, cost: { input: 0, output: 0 } }, "mercury-2": { id: "mercury-2", name: "Mercury 2", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "mercury", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 50000 }, cost: { input: 0.25, output: 0.75, cache_read: 0.025 } }, "gemini-2.5-pro-preview-03-25": { id: "gemini-2.5-pro-preview-03-25", name: "Gemini 2.5 Pro Preview 0325", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, release_date: "2025-03-25", last_updated: "2025-03-25", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 2.5, output: 10, cache_read: 0.25 } }, "claude-opus-4-20250514": { id: "claude-opus-4-20250514", name: "Claude 4 Opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5 } }, "brave-pro": { id: "brave-pro", name: "Brave (Pro)", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-02-10", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, input: 8192, output: 8192 }, cost: { input: 5, output: 5 } }, "deepseek-reasoner": { id: "deepseek-reasoner", name: "DeepSeek Reasoner", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-09", release_date: "2025-12-01", last_updated: "2026-02-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 64000, input: 64000, output: 65536 }, cost: { input: 0.4, output: 1.7, cache_read: 0.2 } }, "longcat-2.0": { id: "longcat-2.0", name: "LongCat 2.0", description: "Meituan LongCat-2.0, a reasoning model with tool calling and a 1M-token context window", family: "longcat", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 262144 }, cost: { input: 0.75, output: 3, cache_read: 0.015 } }, "claw-medium": { id: "claw-medium", name: "Claw Medium", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-05-11", last_updated: "2026-05-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, input: 204800, output: 131072 }, cost: { input: 0.315, output: 1.26, cache_read: 0.1575 } }, "step-2-mini": { id: "step-2-mini", name: "Step-2 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "step", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-10-15", last_updated: "2024-07-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8000, input: 8000, output: 4096 }, cost: { input: 0.2006, output: 0.408, cache_read: 0.1003 } }, "yi-medium-200k": { id: "yi-medium-200k", name: "Yi Medium 200k", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "yi", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-03-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 4096 }, cost: { input: 2.499, output: 2.499, cache_read: 1.2495 } }, "Qwen3.5-27B-BlueStar-v3-Derestricted": { id: "Qwen3.5-27B-BlueStar-v3-Derestricted", name: "Qwen3.5 27B BlueStar v3 Derestricted", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.306, output: 0.306, cache_read: 0.153 } }, "qwen25-vl-72b-instruct": { id: "qwen25-vl-72b-instruct", name: "Qwen25 VL 72b", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-05-10", last_updated: "2025-05-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32000, input: 32000, output: 32768 }, cost: { input: 0.69989, output: 0.69989, cache_read: 0.349945 } }, "Meta-Llama-3-1-8B-Instruct-FP8": { id: "Meta-Llama-3-1-8B-Instruct-FP8", name: "Llama 3.1 8B (decentralized)", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0.02, output: 0.03, cache_read: 0.01 } }, "claude-opus-4-1-20250805": { id: "claude-opus-4-1-20250805", name: "Claude 4.1 Opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5 } }, "qwen3.5-122b-a10b": { id: "qwen3.5-122b-a10b", name: "Qwen3.5 122B A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 32768 }, cost: { input: 0.437, output: 3.496, cache_read: 0.103788 } }, "doubao-seed-2-0-code-preview-260215": { id: "doubao-seed-2-0-code-preview-260215", name: "Doubao Seed 2.0 Code Preview", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 128000 }, cost: { input: 0.782, output: 3.893, cache_read: 0.391 } }, "doubao-1.5-pro-256k": { id: "doubao-1.5-pro-256k", name: "Doubao 1.5 Pro 256k", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-03-12", last_updated: "2025-03-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 16384 }, cost: { input: 0.799, output: 1.445, cache_read: 0.3995 } }, "azure-gpt-4-turbo": { id: "azure-gpt-4-turbo", name: "Azure gpt-4-turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 4096 }, cost: { input: 10, output: 30 } }, "gemini-2.5-flash-preview-04-17:thinking": { id: "gemini-2.5-flash-preview-04-17:thinking", name: "Gemini 2.5 Flash Preview Thinking", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, release_date: "2025-04-17", last_updated: "2025-04-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 0.15, output: 3.5, cache_read: 0.015 } }, "qwen3.7-flash:thinking": { id: "qwen3.7-flash:thinking", name: "Qwen3.7 Flash Thinking", description: "Lightweight multimodal Qwen model for high-throughput text, image, and video tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 983616, input: 983616, output: 65536 }, cost: { input: 0.03, output: 0.13, cache_read: 0.006, cache_write: 0.038 } }, "ernie-x1.1-preview": { id: "ernie-x1.1-preview", name: "ERNIE X1.1", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "ernie", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-10", last_updated: "2025-09-10", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 64000, input: 64000, output: 8192 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "sonar-reasoning-pro": { id: "sonar-reasoning-pro", name: "Perplexity Reasoning Pro", description: "Web-grounded Sonar for multi-step research questions that need cited reasoning", family: "sonar-reasoning", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 127000, input: 127000, output: 128000 }, cost: { input: 2, output: 8, cache_read: 1 } }, "sarvam-105b": { id: "sarvam-105b", name: "Sarvam 105B", description: "Flagship Indian-language reasoning model for enterprise multilingual applications", family: "sarvam", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-01", last_updated: "2025-09-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 4096 }, cost: { input: 0.045, output: 0.177, cache_read: 0.028 } }, "glm-z1-airx": { id: "glm-z1-airx", name: "GLM Z1 AirX", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "glm", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, input: 32000, output: 16384 }, cost: { input: 0.7, output: 0.7, cache_read: 0.35 } }, "TEE/gemma4-31b": { id: "TEE/gemma4-31b", name: "Gemma 4 31B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: false, structured_output: true, release_date: "2026-04-04", last_updated: "2026-04-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 131072 }, cost: { input: 0.45, output: 1, cache_read: 0.45 } }, "TEE/deepseek-v3.1": { id: "TEE/deepseek-v3.1", name: "DeepSeek V3.1 TEE", description: "Hybrid-reasoning DeepSeek model with thinking and non-thinking modes", family: "deepseek", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 164000, input: 164000, output: 8192 }, cost: { input: 1, output: 2.5, cache_read: 0.5 } }, "TEE/qwen3.6-35b-a3b": { id: "TEE/qwen3.6-35b-a3b", name: "Qwen3.6 35B A3B TEE", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 262144 }, cost: { input: 0.2, output: 1.27, cache_read: 0.1 } }, "TEE/glm-5.1": { id: "TEE/glm-5.1", name: "GLM 5.1 TEE", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, input: 202752, output: 65535 }, cost: { input: 1.5, output: 5.25, cache_read: 0.3 } }, "TEE/kimi-k2.5-thinking": { id: "TEE/kimi-k2.5-thinking", name: "Kimi K2.5 Thinking TEE", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 65535 }, cost: { input: 0.6, output: 3, cache_read: 0.3 } }, "TEE/deepseek-v4-flash": { id: "TEE/deepseek-v4-flash", name: "DeepSeek V4 Flash TEE", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 1048576 }, cost: { input: 0.2, output: 0.4, cache_read: 0.04 } }, "TEE/kimi-k2.5": { id: "TEE/kimi-k2.5", name: "Kimi K2.5 TEE", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 65535 }, cost: { input: 0.6, output: 3, cache_read: 0.3 } }, "TEE/gpt-oss-20b": { id: "TEE/gpt-oss-20b", name: "GPT-OSS 20B TEE", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 8192 }, cost: { input: 0.2, output: 0.8, cache_read: 0.1 } }, "TEE/qwen3.5-27b": { id: "TEE/qwen3.5-27b", name: "Qwen3.5 27B TEE", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 65536 }, cost: { input: 0.3, output: 2.4, cache_read: 0.15 } }, "TEE/glm-5.2": { id: "TEE/glm-5.2", name: "GLM 5.2 TEE", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 131072 }, cost: { input: 1.4, output: 4.6, cache_read: 0.5 } }, "TEE/kimi-k2.6": { id: "TEE/kimi-k2.6", name: "Kimi K2.6 TEE", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 65536 }, cost: { input: 1.5, output: 5.25, cache_read: 0.375 } }, "TEE/qwen3.6-27b": { id: "TEE/qwen3.6-27b", name: "Qwen3.6 27B TEE", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 65536 }, cost: { input: 0.32, output: 2.7, cache_read: 0.16 } }, "TEE/gemma-3-27b-it": { id: "TEE/gemma-3-27b-it", name: "Gemma 3 27B TEE", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-03-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 8192 }, cost: { input: 0.2, output: 0.8, cache_read: 0.1 } }, "TEE/llama3-3-70b": { id: "TEE/llama3-3-70b", name: "Llama 3.3 70B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-03", last_updated: "2025-07-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 2, output: 2, cache_read: 2 } }, "TEE/gemma-4-26b-a4b-uncensored": { id: "TEE/gemma-4-26b-a4b-uncensored", name: "Gemma 4 26B A4B Uncensored TEE", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-05-23", last_updated: "2026-05-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, input: 65536, output: 65536 }, cost: { input: 0.15, output: 0.7, cache_read: 0.075 } }, "TEE/deepseek-v3.2": { id: "TEE/deepseek-v3.2", name: "DeepSeek V3.2 TEE", description: "Hybrid-reasoning DeepSeek model with thinking and non-thinking modes, sparse attention, and tool-use", family: "deepseek", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 164000, input: 164000, output: 65536 }, cost: { input: 0.5, output: 1, cache_read: 0.25 } }, "TEE/glm-4.7": { id: "TEE/glm-4.7", name: "GLM 4.7 TEE", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, input: 131000, output: 65535 }, cost: { input: 0.85, output: 3.3, cache_read: 0.425 } }, "TEE/gpt-oss-120b": { id: "TEE/gpt-oss-120b", name: "GPT-OSS 120B TEE", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 16384 }, cost: { input: 2, output: 2, cache_read: 2 } }, "TEE/minimax-m2.5": { id: "TEE/minimax-m2.5", name: "MiniMax M2.5 TEE", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, input: 196608, output: 131072 }, cost: { input: 0.2, output: 1.38, cache_read: 0.1 } }, "TEE/gemma-4-31b-it": { id: "TEE/gemma-4-31b-it", name: "Gemma 4 31B IT TEE", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 262144 }, cost: { input: 0.15, output: 0.46, cache_read: 0.075 } }, "TEE/gemma4-31b:thinking": { id: "TEE/gemma4-31b:thinking", name: "Gemma 4 31B Thinking TEE", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, release_date: "2026-05-02", last_updated: "2026-05-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 131072 }, cost: { input: 0.45, output: 1, cache_read: 0.45 } }, "TEE/kimi-k3": { id: "TEE/kimi-k3", name: "Kimi K3 TEE", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 65535 }, cost: { input: 3, output: 15, cache_read: 1.5 } }, "TEE/qwen3.5-397b-a17b": { id: "TEE/qwen3.5-397b-a17b", name: "Qwen3.5 397B A17B TEE", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 65536 }, cost: { input: 0.55, output: 3.5, cache_read: 0.275 } }, "TEE/glm-5.2:thinking": { id: "TEE/glm-5.2:thinking", name: "GLM 5.2 Thinking TEE", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 131072 }, cost: { input: 1.4, output: 4.6, cache_read: 0.5 } }, "TEE/glm-5.1-thinking": { id: "TEE/glm-5.1-thinking", name: "GLM 5.1 Thinking TEE", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, input: 202752, output: 65535 }, cost: { input: 1.5, output: 5.25, cache_read: 0.3 } }, "TEE/qwen3.6-35b-a3b-uncensored": { id: "TEE/qwen3.6-35b-a3b-uncensored", name: "Qwen3.6 35B A3B Uncensored TEE", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 131072 }], tool_call: true, structured_output: true, release_date: "2026-05-23", last_updated: "2026-05-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 131072 }, cost: { input: 0.3, output: 1.5, cache_read: 0.15 } }, "TEE/qwen3.5-122b-a10b": { id: "TEE/qwen3.5-122b-a10b", name: "Qwen3.5 122B A10B TEE", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 262144 }, cost: { input: 0.46, output: 3.68, cache_read: 0.23 } }, "TEE/qwen2.5-vl-72b-instruct": { id: "TEE/qwen2.5-vl-72b-instruct", name: "Qwen2.5 VL 72B TEE", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-02-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, input: 65536, output: 8192 }, cost: { input: 0.7, output: 0.7, cache_read: 0.35 } }, "microsoft/wizardlm-2-8x22b": { id: "microsoft/wizardlm-2-8x22b", name: "WizardLM-2 8x22B", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 65536, input: 65536, output: 8192 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "cohere/north-mini-code": { id: "cohere/north-mini-code", name: "Cohere North Mini Code 1.0", description: "Cohere coding model for practical software engineering and agentic edits", family: "north", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-09-23", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 64000 }, cost: { input: 0.2, output: 0.8, cache_read: 0.1 } }, "cohere/command-r-plus-08-2024": { id: "cohere/command-r-plus-08-2024", name: "Cohere: Command R+", description: "Cohere's RAG workhorse for long-context enterprise search and tool use", family: "command-r", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-06-01", release_date: "2024-08-30", last_updated: "2024-08-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 4096 }, cost: { input: 2.856, output: 14.246, cache_read: 1.428 } }, "baseten/Kimi-K2-Instruct-FP4": { id: "baseten/Kimi-K2-Instruct-FP4", name: "Kimi K2 0711 Instruct FP4", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-07-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 131072 }, cost: { input: 0.4, output: 1.8, cache_read: 0.2 } }, "nvidia/nemotron-3-ultra-550b-a55b:thinking": { id: "nvidia/nemotron-3-ultra-550b-a55b:thinking", name: "Nvidia Nemotron 3 Ultra 550B Thinking", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, input: 1e6, output: 65536 }, cost: { input: 0.5, output: 2.5, cache_read: 0.25 } }, "nvidia/nemotron-3-nano-30b-a3b": { id: "nvidia/nemotron-3-nano-30b-a3b", name: "Nvidia Nemotron 3 Nano 30B", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-12-15", last_updated: "2025-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 262144 }, cost: { input: 0.17, output: 0.68, cache_read: 0.085 } }, "nvidia/Llama-3.1-Nemotron-70B-Instruct-HF": { id: "nvidia/Llama-3.1-Nemotron-70B-Instruct-HF", name: "Nvidia Nemotron 70b", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", family: "nemotron", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.357, output: 0.408, cache_read: 0.1785 } }, "nvidia/nemotron-3-super-120b-a12b": { id: "nvidia/nemotron-3-super-120b-a12b", name: "Nvidia Nemotron 3 Super 120B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-03-01", last_updated: "2026-03-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.05, output: 0.25, cache_read: 0.025 } }, "nvidia/nemotron-3-super-120b-a12b:thinking": { id: "nvidia/nemotron-3-super-120b-a12b:thinking", name: "Nvidia Nemotron 3 Super 120B Thinking", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-03-01", last_updated: "2026-03-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.05, output: 0.25, cache_read: 0.025 } }, "nvidia/Llama-3.3-Nemotron-Super-49B-v1": { id: "nvidia/Llama-3.3-Nemotron-Super-49B-v1", name: "Nvidia Nemotron Super 49B", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", family: "nemotron", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-08", last_updated: "2025-08-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0.15, output: 0.15, cache_read: 0.075 } }, "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning": { id: "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning", name: "Nvidia Nemotron 3 Nano Omni", description: "Open Nemotron omni model combining reasoning with text, vision, and audio", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-28", last_updated: "2026-04-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 65536 }, cost: { input: 0.105, output: 0.42, cache_read: 0.0525 } }, "nvidia/nemotron-3-ultra-550b-a55b": { id: "nvidia/nemotron-3-ultra-550b-a55b", name: "Nvidia Nemotron 3 Ultra 550B", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, input: 1e6, output: 65536 }, cost: { input: 0.5, output: 2.5, cache_read: 0.25 } }, "huihui-ai/Qwen2.5-32B-Instruct-abliterated": { id: "huihui-ai/Qwen2.5-32B-Instruct-abliterated", name: "Qwen 2.5 32B Abliterated", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-01-06", last_updated: "2025-01-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, input: 32768, output: 8192 }, cost: { input: 0.7, output: 0.7, cache_read: 0.35 } }, "huihui-ai/DeepSeek-R1-Distill-Llama-70B-abliterated": { id: "huihui-ai/DeepSeek-R1-Distill-Llama-70B-abliterated", name: "DeepSeek R1 Llama 70B Abliterated", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.7, output: 0.7, cache_read: 0.35 } }, "huihui-ai/Llama-3.3-70B-Instruct-abliterated": { id: "huihui-ai/Llama-3.3-70B-Instruct-abliterated", name: "Llama 3.3 70B Instruct abliterated", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-08-08", last_updated: "2025-08-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 0.7, output: 0.7, cache_read: 0.35 } }, "huihui-ai/DeepSeek-R1-Distill-Qwen-32B-abliterated": { id: "huihui-ai/DeepSeek-R1-Distill-Qwen-32B-abliterated", name: "DeepSeek R1 Qwen Abliterated", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 1.4, output: 1.4, cache_read: 0.7 } }, "deepcogito/cogito-v1-preview-qwen-32B": { id: "deepcogito/cogito-v1-preview-qwen-32B", name: "Cogito v1 Preview Qwen 32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-05-10", last_updated: "2025-05-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 32768 }, cost: { input: 1.8, output: 1.8, cache_read: 0.9 } }, "google/gemini-flash-latest": { id: "google/gemini-flash-latest", name: "Gemini Flash Latest", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15 } }, "google/gemini-3.5-flash": { id: "google/gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, input: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15 } }, "google/gemma-4-31b-it:thinking": { id: "google/gemma-4-31b-it:thinking", name: "Gemma 4 31B Thinking", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 131072 }, cost: { input: 0.1, output: 0.35, cache_read: 0.05 } }, "google/gemini-3.5-flash-lite": { id: "google/gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, input: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, cache_write: 0.08333 } }, "google/gemma-4-26b-a4b-it:thinking": { id: "google/gemma-4-26b-a4b-it:thinking", name: "Gemma 4 26B A4B Thinking", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 131072 }, cost: { input: 0.13, output: 0.4, cache_read: 0.065 } }, "google/gemini-3.5-flash-thinking": { id: "google/gemini-3.5-flash-thinking", name: "Gemini 3.5 Flash Thinking", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, input: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15 } }, "google/gemini-pro-latest": { id: "google/gemini-pro-latest", name: "Gemini Pro Latest", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2026-03-29", last_updated: "2026-03-29", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 0.375 } }, "google/gemini-3.1-pro-preview-high": { id: "google/gemini-3.1-pro-preview-high", name: "Gemini 3.1 Pro (Preview High)", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-02-21", last_updated: "2026-02-21", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 0.375 } }, "google/gemini-3-flash-preview": { id: "google/gemini-3-flash-preview", name: "Gemini 3 Flash (Preview)", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05 } }, "google/gemini-3.1-pro-preview-customtools": { id: "google/gemini-3.1-pro-preview-customtools", name: "Gemini 3.1 Pro (Preview Custom Tools)", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 0.375 } }, "google/gemma-4-26b-a4b-it": { id: "google/gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 131072 }, cost: { input: 0.13, output: 0.4, cache_read: 0.065 } }, "google/gemini-3.6-flash": { id: "google/gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, input: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15 } }, "google/gemini-3-flash-preview-thinking": { id: "google/gemini-3-flash-preview-thinking", name: "Gemini 3 Flash Thinking", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05 } }, "google/gemini-3.1-flash-lite": { id: "google/gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, input: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, cache_write: 0.08333 } }, "google/gemma-4-31b-it": { id: "google/gemma-4-31b-it", name: "Gemma 4 31B", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 131072 }, cost: { input: 0.1, output: 0.35, cache_read: 0.05 } }, "google/gemini-3.1-pro-preview": { id: "google/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro (Preview)", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 0.375 } }, "google/gemini-flash-lite-latest": { id: "google/gemini-flash-lite-latest", name: "Gemini Flash Lite Latest", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, input: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, cache_write: 0.08333 } }, "google/gemini-3.1-pro-preview-low": { id: "google/gemini-3.1-pro-preview-low", name: "Gemini 3.1 Pro (Preview Low)", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-02-21", last_updated: "2026-02-21", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048756, input: 1048756, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 0.375 } }, "thinkingmachines/inkling:thinking": { id: "thinkingmachines/inkling:thinking", name: "Inkling Thinking", description: "Multimodal MoE reasoning model (975B total, 41B active) for text, image, and audio", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 1048000, input: 1048000, output: 32768 }, cost: { input: 1, output: 4.05, cache_read: 0.17 } }, "thinkingmachines/Inkling-Small": { id: "thinkingmachines/Inkling-Small", name: "Inkling Small", description: "Multimodal MoE reasoning model (276B total, 12B active) for text, image, and audio", family: "ling", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-30", last_updated: "2026-07-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 524288, input: 524288, output: 32768 }, cost: { input: 0.5, output: 1.2, cache_read: 0.1 } }, "thinkingmachines/Inkling-Small:thinking": { id: "thinkingmachines/Inkling-Small:thinking", name: "Inkling Small Thinking", description: "Multimodal MoE reasoning model (276B total, 12B active) for text, image, and audio", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "max"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-30", last_updated: "2026-07-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 524288, input: 524288, output: 32768 }, cost: { input: 0.5, output: 1.2, cache_read: 0.1 } }, "thinkingmachines/inkling": { id: "thinkingmachines/inkling", name: "Inkling", description: "Multimodal MoE reasoning model (975B total, 41B active) for text, image, and audio", family: "ling", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 1048000, input: 1048000, output: 32768 }, cost: { input: 1, output: 4.05, cache_read: 0.17 } }, "zai-org/glm-4.6v": { id: "zai-org/glm-4.6v", name: "GLM 4.6V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 24000 }, cost: { input: 0.3, output: 0.9, cache_read: 0.15 } }, "zai-org/glm-5": { id: "zai-org/glm-5", name: "GLM 5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 128000 }, cost: { input: 0.5, output: 2.55, cache_read: 0.13 } }, "zai-org/glm-5:thinking": { id: "zai-org/glm-5:thinking", name: "GLM 5 Thinking", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 128000 }, cost: { input: 0.5, output: 2.55, cache_read: 0.13 } }, "zai-org/GLM-4.5:thinking": { id: "zai-org/GLM-4.5:thinking", name: "GLM 4.5 (Thinking)", description: "Hybrid-reasoning GLM release that made the 4.5 line broadly useful", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 0.3, output: 1.3, cache_read: 0.15 } }, "zai-org/glm-5.1": { id: "zai-org/glm-5.1", name: "GLM 5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 131072 }, cost: { input: 0.75, output: 2.6, cache_read: 0.15 } }, "zai-org/glm-4.6-original": { id: "zai-org/glm-4.6-original", name: "GLM 4.6 Original", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: false, release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 65535 }, cost: { input: 0.35, output: 1.4, cache_read: 0.175 } }, "zai-org/GLM-4.5-Air": { id: "zai-org/GLM-4.5-Air", name: "GLM 4.5 Air", description: "Lighter GLM-4.5 variant for fast coding assistance and cheaper agents", family: "glm-air", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 98304 }, cost: { input: 0.12, output: 0.8, cache_read: 0.06 } }, "zai-org/glm-4.7-flash": { id: "zai-org/glm-4.7-flash", name: "GLM 4.7 Flash", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 128000 }, cost: { input: 0.07, output: 0.4, cache_read: 0.035 } }, "zai-org/glm-5.2": { id: "zai-org/glm-5.2", name: "GLM 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 131072 }, cost: { input: 0.42, output: 1.32, cache_read: 0.078 } }, "zai-org/glm-4.7-original": { id: "zai-org/glm-4.7-original", name: "GLM 4.7 Original", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 65535 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "zai-org/glm-5-original": { id: "zai-org/glm-5-original", name: "GLM 5 Original", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 128000 }, cost: { input: 1, output: 3.2, cache_read: 0.2 } }, "zai-org/glm-5-original:thinking": { id: "zai-org/glm-5-original:thinking", name: "GLM 5 Original Thinking", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 128000 }, cost: { input: 1, output: 3.2, cache_read: 0.2 } }, "zai-org/glm-4.7-flash-original": { id: "zai-org/glm-4.7-flash-original", name: "GLM 4.7 Flash Original", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 128000 }, cost: { input: 0.07, output: 0.4, cache_read: 0.035 } }, "zai-org/GLM-4.6-turbo:thinking": { id: "zai-org/GLM-4.6-turbo:thinking", name: "GLM 4.6 Turbo (Thinking)", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2025-10-02", last_updated: "2025-10-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 204800 }, cost: { input: 1, output: 3, cache_read: 0.5 } }, "zai-org/glm-5.1:thinking": { id: "zai-org/glm-5.1:thinking", name: "GLM 5.1 Thinking", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 131072 }, cost: { input: 0.75, output: 2.6, cache_read: 0.15 } }, "zai-org/glm-4.5": { id: "zai-org/glm-4.5", name: "GLM 4.5", description: "Hybrid-reasoning GLM release that made the 4.5 line broadly useful", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 0.3, output: 1.3, cache_read: 0.15 } }, "zai-org/glm-4.7-original:thinking": { id: "zai-org/glm-4.7-original:thinking", name: "GLM 4.7 Original Thinking", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 65535 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "zai-org/glm-4.7": { id: "zai-org/glm-4.7", name: "GLM 4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 65535 }, cost: { input: 0.2, output: 0.8, cache_read: 0.1 } }, "zai-org/GLM-4.6-turbo": { id: "zai-org/GLM-4.6-turbo", name: "GLM 4.6 Turbo", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-10-02", last_updated: "2025-10-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 204800 }, cost: { input: 1, output: 3, cache_read: 0.5 } }, "zai-org/glm-latest": { id: "zai-org/glm-latest", name: "GLM Latest", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, release_date: "2026-05-03", last_updated: "2026-05-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 131072 }, cost: { input: 0.42, output: 1.32, cache_read: 0.078 } }, "zai-org/GLM-4.5-Air:thinking": { id: "zai-org/GLM-4.5-Air:thinking", name: "GLM 4.5 Air (Thinking)", description: "Lighter GLM-4.5 variant for fast coding assistance and cheaper agents", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 98304 }, cost: { input: 0.12, output: 0.8, cache_read: 0.06 } }, "zai-org/glm-4.6v-flash-original": { id: "zai-org/glm-4.6v-flash-original", name: "GLM 4.6V Flash", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 24000 }, cost: { input: 0.1, output: 0.4, cache_read: 0.05 } }, "zai-org/glm-4.6v-original": { id: "zai-org/glm-4.6v-original", name: "GLM 4.6V Original", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 24000 }, cost: { input: 0.6, output: 0.9, cache_read: 0.3 } }, "zai-org/glm-4.7-flash:thinking": { id: "zai-org/glm-4.7-flash:thinking", name: "GLM 4.7 Flash Thinking", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 128000 }, cost: { input: 0.07, output: 0.4, cache_read: 0.035 } }, "zai-org/glm-4.7-flash-original:thinking": { id: "zai-org/glm-4.7-flash-original:thinking", name: "GLM 4.7 Flash Original Thinking", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 128000 }, cost: { input: 0.07, output: 0.4, cache_read: 0.035 } }, "zai-org/glm-5.2:thinking": { id: "zai-org/glm-5.2:thinking", name: "GLM 5.2 Thinking", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 131072 }, cost: { input: 0.42, output: 1.32, cache_read: 0.078 } }, "zai-org/glm-4.7:thinking": { id: "zai-org/glm-4.7:thinking", name: "GLM 4.7 Thinking", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 65535 }, cost: { input: 0.2, output: 0.8, cache_read: 0.1 } }, "featherless-ai/Qwerky-72B": { id: "featherless-ai/Qwerky-72B", name: "Qwerky 72B", description: "General-purpose chat model for instruction following, writing, and analysis", family: "qwerky", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, input: 32000, output: 8192 }, cost: { input: 0.5, output: 0.5, cache_read: 0.25 } }, "unsloth/gemma-3-4b-it": { id: "unsloth/gemma-3-4b-it", name: "Gemma 3 4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "unsloth", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-03-10", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 0.2006, output: 0.2006, cache_read: 0.1003 } }, "unsloth/gemma-3-27b-it": { id: "unsloth/gemma-3-27b-it", name: "Gemma 3 27B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "unsloth", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-03-10", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 96000 }, cost: { input: 0.2992, output: 0.2992, cache_read: 0.1496 } }, "unsloth/gemma-3-12b-it": { id: "unsloth/gemma-3-12b-it", name: "Gemma 3 12B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "unsloth", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-03-10", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 131072 }, cost: { input: 0.272, output: 0.272, cache_read: 0.136 } }, "perceptron/perceptron-mk1": { id: "perceptron/perceptron-mk1", name: "Perceptron Mk1", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, release_date: "2026-05-12", last_updated: "2026-05-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 8192 }, cost: { input: 0.15, output: 1.5, cache_read: 0.075 } }, "sakana/fugu-ultra": { id: "sakana/fugu-ultra", name: "Fugu Ultra", description: "Quality-first multi-agent model for hard research, analysis, and competitions", family: "fugu", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-06-15", last_updated: "2026-06-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 16384 }, cost: { input: 5.25, output: 31.5, cache_read: 0.525 } }, "sakana/fugu-ultra-v1.1": { id: "sakana/fugu-ultra-v1.1", name: "Fugu Ultra v1.1", description: "Sakana AI's upgraded Fugu Ultra release with stronger coding, agentic task execution, and advanced reasoning through dynamic orchestration of frontier models.", family: "fugu", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh", "max"] }], tool_call: true, structured_output: true, release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 16384 }, cost: { input: 5.25, output: 31.5, cache_read: 0.525 } }, "Steelskull/L3.3-MS-Nevoria-70b": { id: "Steelskull/L3.3-MS-Nevoria-70b", name: "Steelskull Nevoria 70b", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "Steelskull/L3.3-MS-Evayale-70B": { id: "Steelskull/L3.3-MS-Evayale-70B", name: "Evayale 70b ", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "Steelskull/L3.3-Cu-Mai-R1-70b": { id: "Steelskull/L3.3-Cu-Mai-R1-70b", name: "Llama 3.3 70B Cu Mai", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "Steelskull/L3.3-Electra-R1-70b": { id: "Steelskull/L3.3-Electra-R1-70b", name: "Steelskull Electra R1 70b", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 0.69989, output: 0.69989, cache_read: 0.349945 } }, "Steelskull/L3.3-Nevoria-R1-70b": { id: "Steelskull/L3.3-Nevoria-R1-70b", name: "Steelskull Nevoria R1 70b", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "qwen/qwen3-32b": { id: "qwen/qwen3-32b", name: "Qwen 3 32b", description: "Dense open Qwen model for self-hosted chat, reasoning, and coding", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 41000, input: 41000, output: 32768 }, cost: { input: 0.1, output: 0.3, cache_read: 0.05 } }, "qwen/qwen3-30b-a3b": { id: "qwen/qwen3-30b-a3b", name: "Qwen3 30B A3B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-02-27", last_updated: "2025-02-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 41000, input: 41000, output: 32768 }, cost: { input: 0.1, output: 0.3, cache_read: 0.05 } }, "qwen/Qwen3-235B-A22B-Instruct-2507": { id: "qwen/Qwen3-235B-A22B-Instruct-2507", name: "Qwen 3 235b A22B 2507", description: "Updated large open Qwen3 MoE instruct model for multilingual chat, coding, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-21", last_updated: "2025-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 262144 }, cost: { input: 0.13, output: 0.5, cache_read: 0.065 } }, "qwen/qwen3.5-plus": { id: "qwen/qwen3.5-plus", name: "Qwen3.5 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 983616, input: 983616, output: 65536 }, cost: { input: 0.4, output: 2.4, cache_read: 0.04 } }, "qwen/Qwen3-235B-A22B-Instruct-2507-TEE": { id: "qwen/Qwen3-235B-A22B-Instruct-2507-TEE", name: "Qwen 3 235b A22B 2507 (TEE)", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 262144 }, cost: { input: 0.13, output: 0.5, cache_read: 0.065 } }, "qwen/qwen3-next-80b-a3b-thinking": { id: "qwen/qwen3-next-80b-a3b-thinking", name: "Qwen3 Next 80B A3B (Thinking)", description: "Efficient Qwen thinking model for local reasoning, math, and coding agents", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 32768 }, cost: { input: 0.15, output: 0.65, cache_read: 0.075 } }, "qwen/qwen3.5-9b": { id: "qwen/qwen3.5-9b", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 65536 }, cost: { input: 0.05, output: 0.15, cache_read: 0.025 } }, "qwen/Qwen3-VL-235B-A22B-Instruct": { id: "qwen/Qwen3-VL-235B-A22B-Instruct", name: "Qwen3 VL 235B A22B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 262144 }, cost: { input: 0.3, output: 1.2, cache_read: 0.15 } }, "qwen/qwen3-14b": { id: "qwen/qwen3-14b", name: "Qwen 3 14b", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 41000, input: 41000, output: 32768 }, cost: { input: 0.08, output: 0.24, cache_read: 0.04 } }, "qwen/Qwen3-8B": { id: "qwen/Qwen3-8B", name: "Qwen 3 8B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 41000, input: 41000, output: 32768 }, cost: { input: 0.47, output: 0.47, cache_read: 0.235 } }, "qwen/qwen3-235b-a22b": { id: "qwen/qwen3-235b-a22b", name: "Qwen 3 235b A22B", description: "Large open Qwen MoE for multilingual reasoning, coding, and tool use", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 41000, input: 41000, output: 32768 }, cost: { input: 0.3, output: 0.5, cache_read: 0.15 } }, "qwen/qwen3-max": { id: "qwen/qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen3 model for coding agents, complex reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 32768 }, cost: { input: 1.2002, output: 6.001, cache_read: 0.6001 } }, "qwen/qwen3.5-397b-a17b-thinking": { id: "qwen/qwen3.5-397b-a17b-thinking", name: "Qwen3.5 397B A17B Thinking", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 258048, input: 258048, output: 65536 }, cost: { input: 0.6, output: 3.6, cache_read: 0.3 } }, "qwen/qwen3-coder-plus": { id: "qwen/qwen3-coder-plus", name: "Qwen3 Coder Plus", description: "Hosted Qwen coder for software agents, repo edits, and long-context code", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 1, output: 5, cache_read: 0.5 } }, "qwen/qwen3-coder-flash": { id: "qwen/qwen3-coder-flash", name: "Qwen3 Coder Flash", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 0.3, output: 1.5, cache_read: 0.15 } }, "qwen/Qwen3.6-35B-A3B": { id: "qwen/Qwen3.6-35B-A3B", name: "Qwen3.6 35B A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.112, output: 0.8, cache_read: 0.056 } }, "qwen/qwen-2.5-72b-instruct": { id: "qwen/qwen-2.5-72b-instruct", name: "Qwen2.5 72B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-03", last_updated: "2025-07-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 8192 }, cost: { input: 0.357, output: 0.408, cache_read: 0.1785 } }, "qwen/qwen3.5-397b-a17b": { id: "qwen/qwen3.5-397b-a17b", name: "Qwen3.5 397B A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 258048, input: 258048, output: 65536 }, cost: { input: 0.6, output: 3.6, cache_read: 0.3 } }, "qwen/qwen3.5-plus-thinking": { id: "qwen/qwen3.5-plus-thinking", name: "Qwen3.5 Plus Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 81920 }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 983616, input: 983616, output: 65536 }, cost: { input: 0.4, output: 2.4, cache_read: 0.04 } }, "qwen/Qwen3-Next-80B-A3B-Instruct": { id: "qwen/Qwen3-Next-80B-A3B-Instruct", name: "Qwen3 Next 80B A3B (Instruct)", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 262144 }, cost: { input: 0.15, output: 0.65, cache_read: 0.075 } }, "qwen/Qwen2.5-Coder-32B-Instruct": { id: "qwen/Qwen2.5-Coder-32B-Instruct", name: "Qwen 2.5 Coder 32b", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-03", last_updated: "2025-07-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, input: 32000, output: 8192 }, cost: { input: 0.2006, output: 0.2006, cache_read: 0.1003 } }, "qwen/Qwen3.6-35B-A3B:thinking": { id: "qwen/Qwen3.6-35B-A3B:thinking", name: "Qwen3.6 35B A3B Thinking", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.112, output: 0.8, cache_read: 0.056 } }, "qwen/qwen3-coder": { id: "qwen/qwen3-coder", name: "Qwen 3 Coder 480B", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262000, input: 262000, output: 65536 }, cost: { input: 0.13, output: 0.5, cache_read: 0.065 } }, "qwen/qwen3-coder-next": { id: "qwen/qwen3-coder-next", name: "Qwen3 Coder Next", description: "Open-weight Qwen coding model for agents, repository edits, and multi-turn tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-09", release_date: "2026-02-03", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 65536 }, cost: { input: 0.2, output: 1.5, cache_read: 0.1 } }, "qwen/Qwen3-235B-A22B-Thinking-2507": { id: "qwen/Qwen3-235B-A22B-Thinking-2507", name: "Qwen 3 235b A22B 2507 Thinking", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-11", last_updated: "2025-09-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 262144 }, cost: { input: 0.3, output: 0.5, cache_read: 0.15 } }, "EVA-UNIT-01/EVA-Qwen2.5-32B-v0.2": { id: "EVA-UNIT-01/EVA-Qwen2.5-32B-v0.2", name: "EVA-Qwen2.5-32B-v0.2", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-26", last_updated: "2025-07-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.799, output: 0.799, cache_read: 0.3995 } }, "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.1": { id: "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.1", name: "EVA-LLaMA-3.33-70B-v0.1", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 2.006, output: 2.006, cache_read: 1.003 } }, "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.0": { id: "EVA-UNIT-01/EVA-LLaMA-3.33-70B-v0.0", name: "EVA Llama 3.33 70B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-26", last_updated: "2025-07-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 2.006, output: 2.006, cache_read: 1.003 } }, "EVA-UNIT-01/EVA-Qwen2.5-72B-v0.2": { id: "EVA-UNIT-01/EVA-Qwen2.5-72B-v0.2", name: "EVA-Qwen2.5-72B-v0.2", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.799, output: 0.799, cache_read: 0.3995 } }, "tencent/hy3": { id: "tencent/hy3", name: "Tencent Hy3", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 262144 }, cost: { input: 0.066, output: 0.26, cache_read: 0.029 } }, "tencent/Hunyuan-MT-7B": { id: "tencent/Hunyuan-MT-7B", name: "Hunyuan MT 7B", description: "Translation model for multilingual conversion, localization, and cross-language workflows", family: "hunyuan", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-08-15", last_updated: "2025-09-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, input: 8192, output: 8192 }, cost: { input: 10, output: 20, cache_read: 5 } }, "THUDM/GLM-Z1-9B-0414": { id: "THUDM/GLM-Z1-9B-0414", name: "GLM Z1 9B 0414", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm-z", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-04-14", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, input: 32000, output: 8000 }, cost: { input: 0.2, output: 0.2, cache_read: 0.1 } }, "THUDM/GLM-4-32B-0414": { id: "THUDM/GLM-4-32B-0414", name: "GLM 4 32B 0414", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-04-14", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 0.2, output: 0.2, cache_read: 0.1 } }, "THUDM/GLM-4-9B-0414": { id: "THUDM/GLM-4-9B-0414", name: "GLM 4 9B 0414", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-04-14", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, input: 32000, output: 8000 }, cost: { input: 0.2, output: 0.2, cache_read: 0.1 } }, "abacusai/Dracarys-72B-Instruct": { id: "abacusai/Dracarys-72B-Instruct", name: "Llama 3.1 70B Dracarys 2", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-08-02", last_updated: "2025-08-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "pamanseau/OpenReasoning-Nemotron-32B": { id: "pamanseau/OpenReasoning-Nemotron-32B", name: "OpenReasoning Nemotron 32B", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, input: 32768, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.05 } }, "upstage/solar-pro-3": { id: "upstage/solar-pro-3", name: "Solar Pro 3", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "solar-pro", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 128000 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015 } }, "GalrionSoftworks/MN-LooseCannon-12B-v1": { id: "GalrionSoftworks/MN-LooseCannon-12B-v1", name: "MN-LooseCannon-12B-v1", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "mistralai/Devstral-Small-2505": { id: "mistralai/Devstral-Small-2505", name: "Mistral Devstral Small 2505", description: "Mistral coding agent model for repository tasks and software engineering workflows", family: "devstral", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-08-02", last_updated: "2025-08-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, input: 32768, output: 8192 }, cost: { input: 0.06, output: 0.06, cache_read: 0.03 } }, "mistralai/mistral-large": { id: "mistralai/mistral-large", name: "Mistral Large 2411", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-02-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 256000 }, cost: { input: 2.006, output: 6.001, cache_read: 0.2 } }, "mistralai/mistral-small-4-119b-2603:thinking": { id: "mistralai/mistral-small-4-119b-2603:thinking", name: "Mistral Small 4 119B Thinking", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.4, output: 1.4, cache_read: 0.2 } }, "mistralai/Mistral-Nemo-Instruct-2407": { id: "mistralai/Mistral-Nemo-Instruct-2407", name: "Mistral Nemo", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.1003, output: 0.1207, cache_read: 0.05015 } }, "mistralai/devstral-2-123b-instruct-2512": { id: "mistralai/devstral-2-123b-instruct-2512", name: "Devstral 2 123B", description: "Mistral coding agent model for repository tasks and software engineering workflows", family: "devstral", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-09", last_updated: "2025-12-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 65536 }, cost: { input: 0.4, output: 1.4, cache_read: 0.2 } }, "mistralai/ministral-8b-2512": { id: "mistralai/ministral-8b-2512", name: "Ministral 8B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-04", last_updated: "2025-12-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 32768 }, cost: { input: 0.15, output: 0.15, cache_read: 0.075 } }, "mistralai/ministral-14b-2512": { id: "mistralai/ministral-14b-2512", name: "Ministral 14B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-04", last_updated: "2025-12-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 32768 }, cost: { input: 0.2, output: 0.2, cache_read: 0.1 } }, "mistralai/ministral-3b-2512": { id: "mistralai/ministral-3b-2512", name: "Ministral 3B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-04", last_updated: "2025-12-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 32768 }, cost: { input: 0.1, output: 0.1, cache_read: 0.05 } }, "mistralai/mistral-small-4-119b-2603": { id: "mistralai/mistral-small-4-119b-2603", name: "Mistral Small 4 119B", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 16384 }, cost: { input: 0.4, output: 1.4, cache_read: 0.2 } }, "mistralai/mistral-large-3-675b-instruct-2512": { id: "mistralai/mistral-large-3-675b-instruct-2512", name: "Mistral Large 3 675B", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-25", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 256000 }, cost: { input: 1, output: 3, cache_read: 0.5 } }, "mistralai/ministral-14b-instruct-2512": { id: "mistralai/ministral-14b-instruct-2512", name: "Ministral 3 14B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 32768 }, cost: { input: 0.1, output: 0.4, cache_read: 0.05 } }, "mistralai/mixtral-8x22b-instruct-v0.1": { id: "mistralai/mixtral-8x22b-instruct-v0.1", name: "Mixtral 8x22B", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mixtral", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, input: 65536, output: 65536 }, cost: { input: 2, output: 6, cache_read: 0.2 } }, "mistralai/mistral-medium-3.1": { id: "mistralai/mistral-medium-3.1", name: "Mistral Medium 3.1", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, input: 131072, output: 32768 }, cost: { input: 0.4, output: 2, cache_read: 0.2 } }, "mistralai/mistral-saba": { id: "mistralai/mistral-saba", name: "Mistral Saba", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-02-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, input: 32000, output: 32768 }, cost: { input: 0.1989, output: 0.595, cache_read: 0.09945 } }, "mistralai/codestral-2508": { id: "mistralai/codestral-2508", name: "Codestral 2508", description: "Mistral coding model for code completion, generation, and developer workflows", family: "codestral", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-08-01", last_updated: "2025-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 32768 }, cost: { input: 0.3, output: 0.9, cache_read: 0.15 } }, "mistralai/mistral-medium-3": { id: "mistralai/mistral-medium-3", name: "Mistral Medium 3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, input: 131072, output: 32768 }, cost: { input: 0.4, output: 2, cache_read: 0.2 } }, "bytedance/doubao-seed-character": { id: "bytedance/doubao-seed-character", name: "Doubao Seed Character", description: "ByteDance's character-focused Doubao Seed model for roleplay, persona consistency, dialogue, and creative character interactions. It supports text and image input with a 128k context window. Requests route through ZenMux to ByteDance; ZenMux does not publish a model-API zero-retention or training guarantee, so avoid sensitive data.", family: "seed", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2026-07-18", last_updated: "2026-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 32768 }, cost: { input: 0.1179, output: 0.2947, cache_read: 0.0236, cache_write: 0.0025 } }, "bytedance/doubao-seed-2.1-turbo": { id: "bytedance/doubao-seed-2.1-turbo", name: "Doubao Seed 2.1 Turbo", description: "Fast, lower-cost model in the Doubao Seed 2.1 family for everyday chat, coding assistance, document work, and high-throughput productivity tasks. Supports a 256k context window and up to 128k output tokens. Note: privacy and logging guarantees may be limited.", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-06-23", last_updated: "2026-06-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 128000 }, cost: { input: 0.5, output: 2.5, cache_read: 0.25 } }, "bytedance/doubao-seed-2.1-pro": { id: "bytedance/doubao-seed-2.1-pro", name: "Doubao Seed 2.1 Pro", description: "Higher-capability model in the Doubao Seed 2.1 family for agentic coding, long-context analysis, complex instruction following, and productivity workflows. Supports a 256k context window and up to 128k output tokens. Note: privacy and logging guarantees may be limited.", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-06-23", last_updated: "2026-06-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 128000 }, cost: { input: 1, output: 5, cache_read: 0.5 } }, "soob3123/amoral-gemma3-27B-v2": { id: "soob3123/amoral-gemma3-27B-v2", name: "Amoral Gemma3 27B v2", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-05-23", last_updated: "2025-05-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, input: 32768, output: 8192 }, cost: { input: 0.3, output: 0.3, cache_read: 0.15 } }, "soob3123/GrayLine-Qwen3-8B": { id: "soob3123/GrayLine-Qwen3-8B", name: "Grayline Qwen3 8B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 32768 }, cost: { input: 0.3, output: 0.3, cache_read: 0.15 } }, "soob3123/Veiled-Calla-12B": { id: "soob3123/Veiled-Calla-12B", name: "Veiled Calla 12B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-04-13", last_updated: "2025-04-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, input: 32768, output: 8192 }, cost: { input: 0.3, output: 0.3, cache_read: 0.15 } }, "nex-agi/nex-n2-mini": { id: "nex-agi/nex-n2-mini", name: "Nex N2 Mini", description: "Nex AGI's open-source agentic mixture-of-experts model in the Nex N2 family. It accepts text and image input and is built for coding, tool use, structured outputs, and optional reasoning with a 256K context window.", family: "agi", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, release_date: "2026-06-24", last_updated: "2026-06-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 262144 }, cost: { input: 0.025, output: 0.1, cache_read: 0.0025 } }, "nex-agi/nex-n2-pro": { id: "nex-agi/nex-n2-pro", name: "Nex N2 Pro", description: "Nex AGI's open-source agentic reasoning model, post-trained on Qwen3.5-397B-A17B. It is built for agentic coding, software engineering, deep research, tool use, and long-horizon tasks with a 256K context window.", family: "agi", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 262144 }, cost: { input: 0.5, output: 2.5, cache_read: 0.25 } }, "inflatebot/MN-12B-Mag-Mell-R1": { id: "inflatebot/MN-12B-Mag-Mell-R1", name: "Mag Mell R1", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "LLM360/K2-Think": { id: "LLM360/K2-Think", name: "K2-Think", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-26", last_updated: "2025-07-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 32768 }, cost: { input: 0.17, output: 0.68, cache_read: 0.085 } }, "undi95/remm-slerp-l2-13b": { id: "undi95/remm-slerp-l2-13b", name: "ReMM SLERP 13B", description: "Open Llama multimodal model for image understanding and text reasoning", family: "llama", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 6144, input: 6144, output: 4096 }, cost: { input: 0.799, output: 1.207, cache_read: 0.3995 } }, "meta/muse-spark-1.1": { id: "meta/muse-spark-1.1", name: "Muse Spark 1.1", description: "Muse Spark is a natively multimodal reasoning model with support for tool-use, visual chain of thought, and multi-agent orchestration.", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-04-08", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 65536 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "meta/muse-spark-1.2-contributor": { id: "meta/muse-spark-1.2-contributor", name: "Muse Spark 1.2 Contributor (Data Used for Training)", description: "A much cheaper opt-in version of Muse Spark 1.2 with the same multimodal coding and agentic capabilities. Prompts and outputs sent to this Contributor model may be used by Meta for training and to improve its products; use the standard Muse Spark 1.2 model if you do not want your data used for training.", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, release_date: "2026-08-05", last_updated: "2026-08-05", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 65536 }, cost: { input: 0.1, output: 0.2, cache_read: 0.002 } }, "meta/muse-spark-1.2": { id: "meta/muse-spark-1.2", name: "Muse Spark 1.2", description: "Muse Spark 1.2 is a coding-focused update to Muse Spark 1.1 with improvements in code generation, complex debugging, codebase understanding, and end-to-end developer workflows.", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-05", last_updated: "2026-08-05", modalities: { input: ["text", "image", "video", "pdf", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 65536 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "nanogpt/coding-router:max": { id: "nanogpt/coding-router:max", name: "Coding Router Max", description: "Automatic model router for matching prompts to suitable backends and budgets", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-05-12", last_updated: "2026-05-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "nanogpt/coding-router:medium": { id: "nanogpt/coding-router:medium", name: "Coding Router Medium", description: "Automatic model router for matching prompts to suitable backends and budgets", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-05-12", last_updated: "2026-05-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "nanogpt/coding-router:high": { id: "nanogpt/coding-router:high", name: "Coding Router High", description: "Automatic model router for matching prompts to suitable backends and budgets", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-05-12", last_updated: "2026-05-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 1.1, output: 2.2, cache_read: 0.11 } }, "nanogpt/coding-router:low": { id: "nanogpt/coding-router:low", name: "Coding Router Low", description: "Automatic model router for matching prompts to suitable backends and budgets", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-05-12", last_updated: "2026-05-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "nanogpt/coding-router": { id: "nanogpt/coding-router", name: "Coding Router", description: "Automatic model router for matching prompts to suitable backends and budgets", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-05-12", last_updated: "2026-05-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 1.1, output: 2.2, cache_read: 0.11 } }, "mlabonne/NeuralDaredevil-8B-abliterated": { id: "mlabonne/NeuralDaredevil-8B-abliterated", name: "Neural Daredevil 8B abliterated", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, input: 8192, output: 8192 }, cost: { input: 0.44, output: 0.44, cache_read: 0.22 } }, "MiniMaxAI/MiniMax-M1-80k": { id: "MiniMaxAI/MiniMax-M1-80k", name: "MiniMax M1 80K", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-01-08", last_updated: "2025-06-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 131072 }, cost: { input: 0.6052, output: 2.4225, cache_read: 0.3026 } }, "inclusionai/ling-3.0-flash": { id: "inclusionai/ling-3.0-flash", name: "Ling 3.0 Flash", description: "Ling-3.0-flash is a 124B-parameter Mixture-of-Experts model with approximately 5.1B parameters active per token. It prioritizes token efficiency and production-scale agentic inference, helping coding and tool-using agents complete more work within constrained latency and serving budgets.", family: "ling", attachment: false, reasoning: false, tool_call: true, structured_output: false, release_date: "2026-07-23", last_updated: "2026-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, input: 262144, output: 32768 }, cost: { input: 0.075, output: 0.22, cache_read: 0.015 } }, "inclusionai/ring-2.6-1t": { id: "inclusionai/ring-2.6-1t", name: "Ring 2.6 1T", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "ring", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-05-08", last_updated: "2026-05-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, input: 262144, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.06 } }, "inclusionai/ling-2.6-1t": { id: "inclusionai/ling-2.6-1t", name: "Ling 2.6 1T", description: "Tool-capable chat model for instruction following and agentic application workflows", family: "ling", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, input: 262144, output: 32768 }, cost: { input: 0.3, output: 2.5, cache_read: 0.06 } }, "inclusionai/ling-3.0-flash:thinking": { id: "inclusionai/ling-3.0-flash:thinking", name: "Ling 3.0 Flash Thinking", description: "Ling-3.0-flash Thinking enables visible reasoning on inclusionAI's token-efficient 124B-parameter Mixture-of-Experts model for harder coding, tool use, planning, and production-scale agent workflows.", family: "ling", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: false, release_date: "2026-07-23", last_updated: "2026-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, input: 262144, output: 32768 }, cost: { input: 0.075, output: 0.22, cache_read: 0.015 } }, "inclusionai/ling-2.6-flash": { id: "inclusionai/ling-2.6-flash", name: "Ling 2.6 Flash", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "ling", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 32768 }, cost: { input: 0.1, output: 0.3, cache_read: 0.02 } }, "Salesforce/Llama-xLAM-2-70b-fc-r": { id: "Salesforce/Llama-xLAM-2-70b-fc-r", name: "Llama-xLAM-2 70B fc-r", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-04-13", last_updated: "2025-04-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 2.5, output: 2.5, cache_read: 1.25 } }, "ReadyArt/MS3.2-The-Omega-Directive-24B-Unslop-v2.0": { id: "ReadyArt/MS3.2-The-Omega-Directive-24B-Unslop-v2.0", name: "Omega Directive 24B Unslop v2.0", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 32768 }, cost: { input: 0.5, output: 0.5, cache_read: 0.25 } }, "crofai/greg-2-super": { id: "crofai/greg-2-super", name: "Greg 2 Super", description: "Greg 2 Super is CrofAI's balanced Greg 2 model for strong UI design, frontend iteration, coding, writing, and everyday agent tasks at a lower cost than Ultra.", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-06-19", last_updated: "2026-06-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 229376, input: 229376, output: 229376 }, cost: { input: 1.5, output: 5, cache_read: 0.25 } }, "crofai/greg-2-ultra": { id: "crofai/greg-2-ultra", name: "Greg 2 Ultra", description: "Greg 2 Ultra is CrofAI's most capable Greg 2 model, tuned for premium UI design, agentic coding, creative writing, and higher-end general reasoning tasks.", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-06-19", last_updated: "2026-06-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 229376, input: 229376, output: 229376 }, cost: { input: 3, output: 10, cache_read: 0.5 } }, "mistral/mistral-medium-3.5": { id: "mistral/mistral-medium-3.5", name: "Mistral Medium 3.5", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 32768 }, cost: { input: 1.5, output: 7.5, cache_read: 0.75 } }, "mistral/mistral-medium-3.5:thinking": { id: "mistral/mistral-medium-3.5:thinking", name: "Mistral Medium 3.5 Thinking", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 32768 }, cost: { input: 1.5, output: 7.5, cache_read: 0.75 } }, "meganova-ai/manta-pro-1.0": { id: "meganova-ai/manta-pro-1.0", name: "Manta Pro 1.0", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "nova", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-20", last_updated: "2025-12-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 32768 }, cost: { input: 0.06, output: 0.5, cache_read: 0.03 } }, "meganova-ai/manta-mini-1.0": { id: "meganova-ai/manta-mini-1.0", name: "Manta Mini 1.0", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-20", last_updated: "2025-12-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, input: 8192, output: 8192 }, cost: { input: 0.02, output: 0.16, cache_read: 0.01 } }, "meganova-ai/manta-flash-1.0": { id: "meganova-ai/manta-flash-1.0", name: "Manta Flash 1.0", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-20", last_updated: "2025-12-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 0.02, output: 0.16, cache_read: 0.01 } }, "Doctor-Shotgun/MS3.2-24B-Magnum-Diamond": { id: "Doctor-Shotgun/MS3.2-24B-Magnum-Diamond", name: "MS3.2 24B Magnum Diamond", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 32768 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "chutesai/Mistral-Small-3.2-24B-Instruct-2506": { id: "chutesai/Mistral-Small-3.2-24B-Instruct-2506", name: "Mistral Small 3.2 24b Instruct", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "chutesai", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 131072 }, cost: { input: 0.2, output: 0.4, cache_read: 0.1 } }, "VongolaChouko/Starcannon-Unleashed-12B-v1.0": { id: "VongolaChouko/Starcannon-Unleashed-12B-v1.0", name: "Mistral Nemo Starcannon 12b v1", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "shisa-ai/shisa-v2.1-llama3.3-70b": { id: "shisa-ai/shisa-v2.1-llama3.3-70b", name: "Shisa V2.1 Llama 3.3 70B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, input: 32768, output: 4096 }, cost: { input: 0.5, output: 0.5, cache_read: 0.25 } }, "shisa-ai/shisa-v2-llama3.3-70b": { id: "shisa-ai/shisa-v2-llama3.3-70b", name: "Shisa V2 Llama 3.3 70B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-26", last_updated: "2025-07-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0.5, output: 0.5, cache_read: 0.25 } }, "poolside/laguna-s-2.1:thinking": { id: "poolside/laguna-s-2.1:thinking", name: "Laguna S 2.1 Thinking", description: "Agentic coding model from Poolside in the XS size class for local deployment", family: "laguna", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 131072 }, cost: { input: 0.1, output: 0.2, cache_read: 0.01 } }, "poolside/laguna-s-2.1": { id: "poolside/laguna-s-2.1", name: "Laguna S 2.1", description: "Agentic coding model from Poolside in the XS size class for local deployment", family: "laguna", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 131072 }, cost: { input: 0.1, output: 0.2, cache_read: 0.01 } }, "poolside/laguna-m.1": { id: "poolside/laguna-m.1", name: "Laguna M.1", description: "Poolside's open-weight model for agentic coding and long-horizon work", family: "laguna", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-04-28", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 32768 }, cost: { input: 0.2, output: 0.4, cache_read: 0.1 } }, "nothingiisreal/L3.1-70B-Celeste-V0.1-BF16": { id: "nothingiisreal/L3.1-70B-Celeste-V0.1-BF16", name: "Llama 3.1 70B Celeste v0.1", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "dmind/dmind-1-mini": { id: "dmind/dmind-1-mini", name: "DMind-1-Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 8192 }, cost: { input: 0.2, output: 0.4, cache_read: 0.1 } }, "failspy/Meta-Llama-3-70B-Instruct-abliterated-v3.5": { id: "failspy/Meta-Llama-3-70B-Instruct-abliterated-v3.5", name: "Llama 3 70B abliterated", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-26", last_updated: "2025-07-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, input: 8192, output: 8192 }, cost: { input: 0.7, output: 0.7, cache_read: 0.35 } }, "minimax/minimax-m2-her": { id: "minimax/minimax-m2-her", name: "MiniMax M2-her", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-01-12", last_updated: "2026-01-24", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 65532, input: 65532, output: 2048 }, cost: { input: 0.302, output: 1.207, cache_read: 0.151 } }, "minimax/minimax-m2.7-turbo": { id: "minimax/minimax-m2.7-turbo", name: "MiniMax M2.7 Turbo", description: "Efficient MiniMax model for quick assistance, coding, and routine automation", family: "minimax-m2.7", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, input: 204800, output: 131072 }, cost: { input: 0.6, output: 2.4, cache_read: 0.3 } }, "minimax/minimax-m2.7": { id: "minimax/minimax-m2.7", name: "MiniMax M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, input: 204800, output: 131072 }, cost: { input: 0.315, output: 1.26, cache_read: 0.1575 } }, "minimax/minimax-m3:thinking": { id: "minimax/minimax-m3:thinking", name: "MiniMax M3 Thinking", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 512000, input: 512000, output: 80000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "minimax/minimax-m3": { id: "minimax/minimax-m3", name: "MiniMax M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 512000, input: 512000, output: 80000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "minimax/minimax-m2.5": { id: "minimax/minimax-m2.5", name: "MiniMax M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, input: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.15 } }, "minimax/minimax-01": { id: "minimax/minimax-01", name: "MiniMax 01", description: "MiniMax multimodal coding model for long-context reasoning and agent tasks", family: "minimax", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-01-15", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1000192, input: 1000192, output: 16384 }, cost: { input: 0.1394, output: 1.122, cache_read: 0.0697 } }, "minimax/minimax-m2.1": { id: "minimax/minimax-m2.1", name: "MiniMax M2.1", description: "Earlier MiniMax agent model for practical coding and productivity tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 131072 }, cost: { input: 0.33, output: 1.32, cache_read: 0.165 } }, "minimax/minimax-latest": { id: "minimax/minimax-latest", name: "MiniMax Latest", description: "MiniMax multimodal coding model for long-context reasoning and agent tasks", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, release_date: "2026-05-03", last_updated: "2026-05-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 512000, input: 512000, output: 80000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "MarinaraSpaghetti/NemoMix-Unleashed-12B": { id: "MarinaraSpaghetti/NemoMix-Unleashed-12B", name: "NemoMix 12B Unleashed", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, input: 32768, output: 8192 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "deepseek/deepseek-v4-flash:thinking": { id: "deepseek/deepseek-v4-flash:thinking", name: "DeepSeek V4 Flash (Thinking)", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 384000 }, cost: { input: 0.07, output: 0.14, cache_read: 0.014 } }, "deepseek/deepseek-latest": { id: "deepseek/deepseek-latest", name: "DeepSeek Latest", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, structured_output: true, release_date: "2026-05-03", last_updated: "2026-05-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 384000 }, cost: { input: 1.1, output: 2.2, cache_read: 0.11 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 384000 }, cost: { input: 0.07, output: 0.14, cache_read: 0.014 } }, "deepseek/deepseek-v4-flash-0731:thinking": { id: "deepseek/deepseek-v4-flash-0731:thinking", name: "DeepSeek V4 Flash 0731 (Thinking)", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, input: 1e6, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.014 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 384000 }, cost: { input: 1.1, output: 2.2, cache_read: 0.11 } }, "deepseek/deepseek-v4-pro-cheaper": { id: "deepseek/deepseek-v4-pro-cheaper", name: "DeepSeek V4 Pro Cheaper", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, structured_output: true, release_date: "2026-04-25", last_updated: "2026-04-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 384000 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "deepseek/deepseek-v4-flash-0731-cheaper:thinking": { id: "deepseek/deepseek-v4-flash-0731-cheaper:thinking", name: "DeepSeek V4 Flash 0731 Cheaper (Thinking)", description: "DeepSeek V4 Flash 0731 Cheaper Thinking enables reasoning by default on the same re-post-trained Mixture-of-Experts model with a 1M-token context window. This route goes directly to DeepSeek to use its lower cached-input pricing. \u26A0\uFE0F Privacy and logging guarantees are limited.", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, structured_output: true, release_date: "2026-08-01", last_updated: "2026-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.014 } }, "deepseek/deepseek-v4-flash-0731-cheaper": { id: "deepseek/deepseek-v4-flash-0731-cheaper", name: "DeepSeek V4 Flash 0731 Cheaper", description: "DeepSeek V4 Flash 0731 Cheaper is the same re-post-trained Mixture-of-Experts model with a 1M-token context window. This route goes directly to DeepSeek to use its lower cached-input pricing. \u26A0\uFE0F Privacy and logging guarantees are limited.", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, structured_output: true, release_date: "2026-08-01", last_updated: "2026-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.014 } }, "deepseek/deepseek-v4-flash-0731": { id: "deepseek/deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, input: 1e6, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.014 } }, "deepseek/deepseek-v3.2": { id: "deepseek/deepseek-v3.2", name: "DeepSeek V3.2", description: "Hybrid-reasoning DeepSeek model with thinking and non-thinking modes, sparse attention, and tool-use", family: "deepseek", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 163000, input: 163000, output: 65536 }, cost: { input: 0.28, output: 0.42, cache_read: 0.14 } }, "deepseek/deepseek-v4-flash-latest": { id: "deepseek/deepseek-v4-flash-latest", name: "DeepSeek V4 Flash Latest", description: "Compatibility alias that routes to the newest dated DeepSeek V4 Flash release. Currently routes to DeepSeek V4 Flash 0731. \u26A0\uFE0F This route goes directly to DeepSeek, so privacy and logging guarantees are limited.", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, structured_output: true, release_date: "2026-08-02", last_updated: "2026-08-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.014 } }, "deepseek/deepseek-v4-pro:thinking": { id: "deepseek/deepseek-v4-pro:thinking", name: "DeepSeek V4 Pro (Thinking)", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 384000 }, cost: { input: 1.1, output: 2.2, cache_read: 0.11 } }, "deepseek/deepseek-prover-v2-671b": { id: "deepseek/deepseek-prover-v2-671b", name: "DeepSeek Prover v2 671B", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-11-15", last_updated: "2025-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 160000, input: 160000, output: 16384 }, cost: { input: 1, output: 2.5, cache_read: 0.5 } }, "deepseek/deepseek-v3.2:thinking": { id: "deepseek/deepseek-v3.2:thinking", name: "DeepSeek V3.2 Thinking", description: "Hybrid-reasoning DeepSeek model with thinking and non-thinking modes, sparse attention, and tool-use", family: "deepseek", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 163000, input: 163000, output: 65536 }, cost: { input: 0.28, output: 0.42, cache_read: 0.14 } }, "deepseek/deepseek-v4-pro-cheaper:thinking": { id: "deepseek/deepseek-v4-pro-cheaper:thinking", name: "DeepSeek V4 Pro Cheaper (Thinking)", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, structured_output: true, release_date: "2026-04-25", last_updated: "2026-04-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 384000 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "amazon/nova-2-lite-v1": { id: "amazon/nova-2-lite-v1", name: "Amazon Nova 2 Lite", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 65535 }, cost: { input: 0.51, output: 4.25, cache_read: 0.255 } }, "amazon/nova-pro-v1": { id: "amazon/nova-pro-v1", name: "Amazon Nova Pro 1.0", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "nova-pro", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-12-03", last_updated: "2024-12-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 300000, input: 300000, output: 32000 }, cost: { input: 0.799, output: 3.196, cache_read: 0.3995 } }, "amazon/nova-micro-v1": { id: "amazon/nova-micro-v1", name: "Amazon Nova Micro 1.0", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova-micro", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 5120 }, cost: { input: 0.0357, output: 0.1394, cache_read: 0.01785 } }, "amazon/nova-lite-v1": { id: "amazon/nova-lite-v1", name: "Amazon Nova Lite 1.0", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova-lite", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-12-03", last_updated: "2024-12-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 300000, input: 300000, output: 5120 }, cost: { input: 0.0595, output: 0.238, cache_read: 0.02975 } }, "Gryphe/MythoMax-L2-13b": { id: "Gryphe/MythoMax-L2-13b", name: "MythoMax 13B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-08-08", last_updated: "2025-08-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 4000, input: 4000, output: 4096 }, cost: { input: 0.1003, output: 0.1003, cache_read: 0.05015 } }, "LatitudeGames/Wayfarer-Large-70B-Llama-3.3": { id: "LatitudeGames/Wayfarer-Large-70B-Llama-3.3", name: "Llama 3.3 70B Wayfarer", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-02-20", last_updated: "2025-02-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 0.7, output: 0.7, cache_read: 0.35 } }, "ibm-granite/granite-4.1-8b": { id: "ibm-granite/granite-4.1-8b", name: "Granite 4.1 8B", description: "Tool-capable chat model for instruction following and agentic application workflows", family: "granite", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 131072 }, cost: { input: 0.05, output: 0.1, cache_read: 0.05 } }, "x-ai/grok-4.20-multi-agent": { id: "x-ai/grok-4.20-multi-agent", name: "Grok 4.20 Multi-Agent", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: false, structured_output: true, release_date: "2026-03-31", last_updated: "2026-03-31", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, input: 2000000, output: 131072 }, cost: { input: 2, output: 6, cache_read: 1 } }, "x-ai/grok-4.3": { id: "x-ai/grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 1e6 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "x-ai/grok-4.5": { id: "x-ai/grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, input: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.5 } }, "x-ai/grok-build-0.1": { id: "x-ai/grok-build-0.1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 1, output: 2, cache_read: 0.2 } }, "x-ai/grok-4.20": { id: "x-ai/grok-4.20", name: "Grok 4.20", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2026-03-31", last_updated: "2026-03-31", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, input: 2000000, output: 131072 }, cost: { input: 2, output: 6, cache_read: 1 } }, "x-ai/grok-latest": { id: "x-ai/grok-latest", name: "Grok Latest", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2026-05-03", last_updated: "2026-05-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, input: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.5 } }, "alibaba/qwen3.6-27b:thinking": { id: "alibaba/qwen3.6-27b:thinking", name: "Qwen3.6 27B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 131072 }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 260096, input: 260096, output: 65536 }, cost: { input: 0.203, output: 2.24, cache_read: 0.1015 } }, "alibaba/qwen3.6-27b": { id: "alibaba/qwen3.6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 260096, input: 260096, output: 65536 }, cost: { input: 0.203, output: 2.24, cache_read: 0.1015 } }, "alibaba/qwen3.6-flash": { id: "alibaba/qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 991808, input: 991808, output: 65536 }, cost: { input: 0.19, output: 1.16, cache_read: 0.02, cache_write: 0.24 } }, "kwaipilot/kat-coder-pro-v2": { id: "kwaipilot/kat-coder-pro-v2", name: "KAT Coder Pro V2", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "kat-coder", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-03-28", last_updated: "2026-03-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 80000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.15 } }, "kwaipilot/kat-coder-pro-v2.5": { id: "kwaipilot/kat-coder-pro-v2.5", name: "KAT Coder Pro V2.5", description: "Higher-capability KAT Coder model for complex code generation, repository-scale editing, debugging, and agentic software-development workflows.", family: "kat-coder", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-07-14", last_updated: "2026-07-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 80000 }, cost: { input: 0.74, output: 2.96, cache_read: 0.15 } }, "kwaipilot/kat-coder-air-v2.5": { id: "kwaipilot/kat-coder-air-v2.5", name: "KAT Coder Air V2.5", description: "Fast, cost-efficient KAT Coder model for code generation, editing, debugging, and agentic software-development workflows.", family: "kat-coder", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-07-14", last_updated: "2026-07-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 80000 }, cost: { input: 0.15, output: 0.6, cache_read: 0.03 } }, "Envoid/Llama-3.05-NT-Storybreaker-Ministral-70B": { id: "Envoid/Llama-3.05-NT-Storybreaker-Ministral-70B", name: "Llama 3.05 Storybreaker Ministral 70b", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "Envoid/Llama-3.05-Nemotron-Tenyxchat-Storybreaker-70B": { id: "Envoid/Llama-3.05-Nemotron-Tenyxchat-Storybreaker-70B", name: "Nemotron Tenyxchat Storybreaker 70b", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", family: "nemotron", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "NeverSleep/Lumimaid-v0.2-70B": { id: "NeverSleep/Lumimaid-v0.2-70B", name: "Lumimaid v0.2", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 1, output: 1.5, cache_read: 0.5 } }, "Sao10K/L3.3-70B-Euryale-v2.3": { id: "Sao10K/L3.3-70B-Euryale-v2.3", name: "Llama 3.3 70B Euryale", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 20480, input: 20480, output: 16384 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "Sao10K/L3-8B-Stheno-v3.2": { id: "Sao10K/L3-8B-Stheno-v3.2", name: "Sao10K Stheno 8b", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-11-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.2006, output: 0.2006, cache_read: 0.1003 } }, "Sao10K/L3.1-70B-Euryale-v2.2": { id: "Sao10K/L3.1-70B-Euryale-v2.2", name: "Llama 3.1 70B Euryale", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 20480, input: 20480, output: 16384 }, cost: { input: 0.306, output: 0.357, cache_read: 0.153 } }, "Sao10K/L3.1-70B-Hanami-x1": { id: "Sao10K/L3.1-70B-Hanami-x1", name: "Llama 3.1 70B Hanami", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 16384 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "deepseek-ai/deepseek-v3.2-exp": { id: "deepseek-ai/deepseek-v3.2-exp", name: "DeepSeek V3.2 Exp", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-09-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, input: 163840, output: 65536 }, cost: { input: 0.28, output: 0.42, cache_read: 0.14 } }, "deepseek-ai/DeepSeek-R1-0528": { id: "deepseek-ai/DeepSeek-R1-0528", name: "DeepSeek R1 0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2025-05-28", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 163840 }, cost: { input: 0.4, output: 1.7, cache_read: 0.2 } }, "deepseek-ai/DeepSeek-V3.1": { id: "deepseek-ai/DeepSeek-V3.1", name: "DeepSeek V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-26", last_updated: "2025-07-26", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 0.2, output: 0.7, cache_read: 0.1 } }, "deepseek-ai/deepseek-v3.2-exp-thinking": { id: "deepseek-ai/deepseek-v3.2-exp-thinking", name: "DeepSeek V3.2 Exp Thinking", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-09-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, input: 163840, output: 65536 }, cost: { input: 0.28, output: 0.42, cache_read: 0.14 } }, "deepseek-ai/DeepSeek-V3.1:thinking": { id: "deepseek-ai/DeepSeek-V3.1:thinking", name: "DeepSeek V3.1 Thinking", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek-thinking", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 0.2, output: 0.7, cache_read: 0.1 } }, "deepseek-ai/DeepSeek-V3.1-Terminus:thinking": { id: "deepseek-ai/DeepSeek-V3.1-Terminus:thinking", name: "DeepSeek V3.1 Terminus (Thinking)", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek-thinking", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2024-01-01", last_updated: "2025-09-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 0.25, output: 0.7, cache_read: 0.125 } }, "deepseek-ai/DeepSeek-V3.1-Terminus": { id: "deepseek-ai/DeepSeek-V3.1-Terminus", name: "DeepSeek V3.1 Terminus", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2025-08-02", last_updated: "2025-08-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 65536 }, cost: { input: 0.25, output: 0.7, cache_read: 0.125 } }, "aion-labs/aion-2.0": { id: "aion-labs/aion-2.0", name: "AionLabs: Aion-2.0", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, input: 131072, output: 32768 }, cost: { input: 0.8, output: 1.6, cache_read: 0.2 } }, "aion-labs/aion-3.0-mini": { id: "aion-labs/aion-3.0-mini", name: "AionLabs: Aion 3.0 Mini", description: "Aion 3.0 Mini is a DeepSeek-family collaborative generation model tuned for immersive roleplay and storytelling, with stronger narrative structure, tension, conflict, and nuanced mature themes.", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2026-07-07", last_updated: "2026-07-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, input: 131072, output: 32768 }, cost: { input: 0.7, output: 1.4, cache_read: 0.18 } }, "aion-labs/aion-rp-llama-3.1-8b": { id: "aion-labs/aion-rp-llama-3.1-8b", name: "Llama 3.1 8b (uncensored)", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 16384 }, cost: { input: 0.8, output: 1.6, cache_read: 0.4 } }, "aion-labs/aion-3.0": { id: "aion-labs/aion-3.0", name: "AionLabs: Aion 3.0", description: "Aion 3.0 is a GLM-family collaborative generation model tuned for immersive roleplay and storytelling, with stronger narrative structure, tension, conflict, and nuanced mature themes.", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, release_date: "2026-07-07", last_updated: "2026-07-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, input: 131072, output: 32768 }, cost: { input: 3, output: 6, cache_read: 0.75 } }, "aion-labs/aion-2.5": { id: "aion-labs/aion-2.5", name: "AionLabs: Aion-2.5", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, input: 131072, output: 32768 }, cost: { input: 1, output: 3, cache_read: 0.35 } }, "inflection/inflection-3-pi": { id: "inflection/inflection-3-pi", name: "Inflection 3 Pi", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-11-21", last_updated: "2024-10-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8000, input: 8000, output: 4096 }, cost: { input: 2.499, output: 9.996, cache_read: 1.2495 } }, "inflection/inflection-3-productivity": { id: "inflection/inflection-3-productivity", name: "Inflection 3 Productivity", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-11-21", last_updated: "2024-10-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8000, input: 8000, output: 4096 }, cost: { input: 2.499, output: 9.996, cache_read: 1.2495 } }, "xiaomi/mimo-v2.5:thinking": { id: "xiaomi/mimo-v2.5:thinking", name: "MiMo V2.5 Thinking", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028, cache_write: 0 } }, "xiaomi/mimo-v2.5": { id: "xiaomi/mimo-v2.5", name: "MiMo V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028, cache_write: 0 } }, "xiaomi/mimo-v2.5-pro-crof": { id: "xiaomi/mimo-v2.5-pro-crof", name: "MiMo V2.5 Pro (Crof)", description: "MiMo V2.5 Pro is Xiaomi's long-context flagship general model for coding and agentic orchestration. This separately served variant is intended for users concerned about censorship on the regular Xiaomi MiMo V2.5 Pro, and it is included in the NanoGPT subscription.", family: "mimo-v2.5-pro", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2026-07-23", last_updated: "2026-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, input: 1e6, output: 131072 }, cost: { input: 0.4, output: 0.8, cache_read: 0.003 } }, "xiaomi/mimo-v2.5-pro:thinking": { id: "xiaomi/mimo-v2.5-pro:thinking", name: "MiMo V2.5 Pro Thinking", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 131072 }, cost: { input: 0.435, output: 0.87, cache_read: 0.0036, cache_write: 0 } }, "xiaomi/mimo-v2.5-pro": { id: "xiaomi/mimo-v2.5-pro", name: "MiMo V2.5 Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 131072 }, cost: { input: 0.435, output: 0.87, cache_read: 0.0036, cache_write: 0 } }, "xiaomi/mimo-v2.5-pro-crof:thinking": { id: "xiaomi/mimo-v2.5-pro-crof:thinking", name: "MiMo V2.5 Pro Thinking (Crof)", description: "MiMo V2.5 Pro with Xiaomi thinking enabled for coding, long-context reasoning, and agentic orchestration. This separately served thinking variant is intended for users concerned about censorship on the regular Xiaomi MiMo V2.5 Pro, and it is included in the NanoGPT subscription.", family: "mimo-v2.5-pro", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2026-07-23", last_updated: "2026-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, input: 1e6, output: 131072 }, cost: { input: 0.4, output: 0.8, cache_read: 0.003 } }, "anthropic/claude-opus-4.8:thinking": { id: "anthropic/claude-opus-4.8:thinking", name: "Claude Opus 4.8 Thinking", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "anthropic/claude-sonnet-4.6": { id: "anthropic/claude-sonnet-4.6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "anthropic/claude-opus-4.6:thinking": { id: "anthropic/claude-opus-4.6:thinking", name: "Claude 4.6 Opus Thinking", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "anthropic/claude-fable-5": { id: "anthropic/claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-sonnet-latest": { id: "anthropic/claude-sonnet-latest", name: "Claude Sonnet Latest", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, release_date: "2026-03-01", last_updated: "2026-03-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "anthropic/claude-opus-latest": { id: "anthropic/claude-opus-latest", name: "Claude Opus Latest", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, release_date: "2026-03-29", last_updated: "2026-03-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4.7": { id: "anthropic/claude-opus-4.7", name: "Claude 4.7 Opus", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "anthropic/claude-sonnet-4.6:thinking": { id: "anthropic/claude-sonnet-4.6:thinking", name: "Claude Sonnet 4.6 Thinking", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "anthropic/claude-sonnet-5:thinking": { id: "anthropic/claude-sonnet-5:thinking", name: "Claude Sonnet 5 Thinking", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "anthropic/claude-haiku-latest": { id: "anthropic/claude-haiku-latest", name: "Claude Haiku Latest", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, release_date: "2026-03-29", last_updated: "2026-03-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1 } }, "anthropic/claude-fable-latest": { id: "anthropic/claude-fable-latest", name: "Claude Fable Latest", description: "Compatibility alias for Claude Fable.", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4.6:thinking:medium": { id: "anthropic/claude-opus-4.6:thinking:medium", name: "Claude 4.6 Opus Thinking Medium", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "anthropic/claude-opus-4.7:thinking": { id: "anthropic/claude-opus-4.7:thinking", name: "Claude 4.7 Opus Thinking", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "anthropic/claude-opus-4.8": { id: "anthropic/claude-opus-4.8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "anthropic/claude-sonnet-5": { id: "anthropic/claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "anthropic/claude-opus-5": { id: "anthropic/claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4.6:thinking:max": { id: "anthropic/claude-opus-4.6:thinking:max", name: "Claude 4.6 Opus Thinking Max", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "anthropic/claude-opus-4.6:thinking:low": { id: "anthropic/claude-opus-4.6:thinking:low", name: "Claude 4.6 Opus Thinking Low", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "anthropic/claude-opus-4.6": { id: "anthropic/claude-opus-4.6", name: "Claude 4.6 Opus", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "stepfun-ai/step-3.5-flash": { id: "stepfun-ai/step-3.5-flash", name: "Step 3.5 Flash", description: "StepFun flash lane for quick multimodal reasoning and coding assistance", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-01-29", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0.1, output: 0.3, cache_read: 0.05 } }, "stepfun-ai/step-3.5-flash-2603": { id: "stepfun-ai/step-3.5-flash-2603", name: "Step 3.5 Flash 2603", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0.1, output: 0.3, cache_read: 0.05 } }, "NousResearch/hermes-3-llama-3.1-70b": { id: "NousResearch/hermes-3-llama-3.1-70b", name: "Hermes 3 70B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "nousresearch", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-01-07", last_updated: "2026-01-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, input: 65536, output: 8192 }, cost: { input: 0.408, output: 0.408, cache_read: 0.204 } }, "NousResearch/hermes-4-405b:thinking": { id: "NousResearch/hermes-4-405b:thinking", name: "Hermes 4 Large (Thinking)", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "nousresearch", attachment: false, reasoning: false, tool_call: false, structured_output: true, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 0.3, output: 1.2, cache_read: 0.15 } }, "NousResearch/hermes-4-405b": { id: "NousResearch/hermes-4-405b", name: "Hermes 4 Large", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "nousresearch", attachment: false, reasoning: false, tool_call: false, structured_output: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 0.3, output: 1.2, cache_read: 0.15 } }, "NousResearch/Hermes-4-70B:thinking": { id: "NousResearch/Hermes-4-70B:thinking", name: "Hermes 4 (Thinking)", description: "General-purpose chat model for instruction following, writing, and analysis", family: "nousresearch", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-09-17", last_updated: "2025-09-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 0.2006, output: 0.3995, cache_read: 0.1003 } }, "NousResearch/hermes-4-70b": { id: "NousResearch/hermes-4-70b", name: "Hermes 4 Medium", description: "General-purpose chat model for instruction following, writing, and analysis", family: "nousresearch", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-03", last_updated: "2025-07-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 0.2006, output: 0.3995, cache_read: 0.1003 } }, "z-ai/glm-4.5v:thinking": { id: "z-ai/glm-4.5v:thinking", name: "GLM 4.5V Thinking", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 64000, input: 64000, output: 96000 }, cost: { input: 0.6, output: 1.8, cache_read: 0.3 } }, "z-ai/glm-4.6": { id: "z-ai/glm-4.6", name: "GLM 4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 65535 }, cost: { input: 0.35, output: 1.4, cache_read: 0.175 } }, "z-ai/glm-4.5v": { id: "z-ai/glm-4.5v", name: "GLM 4.5V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 64000, input: 64000, output: 96000 }, cost: { input: 0.6, output: 1.8, cache_read: 0.3 } }, "z-ai/glm-5-turbo": { id: "z-ai/glm-5-turbo", name: "GLM 5 Turbo", description: "Faster GLM-5 lane for coding agents that need lower latency", family: "glm", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202800, input: 202800, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24 } }, "z-ai/glm-5v-turbo": { id: "z-ai/glm-5v-turbo", name: "GLM 5V Turbo", description: "Fast GLM vision model for screenshots, documents, and multimodal agent tasks", family: "glm", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 202800, input: 202800, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24 } }, "z-ai/glm-4.6:thinking": { id: "z-ai/glm-4.6:thinking", name: "GLM 4.6 Thinking", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 65535 }, cost: { input: 0.35, output: 1.4, cache_read: 0.175 } }, "z-ai/glm-5v-turbo:thinking": { id: "z-ai/glm-5v-turbo:thinking", name: "GLM 5V Turbo Thinking", description: "Fast GLM vision model for screenshots, documents, and multimodal agent tasks", family: "glm", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 202800, input: 202800, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24 } }, "moonshotai/kimi-k2.5": { id: "moonshotai/kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 65536 }, cost: { input: 0.3, output: 1.9, cache_read: 0.15 } }, "moonshotai/kimi-k2.6:thinking": { id: "moonshotai/kimi-k2.6:thinking", name: "Kimi K2.6 Thinking", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 65536 }, cost: { input: 0.5, output: 2.6, cache_read: 0.125 } }, "moonshotai/kimi-k2-instruct-0711": { id: "moonshotai/kimi-k2-instruct-0711", name: "Kimi K2 0711", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2024-01-01", last_updated: "2025-07-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 8192 }, cost: { input: 0.4, output: 1.8, cache_read: 0.2 } }, "moonshotai/kimi-k2.7-code-highspeed": { id: "moonshotai/kimi-k2.7-code-highspeed", name: "Kimi K2.7 Code High-Speed", description: "Lower-latency Kimi Code variant for interactive edits and coding-agent loops", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 65536 }, cost: { input: 1.9, output: 8, cache_read: 0.32 } }, "moonshotai/kimi-k2.6": { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 65536 }, cost: { input: 0.5, output: 2.6, cache_read: 0.125 } }, "moonshotai/Kimi-K2-Instruct-0905": { id: "moonshotai/Kimi-K2-Instruct-0905", name: "Kimi K2 0905", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 262144 }, cost: { input: 0.4, output: 1.8, cache_read: 0.2 } }, "moonshotai/kimi-latest": { id: "moonshotai/kimi-latest", name: "Kimi Latest", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, release_date: "2026-05-03", last_updated: "2026-05-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 1048576 }, cost: { input: 2.5, output: 13.5, cache_read: 0.25 } }, "moonshotai/kimi-k2.7-code": { id: "moonshotai/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 65536 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "moonshotai/kimi-k2-thinking": { id: "moonshotai/kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Thinking Kimi model for slower research passes, planning, and hard technical questions", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-08", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 98304 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "moonshotai/kimi-k3": { id: "moonshotai/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 1048576 }, cost: { input: 2.5, output: 13.5, cache_read: 0.25 } }, "moonshotai/kimi-k2-instruct": { id: "moonshotai/kimi-k2-instruct", name: "Kimi K2 Instruct", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2024-01-01", last_updated: "2025-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 8192 }, cost: { input: 0.4, output: 1.8, cache_read: 0.2 } }, "moonshotai/kimi-k2.5:thinking": { id: "moonshotai/kimi-k2.5:thinking", name: "Kimi K2.5 Thinking", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 65536 }, cost: { input: 0.3, output: 1.9, cache_read: 0.15 } }, "openai/gpt-5.1-codex-mini": { id: "openai/gpt-5.1-codex-mini", name: "GPT 5.1 Codex Mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/gpt-chat-latest": { id: "openai/gpt-chat-latest", name: "GPT Chat Latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, release_date: "2026-05-03", last_updated: "2026-05-03", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 1050000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "openai/gpt-4.1-mini": { id: "openai/gpt-4.1-mini", name: "GPT 4.1 Mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, input: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "openai/gpt-4o": { id: "openai/gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.6-sol": { id: "openai/gpt-5.6-sol", name: "GPT 5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 1050000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "openai/o3-mini-high": { id: "openai/o3-mini-high", name: "OpenAI o3-mini (High)", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2024-01-01", last_updated: "2025-01-31", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-5.1-2025-11-13": { id: "openai/gpt-5.1-2025-11-13", name: "GPT-5.1 (2025-11-13)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2024-01-01", last_updated: "2025-11-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 32768 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4.1-nano": { id: "openai/gpt-4.1-nano", name: "GPT 4.1 Nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, input: 1047576, output: 32768 }, cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0.2, output: 0.3 } }, "openai/gpt-oss-safeguard-20b": { id: "openai/gpt-oss-safeguard-20b", name: "GPT OSS Safeguard 20B", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, release_date: "2026-02-23", last_updated: "2025-10-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0.075, output: 0.3 } }, "openai/o3-mini": { id: "openai/o3-mini", name: "OpenAI o3-mini", description: "Smaller o-series reasoner for economical coding, math, and planning tasks", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-5.6-sol-pro": { id: "openai/gpt-5.6-sol-pro", name: "GPT 5.6 Sol Pro", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 1050000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT 5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "openai/gpt-4o-mini": { id: "openai/gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT 5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/o4-mini-deep-research": { id: "openai/o4-mini-deep-research", name: "OpenAI o4-mini Deep Research", description: "Research model for long-horizon investigation, synthesis, and analytical reports", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium"] }], tool_call: false, structured_output: false, temperature: false, knowledge: "2024-05", release_date: "2024-06-26", last_updated: "2024-06-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 1e5 }, cost: { input: 2.2, output: 8.8, cache_read: 1.1 } }, "openai/o4-mini-high": { id: "openai/o4-mini-high", name: "OpenAI o4-mini high", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2025-12-04", last_updated: "2025-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/o3-deep-research": { id: "openai/o3-deep-research", name: "OpenAI o3 Deep Research", description: "Research model for long-horizon investigation, synthesis, and analytical reports", family: "o", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium"] }], tool_call: false, structured_output: false, temperature: false, knowledge: "2024-05", release_date: "2024-06-26", last_updated: "2024-06-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 1e5 }, cost: { input: 11, output: 44, cache_read: 5.5 } }, "openai/gpt-5-codex": { id: "openai/gpt-5-codex", name: "GPT-5 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 32768 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-3.5-turbo": { id: "openai/gpt-3.5-turbo", name: "GPT-3.5 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2021-09-01", release_date: "2023-03-01", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16385, input: 16385, output: 4096 }, cost: { input: 0.5, output: 1.5 } }, "openai/gpt-latest": { id: "openai/gpt-latest", name: "GPT Latest", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, release_date: "2026-03-29", last_updated: "2026-03-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 1050000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "openai/o1-preview": { id: "openai/o1-preview", name: "OpenAI o1-preview", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-09-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 32768 }, cost: { input: 15, output: 60, cache_read: 7.5 } }, "openai/gpt-4o-2024-11-20": { id: "openai/gpt-4o-2024-11-20", name: "GPT-4o (2024-11-20)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-09", release_date: "2024-11-20", last_updated: "2024-11-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-4o-search-preview": { id: "openai/gpt-4o-search-preview", name: "GPT-4o Search Preview", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-03-10", last_updated: "2024-05-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/o3-pro-2025-06-10": { id: "openai/o3-pro-2025-06-10", name: "OpenAI o3-pro (2025-06-10)", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-pro", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2024-01-01", last_updated: "2025-06-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 1e5 }, cost: { input: 22, output: 88, cache_read: 11 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT 5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 922000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25 } }, "openai/gpt-5.6-luna-pro": { id: "openai/gpt-5.6-luna-pro", name: "GPT 5.6 Luna Pro", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 1050000, output: 128000 }, cost: { input: 0.1, output: 0.6, cache_read: 0.01, cache_write: 0.125 } }, "openai/gpt-5.2-codex": { id: "openai/gpt-5.2-codex", name: "GPT 5.2 Codex", description: "Code-specialist GPT for repository edits, reviews, and long-running software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT 5.4 Nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "openai/gpt-5-pro": { id: "openai/gpt-5-pro", name: "GPT 5 Pro", description: "Higher-accuracy GPT-5 tier for tough analysis, coding reviews, and planning", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: false, structured_output: false, temperature: false, knowledge: "2024-09-30", release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 15, output: 120, cache_read: 1.5 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT 5.4 Mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0.35, output: 0.75 } }, "openai/o1": { id: "openai/o1", name: "OpenAI o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: false, knowledge: "2023-09", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 1e5 }, cost: { input: 15, output: 60, cache_read: 7.5 } }, "openai/gpt-5.6-luna": { id: "openai/gpt-5.6-luna", name: "GPT 5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 1050000, output: 128000 }, cost: { input: 0.1, output: 0.6, cache_read: 0.01, cache_write: 0.125 } }, "openai/o3-mini-low": { id: "openai/o3-mini-low", name: "OpenAI o3-mini (Low)", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2026-01-31", last_updated: "2025-01-31", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT 5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.3-codex": { id: "openai/gpt-5.3-codex", name: "GPT 5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT 5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/o1-pro": { id: "openai/o1-pro", name: "OpenAI o1 Pro", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-pro", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: false, knowledge: "2023-09", release_date: "2025-03-19", last_updated: "2025-03-19", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 1e5 }, cost: { input: 150, output: 600, cache_read: 75 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT 5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4-turbo-preview": { id: "openai/gpt-4-turbo-preview", name: "GPT-4 Turbo Preview", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 4096 }, cost: { input: 10, output: 30 } }, "openai/gpt-4-turbo": { id: "openai/gpt-4-turbo", name: "GPT-4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-12", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 4096 }, cost: { input: 10, output: 30 } }, "openai/gpt-4o-2024-08-06": { id: "openai/gpt-4o-2024-08-06", name: "GPT-4o (2024-08-06)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-09", release_date: "2024-08-06", last_updated: "2024-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.1-codex": { id: "openai/gpt-5.1-codex", name: "GPT 5.1 Codex", description: "Codex GPT for repository edits, code review, and practical software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-5-nano": { id: "openai/gpt-5-nano", name: "GPT 5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "openai/gpt-4o-mini-search-preview": { id: "openai/gpt-4o-mini-search-preview", name: "GPT-4o mini Search Preview", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2026-03-10", last_updated: "2024-07-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "openai/o3": { id: "openai/o3", name: "OpenAI o3", description: "Deliberate o-series reasoner for hard math, coding, and multi-step analysis", family: "o", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: false, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 1 } }, "openai/gpt-5.6-terra": { id: "openai/gpt-5.6-terra", name: "GPT 5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 1050000, output: 128000 }, cost: { input: 1, output: 6, cache_read: 0.1, cache_write: 1.25 } }, "openai/gpt-5.6-terra-pro": { id: "openai/gpt-5.6-terra-pro", name: "GPT 5.6 Terra Pro", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 1050000, output: 128000 }, cost: { input: 1, output: 6, cache_read: 0.1, cache_write: 1.25 } }, "openai/gpt-4.1": { id: "openai/gpt-4.1", name: "GPT 4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, input: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/o4-mini": { id: "openai/o4-mini", name: "OpenAI o4-mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-5.1-codex-max": { id: "openai/gpt-5.1-codex-max", name: "GPT 5.1 Codex Max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 2.5, output: 20, cache_read: 0.25 } }, "meta-llama/llama-3.3-70b-instruct": { id: "meta-llama/llama-3.3-70b-instruct", name: "Llama 3.3 70b Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 16384 }, cost: { input: 0.05, output: 0.23, cache_read: 0.025 } }, "meta-llama/llama-4-maverick": { id: "meta-llama/llama-4-maverick", name: "Llama 4 Maverick", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: false, structured_output: true, release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, input: 1048576, output: 65536 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "meta-llama/llama-4-scout": { id: "meta-llama/llama-4-scout", name: "Llama 4 Scout", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: true, reasoning: false, tool_call: true, structured_output: true, release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 328000, input: 328000, output: 65536 }, cost: { input: 0.085, output: 0.46, cache_read: 0.0425 } }, "meta-llama/llama-3.2-3b-instruct": { id: "meta-llama/llama-3.2-3b-instruct", name: "Llama 3.2 3b Instruct", description: "Open Llama multimodal model for image understanding and text reasoning", family: "llama", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-09-25", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 8192 }, cost: { input: 0.0306, output: 0.0493, cache_read: 0.0153 } }, "meta-llama/llama-3.1-8b-instruct": { id: "meta-llama/llama-3.1-8b-instruct", name: "Llama 3.1 8b Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 16384 }, cost: { input: 0.0544, output: 0.085, cache_read: 0.0272 } }, "arcee-ai/trinity-large-thinking": { id: "arcee-ai/trinity-large-thinking", name: "Trinity Large Thinking", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "trinity", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 80000 }, cost: { input: 0.25, output: 0.9, cache_read: 0.125 } }, "bytedance-seed/seed-2.0-lite": { id: "bytedance-seed/seed-2.0-lite", name: "ByteDance Seed 2.0 Lite", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: true, release_date: "2026-03-10", last_updated: "2026-03-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, input: 262144, output: 131072 }, cost: { input: 0.25, output: 2, cache_read: 0.125 } }, "TheDrummer/Cydonia-24B-v2": { id: "TheDrummer/Cydonia-24B-v2", name: "The Drummer Cydonia 24B v2", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-02-17", last_updated: "2025-02-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 32768 }, cost: { input: 0.1003, output: 0.1207, cache_read: 0.05015 } }, "TheDrummer/Cydonia-24B-v4": { id: "TheDrummer/Cydonia-24B-v4", name: "The Drummer Cydonia 24B v4", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-07-22", last_updated: "2025-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 32768 }, cost: { input: 0.2006, output: 0.2414, cache_read: 0.1003 } }, "TheDrummer/Cydonia-24B-v4.3": { id: "TheDrummer/Cydonia-24B-v4.3", name: "The Drummer Cydonia 24B v4.3", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-25", last_updated: "2025-12-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, input: 32768, output: 32768 }, cost: { input: 0.12, output: 0.15, cache_read: 0.06 } }, "TheDrummer/Anubis-70B-v1": { id: "TheDrummer/Anubis-70B-v1", name: "Anubis 70B v1", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, input: 65536, output: 16384 }, cost: { input: 0.31, output: 0.31, cache_read: 0.155 } }, "TheDrummer/skyfall-36b-v2": { id: "TheDrummer/skyfall-36b-v2", name: "TheDrummer Skyfall 36B V2", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-03-10", last_updated: "2025-03-10", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 32000, input: 32000, output: 32768 }, cost: { input: 0.55, output: 0.8, cache_read: 0.25 } }, "TheDrummer/Anubis-70B-v1.1": { id: "TheDrummer/Anubis-70B-v1.1", name: "Anubis 70B v1.1", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 16384 }, cost: { input: 0.31, output: 0.31, cache_read: 0.155 } }, "TheDrummer/Rocinante-12B-v1.1": { id: "TheDrummer/Rocinante-12B-v1.1", name: "Rocinante 12b", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 0.408, output: 0.595, cache_read: 0.204 } }, "TheDrummer/Magidonia-24B-v4.3": { id: "TheDrummer/Magidonia-24B-v4.3", name: "The Drummer Magidonia 24B v4.3", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-12-25", last_updated: "2025-12-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, input: 32768, output: 32768 }, cost: { input: 0.1003, output: 0.1207, cache_read: 0.05015 } }, "TheDrummer/Cydonia-24B-v4.1": { id: "TheDrummer/Cydonia-24B-v4.1", name: "The Drummer Cydonia 24B v4.1", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2025-08-19", last_updated: "2025-08-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 131072, output: 131072 }, cost: { input: 0.35, output: 0.55, cache_read: 0.16 } }, "TheDrummer/UnslopNemo-12B-v4.1": { id: "TheDrummer/UnslopNemo-12B-v4.1", name: "UnslopNemo 12b v4", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 8192, input: 8192, output: 8192 }, cost: { input: 0.493, output: 0.493, cache_read: 0.2465 } }, "Tongyi-Zhiwen/QwenLong-L1-32B": { id: "Tongyi-Zhiwen/QwenLong-L1-32B", name: "QwenLong L1 32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 40960 }, cost: { input: 0.14, output: 0.6, cache_read: 0.07 } }, "stepfun/step-3.7-flash:thinking": { id: "stepfun/step-3.7-flash:thinking", name: "Step 3.7 Flash Thinking", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 256000 }, cost: { input: 0.2, output: 1.15, cache_read: 0.04 } }, "anthracite-org/magnum-v2-72b": { id: "anthracite-org/magnum-v2-72b", name: "Magnum V2 72B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 2.006, output: 2.992, cache_read: 1.003 } }, "anthracite-org/magnum-v4-72b": { id: "anthracite-org/magnum-v4-72b", name: "Magnum v4 72B", description: "Open Llama multimodal model for image understanding and text reasoning", family: "llama", attachment: true, reasoning: false, tool_call: false, structured_output: false, release_date: "2024-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 2.006, output: 2.992, cache_read: 1.003 } } } }, fastrouter: { id: "fastrouter", env: ["FASTROUTER_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://go.fastrouter.ai/api/v1", name: "FastRouter", doc: "https://fastrouter.ai/models", models: { "google/veo3.1-fast": { id: "google/veo3.1-fast", name: "Veo 3.1 Fast", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-05-01", last_updated: "2026-05-01", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 400000, output: 0 } }, "google/gemini-3.5-flash": { id: "google/gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9 } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.0375 } }, "google/veo3.1-lite": { id: "google/veo3.1-lite", name: "Veo 3.1 Lite", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-05-01", last_updated: "2026-05-01", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 400000, output: 0 } }, "google/gemini-3-pro-image-preview": { id: "google/gemini-3-pro-image-preview", name: "Nano Banana Pro", description: "Nano Banana Pro for higher-fidelity image generation and design-heavy edits", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 32768 }, cost: { input: 2, output: 12 } }, "google/gemini-3.1-flash-image-preview": { id: "google/gemini-3.1-flash-image-preview", name: "Nano Banana 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 65536 }, cost: { input: 0.5, output: 3 } }, "google/imagen-4.0-fast": { id: "google/imagen-4.0-fast", name: "Imagen 4 Fast", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "imagen", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/veo3.1": { id: "google/veo3.1", name: "Veo 3.1", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-05-01", last_updated: "2026-05-01", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 400000, output: 0 } }, "google/gemma-4-31b-it": { id: "google/gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.13, output: 0.38 } }, "google/gemini-3.1-pro-preview": { id: "google/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12 } }, "google/imagen-4.0-ultra": { id: "google/imagen-4.0-ultra", name: "Imagen 4 Ultra", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "imagen", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.31 } }, "qwen/qwen3-coder": { id: "qwen/qwen3-coder", name: "Qwen3 Coder", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 66536 }, cost: { input: 0.3, output: 1.2 } }, "leonardo-ai/lucid-origin": { id: "leonardo-ai/lucid-origin", name: "Lucid Origin", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "lucid", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-06-01", last_updated: "2025-06-01", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 4096, output: 0 } }, "leonardo-ai/lucid-realism": { id: "leonardo-ai/lucid-realism", name: "Lucid Realism", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "lucid", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-06-01", last_updated: "2025-06-01", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 4096, output: 0 } }, "bytedance/seedance-2": { id: "bytedance/seedance-2", name: "Seedance 2", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "seed", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 4096, output: 0 } }, "minimax/minimax-m2.7-highspeed": { id: "minimax/minimax-m2.7-highspeed", name: "MiniMax-M2.7-highspeed", description: "Low-latency M2.7 variant for interactive coding plans and agent loops", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.4 } }, "minimax/minimax-m2.7": { id: "minimax/minimax-m2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 1.74, output: 3.48 } }, "wanx/wan-v2-6": { id: "wanx/wan-v2-6", name: "Wan 2.6", description: "Video model for prompt-guided generation, editing, and motion workflows", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: true, limit: { context: 400000, output: 0 } }, "x-ai/grok-4": { id: "x-ai/grok-4", name: "Grok 4", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.75, cache_write: 15 } }, "x-ai/grok-4.3": { id: "x-ai/grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5 } }, "x-ai/grok-build-0.1": { id: "x-ai/grok-build-0.1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1, output: 2 } }, "deepseek-ai/deepseek-r1-distill-llama-70b": { id: "deepseek-ai/deepseek-r1-distill-llama-70b", name: "DeepSeek R1 Distill Llama 70B", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2024-10", release_date: "2025-01-23", last_updated: "2025-01-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.03, output: 0.14 } }, "anthropic/claude-sonnet-4.6": { id: "anthropic/claude-sonnet-4.6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 32000 }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15 } }, "anthropic/claude-opus-4.1": { id: "anthropic/claude-opus-4.1", name: "Claude Opus 4.1", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 32000 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-sonnet-4": { id: "anthropic/claude-sonnet-4", name: "Claude Sonnet 4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 32000 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-opus-4.8": { id: "anthropic/claude-opus-4.8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 32000 }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25 } }, "z-ai/glm-5": { id: "z-ai/glm-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.95, output: 3.15 } }, "z-ai/glm-5.1": { id: "z-ai/glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 1.05, output: 3.5 } }, "moonshotai/kimi-k2.6": { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.75, output: 3.5 } }, "moonshotai/kimi-k2": { id: "moonshotai/kimi-k2", name: "Kimi K2", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-07-11", last_updated: "2025-07-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.55, output: 2.2 } }, "openai/gpt-image-2": { id: "openai/gpt-image-2", name: "GPT Image 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 128000, output: 0 } }, "openai/gpt-5.5-pro": { id: "openai/gpt-5.5-pro", name: "GPT-5.5 Pro", description: "Highest-accuracy GPT-5.5 tier for slower, precision-heavy reasoning and coding", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180 } }, "openai/gpt-realtime-1.5": { id: "openai/gpt-realtime-1.5", name: "GPT Realtime 1.5", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-06-01", last_updated: "2025-06-01", modalities: { input: ["text", "audio", "image"], output: ["text", "audio"] }, open_weights: false, limit: { context: 32000, output: 4096 }, cost: { input: 4, output: 16 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0.05, output: 0.2 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30 } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT-5", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-10-01", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 0.6 } }, "openai/gpt-5.3-codex": { id: "openai/gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT-5 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2024-10-01", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/gpt-5-nano": { id: "openai/gpt-5-nano", name: "GPT-5 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2024-10-01", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "openai/gpt-4.1": { id: "openai/gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "sarvam/sarvam-30b": { id: "sarvam/sarvam-30b", name: "Sarvam 30B", description: "Efficient Indian-language reasoning model for chat, coding, and multilingual work", family: "sarvam", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-18", last_updated: "2026-02-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.02, output: 0.1 } }, "sarvam/sarvam-105b": { id: "sarvam/sarvam-105b", name: "Sarvam 105B", description: "Flagship Indian-language reasoning model for enterprise multilingual applications", family: "sarvam", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-09-01", last_updated: "2025-09-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.04, output: 0.16 } } } }, nearai: { id: "nearai", env: ["NEARAI_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://cloud-api.near.ai/v1", name: "NEAR AI Cloud", doc: "https://docs.near.ai/", models: { "google/gemini-3.5-flash": { id: "google/gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, input_audio: 1.5 } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, input_audio: 1 } }, "google/gemini-3-pro": { id: "google/gemini-3-pro", name: "Gemini 3 Pro Preview", description: "Preview Gemini flagship for complex reasoning, coding, and rich multimodal prompts", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 15, cache_read: 0 } }, "google/gemini-3.1-flash-lite": { id: "google/gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "google/gemini-2.5-flash-lite": { id: "google/gemini-2.5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01, input_audio: 0.3 } }, "google/gemma-4-31B-it": { id: "google/gemma-4-31B-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.13, output: 0.4, cache_read: 0.026 } }, "zai-org/GLM-5.1-FP8": { id: "zai-org/GLM-5.1-FP8", name: "GLM-5.1 FP8", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-27", last_updated: "2026-03-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 0.85, output: 3.3 } }, "black-forest-labs/FLUX.2-klein-4B": { id: "black-forest-labs/FLUX.2-klein-4B", name: "FLUX.2 Klein 4B", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-14", last_updated: "2026-01-14", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 1, output: 1 } }, "Qwen/Qwen3.5-122B-A10B": { id: "Qwen/Qwen3.5-122B-A10B", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.4, output: 3.2 } }, "Qwen/Qwen3-Reranker-0.6B": { id: "Qwen/Qwen3-Reranker-0.6B", name: "Qwen3 Reranker 0.6B", description: "Reranking model for improving retrieval quality in search and recommendation systems", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-06-03", last_updated: "2025-06-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 1024 }, cost: { input: 0.01, output: 0.01 } }, "Qwen/Qwen3-30B-A3B-Instruct-2507": { id: "Qwen/Qwen3-30B-A3B-Instruct-2507", name: "Qwen3 30B-A3B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-29", last_updated: "2025-07-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.15, output: 0.55 } }, "Qwen/Qwen3.6-35B-A3B-FP8": { id: "Qwen/Qwen3.6-35B-A3B-FP8", name: "Qwen 3.6 35B A3B FP8", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.17, output: 1.1, cache_read: 0.056 } }, "Qwen/Qwen3-VL-30B-A3B-Instruct": { id: "Qwen/Qwen3-VL-30B-A3B-Instruct", name: "Qwen3-VL 30B-A3B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 32768 }, cost: { input: 0.15, output: 0.55 } }, "Qwen/Qwen3-Embedding-0.6B": { id: "Qwen/Qwen3-Embedding-0.6B", name: "Qwen3 Embedding 0.6B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-06-03", last_updated: "2025-06-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 1024 }, cost: { input: 0.01, output: 0 } }, "anthropic/claude-sonnet-4-6": { id: "anthropic/claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-haiku-4-5": { id: "anthropic/claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "anthropic/claude-opus-4-6": { id: "anthropic/claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-4-5": { id: "anthropic/claude-sonnet-4-5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15.5, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-opus-4-7": { id: "anthropic/claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "openai/gpt-4.1-mini": { id: "openai/gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "openai/gpt-4.1-nano": { id: "openai/gpt-4.1-nano", name: "GPT-4.1 nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "openai/o3-mini": { id: "openai/o3-mini", name: "o3-mini", description: "Smaller o-series reasoner for economical coding, math, and planning tasks", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/whisper-large-v3": { id: "openai/whisper-large-v3", name: "Whisper Large v3", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "whisper", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2023-11-06", last_updated: "2023-11-06", modalities: { input: ["audio"], output: ["text"] }, open_weights: true, limit: { context: 448, output: 448 }, cost: { input: 0.01, output: 0 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT-OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 32768 }, cost: { input: 0.15, output: 0.55 } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.8, output: 15.5, cache_read: 0.18 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-5-nano": { id: "openai/gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "openai/o3": { id: "openai/o3", name: "o3", description: "Deliberate o-series reasoner for hard math, coding, and multi-step analysis", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/gpt-4.1": { id: "openai/gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/o4-mini": { id: "openai/o4-mini", name: "o4-mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.275 } } } }, daoxe: { id: "daoxe", env: ["DAOXE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://daoxe.com/v1", name: "DaoXE", doc: "https://daoxe.com/pricing", models: { "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "grok-4.3": { id: "grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25 } }, "grok-4.5": { id: "grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.5 } }, "claude-haiku-4-5-20251001": { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 5 } }, "gemini-3.1-pro-preview": { id: "gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2 } } } }, crof: { id: "crof", env: ["CROF_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://crof.ai/v1", name: "CrofAI", doc: "https://crof.ai/docs", models: { "glm-5": { id: "glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.48, output: 1.9, cache_read: 0.1, cache_write: 0 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.45, output: 2.15, cache_read: 0.08, cache_write: 0 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.12, output: 0.21, cache_read: 0.003 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.35, output: 1.7, cache_read: 0.07 } }, "greg-1-mini": { id: "greg-1-mini", name: "Greg 1 Mini", description: "Efficient model for low-latency assistance, extraction, and routine automation", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 229376, output: 229376 }, cost: { input: 0.07, output: 0.15, cache_read: 0.01 } }, "glm-4.7-flash": { id: "glm-4.7-flash", name: "GLM-4.7-Flash", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.04, output: 0.3, cache_read: 0.008, cache_write: 0 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.5, output: 2.2, cache_read: 0.08 } }, "qwen3.5-9b": { id: "qwen3.5-9b", name: "Qwen3.5 9B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-13", last_updated: "2026-03-13", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.04, output: 0.15, cache_read: 0.008 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.5, output: 1.99, cache_read: 0.05 } }, "qwen3.6-27b": { id: "qwen3.6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.2, output: 1.5, cache_read: 0.04 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.35, output: 0.8, cache_read: 0.003 } }, "greg-2-super": { id: "greg-2-super", name: "Greg 2 Super", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-06-14", last_updated: "2026-06-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 229376, output: 229376 }, cost: { input: 1.5, output: 5, cache_read: 0.25 } }, "deepseek-v4-flash-0731": { id: "deepseek-v4-flash-0731", name: "DeepSeek V4 Flash (New)", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.12, output: 0.21, cache_read: 0.003 } }, "greg-rp": { id: "greg-rp", name: "Greg (Roleplay)", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 229376, output: 229376 }, cost: { input: 0.1, output: 0.3, cache_read: 0.02 } }, "deepseek-v3.2": { id: "deepseek-v3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-07-22", last_updated: "2025-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 163840 }, cost: { input: 0.18, output: 0.35, cache_read: 0.04 } }, "greg-2-ultra": { id: "greg-2-ultra", name: "Greg 2 Ultra", description: "Flagship model for demanding analysis, coding, and production agent workflows", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-06-14", last_updated: "2026-06-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 229376, output: 229376 }, cost: { input: 3, output: 10, cache_read: 0.5 } }, "glm-4.7": { id: "glm-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.25, output: 1.1, cache_read: 0.05, cache_write: 0 } }, "minimax-m2.5": { id: "minimax-m2.5", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.11, output: 0.95, cache_read: 0.02, cache_write: 0.375 } }, "gemma-4-31b-it": { id: "gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.1, output: 0.3, cache_read: 0.02 } }, "deepseek-v4-pro-lightning": { id: "deepseek-v4-pro-lightning", name: "DeepSeek V4 Pro Lightning", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.8, output: 1.6, cache_read: 0.02 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.55, output: 2.25, cache_read: 0.05 } }, "kimi-k3-eco": { id: "kimi-k3-eco", name: "Kimi K3 Eco", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 1, output: 4, cache_read: 0.1 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 262144 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 2, output: 8, cache_read: 0.25 } }, "mimo-v2.5-pro": { id: "mimo-v2.5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.4, output: 0.8, cache_read: 0.003, tiers: [{ input: 2, output: 6, cache_read: 0.4, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.4 } } }, "qwen3.5-397b-a17b": { id: "qwen3.5-397b-a17b", name: "Qwen3.5 397B-A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, provider: { npm: "@ai-sdk/openai-compatible" }, cost: { input: 0.35, output: 1.75, cache_read: 0.07 } }, "kimi-k2.5-lightning": { id: "kimi-k2.5-lightning", name: "Kimi K2.5 (Lightning)", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-02-06", last_updated: "2026-02-06", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 1, output: 3, cache_read: 0.2 } } } }, qvac: { id: "qvac", env: ["QVAC_API_KEY"], npm: "@qvac/ai-sdk-provider", name: "QVAC", doc: "https://www.npmjs.com/package/@qvac/ai-sdk-provider", models: { "gemma4-31b": { id: "gemma4-31b", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "qwen3.6-35b-a3b": { id: "qwen3.6-35b-a3b", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0, output: 0 } }, "gpt-oss-20b": { id: "gpt-oss-20b", name: "GPT OSS 20B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0, output: 0 } }, "qwen3.5-9b": { id: "qwen3.5-9b", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 0, output: 0 } }, "qwen3.6-27b": { id: "qwen3.6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0, output: 0 } }, "qwen3.5-4b": { id: "qwen3.5-4b", name: "Qwen3.5 4B", description: "Qwen instruction model for multilingual chat and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-11-01", last_updated: "2025-11-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 0, output: 0 } }, "qwen3.5-0.8b": { id: "qwen3.5-0.8b", name: "Qwen3.5 0.8B", description: "Qwen instruction model for multilingual chat and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-11-01", last_updated: "2025-11-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 0, output: 0 } }, "qwen3.5-2b": { id: "qwen3.5-2b", name: "Qwen3.5 2B", description: "Qwen instruction model for multilingual chat and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-11-01", last_updated: "2025-11-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 0, output: 0 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0, output: 0 } } } }, "abliteration-ai": { id: "abliteration-ai", env: ["ABLIT_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.abliteration.ai/v1", name: "abliteration.ai", doc: "https://docs.abliteration.ai/models", models: { "abliterated-model-large": { id: "abliterated-model-large", name: "Abliterated Model Large", description: "GLM-5.2 model abliterated and finetuned for cyber, ML red teaming, and agent testing", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }, { type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-25", last_updated: "2026-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 1e6, output: 999990 }, cost: { input: 5, output: 5, cache_read: 0.5 } }, "abliterated-model": { id: "abliterated-model", name: "Abliterated Model", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }, { type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-01-06", last_updated: "2026-07-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 150000, input: 150000, output: 8192 }, cost: { input: 3, output: 3, cache_read: 0.3 } } } }, "alibaba-coding-plan-cn": { id: "alibaba-coding-plan-cn", env: ["ALIBABA_CODING_PLAN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://coding.dashscope.aliyuncs.com/v1", name: "Alibaba Coding Plan (China)", doc: "https://help.aliyun.com/zh/model-studio/coding-plan", models: { "qwen3.7-plus": { id: "qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5": { id: "glm-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 16384 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3.5-plus": { id: "qwen3.5-plus", name: "Qwen3.5 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3.7-max": { id: "qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5, cache_write: 3.125 } }, "qwen3-coder-plus": { id: "qwen3-coder-plus", name: "Qwen3 Coder Plus", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-4.7": { id: "glm-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 16384 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3-max-2026-01-23": { id: "qwen3-max-2026-01-23", name: "Qwen3 Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-23", last_updated: "2026-01-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "MiniMax-M2.5": { id: "MiniMax-M2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 24576 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3.6-flash": { id: "qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.1875, output: 1.125, cache_write: 0.234375 } }, "qwen3-coder-next": { id: "qwen3-coder-next", name: "Qwen3 Coder Next", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-03", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3.6-plus": { id: "qwen3.6-plus", name: "Qwen3.6 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, llmgateway: { id: "llmgateway", env: ["LLMGATEWAY_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.llmgateway.io/v1", name: "LLM Gateway", doc: "https://llmgateway.io/docs", models: { "qwen3-coder-480b-a35b-instruct": { id: "qwen3-coder-480b-a35b-instruct", name: "Qwen3-Coder 480B-A35B Instruct", description: "Open Qwen coding heavyweight for repository reasoning and agentic engineering", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.3, output: 1.3 } }, "gpt-5.1-codex-mini": { id: "gpt-5.1-codex-mini", name: "GPT-5.1 Codex mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "grok-4": { id: "grok-4", name: "Grok 4", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 3, output: 15, cache_read: 0.75 } }, "mistral-small-2506": { id: "mistral-small-2506", name: "Mistral Small 3.2", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-06-20", last_updated: "2025-06-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.1, output: 0.3 } }, "qwen3.7-flash": { id: "qwen3.7-flash", name: "Qwen3.7 Flash", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-27", last_updated: "2026-07-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 0.03, output: 0.13, cache_read: 0.006, cache_write: 0.0375 } }, "minimax-m2.7-highspeed": { id: "minimax-m2.7-highspeed", name: "MiniMax-M2.7-highspeed", description: "Low-latency M2.7 variant for interactive coding plans and agent loops", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.4, cache_read: 0.06, cache_write: 0.375 } }, "qwen3.7-plus": { id: "qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.4, output: 1.6, cache_read: 0.08, cache_write: 0.5 } }, "qwen3-vl-plus": { id: "qwen3-vl-plus", name: "Qwen3-VL Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.2, output: 1.6, reasoning: 4.8, cache_read: 0.04, cache_write: 0.25 } }, "grok-4-5": { id: "grok-4-5", name: "Grok 4.5", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.5 } }, "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "grok-build-0-1": { id: "grok-build-0-1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1, output: 2, cache_read: 0.2, tiers: [{ input: 2, output: 4, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2, output: 4, cache_read: 0.4 } } }, "qwen3-32b": { id: "qwen3-32b", name: "Qwen3 32B", description: "Dense open Qwen model for self-hosted chat, reasoning, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 16384 }, cost: { input: 0.1, output: 0.3, reasoning: 8.4 } }, "glm-4.6v": { id: "glm-4.6v", name: "GLM-4.6V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.3, output: 0.9, cache_read: 0.05 } }, "gpt-5.2-pro": { id: "gpt-5.2-pro", name: "GPT-5.2 Pro", description: "Higher-accuracy GPT-5.2 variant for tougher reasoning and review workflows", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 21, output: 168 } }, "seed-1-8-251228": { id: "seed-1-8-251228", name: "Seed 1.8 (251228)", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-18", last_updated: "2025-12-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8192 }, cost: { input: 0.25, output: 2, cache_read: 0.05 } }, "gpt-5.5-pro": { id: "gpt-5.5-pro", name: "GPT-5.5 Pro", description: "Highest-accuracy GPT-5.5 tier for slower, precision-heavy reasoning and coding", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "gpt-4.1-mini": { id: "gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "gpt-4o": { id: "gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "llama-3.1-70b-instruct": { id: "llama-3.1-70b-instruct", name: "Llama 3.1 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 2048 }, status: "beta", cost: { input: 0.72, output: 0.72 } }, "glm-5": { id: "glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 203000, output: 131072 }, cost: { input: 0.72, output: 2.3, cache_read: 0.144, cache_write: 0 } }, "muse-spark-1.1": { id: "muse-spark-1.1", name: "Muse Spark 1.1", description: "Muse Spark is a natively multimodal reasoning model with support for tool-use, visual chain of thought, and multi-agent orchestration.", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-08", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 32000 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "gemini-3.5-flash": { id: "gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, cache_write: 0.08333 } }, "qwen3.6-35b-a3b": { id: "qwen3.6-35b-a3b", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.248, output: 1.485 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "gpt-5.4-pro": { id: "gpt-5.4-pro", name: "GPT-5.4 Pro", description: "More exact GPT-5.4 tier for demanding professional reasoning and agent tasks", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180 } }, "fugu-ultra": { id: "fugu-ultra", name: "Fugu Ultra", description: "Quality-first multi-agent model for hard research, analysis, and competitions", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-06-22", last_updated: "2026-06-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "claude-3-opus": { id: "claude-3-opus", name: "Claude 3 Opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2024-03-04", last_updated: "2024-03-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "grok-4-20-beta-0309-non-reasoning": { id: "grok-4-20-beta-0309-non-reasoning", name: "Grok 4.20 (Non-Reasoning)", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 2, output: 6, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "qwen2-5-vl-72b-instruct": { id: "qwen2-5-vl-72b-instruct", name: "Qwen2.5-VL 72B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 8192 }, cost: { input: 0.25, output: 0.75 } }, "glm-4.5-air": { id: "glm-4.5-air", name: "GLM-4.5-Air", description: "Lighter GLM-4.5 variant for fast coding assistance and cheaper agents", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 98304 }, cost: { input: 0.13, output: 0.85, cache_read: 0.025, cache_write: 0 } }, "qwen-max": { id: "qwen-max", name: "Qwen Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-04-03", last_updated: "2025-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 8192 }, cost: { input: 1.6, output: 6.4 } }, "qwen-omni-turbo": { id: "qwen-omni-turbo", name: "Qwen-Omni Turbo", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-01-19", last_updated: "2025-03-26", modalities: { input: ["text", "image", "audio", "video"], output: ["text", "audio"] }, open_weights: false, limit: { context: 32768, output: 2048 }, cost: { input: 0.2, output: 0.8 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }, { type: "budget_tokens", min: 1, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.931, output: 2.93, cache_read: 0.173, cache_write: 0 } }, "llama-3-70b-instruct": { id: "llama-3-70b-instruct", name: "Llama 3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-04-18", last_updated: "2024-04-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8000 }, cost: { input: 0.51, output: 0.74 } }, "seed-1-6-250915": { id: "seed-1-6-250915", name: "Seed 1.6 (250915)", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8192 }, cost: { input: 0.25, output: 2, cache_read: 0.05 } }, "gemini-3.5-flash-lite": { id: "gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, cache_write: 0.08333 } }, "gpt-4o-mini-transcribe": { id: "gpt-4o-mini-transcribe", name: "GPT-4o Mini Transcribe", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-03-20", last_updated: "2025-03-20", modalities: { input: ["text", "audio"], output: ["text"] }, open_weights: false, limit: { context: 16000, output: 16000 }, cost: { input: 1.25, output: 5 } }, "qwen3-235b-a22b-thinking-2507": { id: "qwen3-235b-a22b-thinking-2507", name: "Qwen3 235B A22B Thinking (2507)", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-08", last_updated: "2025-07-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 8192 }, cost: { input: 0.3, output: 3 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1050000, output: 384000 }, cost: { input: 0.076, output: 0.153, cache_read: 0.014 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.405, output: 1.98, cache_read: 0.225 } }, "minimax-m2.7": { id: "minimax-m2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.08, output: 0.32, cache_read: 0.017, cache_write: 0.375 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gpt-4.1-nano": { id: "gpt-4.1-nano", name: "GPT-4.1 nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "qwen3-coder-30b-a3b-instruct": { id: "qwen3-coder-30b-a3b-instruct", name: "Qwen3-Coder 30B-A3B Instruct", description: "Smaller Qwen coder for efficient local agents and repo-level fixes", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 65536 }, cost: { input: 0.07, output: 0.27 } }, "gpt-oss-20b": { id: "gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32766 }, cost: { input: 0.04, output: 0.15 } }, "glm-4.7-flash": { id: "glm-4.7-flash", name: "GLM-4.7-Flash", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0.06, output: 0.4, cache_read: 0.01, cache_write: 0 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.55, output: 1.9255, cache_read: 0.1375, cache_write: 0 } }, "glm-4.7-flashx": { id: "glm-4.7-flashx", name: "GLM-4.7-FlashX", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0.07, output: 0.4, cache_read: 0.01, cache_write: 0 } }, "qwen3.7-max": { id: "qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 1.25, output: 3.75, cache_read: 0.125, cache_write: 3.125 } }, "ministral-8b-2512": { id: "ministral-8b-2512", name: "Ministral 8B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "mistral", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 8192 }, cost: { input: 0.15, output: 0.15 } }, "qwen3-next-80b-a3b-thinking": { id: "qwen3-next-80b-a3b-thinking", name: "Qwen3-Next 80B-A3B (Thinking)", description: "Efficient Qwen thinking model for local reasoning, math, and coding agents", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 1.2 } }, "ministral-14b-2512": { id: "ministral-14b-2512", name: "Ministral 14B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "mistral", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 8192 }, cost: { input: 0.2, output: 0.2 } }, "ministral-3b-2512": { id: "ministral-3b-2512", name: "Ministral 3B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "mistral", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.1, output: 0.1 } }, "qwen3.5-9b": { id: "qwen3.5-9b", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.1, output: 0.15 } }, "gpt-5.2-chat-latest": { id: "gpt-5.2-chat-latest", name: "GPT-5.2 Chat", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "o3-mini": { id: "o3-mini", name: "o3-mini", description: "Smaller o-series reasoner for economical coding, math, and planning tasks", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "qwen-plus-latest": { id: "qwen-plus-latest", name: "Qwen Plus Latest", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-01-25", last_updated: "2025-01-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 8192 }, cost: { input: 0.4, output: 1.2, cache_read: 0.08, cache_write: 0.5 } }, "kimi-k2.7-code-highspeed": { id: "kimi-k2.7-code-highspeed", name: "Kimi K2.7 Code Highspeed", description: "Lower-latency Kimi Code variant for interactive edits and coding-agent loops", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.9, output: 8, cache_read: 0.38 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.22, output: 1.137, cache_read: 0.048 } }, "minimax-m2.1-lightning": { id: "minimax-m2.1-lightning", name: "MiniMax M2.1 Lightning", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 131072 }, cost: { input: 0.12, output: 0.48 } }, "grok-4-20-beta-0309-reasoning": { id: "grok-4-20-beta-0309-reasoning", name: "Grok 4.20 (Reasoning)", description: "Reasoning Grok for document-heavy analysis and long-horizon tool use", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 2, output: 6, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "gemini-pro-latest": { id: "gemini-pro-latest", name: "Gemini Pro Latest", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-27", last_updated: "2026-02-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2 } }, "glm-4-32b-0414-128k": { id: "glm-4-32b-0414-128k", name: "GLM-4 32B (0414-128k)", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.1, output: 0.1 } }, sonar: { id: "sonar", name: "Sonar", description: "Fast web-grounded Sonar for current answers, citations, and lightweight retrieval", family: "sonar", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 130000, output: 4096 }, cost: { input: 1, output: 1 } }, "seed-1-6-flash-250715": { id: "seed-1-6-flash-250715", name: "Seed 1.6 Flash (250715)", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-26", last_updated: "2025-07-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8192 }, cost: { input: 0.07, output: 0.3, cache_read: 0.015 } }, "sonar-pro": { id: "sonar-pro", name: "Sonar Pro", description: "Deeper Sonar search model with broader retrieval and stronger synthesis", family: "sonar-pro", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 3, output: 15 } }, "nemotron-3-nano-omni": { id: "nemotron-3-nano-omni", name: "Nemotron 3 Nano Omni", description: "Omni-modal model for text, vision, audio, and multimodal agent tasks", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-28", last_updated: "2026-04-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.06, output: 0.24 } }, "llama-3.2-11b-instruct": { id: "llama-3.2-11b-instruct", name: "Llama 3.2 11B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.07, output: 0.33 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "gemini-3-flash-preview": { id: "gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05 } }, "gpt-4o-mini": { id: "gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "llama-4-scout-17b-instruct": { id: "llama-4-scout-17b-instruct", name: "Llama 4 Scout 17B Instruct", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 2048 }, cost: { input: 0.18, output: 0.59 } }, "minimax-m3": { id: "minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 128000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "gpt-5": { id: "gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "qwen3-max": { id: "qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen3 model for coding agents, complex reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.845, output: 3.38, cache_read: 0.6, cache_write: 3.75 } }, "gemma-4-26b-a4b-it": { id: "gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.07, output: 0.34 } }, "llama-3.3-70b-instruct": { id: "llama-3.3-70b-instruct", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 4096 }, cost: { input: 0.13, output: 0.4 } }, "gpt-3.5-turbo": { id: "gpt-3.5-turbo", name: "GPT-3.5-turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2021-09-01", release_date: "2023-03-01", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16385, output: 4096 }, cost: { input: 0.5, output: 1.5, cache_read: 0 } }, "claude-sonnet-4-5": { id: "claude-sonnet-4-5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "minicpm-v-4.5": { id: "minicpm-v-4.5", name: "MiniCPM-V 4.5", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 }, cost: { input: 0.658, output: 1.11 } }, hy3: { id: "hy3", name: "Hy3", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 64000 }, cost: { input: 0.14, output: 0.58, cache_read: 0.035 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1050000, output: 384000 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "glm-4.6": { id: "glm-4.6", name: "GLM-4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.55, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "grok-4-3": { id: "grok-4-3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.3125, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "gpt-4o-search-preview": { id: "gpt-4o-search-preview", name: "GPT-4o Search Preview", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2024-10-01", last_updated: "2024-10-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10 } }, "qwen3-coder-plus": { id: "qwen3-coder-plus", name: "Qwen3 Coder Plus", description: "Hosted Qwen coder for software agents, repo edits, and long-context code", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 6, output: 60, cache_read: 1.2, cache_write: 7.5 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25 } }, "llama-4-maverick-17b-instruct": { id: "llama-4-maverick-17b-instruct", name: "Llama 4 Maverick 17B Instruct", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 2048 }, cost: { input: 0.27, output: 0.85 } }, "gpt-5.3-chat-latest": { id: "gpt-5.3-chat-latest", name: "GPT-5.3 Chat (latest)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "minimax-m2.5-highspeed": { id: "minimax-m2.5-highspeed", name: "MiniMax-M2.5-highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-13", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.4, cache_read: 0.03, cache_write: 0.375 } }, "qwen3.8-max": { id: "qwen3.8-max", name: "Qwen3.8 Max Preview", description: "Preview Qwen flagship for million-token multimodal reasoning and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "xhigh"] }, { type: "budget_tokens" }], tool_call: true, temperature: true, release_date: "2026-07-19", last_updated: "2026-07-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 1.815, output: 5.4461, cache_read: 0.21, cache_write: 2.5 } }, "grok-4-1-fast-reasoning": { id: "grok-4-1-fast-reasoning", name: "Grok 4.1 Fast Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-11-19", last_updated: "2025-11-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "qwen3-235b-a22b-fp8": { id: "qwen3-235b-a22b-fp8", name: "Qwen3 235B A22B FP8", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-28", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 8192 }, cost: { input: 0.2, output: 0.8 } }, "glm-4.5": { id: "glm-4.5", name: "GLM-4.5", description: "Hybrid-reasoning GLM release that made the 4.5 line broadly useful", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 98304 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "cosmos3-super-reasoner": { id: "cosmos3-super-reasoner", name: "Cosmos 3 Super Reasoner", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.1, output: 0.3 } }, "claude-sonnet-4-5-20250929": { id: "claude-sonnet-4-5-20250929", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "glm-4.5v": { id: "glm-4.5v", name: "GLM-4.5V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.6, output: 1.8, cache_read: 0.11 } }, "gpt-5.2-codex": { id: "gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Code-specialist GPT for repository edits, reviews, and long-running software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "qwen3-coder-flash": { id: "qwen3-coder-flash", name: "Qwen3 Coder Flash", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.3, output: 1.5, cache_read: 0.06, cache_write: 0.375 } }, "glm-4.6v-flashx": { id: "glm-4.6v-flashx", name: "GLM-4.6V FlashX", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16000 }, cost: { input: 0.04, output: 0.4, cache_read: 0.004 } }, "qwen2-5-vl-32b-instruct": { id: "qwen2-5-vl-32b-instruct", name: "Qwen2.5 VL 32B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-03-15", last_updated: "2025-03-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 1.4, output: 4.2 } }, "claude-opus-4-5-20251101": { id: "claude-opus-4-5-20251101", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }, { type: "budget_tokens", min: 1024, max: 31999 }], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-01", last_updated: "2025-11-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gpt-5.4-nano": { id: "gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "gemma-3-27b": { id: "gemma-3-27b", name: "Gemma 3 27B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-03-12", last_updated: "2025-03-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 110000, output: 110000 }, cost: { input: 0.1, output: 0.3 } }, "qwen3-235b-a22b-instruct-2507": { id: "qwen3-235b-a22b-instruct-2507", name: "Qwen3 235B A22B Instruct (2507)", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-08", last_updated: "2025-07-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 8192 }, cost: { input: 0.09, output: 0.58 } }, "qwen3-vl-235b-a22b-instruct": { id: "qwen3-vl-235b-a22b-instruct", name: "Qwen3 VL 235B A22B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 8192 }, cost: { input: 0.2, output: 0.88, cache_read: 0.11 } }, "qwen35-397b-a17b": { id: "qwen35-397b-a17b", name: "Qwen3.5 397B-A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.6, output: 3.6 } }, "gpt-5-pro": { id: "gpt-5-pro", name: "GPT-5 Pro", description: "Higher-accuracy GPT-5 tier for tough analysis, coding reviews, and planning", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 272000 }, cost: { input: 15, output: 120 } }, "qwen-flash": { id: "qwen-flash", name: "Qwen Flash", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.05, output: 0.4, cache_read: 0.01, cache_write: 0.0625 } }, "codestral-2508": { id: "codestral-2508", name: "Codestral", description: "Mistral coding model for code completion, generation, and developer workflows", family: "mistral", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-07-30", last_updated: "2025-07-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 0.3, output: 0.9 } }, "llama-3.1-nemotron-ultra-253b": { id: "llama-3.1-nemotron-ultra-253b", name: "Llama 3.1 Nemotron Ultra 253B", description: "Flagship Nemotron model for high-throughput reasoning and complex agents", family: "nemotron", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-04-07", last_updated: "2025-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.6, output: 1.8 } }, "deepseek-v3.2": { id: "deepseek-v3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 16384 }, cost: { input: 0.26, output: 0.38, cache_read: 0.13 } }, "gemini-3.6-flash": { id: "gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15, cache_write: 0.08333 } }, "muse-spark-1.2": { id: "muse-spark-1.2", name: "Muse Spark 1.2", description: "Muse Spark 1.2 is a coding-focused update to Muse Spark 1.1 with improvements in code generation, complex debugging, codebase understanding, and end-to-end developer workflows.", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-05", last_updated: "2026-08-05", modalities: { input: ["text", "image", "video", "pdf", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "qwen3-vl-flash": { id: "qwen3-vl-flash", name: "Qwen3 VL Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-09", last_updated: "2025-10-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.01 } }, "mimo-v2.5": { id: "mimo-v2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028, tiers: [{ input: 0.8, output: 4, cache_read: 0.16, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.8, output: 4, cache_read: 0.16 } } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "gemini-3.1-flash-lite": { id: "gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, cache_write: 0.08333 } }, "qwen-plus": { id: "qwen-plus", name: "Qwen Plus", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-01-25", last_updated: "2025-09-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.4, output: 1.2, reasoning: 4, cache_read: 0.08, cache_write: 0.5 } }, "glm-4.7": { id: "glm-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.38, output: 1.98, cache_read: 0.19, cache_write: 0 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32766 }, cost: { input: 0.032, output: 0.14, cache_read: 0.032 } }, "minimax-m2.5": { id: "minimax-m2.5", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 228700, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "minimax-m2": { id: "minimax-m2", name: "MiniMax-M2", description: "Efficient open MiniMax model built for coding agents and tool-heavy workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 128000 }, cost: { input: 0.2, output: 1, cache_read: 0.03 } }, o1: { id: "o1", name: "o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2023-09", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 15, output: 60, cache_read: 7.5 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, cache_write: 0.25 } }, "gemma-4-31b-it": { id: "gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.102, output: 0.297, cache_read: 0.012 } }, "hermes-4-405b": { id: "hermes-4-405b", name: "Hermes 4 405B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "hermes", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 1, output: 3 } }, "llama-3.2-3b-instruct": { id: "llama-3.2-3b-instruct", name: "Llama 3.2 3B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-09-18", last_updated: "2024-09-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32000 }, cost: { input: 0.03, output: 0.05 } }, "gpt-5.2": { id: "gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5.3-codex": { id: "gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "claude-haiku-4-5-20251001": { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "glm-4.5-airx": { id: "glm-4.5-airx", name: "GLM-4.5 AirX", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.1, output: 4.5, cache_read: 0.22 } }, "minimax-text-01": { id: "minimax-text-01", name: "MiniMax Text 01", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-01-15", last_updated: "2025-01-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0.2, output: 1.1 } }, "kimi-k2": { id: "kimi-k2", name: "Kimi K2", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-11", last_updated: "2025-07-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 0.57, output: 2.3, cache_read: 0.5 } }, "gemini-3.1-pro-preview": { id: "gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "qwen3.6-flash": { id: "qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.05, cache_write: 0.3125 } }, "gpt-5.1": { id: "gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "claude-haiku-4-5-free": { id: "claude-haiku-4-5-free", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 200000 }, cost: { input: 0, output: 0 } }, "qwen3-30b-a3b-instruct-2507": { id: "qwen3-30b-a3b-instruct-2507", name: "Qwen3 30B A3B Instruct (2507)", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-08", last_updated: "2025-07-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 8192 }, cost: { input: 0.1, output: 0.3 } }, "devstral-2512": { id: "devstral-2512", name: "Devstral 2", description: "Mistral's coding-agent model for repository work, terminal tasks, and software fixes", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-12", release_date: "2025-12-09", last_updated: "2025-12-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0.4, output: 2 } }, "gpt-4-turbo": { id: "gpt-4-turbo", name: "GPT-4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-12", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 10, output: 30 } }, "kimi-k2-thinking": { id: "kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Thinking Kimi model for slower research passes, planning, and hard technical questions", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-08", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 2.5, cache_read: 0.06 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "grok-4-1-fast-non-reasoning": { id: "grok-4-1-fast-non-reasoning", name: "Grok 4.1 Fast Non-Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-11-19", last_updated: "2025-11-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, auto: { id: "auto", name: "Auto Route", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "gpt-5.1-codex": { id: "gpt-5.1-codex", name: "GPT-5.1 Codex", description: "Codex GPT for repository edits, code review, and practical software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, custom: { id: "custom", name: "Custom Model", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-01-01", last_updated: "2024-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "gpt-5-nano": { id: "gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "qwen3-vl-30b-a3b-instruct": { id: "qwen3-vl-30b-a3b-instruct", name: "Qwen3 VL 30B A3B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-02", last_updated: "2025-10-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 8192 }, cost: { input: 0.15, output: 0.6 } }, "mimo-v2.5-pro": { id: "mimo-v2.5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0.435, output: 0.87, cache_read: 0.0036, tiers: [{ input: 2, output: 6, cache_read: 0.4, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.4 } } }, "gpt-4o-mini-search-preview": { id: "gpt-4o-mini-search-preview", name: "GPT-4o Mini Search Preview", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2024-10-01", last_updated: "2024-10-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gemini-2.5-flash-lite": { id: "gemini-2.5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01 } }, "minimax-m2.1": { id: "minimax-m2.1", name: "MiniMax-M2.1", description: "Earlier MiniMax agent model for practical coding and productivity tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.27, output: 1.1 } }, o3: { id: "o3", name: "o3", description: "Deliberate o-series reasoner for hard math, coding, and multi-step analysis", family: "o", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 2.5 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: false, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "nemotron-3-ultra-550b": { id: "nemotron-3-ultra-550b", name: "Nemotron 3 Ultra 550B A55B", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 128000 }, cost: { input: 0.5, output: 2.5, cache_read: 0.15 } }, "mistral-large-latest": { id: "mistral-large-latest", name: "Mistral Large (latest)", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 262144 }, cost: { input: 4, output: 12 } }, "qwen3-vl-235b-a22b-thinking": { id: "qwen3-vl-235b-a22b-thinking", name: "Qwen3 VL 235B A22B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.98, output: 3.95 } }, "qwen3.6-max-preview": { id: "qwen3.6-max-preview", name: "Qwen3.6 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 1.3, output: 7.8, cache_read: 0.13, cache_write: 1.625 } }, "glm-4.5-x": { id: "glm-4.5-x", name: "GLM-4.5 X", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, status: "beta", cost: { input: 2.2, output: 8.9, cache_read: 0.45 } }, "nemotron-3-nano-30b": { id: "nemotron-3-nano-30b", name: "Nemotron 3 Nano 30B", description: "Compact Nemotron model for efficient reasoning and deployable AI agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-15", last_updated: "2025-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.06, output: 0.24 } }, "gpt-4.1": { id: "gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "qwen-coder-plus": { id: "qwen-coder-plus", name: "Qwen Coder Plus", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-09-18", last_updated: "2024-09-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.502, output: 1.004 } }, "o4-mini": { id: "o4-mini", name: "o4-mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.275 } }, "grok-4-20-reasoning": { id: "grok-4-20-reasoning", name: "Grok 4.20 (Reasoning)", description: "Reasoning Grok for document-heavy analysis and long-horizon tool use", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "kimi-k3-fast": { id: "kimi-k3-fast", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1040384, output: 131072 }, cost: { input: 4.5, output: 22.5, cache_read: 0.45 } }, "claude-opus-5": { id: "claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "qwen3-coder-next": { id: "qwen3-coder-next", name: "Qwen3 Coder Next", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.108, output: 0.675, cache_read: 0.06 } }, "gpt-4": { id: "gpt-4", name: "GPT-4", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-11", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 8192 }, cost: { input: 30, output: 60 } }, "nemotron-3-super-120b": { id: "nemotron-3-super-120b", name: "Nemotron 3 Super 120B", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.3, output: 0.9 } }, "qwen3.6-plus": { id: "qwen3.6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 0.625, tiers: [{ input: 2, output: 6, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.2, cache_write: 2.5 } } }, "claude-opus-4-1-20250805": { id: "claude-opus-4-1-20250805", name: "Claude Opus 4.1", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }, { type: "budget_tokens", min: 1024, max: 31999 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "seed-1-6-250615": { id: "seed-1-6-250615", name: "Seed 1.6 (250615)", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-06-25", last_updated: "2025-06-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8192 }, cost: { input: 0.25, output: 2, cache_read: 0.05 } }, "qwen-max-latest": { id: "qwen-max-latest", name: "Qwen Max Latest", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-01-25", last_updated: "2025-01-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 8192 }, cost: { input: 1.6, output: 6.4 } }, "qwen3-next-80b-a3b-instruct": { id: "qwen3-next-80b-a3b-instruct", name: "Qwen3-Next 80B-A3B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 1.2 } }, "gpt-4o-transcribe": { id: "gpt-4o-transcribe", name: "GPT-4o Transcribe", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-03-20", last_updated: "2025-03-20", modalities: { input: ["text", "audio"], output: ["text"] }, open_weights: false, limit: { context: 16000, output: 16000 }, cost: { input: 2.5, output: 10 } }, "grok-4-20-non-reasoning": { id: "grok-4-20-non-reasoning", name: "Grok 4.20 (Non-Reasoning)", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "hermes-4-70b": { id: "hermes-4-70b", name: "Hermes 4 70B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "hermes", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.13, output: 0.4 } }, "sonar-reasoning-pro": { id: "sonar-reasoning-pro", name: "Sonar Reasoning Pro", description: "Web-grounded Sonar for multi-step research questions that need cited reasoning", family: "sonar-reasoning", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 2, output: 8 } }, "mistral-large-2512": { id: "mistral-large-2512", name: "Mistral Large 3", description: "Mistral's largest general model for enterprise agents, coding, and multilingual reasoning", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.5, output: 1.5 } } } }, kenari: { id: "kenari", env: ["KENARI_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://kenari.id/v1", name: "Kenari", doc: "https://kenari.id/docs", models: { "gpt-image-2": { id: "gpt-image-2", name: "GPT-Image-2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 272000, output: 16384 }, cost: { input: 0, output: 0 } }, "mimo-v2-5": { id: "mimo-v2-5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0 } }, "grok-4-5": { id: "grok-4-5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 0, output: 0 } }, "grok-build-0-1": { id: "grok-build-0-1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0, output: 0 } }, "nemotron-3-nano-30b-a3b": { id: "nemotron-3-nano-30b-a3b", name: "Nemotron 3 Nano 30B A3B", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-12-15", last_updated: "2025-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0 } }, "kimi-k2-6": { id: "kimi-k2-6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 0, output: 0 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0, output: 0 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 0, output: 0 } }, "gpt-oss-20b": { id: "gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0, output: 0 } }, "kimi-k2-7-code:free": { id: "kimi-k2-7-code:free", name: "Kimi K2.7 Code (Free)", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0 } }, "gpt-5-6-luna": { id: "gpt-5-6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, cost: { input: 0, output: 0 } }, "mimo-v2-5:free": { id: "mimo-v2-5:free", name: "MiMo-V2.5 (Free)", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0 } }, "nemotron-3-super-120b-a12b": { id: "nemotron-3-super-120b-a12b", name: "Nemotron 3 Super 120B A12B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium"] }], tool_call: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0 } }, "minimax-m3": { id: "minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 512000, output: 128000 }, cost: { input: 0, output: 0 } }, "gemini-3-1-flash-lite": { id: "gemini-3-1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0, output: 0 } }, "kimi-k2-7-code": { id: "kimi-k2-7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0 } }, "gpt-5-4-mini": { id: "gpt-5-4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0, output: 0 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0, output: 0 } }, "deepseek-v4-flash:free": { id: "deepseek-v4-flash:free", name: "DeepSeek V4 Flash (Free)", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0, output: 0 } }, "glm-5-2": { id: "glm-5-2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0 } }, "gemini-2-5-flash-lite": { id: "gemini-2-5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0, output: 0 } }, "qwen3-7-plus": { id: "qwen3-7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0, output: 0 } }, "gpt-5-6-terra": { id: "gpt-5-6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, cost: { input: 0, output: 0 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0, output: 0 } }, "gemma-4-31b-it": { id: "gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "nemotron-3-ultra-550b-a55b": { id: "nemotron-3-ultra-550b-a55b", name: "Nemotron 3 Ultra 550B A55B", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high"] }], tool_call: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 0, output: 0 } }, "gpt-5-6-sol": { id: "gpt-5-6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, cost: { input: 0, output: 0 } }, "glm-4-7-flash:free": { id: "glm-4-7-flash:free", name: "GLM-4.7-Flash (Free)", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0, output: 0 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 0, output: 0 } }, "glm-5-1": { id: "glm-5-1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0, output: 0 } }, "gemini-2-5-flash": { id: "gemini-2-5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0, output: 0 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 0, output: 0 } }, "nemotron-3-super-120b-a12b:free": { id: "nemotron-3-super-120b-a12b:free", name: "Nemotron 3 Super 120B A12B (Free)", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium"] }], tool_call: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0 } }, "kimi-k2-6:free": { id: "kimi-k2-6:free", name: "Kimi K2.6 (Free)", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0 } }, "mimo-v2-5-pro": { id: "mimo-v2-5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0 } }, "gpt-5-5": { id: "gpt-5-5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0, output: 0 } } } }, friendli: { id: "friendli", env: ["FRIENDLI_TOKEN"], npm: "@ai-sdk/openai-compatible", api: "https://api.friendli.ai/serverless/v1", name: "Friendli", doc: "https://friendli.ai/docs/guides/serverless_endpoints/introduction", models: { "google/gemma-4-31B-it": { id: "google/gemma-4-31B-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.14, output: 0.4 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "zai-org/GLM-5.1": { id: "zai-org/GLM-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "MiniMaxAI/MiniMax-M2.5": { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 196608 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "deepseek-ai/DeepSeek-V3.2": { id: "deepseek-ai/DeepSeek-V3.2", name: "DeepSeek-V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 163840 }, cost: { input: 0.5, output: 1.5, cache_read: 0.25 } } } }, opencode: { id: "opencode", env: ["OPENCODE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://opencode.ai/zen/v1", name: "OpenCode Zen", doc: "https://opencode.ai/docs/zen", models: { "gpt-5.1-codex-mini": { id: "gpt-5.1-codex-mini", name: "GPT-5.1 Codex Mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "trinity-large-preview-free": { id: "trinity-large-preview-free", name: "Trinity Large Preview", description: "Legacy model retained for compatibility with older integrations", family: "trinity", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2026-01-28", last_updated: "2026-01-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, status: "deprecated", cost: { input: 0, output: 0 } }, "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, interleaved: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-02-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gpt-5.5-pro": { id: "gpt-5.5-pro", name: "GPT-5.5 Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 30, output: 180, cache_read: 30 } }, "hy3-preview-free": { id: "hy3-preview-free", name: "Hy3 preview Free", description: "Legacy model retained for compatibility with older integrations", family: "hy3-free", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "glm-5": { id: "glm-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.2 } }, "gemini-3.5-flash": { id: "gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, provider: { npm: "@ai-sdk/google" }, cost: { input: 1.5, output: 9, cache_read: 0.15, input_audio: 1.5 } }, "gpt-5.3-codex-spark": { id: "gpt-5.3-codex-spark", name: "GPT-5.3 Codex Spark", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex-spark", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "gpt-5.4-pro": { id: "gpt-5.4-pro", name: "GPT-5.4 Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 30, output: 180, cache_read: 30 } }, "qwen3.5-plus": { id: "qwen3.5-plus", name: "Qwen3.5 Plus", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, cache_write: 0.25 } }, "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 45, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1, cache_write: 12.5 } } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "gemini-3.5-flash-lite": { id: "gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, provider: { npm: "@ai-sdk/google" }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "minimax-m3-free": { id: "minimax-m3-free", name: "MiniMax-M3 Free", description: "Legacy model retained for compatibility with older integrations", family: "minimax-m3-free", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-31", last_updated: "2026-05-31", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 32000 }, status: "deprecated", provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0, output: 0, cache_read: 0 } }, "glm-4.7-free": { id: "glm-4.7-free", name: "GLM-4.7 Free", description: "Legacy model retained for compatibility with older integrations", family: "glm-free", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "gemini-3.1-pro": { id: "gemini-3.1-pro", name: "Gemini 3.1 Pro Preview", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, provider: { npm: "@ai-sdk/google" }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-10", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.6, output: 3, cache_read: 0.08 } }, "minimax-m2.7": { id: "minimax-m2.7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "north-mini-code-free": { id: "north-mini-code-free", name: "North Mini Code Free", description: "Cohere coding model for practical software engineering and agentic edits", family: "north-free", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-09-23", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0, output: 0 } }, "longcat-2.0-free": { id: "longcat-2.0-free", name: "LongCat-2.0 Free", description: "Meituan LongCat-2.0, a reasoning model with tool calling and a 1M-token context window", family: "longcat", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0 } }, "qwen3.6-plus-free": { id: "qwen3.6-plus-free", name: "Qwen3.6 Plus Free", description: "Legacy model retained for compatibility with older integrations", family: "qwen-free", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, status: "deprecated", provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0, output: 0, cache_read: 0 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "ling-3.0-flash-free": { id: "ling-3.0-flash-free", name: "Ling-3.0-flash Free", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "ling", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-23", last_updated: "2026-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "laguna-s-2.1-free": { id: "laguna-s-2.1-free", name: "Laguna S 2.1 Free", description: "Agentic coding model from Poolside in the XS size class for local deployment", family: "laguna", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 32000 }, cost: { input: 0, output: 0, cache_read: 0 } }, "deepseek-v4-flash-free": { id: "deepseek-v4-flash-free", name: "DeepSeek V4 Flash Free", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0, output: 0, cache_read: 0 } }, "gemini-3-flash": { id: "gemini-3-flash", name: "Gemini 3 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, provider: { npm: "@ai-sdk/google" }, cost: { input: 0.5, output: 3, cache_read: 0.05 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-10", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "glm-5-free": { id: "glm-5-free", name: "GLM-5 Free", description: "Legacy model retained for compatibility with older integrations", family: "glm-free", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "mimo-v2-omni-free": { id: "mimo-v2-omni-free", name: "MiMo V2 Omni Free", description: "Legacy model retained for compatibility with older integrations", family: "mimo-omni-free", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 64000 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "claude-opus-4-1": { id: "claude-opus-4-1", name: "Claude Opus 4.1", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, status: "deprecated", provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "minimax-m3": { id: "minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 512000, output: 128000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "gpt-5": { id: "gpt-5", name: "GPT-5", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 1.07, output: 8.5, cache_read: 0.107 } }, "minimax-m2.5-free": { id: "minimax-m2.5-free", name: "MiniMax-M2.5 Free", description: "Legacy model retained for compatibility with older integrations", family: "minimax-free", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, status: "deprecated", provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0, output: 0, cache_read: 0 } }, "gpt-5-codex": { id: "gpt-5-codex", name: "GPT-5 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 1.07, output: 8.5, cache_read: 0.107 } }, "claude-sonnet-4-5": { id: "claude-sonnet-4-5", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, interleaved: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "minimax-m2.1-free": { id: "minimax-m2.1-free", name: "MiniMax-M2.1 Free", description: "Legacy model retained for compatibility with older integrations", family: "minimax-free", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, status: "deprecated", provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0, output: 0, cache_read: 0 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 1.74, output: 3.84, cache_read: 0.145 } }, "gemini-3-pro": { id: "gemini-3-pro", name: "Gemini 3 Pro", description: "Legacy model retained for compatibility with older integrations", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, status: "deprecated", provider: { npm: "@ai-sdk/google" }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "glm-4.6": { id: "glm-4.6", name: "GLM-4.6", description: "Legacy model retained for compatibility with older integrations", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, status: "deprecated", cost: { input: 0.6, output: 2.2, cache_read: 0.1 } }, "mimo-v2-flash-free": { id: "mimo-v2-flash-free", name: "MiMo V2 Flash Free", description: "Legacy model retained for compatibility with older integrations", family: "mimo-flash-free", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "ling-3.0-tiny-free": { id: "ling-3.0-tiny-free", name: "Ling-3.0-tiny Free", description: "Compact MoE model for responsive agents, instruction following, and multi-turn conversations", family: "ling", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-08-06", last_updated: "2026-08-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "grok-code": { id: "grok-code", name: "Grok Code Fast 1", description: "Legacy model retained for compatibility with older integrations", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-08-20", last_updated: "2025-08-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "gpt-5.2-codex": { id: "gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-01-14", last_updated: "2026-01-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5.4-nano": { id: "gpt-5.4-nano", name: "GPT-5.4 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "gemini-3.6-flash": { id: "gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, provider: { npm: "@ai-sdk/google" }, cost: { input: 1.5, output: 7.5, cache_read: 0.15, input_audio: 1.5 } }, "hy3-free": { id: "hy3-free", name: "Hy3 Free", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "hy3-free", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-06-26", last_updated: "2026-06-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 190000, output: 64000 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "kimi-k2.5-free": { id: "kimi-k2.5-free", name: "Kimi K2.5 Free", description: "Legacy model retained for compatibility with older integrations", family: "kimi-free", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-10", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "claude-sonnet-4": { id: "claude-sonnet-4", name: "Claude Sonnet 4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "glm-4.7": { id: "glm-4.7", name: "GLM-4.7", description: "Legacy model retained for compatibility with older integrations", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, status: "deprecated", cost: { input: 0.6, output: 2.2, cache_read: 0.1 } }, "minimax-m2.5": { id: "minimax-m2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, cache_write: 0.25, tiers: [{ input: 0.4, output: 1.8, cache_read: 0.04, cache_write: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 0.4, output: 1.8, cache_read: 0.04, cache_write: 0.5 } } }, "mimo-v2.5-free": { id: "mimo-v2.5-free", name: "MiMo V2.5 Free", description: "MiMo omni model for text, image, video, audio, and agents", family: "mimo-v2.5-free", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 32000 }, cost: { input: 0, output: 0, cache_read: 0 } }, "gpt-5.2": { id: "gpt-5.2", name: "GPT-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5.3-codex": { id: "gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-24", last_updated: "2026-02-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "grok-4.5": { id: "grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 2, output: 6, cache_read: 0.5, tiers: [{ input: 4, output: 12, cache_read: 1, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 12, cache_read: 1 } } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "kimi-k2": { id: "kimi-k2", name: "Kimi K2", description: "Legacy model retained for compatibility with older integrations", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0.4, output: 2.5, cache_read: 0.4 } }, "gpt-5.1": { id: "gpt-5.1", name: "GPT-5.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 1.07, output: 8.5, cache_read: 0.107 } }, "big-pickle": { id: "big-pickle", name: "Big Pickle", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "big-pickle", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-10-17", last_updated: "2025-10-17", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 160000, output: 32000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "nemotron-3-super-free": { id: "nemotron-3-super-free", name: "Nemotron 3 Super Free", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron-free", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2026-02", release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 128000 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "kimi-k2-thinking": { id: "kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Legacy model retained for compatibility with older integrations", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-10", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0.4, output: 2.5, cache_read: 0.4 } }, "grok-build-0.1": { id: "grok-build-0.1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 1, output: 2, cache_read: 0.2 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "gpt-5.1-codex": { id: "gpt-5.1-codex", name: "GPT-5.1 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 1.07, output: 8.5, cache_read: 0.107 } }, "gpt-5-nano": { id: "gpt-5-nano", name: "GPT-5 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "claude-3-5-haiku": { id: "claude-3-5-haiku", name: "Claude Haiku 3.5", description: "Legacy model retained for compatibility with older integrations", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07-31", release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, status: "deprecated", provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0.8, output: 4, cache_read: 0.08, cache_write: 1 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "minimax-m2.1": { id: "minimax-m2.1", name: "MiniMax-M2.1", description: "Legacy model retained for compatibility with older integrations", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, status: "deprecated", cost: { input: 0.3, output: 1.2, cache_read: 0.1 } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 3.125, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, cache_write: 6.25, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5, cache_write: 6.25 } } }, "claude-opus-4-5": { id: "claude-opus-4-5", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "nemotron-3-ultra-free": { id: "nemotron-3-ultra-free", name: "Nemotron 3 Ultra Free", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron-free", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2026-02", release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 0, output: 0, cache_read: 0 } }, "claude-opus-5": { id: "claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gpt-5.1-codex-max": { id: "gpt-5.1-codex-max", name: "GPT-5.1 Codex Max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai" }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "qwen3-coder": { id: "qwen3-coder", name: "Qwen3 Coder", description: "Legacy model retained for compatibility with older integrations", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, status: "deprecated", cost: { input: 0.45, output: 1.8 } }, "qwen3.6-plus": { id: "qwen3.6-plus", name: "Qwen3.6 Plus", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 0.625 } }, "ring-2.6-1t-free": { id: "ring-2.6-1t-free", name: "Ring 2.6 1T Free", description: "Legacy model retained for compatibility with older integrations", family: "ring-1t-free", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-06", release_date: "2026-05-08", last_updated: "2026-05-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 66000 }, status: "deprecated", cost: { input: 0, output: 0 } }, "mimo-v2-pro-free": { id: "mimo-v2-pro-free", name: "MiMo V2 Pro Free", description: "Legacy model retained for compatibility with older integrations", family: "mimo-pro-free", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 64000 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "ling-2.6-flash-free": { id: "ling-2.6-flash-free", name: "Ling 2.6 Flash Free", description: "Legacy model retained for compatibility with older integrations", family: "ling-flash-free", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262100, output: 32800 }, status: "deprecated", cost: { input: 0, output: 0 } } } }, sakana: { id: "sakana", env: ["SAKANA_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.sakana.ai/v1", name: "Sakana AI", doc: "https://console.sakana.ai/models", models: { "fugu-ultra-20260615": { id: "fugu-ultra-20260615", name: "Fugu Ultra", description: "Quality-first multi-agent model for hard research, analysis, and competitions", family: "fugu", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-06-15", last_updated: "2026-06-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, provider: { shape: "responses" }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "fugu-ultra": { id: "fugu-ultra", name: "Fugu Ultra", description: "Quality-first multi-agent model for hard research, analysis, and competitions", family: "fugu", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-06-15", last_updated: "2026-06-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, provider: { shape: "responses" }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, fugu: { id: "fugu", name: "Fugu", description: "Multi-agent model for routing expert agents across complex analytical tasks", family: "fugu", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-06-15", last_updated: "2026-06-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, provider: { shape: "responses" } } } }, trustedrouter: { id: "trustedrouter", env: ["TRUSTEDROUTER_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.trustedrouter.com/v1", name: "TrustedRouter", doc: "https://trustedrouter.com/docs", models: { synth: { id: "synth", name: "Synth", description: "TrustedRouter synthesis orchestration alias that combines multiple model responses into one answer.", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-20", last_updated: "2026-06-27", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 } }, zdr: { id: "zdr", name: "Zero Data Retention", description: "TrustedRouter privacy routing alias that prefers zero data retention model endpoints.", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-27", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 } }, e2e: { id: "e2e", name: "End-to-End Encrypted", description: "TrustedRouter privacy routing alias for end-to-end encrypted provider routes where available.", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-27", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 } }, auto: { id: "auto", name: "Auto", description: "TrustedRouter automatic routing alias that chooses a healthy supported model endpoint for the request.", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-01", last_updated: "2026-06-27", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 } }, cheap: { id: "cheap", name: "Cheap", description: "TrustedRouter low-cost routing alias that prefers inexpensive healthy model endpoints.", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-01", last_updated: "2026-06-27", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 } }, "synth-code": { id: "synth-code", name: "Synth Code", description: "TrustedRouter code synthesis orchestration alias that combines multiple model responses into one answer.", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-20", last_updated: "2026-06-27", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 } }, fast: { id: "fast", name: "Fast", description: "TrustedRouter speed routing alias that prefers low-latency healthy model endpoints.", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-27", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 } } } }, "salad-cloud": { id: "salad-cloud", env: ["SALAD_CLOUD_API_KEY"], npm: "@saladtechnologies-oss/ai-sdk-provider", name: "SaladCloud AI Gateway", doc: "https://docs.salad.com/ai-gateway/explanation/overview", models: { "qwen3.6-35b-a3b": { id: "qwen3.6-35b-a3b", name: "Qwen3.6 35B-A3B", description: "Qwen MoE for agentic tasks, complex reasoning, code generation, and instruction following", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 262144, output: 262144 }, cost: { input: 0.09, output: 0.6 } } } }, "atomic-chat": { id: "atomic-chat", env: ["ATOMIC_CHAT_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "http://127.0.0.1:1337/v1", name: "Atomic Chat", doc: "https://atomic.chat", models: { "Qwen3_5-9B-Q4_K_M": { id: "Qwen3_5-9B-Q4_K_M", name: "Qwen 3.5 9B (Q4_K_M)", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-05", last_updated: "2026-04-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 0, output: 0 } }, "gemma-4-E4B-it-IQ4_XS": { id: "gemma-4-E4B-it-IQ4_XS", name: "Gemma 4 E4B Instruct (IQ4_XS)", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 0, output: 0 } }, "Qwen3_5-9B-MLX-4bit": { id: "Qwen3_5-9B-MLX-4bit", name: "Qwen 3.5 9B (MLX 4-bit)", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-05", last_updated: "2026-04-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 0, output: 0 } }, "gemma-4-E4B-it-MLX-4bit": { id: "gemma-4-E4B-it-MLX-4bit", name: "Gemma 4 E4B Instruct (MLX 4-bit)", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 0, output: 0 } }, "Meta-Llama-3_1-8B-Instruct-GGUF": { id: "Meta-Llama-3_1-8B-Instruct-GGUF", name: "Meta Llama 3.1 8B Instruct (GGUF)", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 4096 }, cost: { input: 0, output: 0 } } } }, inception: { id: "inception", env: ["INCEPTION_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.inceptionlabs.ai/v1/", name: "Inception", doc: "https://platform.inceptionlabs.ai/docs", models: { "mercury-edit-2": { id: "mercury-edit-2", name: "Mercury Edit 2", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, release_date: "2026-03-30", last_updated: "2026-03-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.25, output: 0.75, cache_read: 0.025 } }, "mercury-2": { id: "mercury-2", name: "Mercury 2", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "mercury", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-02-24", last_updated: "2026-02-24", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 50000 }, cost: { input: 0.25, output: 0.75, cache_read: 0.025 } } } }, "stepfun-step-plan": { id: "stepfun-step-plan", env: ["STEPFUN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.stepfun.com/step_plan/v1", name: "StepFun Step Plan (China)", doc: "https://platform.stepfun.com/docs/zh/step-plan/integrations/reasoning-api", models: { "step-3.5-flash": { id: "step-3.5-flash", name: "Step 3.5 Flash", description: "StepFun flash lane for quick multimodal reasoning and coding assistance", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-01-29", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 } }, "step-3.7-flash": { id: "step-3.7-flash", name: "Step 3.7 Flash", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 } }, "step-3.5-flash-2603": { id: "step-3.5-flash-2603", name: "Step 3.5 Flash 2603", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 } }, "step-router-v1": { id: "step-router-v1", name: "Step Router v1", description: "StepFun routing model that dispatches requests to the appropriate Step model.", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 256000 } } } }, "cloudflare-workers-ai": { id: "cloudflare-workers-ai", env: ["CLOUDFLARE_ACCOUNT_ID", "CLOUDFLARE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/v1", name: "Cloudflare Workers AI", doc: "https://developers.cloudflare.com/workers-ai/models/", models: { "@cf/aisingapore/gemma-sea-lion-v4-27b-it": { id: "@cf/aisingapore/gemma-sea-lion-v4-27b-it", name: "Gemma Sea Lion V4 27B It", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.351, output: 0.555 } }, "@cf/nvidia/nemotron-3-120b-a12b": { id: "@cf/nvidia/nemotron-3-120b-a12b", name: "Nemotron 3 Super 120B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: true, structured_output: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.5, output: 1.5 } }, "@cf/google/gemma-4-26b-a4b-it": { id: "@cf/google/gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 0.1, output: 0.3 } }, "@cf/zai-org/glm-4.7-flash": { id: "@cf/zai-org/glm-4.7-flash", name: "GLM-4.7-Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.0605, output: 0.4 } }, "@cf/zai-org/glm-5.2": { id: "@cf/zai-org/glm-5.2", name: "Glm 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "@cf/qwen/qwen3-30b-a3b-fp8": { id: "@cf/qwen/qwen3-30b-a3b-fp8", name: "Qwen3 30B A3b fp8", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-04-30", last_updated: "2025-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.0509, output: 0.335 } }, "@cf/qwen/qwq-32b": { id: "@cf/qwen/qwq-32b", name: "Qwq 32B", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-03-05", last_updated: "2025-03-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 24000, output: 24000 }, cost: { input: 0.66, output: 1 } }, "@cf/qwen/qwen2.5-coder-32b-instruct": { id: "@cf/qwen/qwen2.5-coder-32b-instruct", name: "Qwen2.5 Coder 32B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-02-27", last_updated: "2025-02-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.66, output: 1 } }, "@cf/mistralai/mistral-small-3.1-24b-instruct": { id: "@cf/mistralai/mistral-small-3.1-24b-instruct", name: "Mistral Small 3.1 24B Instruct", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-03-18", last_updated: "2025-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.351, output: 0.555 } }, "@cf/meta/llama-3.2-1b-instruct": { id: "@cf/meta/llama-3.2-1b-instruct", name: "Llama 3.2 1B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-12", release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 60000, output: 60000 }, cost: { input: 0.027, output: 0.201 } }, "@cf/meta/llama-3.2-3b-instruct": { id: "@cf/meta/llama-3.2-3b-instruct", name: "Llama 3.2 3B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-12", release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 80000, output: 80000 }, cost: { input: 0.0509, output: 0.335 } }, "@cf/meta/llama-3.3-70b-instruct-fp8-fast": { id: "@cf/meta/llama-3.3-70b-instruct-fp8-fast", name: "Llama 3.3 70B Instruct fp8 Fast", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 24000, output: 24000 }, cost: { input: 0.293, output: 2.253 } }, "@cf/meta/llama-guard-3-8b": { id: "@cf/meta/llama-guard-3-8b", name: "Llama Guard 3 8B", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-01-22", last_updated: "2025-01-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.484, output: 0.03 } }, "@cf/meta/llama-3.2-11b-vision-instruct": { id: "@cf/meta/llama-3.2-11b-vision-instruct", name: "Llama 3.2 11B Vision Instruct", description: "Open Llama multimodal model for image understanding and text reasoning", family: "llama", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.0485, output: 0.676 } }, "@cf/meta/llama-3.1-8b-instruct-fp8": { id: "@cf/meta/llama-3.1-8b-instruct-fp8", name: "Llama 3.1 8B Instruct fp8", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2024-07-25", last_updated: "2024-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 32000 }, cost: { input: 0.152, output: 0.287 } }, "@cf/meta/llama-4-scout-17b-16e-instruct": { id: "@cf/meta/llama-4-scout-17b-16e-instruct", name: "Llama 4 Scout 17B 16E Instruct", description: "Open Llama with long-context vision for efficient multimodal agents", family: "llama", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 16384 }, cost: { input: 0.27, output: 0.85 } }, "@cf/ibm-granite/granite-4.0-h-micro": { id: "@cf/ibm-granite/granite-4.0-h-micro", name: "Granite 4.0 H Micro", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "granite", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-10-07", last_updated: "2025-10-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 131000 }, cost: { input: 0.017, output: 0.112 } }, "@cf/deepseek-ai/deepseek-r1-distill-qwen-32b": { id: "@cf/deepseek-ai/deepseek-r1-distill-qwen-32b", name: "Deepseek R1 Distill Qwen 32B", description: "Classic open reasoning model for transparent math, coding, and deliberate problem solving", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 80000, output: 80000 }, cost: { input: 0.497, output: 4.881 } }, "@cf/moonshotai/kimi-k2.6": { id: "@cf/moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 256000 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "@cf/moonshotai/kimi-k2.7-code": { id: "@cf/moonshotai/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "@cf/openai/gpt-oss-20b": { id: "@cf/openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.2, output: 0.3 } }, "@cf/openai/gpt-oss-120b": { id: "@cf/openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.35, output: 0.75 } } } }, modelscope: { id: "modelscope", env: ["MODELSCOPE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api-inference.modelscope.cn/v1", name: "ModelScope", doc: "https://modelscope.cn/docs/model-service/API-Inference/intro", models: { "Qwen/Qwen3-235B-A22B-Instruct-2507": { id: "Qwen/Qwen3-235B-A22B-Instruct-2507", name: "Qwen3 235B A22B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04-28", last_updated: "2025-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0, output: 0 } }, "Qwen/Qwen3-Coder-30B-A3B-Instruct": { id: "Qwen/Qwen3-Coder-30B-A3B-Instruct", name: "Qwen3 Coder 30B A3B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-31", last_updated: "2025-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0, output: 0 } }, "Qwen/Qwen3-30B-A3B-Thinking-2507": { id: "Qwen/Qwen3-30B-A3B-Thinking-2507", name: "Qwen3 30B A3B Thinking 2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-30", last_updated: "2025-07-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "Qwen/Qwen3-30B-A3B-Instruct-2507": { id: "Qwen/Qwen3-30B-A3B-Instruct-2507", name: "Qwen3 30B A3B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-30", last_updated: "2025-07-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0, output: 0 } }, "Qwen/Qwen3-235B-A22B-Thinking-2507": { id: "Qwen/Qwen3-235B-A22B-Thinking-2507", name: "Qwen3-235B-A22B-Thinking-2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0, output: 0 } }, "ZhipuAI/GLM-4.5": { id: "ZhipuAI/GLM-4.5", name: "GLM-4.5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0, output: 0 } }, "ZhipuAI/GLM-4.6": { id: "ZhipuAI/GLM-4.6", name: "GLM-4.6", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-07", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 98304 }, cost: { input: 0, output: 0 } } } }, "github-copilot": { id: "github-copilot", env: ["GITHUB_TOKEN"], npm: "@ai-sdk/openai-compatible", api: "https://api.githubcopilot.com", name: "GitHub Copilot", doc: "https://docs.github.com/en/copilot", models: { "gemini-3.5-flash": { id: "gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }, { type: "budget_tokens", min: 256, max: 24000 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 128000, output: 64000 }, cost: { input: 1.5, output: 9, cache_read: 0.15, input_audio: 1.5 } }, "claude-sonnet-4.6": { id: "claude-sonnet-4.6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024, max: 32000 }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 168000, output: 32000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 45, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1, cache_write: 12.5 } } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "mai-code-1-flash-picker": { id: "mai-code-1-flash-picker", name: "MAI-Code-1-Flash", description: "Microsoft coding model built for fast, efficient assistance in everyday developer workflows", family: "mai", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-12", release_date: "2026-06-02", last_updated: "2026-06-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 128000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "claude-opus-4.5": { id: "claude-opus-4.5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 32000 }], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 168000, output: 32000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "claude-opus-4.7": { id: "claude-opus-4.7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 168000, output: 32000 }, experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-sonnet-4.5": { id: "claude-sonnet-4.5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 32000 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 168000, output: 32000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "gpt-5.2-codex": { id: "gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Code-specialist GPT for repository edits, reviews, and long-running software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5.4-nano": { id: "gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "gemini-3.6-flash": { id: "gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }, { type: "budget_tokens", min: 256, max: 32000 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 936000, output: 64000 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15 } }, "claude-sonnet-4": { id: "claude-sonnet-4", name: "Claude Sonnet 4 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 216000, input: 128000, output: 16000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, tiers: [{ input: 0.4, output: 1.8, cache_read: 0.04, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 0.4, output: 1.8, cache_read: 0.04 } } }, "gpt-5.2": { id: "gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "claude-haiku-4.5": { id: "claude-haiku-4.5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 32000 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 136000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "gpt-5.3-codex": { id: "gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 264000, input: 128000, output: 64000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "grok-4.5": { id: "grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, input: 372000, output: 128000 }, cost: { input: 2, output: 6, cache_read: 0.5, tiers: [{ input: 4, output: 12, cache_read: 1, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 12, cache_read: 1 } } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 224000, output: 32000 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "gemini-3.1-pro-preview": { id: "gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 256, max: 32000 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 936000, output: 64000 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "claude-opus-4.8": { id: "claude-opus-4.8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 168000, output: 64000 }, experimental: { modes: { fast: { cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "gpt-4.1": { id: "gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 16384 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "claude-opus-5": { id: "claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 936000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-opus-4.6": { id: "claude-opus-4.6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 168000, output: 32000 }, experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } } } }, "302ai": { id: "302ai", env: ["302AI_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.302.ai/v1", name: "302.AI", doc: "https://doc.302.ai", models: { "qwen3-coder-480b-a35b-instruct": { id: "qwen3-coder-480b-a35b-instruct", name: "qwen3-coder-480b-a35b-instruct", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.86, output: 3.43 } }, "grok-4.20-beta-0309-reasoning": { id: "grok-4.20-beta-0309-reasoning", name: "grok-4.20-beta-0309-reasoning", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 2, output: 6 } }, "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "claude-sonnet-4-6", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-18", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15 } }, "glm-4.6v": { id: "glm-4.6v", name: "GLM-4.6V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.145, output: 0.43 } }, "gpt-4.1-mini": { id: "gpt-4.1-mini", name: "gpt-4.1-mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6 } }, "gpt-4o": { id: "gpt-4o", name: "gpt-4o", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-05-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10 } }, "glm-5": { id: "glm-5", name: "glm-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.6 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "claude-haiku-4-5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-16", last_updated: "2025-10-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5 } }, "gpt-5.4-pro": { id: "gpt-5.4-pro", name: "gpt-5.4-pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, cache_read: 0, cache_write: 0, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "grok-4-fast-reasoning": { id: "grok-4-fast-reasoning", name: "grok-4-fast-reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 0.2, output: 0.5 } }, "qwen3-30b-a3b": { id: "qwen3-30b-a3b", name: "Qwen3-30B-A3B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04-29", last_updated: "2025-04-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.11, output: 1.08 } }, "glm-4.5-air": { id: "glm-4.5-air", name: "glm-4.5-air", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-29", last_updated: "2025-07-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.1143, output: 0.286 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "gemini-2.5-flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.3, output: 2.5 } }, "glm-5.1": { id: "glm-5.1", name: "glm-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-10", last_updated: "2026-04-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 0.86, output: 3.5 } }, "doubao-seed-1-6-vision-250815": { id: "doubao-seed-1-6-vision-250815", name: "doubao-seed-1-6-vision-250815", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 }, cost: { input: 0.114, output: 1.143 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "claude-opus-4-6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024, max: 127999 }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-06", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25 } }, "gpt-4.1-nano": { id: "gpt-4.1-nano", name: "gpt-4.1-nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.1, output: 0.4 } }, "kimi-k2-thinking-turbo": { id: "kimi-k2-thinking-turbo", name: "kimi-k2-thinking-turbo", description: "Kimi reasoning model for long-horizon research, planning, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 1.265, output: 9.119 } }, "claude-opus-4-1-20250805-thinking": { id: "claude-opus-4-1-20250805-thinking", name: "claude-opus-4-1-20250805-thinking", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-05-27", last_updated: "2025-05-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75 } }, "chatgpt-4o-latest": { id: "chatgpt-4o-latest", name: "chatgpt-4o-latest", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2023-09", release_date: "2024-08-08", last_updated: "2024-08-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 5, output: 15 } }, "glm-4.7-flashx": { id: "glm-4.7-flashx", name: "glm-4.7-flashx", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-20", last_updated: "2026-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0.0715, output: 0.429 } }, "gemini-3-pro-image-preview": { id: "gemini-3-pro-image-preview", name: "gemini-3-pro-image-preview", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-06", release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 64000 }, cost: { input: 2, output: 120 } }, "ministral-14b-2512": { id: "ministral-14b-2512", name: "ministral-14b-2512", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.33, output: 0.33 } }, "MiniMax-M2": { id: "MiniMax-M2", name: "MiniMax-M2", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-10-26", last_updated: "2025-10-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 0.33, output: 1.32 } }, "gpt-5.2-chat-latest": { id: "gpt-5.2-chat-latest", name: "gpt-5.2-chat-latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-12", last_updated: "2025-12-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14 } }, "grok-4.1": { id: "grok-4.1", name: "grok-4.1", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 2, output: 10 } }, "gemini-2.5-flash-nothink": { id: "gemini-2.5-flash-nothink", name: "gemini-2.5-flash-nothink", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-24", last_updated: "2025-06-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.3, output: 2.5 } }, "MiniMax-M1": { id: "MiniMax-M1", name: "MiniMax-M1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-06-16", last_updated: "2025-06-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 0.132, output: 1.254 } }, "MiniMax-M2.7": { id: "MiniMax-M2.7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-19", last_updated: "2026-03-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "claude-opus-4-6-thinking": { id: "claude-opus-4-6-thinking", name: "claude-opus-4-6-thinking", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2026-02-06", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25 } }, "gemini-3-flash-preview": { id: "gemini-3-flash-preview", name: "gemini-3-flash-preview", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-12-18", last_updated: "2025-12-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.5, output: 3 } }, "deepseek-v3.2-thinking": { id: "deepseek-v3.2-thinking", name: "DeepSeek-V3.2-Thinking", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.29, output: 0.43 } }, "gpt-5": { id: "gpt-5", name: "gpt-5", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-08", last_updated: "2025-08-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10 } }, "qwen3-235b-a22b": { id: "qwen3-235b-a22b", name: "Qwen3-235B-A22B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04-29", last_updated: "2025-04-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.29, output: 2.86 } }, "MiniMax-M2.1": { id: "MiniMax-M2.1", name: "MiniMax-M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-12-19", last_updated: "2025-12-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "gemini-3.1-flash-image-preview": { id: "gemini-3.1-flash-image-preview", name: "gemini-3.1-flash-image-preview", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2026-02-27", last_updated: "2026-02-27", modalities: { input: ["text", "image", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.5, output: 60 } }, "claude-sonnet-4-5": { id: "claude-sonnet-4-5", name: "claude-sonnet-4-5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15 } }, "grok-4.20-multi-agent-beta-0309": { id: "grok-4.20-multi-agent-beta-0309", name: "grok-4.20-multi-agent-beta-0309", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 2, output: 6 } }, "grok-4-fast-non-reasoning": { id: "grok-4-fast-non-reasoning", name: "grok-4-fast-non-reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 0.2, output: 0.5 } }, "glm-4.6": { id: "glm-4.6", name: "glm-4.6", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.286, output: 1.142 } }, "gemini-2.5-flash-preview-09-2025": { id: "gemini-2.5-flash-preview-09-2025", name: "gemini-2.5-flash-preview-09-2025", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-09-26", last_updated: "2025-09-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.3, output: 2.5 } }, "gpt-5.4": { id: "gpt-5.4", name: "gpt-5.4", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 0, tiers: [{ input: 5, output: 22.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5 } } }, "grok-4-1-fast-reasoning": { id: "grok-4-1-fast-reasoning", name: "grok-4-1-fast-reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 0.2, output: 0.5 } }, "glm-4.5": { id: "glm-4.5", name: "GLM-4.5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-29", last_updated: "2025-07-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.286, output: 1.142 } }, "qwen3-max-2025-09-23": { id: "qwen3-max-2025-09-23", name: "qwen3-max-2025-09-23", description: "Flagship model for demanding analysis, coding, and production agent workflows", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-24", last_updated: "2025-09-24", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 258048, output: 65536 }, cost: { input: 0.86, output: 3.43 } }, "claude-sonnet-4-5-20250929": { id: "claude-sonnet-4-5-20250929", name: "claude-sonnet-4-5-20250929", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15 } }, "glm-4.5v": { id: "glm-4.5v", name: "GLM-4.5V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-08-12", last_updated: "2025-08-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 64000, output: 16384 }, cost: { input: 0.29, output: 0.86 } }, "kimi-k2-0905-preview": { id: "kimi-k2-0905-preview", name: "kimi-k2-0905-preview", description: "Kimi model for long-context chat, coding, and agentic reasoning", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.632, output: 2.53 } }, "claude-opus-4-5-20251101": { id: "claude-opus-4-5-20251101", name: "claude-opus-4-5-20251101", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-25", last_updated: "2025-11-25", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25 } }, "gpt-5.4-nano": { id: "gpt-5.4-nano", name: "gpt-5.4-nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-19", last_updated: "2026-03-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25 } }, "qwen3-235b-a22b-instruct-2507": { id: "qwen3-235b-a22b-instruct-2507", name: "qwen3-235b-a22b-instruct-2507", description: "Tool-capable chat model for instruction following and agentic application workflows", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-30", last_updated: "2025-07-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 65536 }, cost: { input: 0.29, output: 1.143 } }, "claude-3-5-haiku-latest": { id: "claude-3-5-haiku-latest", name: "claude-3-5-haiku-latest", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07-31", release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 0.8, output: 4 } }, "gpt-5-pro": { id: "gpt-5-pro", name: "gpt-5-pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-10-08", last_updated: "2025-10-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 272000 }, cost: { input: 15, output: 120 } }, "qwen-flash": { id: "qwen-flash", name: "Qwen-Flash", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.022, output: 0.22 } }, "deepseek-v3.2": { id: "deepseek-v3.2", name: "deepseek-v3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.29, output: 0.43 } }, "doubao-seed-1-6-thinking-250715": { id: "doubao-seed-1-6-thinking-250715", name: "doubao-seed-1-6-thinking-250715", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-07-15", last_updated: "2025-07-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 16000 }, cost: { input: 0.121, output: 1.21 } }, "glm-for-coding": { id: "glm-for-coding", name: "glm-for-coding", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 0.086, output: 0.343 } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "gpt-5.4-mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-19", last_updated: "2026-03-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5 } }, "claude-sonnet-4-5-20250929-thinking": { id: "claude-sonnet-4-5-20250929-thinking", name: "claude-sonnet-4-5-20250929-thinking", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15 } }, "qwen-plus": { id: "qwen-plus", name: "Qwen-Plus", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.12, output: 1.2 } }, "glm-4.7": { id: "glm-4.7", name: "glm-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.286, output: 1.142 } }, "gpt-5.2": { id: "gpt-5.2", name: "gpt-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-12", last_updated: "2025-12-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14 } }, "gemini-2.5-flash-image": { id: "gemini-2.5-flash-image", name: "gemini-2.5-flash-image", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-10-08", last_updated: "2025-10-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.3, output: 30 } }, "claude-3-5-haiku-20241022": { id: "claude-3-5-haiku-20241022", name: "claude-3-5-haiku-20241022", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07-31", release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 0.8, output: 4 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "gpt-5-mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-08", last_updated: "2025-08-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2 } }, "claude-haiku-4-5-20251001": { id: "claude-haiku-4-5-20251001", name: "claude-haiku-4-5-20251001", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-16", last_updated: "2025-10-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5 } }, "deepseek-chat": { id: "deepseek-chat", name: "Deepseek-Chat", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-11-29", last_updated: "2024-11-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.29, output: 0.43 } }, "doubao-seed-1-8-251215": { id: "doubao-seed-1-8-251215", name: "doubao-seed-1-8-251215", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-12-18", last_updated: "2025-12-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 224000, output: 64000 }, cost: { input: 0.114, output: 0.286 } }, "gemini-2.5-flash-lite-preview-09-2025": { id: "gemini-2.5-flash-lite-preview-09-2025", name: "gemini-2.5-flash-lite-preview-09-2025", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-09-26", last_updated: "2025-09-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.1, output: 0.4 } }, "glm-4.5-airx": { id: "glm-4.5-airx", name: "glm-4.5-airx", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-29", last_updated: "2025-07-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.572, output: 1.714 } }, "claude-opus-4-5-20251101-thinking": { id: "claude-opus-4-5-20251101-thinking", name: "claude-opus-4-5-20251101-thinking", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-11-25", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25 } }, "gpt-5.1": { id: "gpt-5.1", name: "gpt-5.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10 } }, "gpt-5.4-nano-2026-03-17": { id: "gpt-5.4-nano-2026-03-17", name: "gpt-5.4-nano-2026-03-17", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-19", last_updated: "2026-03-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25 } }, "kimi-k2-thinking": { id: "kimi-k2-thinking", name: "kimi-k2-thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.575, output: 2.3 } }, "MiniMax-M2.7-highspeed": { id: "MiniMax-M2.7-highspeed", name: "MiniMax-M2.7-highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-19", last_updated: "2026-03-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 4.8 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "gemini-2.5-pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 1.25, output: 10 } }, "grok-4-1-fast-non-reasoning": { id: "grok-4-1-fast-non-reasoning", name: "grok-4-1-fast-non-reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 0.2, output: 0.5 } }, "gemini-3-pro-preview": { id: "gemini-3-pro-preview", name: "gemini-3-pro-preview", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-11-19", last_updated: "2025-11-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 2, output: 12 } }, "glm-5-turbo": { id: "glm-5-turbo", name: "glm-5-turbo", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 0.72, output: 3.2 } }, "glm-5v-turbo": { id: "glm-5v-turbo", name: "GLM-5V-Turbo", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 0.72, output: 3.2 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "claude-opus-4-7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "claude-sonnet-4-20250514": { id: "claude-sonnet-4-20250514", name: "claude-sonnet-4-20250514", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15 } }, "gemini-2.0-flash-lite": { id: "gemini-2.0-flash-lite", name: "gemini-2.0-flash-lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-11", release_date: "2025-06-16", last_updated: "2025-06-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 8192 }, cost: { input: 0.075, output: 0.3 } }, "claude-opus-4-5": { id: "claude-opus-4-5", name: "claude-opus-4-5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-25", last_updated: "2025-11-25", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25 } }, "grok-4.20-beta-0309-non-reasoning": { id: "grok-4.20-beta-0309-non-reasoning", name: "grok-4.20-beta-0309-non-reasoning", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 2, output: 6 } }, "gpt-5.4-mini-2026-03-17": { id: "gpt-5.4-mini-2026-03-17", name: "gpt-5.4-mini-2026-03-17", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-19", last_updated: "2026-03-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5 } }, "glm-4.5-x": { id: "glm-4.5-x", name: "glm-4.5-x", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-29", last_updated: "2025-07-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.143, output: 2.29 } }, "gpt-4.1": { id: "gpt-4.1", name: "gpt-4.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8 } }, "claude-opus-4-20250514": { id: "claude-opus-4-20250514", name: "claude-opus-4-20250514", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 31999 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75 } }, "claude-sonnet-4-6-thinking": { id: "claude-sonnet-4-6-thinking", name: "claude-sonnet-4-6-thinking", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-08", release_date: "2026-02-18", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15 } }, "deepseek-reasoner": { id: "deepseek-reasoner", name: "Deepseek-Reasoner", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.29, output: 0.43 } }, "gpt-5-thinking": { id: "gpt-5-thinking", name: "gpt-5-thinking", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-08-08", last_updated: "2025-08-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10 } }, "doubao-seed-code-preview-251028": { id: "doubao-seed-code-preview-251028", name: "doubao-seed-code-preview-251028", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-11-11", last_updated: "2025-11-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 }, cost: { input: 0.17, output: 1.14 } }, "gpt-5.1-chat-latest": { id: "gpt-5.1-chat-latest", name: "gpt-5.1-chat-latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.25, output: 10 } }, "claude-opus-4-1-20250805": { id: "claude-opus-4-1-20250805", name: "claude-opus-4-1-20250805", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 31999 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75 } }, "qwen-max-latest": { id: "qwen-max-latest", name: "Qwen-Max-Latest", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-04-03", last_updated: "2025-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.343, output: 1.372 } }, "mistral-large-2512": { id: "mistral-large-2512", name: "mistral-large-2512", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 262144 }, cost: { input: 1.1, output: 3.3 } } } }, helicone: { id: "helicone", env: ["HELICONE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://ai-gateway.helicone.ai/v1", name: "Helicone", doc: "https://helicone.ai/models", models: { "gpt-5.1-codex-mini": { id: "gpt-5.1-codex-mini", name: "OpenAI: GPT-5.1 Codex Mini", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-codex", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.024999999999999998 } }, "grok-4": { id: "grok-4", name: "xAI Grok 4", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-07-09", last_updated: "2024-07-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 3, output: 15, cache_read: 0.75 } }, "qwen2.5-coder-7b-fast": { id: "qwen2.5-coder-7b-fast", name: "Qwen2.5 Coder 7B fast", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-09", release_date: "2024-09-15", last_updated: "2024-09-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 8192 }, cost: { input: 0.03, output: 0.09 } }, "qwen3-32b": { id: "qwen3-32b", name: "Qwen3 32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04-28", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 40960 }, cost: { input: 0.29, output: 0.59 } }, "gpt-4.1-mini": { id: "gpt-4.1-mini", name: "OpenAI GPT-4.1 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.39999999999999997, output: 1.5999999999999999, cache_read: 0.09999999999999999 } }, "gpt-4o": { id: "gpt-4o", name: "OpenAI GPT-4o", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-05", release_date: "2024-05-13", last_updated: "2024-05-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "kimi-k2-0711": { id: "kimi-k2-0711", name: "Kimi K2 (07/11)", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0.5700000000000001, output: 2.3 } }, "claude-3.7-sonnet": { id: "claude-3.7-sonnet", name: "Anthropic: Claude 3.7 Sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-02", release_date: "2025-02-19", last_updated: "2025-02-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.30000000000000004, cache_write: 3.75 } }, "grok-4-fast-reasoning": { id: "grok-4-fast-reasoning", name: "xAI: Grok 4 Fast Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-09-01", last_updated: "2025-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 0.19999999999999998, output: 0.5, cache_read: 0.049999999999999996 } }, "qwen3-30b-a3b": { id: "qwen3-30b-a3b", name: "Qwen3 30B A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-06-01", last_updated: "2025-06-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 41000, output: 41000 }, cost: { input: 0.08, output: 0.29 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Google Gemini 2.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.3, output: 2.5, cache_read: 0.075, cache_write: 0.3 } }, "gpt-4.1-nano": { id: "gpt-4.1-nano", name: "OpenAI GPT-4.1 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.09999999999999999, output: 0.39999999999999997, cache_read: 0.024999999999999998 } }, "qwen3-coder-30b-a3b-instruct": { id: "qwen3-coder-30b-a3b-instruct", name: "Qwen3 Coder 30B A3B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-31", last_updated: "2025-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.09999999999999999, output: 0.3 } }, "gpt-oss-20b": { id: "gpt-oss-20b", name: "OpenAI GPT-OSS 20b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2024-06", release_date: "2024-06-01", last_updated: "2024-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.049999999999999996, output: 0.19999999999999998 } }, "chatgpt-4o-latest": { id: "chatgpt-4o-latest", name: "OpenAI ChatGPT-4o", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2024-08-14", last_updated: "2024-08-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 5, output: 20, cache_read: 2.5 } }, "o3-mini": { id: "o3-mini", name: "OpenAI o3 Mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2023-10", release_date: "2023-10-01", last_updated: "2023-10-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "grok-code-fast-1": { id: "grok-code-fast-1", name: "xAI Grok Code Fast 1", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2024-08-25", last_updated: "2024-08-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 1e4 }, cost: { input: 0.19999999999999998, output: 1.5, cache_read: 0.02 } }, "sonar-deep-research": { id: "sonar-deep-research", name: "Perplexity Sonar Deep Research", description: "Sonar search model for current answers, retrieval, and citation-backed chat", family: "sonar-deep-research", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-01-27", last_updated: "2025-01-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 127000, output: 4096 }, cost: { input: 2, output: 8 } }, sonar: { id: "sonar", name: "Perplexity Sonar", description: "Sonar search model for current answers, retrieval, and citation-backed chat", family: "sonar", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-01-27", last_updated: "2025-01-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 127000, output: 4096 }, cost: { input: 1, output: 1 } }, "llama-3.3-70b-versatile": { id: "llama-3.3-70b-versatile", name: "Meta Llama 3.3 70B Versatile", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32678 }, cost: { input: 0.59, output: 0.7899999999999999 } }, "sonar-pro": { id: "sonar-pro", name: "Perplexity Sonar Pro", description: "Advanced Sonar search model for deeper research and cited synthesis", family: "sonar-pro", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-01-27", last_updated: "2025-01-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, cost: { input: 3, output: 15 } }, "mistral-large-2411": { id: "mistral-large-2411", name: "Mistral-Large", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-07-24", last_updated: "2024-07-24", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32768 }, cost: { input: 2, output: 6 } }, "deepseek-r1-distill-llama-70b": { id: "deepseek-r1-distill-llama-70b", name: "DeepSeek R1 Distill Llama 70B", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-01-20", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 0.03, output: 0.13 } }, "claude-3.5-haiku": { id: "claude-3.5-haiku", name: "Anthropic: Claude 3.5 Haiku", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 0.7999999999999999, output: 4, cache_read: 0.08, cache_write: 1 } }, "claude-opus-4-1": { id: "claude-opus-4-1", name: "Anthropic: Claude Opus 4.1", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 31999 }], tool_call: true, temperature: true, knowledge: "2025-08", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "o3-pro": { id: "o3-pro", name: "OpenAI o3 Pro", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-pro", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2024-06", release_date: "2024-06-01", last_updated: "2024-06-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 20, output: 80 } }, "gpt-4o-mini": { id: "gpt-4o-mini", name: "OpenAI GPT-4o-mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "gpt-5": { id: "gpt-5", name: "OpenAI GPT-5", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.12500000000000003 } }, "llama-3.1-8b-instant": { id: "llama-3.1-8b-instant", name: "Meta Llama 3.1 8B Instant", description: "Compact Llama instruction model for fast chat and local deployment", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-07-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32678 }, cost: { input: 0.049999999999999996, output: 0.08 } }, "claude-4.5-opus": { id: "claude-4.5-opus", name: "Anthropic: Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-11", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-4.5-sonnet": { id: "claude-4.5-sonnet", name: "Anthropic: Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.30000000000000004, cache_write: 3.75 } }, "gpt-5-codex": { id: "gpt-5-codex", name: "OpenAI: GPT-5 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.12500000000000003 } }, "llama-3.3-70b-instruct": { id: "llama-3.3-70b-instruct", name: "Meta Llama 3.3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16400 }, cost: { input: 0.13, output: 0.39 } }, "grok-4-fast-non-reasoning": { id: "grok-4-fast-non-reasoning", name: "xAI Grok 4 Fast Non-Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-09-19", last_updated: "2025-09-19", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 0.19999999999999998, output: 0.5, cache_read: 0.049999999999999996 } }, "glm-4.6": { id: "glm-4.6", name: "Zai GLM-4.6", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131072 }, cost: { input: 0.44999999999999996, output: 1.5 } }, "gpt-5-chat-latest": { id: "gpt-5-chat-latest", name: "OpenAI GPT-5 Chat Latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-codex", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2024-09", release_date: "2024-09-30", last_updated: "2024-09-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.25, output: 10, cache_read: 0.12500000000000003 } }, "claude-4.5-haiku": { id: "claude-4.5-haiku", name: "Anthropic: Claude 4.5 Haiku", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-10", release_date: "2025-10-01", last_updated: "2025-10-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 1, output: 5, cache_read: 0.09999999999999999, cache_write: 1.25 } }, "grok-4-1-fast-reasoning": { id: "grok-4-1-fast-reasoning", name: "xAI Grok 4.1 Fast Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-11", release_date: "2025-11-17", last_updated: "2025-11-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 0.19999999999999998, output: 0.5, cache_read: 0.049999999999999996 } }, "claude-sonnet-4-5-20250929": { id: "claude-sonnet-4-5-20250929", name: "Anthropic: Claude Sonnet 4.5 (20250929)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.30000000000000004, cache_write: 3.75 } }, "hermes-2-pro-llama-3-8b": { id: "hermes-2-pro-llama-3-8b", name: "Hermes 2 Pro Llama 3 8B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-05", release_date: "2024-05-27", last_updated: "2024-05-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.14, output: 0.14 } }, "ernie-4.5-21b-a3b-thinking": { id: "ernie-4.5-21b-a3b-thinking", name: "Baidu Ernie 4.5 21B A3B Thinking", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "ernie", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2025-03", release_date: "2025-03-16", last_updated: "2025-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8000 }, cost: { input: 0.07, output: 0.28 } }, "deepseek-v3": { id: "deepseek-v3", name: "DeepSeek V3", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2024-12-26", last_updated: "2024-12-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.56, output: 1.68, cache_read: 0.07 } }, "llama-prompt-guard-2-22m": { id: "llama-prompt-guard-2-22m", name: "Meta Llama Prompt Guard 2 22M", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-10", release_date: "2024-10-01", last_updated: "2024-10-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 512, output: 2 }, cost: { input: 0.01, output: 0.01 } }, "mistral-nemo": { id: "mistral-nemo", name: "Mistral Nemo", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-07", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16400 }, cost: { input: 20, output: 40 } }, "qwen3-vl-235b-a22b-instruct": { id: "qwen3-vl-235b-a22b-instruct", name: "Qwen3 VL 235B A22B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 16384 }, cost: { input: 0.3, output: 1.5 } }, "gpt-5-pro": { id: "gpt-5-pro", name: "OpenAI: GPT-5 Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32768 }, cost: { input: 15, output: 120 } }, "llama-4-maverick": { id: "llama-4-maverick", name: "Meta Llama 4 Maverick 17B 128E", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.15, output: 0.6 } }, "deepseek-v3.2": { id: "deepseek-v3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-09-22", last_updated: "2025-09-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 65536 }, cost: { input: 0.27, output: 0.41 } }, "claude-sonnet-4": { id: "claude-sonnet-4", name: "Anthropic: Claude Sonnet 4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-05-14", last_updated: "2025-05-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.30000000000000004, cache_write: 3.75 } }, "deepseek-tng-r1t2-chimera": { id: "deepseek-tng-r1t2-chimera", name: "DeepSeek TNG R1T2 Chimera", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek-thinking", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-02", last_updated: "2025-07-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 130000, output: 163840 }, cost: { input: 0.3, output: 1.2 } }, "gemma-3-12b-it": { id: "gemma-3-12b-it", name: "Google Gemma 3 12B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-12", release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.049999999999999996, output: 0.09999999999999999 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "OpenAI GPT-OSS 120b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2024-06", release_date: "2024-06-01", last_updated: "2024-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.04, output: 0.16 } }, o1: { id: "o1", name: "OpenAI: o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 15, output: 60, cache_read: 7.5 } }, "llama-4-scout": { id: "llama-4-scout", name: "Meta Llama 4 Scout 17B 16E", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.08, output: 0.3 } }, "llama-3.1-8b-instruct-turbo": { id: "llama-3.1-8b-instruct-turbo", name: "Meta Llama 3.1 8B Instruct Turbo", description: "Compact Llama instruction model for fast chat and local deployment", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.02, output: 0.03 } }, "claude-3.5-sonnet-v2": { id: "claude-3.5-sonnet-v2", name: "Anthropic: Claude 3.5 Sonnet v2", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 3, output: 15, cache_read: 0.30000000000000004, cache_write: 3.75 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "OpenAI GPT-5 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.024999999999999998 } }, "claude-haiku-4-5-20251001": { id: "claude-haiku-4-5-20251001", name: "Anthropic: Claude 4.5 Haiku (20251001)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-10", release_date: "2025-10-01", last_updated: "2025-10-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 1, output: 5, cache_read: 0.09999999999999999, cache_write: 1.25 } }, "mistral-small": { id: "mistral-small", name: "Mistral Small 3.2", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-06-20", last_updated: "2025-06-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.075, output: 0.2 } }, "deepseek-v3.1-terminus": { id: "deepseek-v3.1-terminus", name: "DeepSeek V3.1 Terminus", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-09-22", last_updated: "2025-09-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.27, output: 1, cache_read: 0.21600000000000003 } }, "gpt-5.1": { id: "gpt-5.1", name: "OpenAI GPT-5.1", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.12500000000000003 } }, "kimi-k2-thinking": { id: "kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-11", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 262144 }, cost: { input: 0.48, output: 2 } }, "gemma2-9b-it": { id: "gemma2-9b-it", name: "Google Gemma 2", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-06", release_date: "2024-06-25", last_updated: "2024-06-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 8192 }, cost: { input: 0.01, output: 0.03 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "Google Gemini 2.5 Pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.3125, cache_write: 1.25 } }, "grok-4-1-fast-non-reasoning": { id: "grok-4-1-fast-non-reasoning", name: "xAI Grok 4.1 Fast Non-Reasoning", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "grok", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-11", release_date: "2025-11-17", last_updated: "2025-11-17", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 0.19999999999999998, output: 0.5, cache_read: 0.049999999999999996 } }, "gpt-5.1-codex": { id: "gpt-5.1-codex", name: "OpenAI: GPT-5.1 Codex", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-codex", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.12500000000000003 } }, "llama-3.1-8b-instruct": { id: "llama-3.1-8b-instruct", name: "Meta Llama 3.1 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 16384 }, cost: { input: 0.02, output: 0.049999999999999996 } }, "claude-opus-4": { id: "claude-opus-4", name: "Anthropic: Claude Opus 4", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 31999 }], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-05-14", last_updated: "2025-05-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "gpt-5-nano": { id: "gpt-5-nano", name: "OpenAI GPT-5 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.049999999999999996, output: 0.39999999999999997, cache_read: 0.005 } }, "gemini-3-pro-preview": { id: "gemini-3-pro-preview", name: "Google Gemini 3 Pro Preview", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, temperature: true, knowledge: "2025-11", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.19999999999999998 } }, "gemini-2.5-flash-lite": { id: "gemini-2.5-flash-lite", name: "Google Gemini 2.5 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 512, max: 24576 }], tool_call: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-22", last_updated: "2025-07-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.09999999999999999, output: 0.39999999999999997, cache_read: 0.024999999999999998, cache_write: 0.09999999999999999 } }, o3: { id: "o3", name: "OpenAI o3", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2024-06", release_date: "2024-06-01", last_updated: "2024-06-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "llama-prompt-guard-2-86m": { id: "llama-prompt-guard-2-86m", name: "Meta Llama Prompt Guard 2 86M", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-10", release_date: "2024-10-01", last_updated: "2024-10-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 512, output: 2 }, cost: { input: 0.01, output: 0.01 } }, "gpt-4.1": { id: "gpt-4.1", name: "OpenAI GPT-4.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "o4-mini": { id: "o4-mini", name: "OpenAI o4 Mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2024-06", release_date: "2024-06-01", last_updated: "2024-06-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.275 } }, "claude-3-haiku-20240307": { id: "claude-3-haiku-20240307", name: "Anthropic: Claude 3 Haiku", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-03", release_date: "2024-03-07", last_updated: "2024-03-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, cost: { input: 0.25, output: 1.25, cache_read: 0.03, cache_write: 0.3 } }, "grok-3-mini": { id: "grok-3-mini", name: "xAI Grok 3 Mini", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06", release_date: "2024-06-01", last_updated: "2024-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.3, output: 0.5, cache_read: 0.075 } }, "o1-mini": { id: "o1-mini", name: "OpenAI: o1-mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 65536 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "kimi-k2-0905": { id: "kimi-k2-0905", name: "Kimi K2 (09/05)", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 16384 }, cost: { input: 0.5, output: 2, cache_read: 0.39999999999999997 } }, "gpt-4.1-mini-2025-04-14": { id: "gpt-4.1-mini-2025-04-14", name: "OpenAI GPT-4.1 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.39999999999999997, output: 1.5999999999999999, cache_read: 0.09999999999999999 } }, "deepseek-reasoner": { id: "deepseek-reasoner", name: "DeepSeek Reasoner", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-01-20", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, cost: { input: 0.56, output: 1.68, cache_read: 0.07 } }, "qwen3-coder": { id: "qwen3-coder", name: "Qwen3 Coder 480B A35B Instruct Turbo", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 16384 }, cost: { input: 0.22, output: 0.95 } }, "gpt-5.1-chat-latest": { id: "gpt-5.1-chat-latest", name: "OpenAI GPT-5.1 Chat", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-codex", attachment: false, reasoning: false, tool_call: true, temperature: false, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.25, output: 10, cache_read: 0.12500000000000003 } }, "claude-opus-4-1-20250805": { id: "claude-opus-4-1-20250805", name: "Anthropic: Claude Opus 4.1 (20250805)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 31999 }], tool_call: true, temperature: true, knowledge: "2025-08", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "grok-3": { id: "grok-3", name: "xAI Grok 3", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06", release_date: "2024-06-01", last_updated: "2024-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.75 } }, "sonar-reasoning": { id: "sonar-reasoning", name: "Perplexity Sonar Reasoning", description: "Web-grounded reasoning model for multi-step research and cited answers", family: "sonar-reasoning", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-01-27", last_updated: "2025-01-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 127000, output: 4096 }, cost: { input: 1, output: 5 } }, "qwen3-next-80b-a3b-instruct": { id: "qwen3-next-80b-a3b-instruct", name: "Qwen3 Next 80B A3B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 16384 }, cost: { input: 0.14, output: 1.4 } }, "qwen3-235b-a22b-thinking": { id: "qwen3-235b-a22b-thinking", name: "Qwen3 235B A22B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2025-07", release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 81920 }, cost: { input: 0.3, output: 2.9000000000000004 } }, "llama-guard-4": { id: "llama-guard-4", name: "Meta Llama Guard 4 12B", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 1024 }, cost: { input: 0.21, output: 0.21 } }, "sonar-reasoning-pro": { id: "sonar-reasoning-pro", name: "Perplexity Sonar Reasoning Pro", description: "Web-grounded reasoning model for multi-step research and cited answers", family: "sonar-reasoning", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-01-27", last_updated: "2025-01-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 127000, output: 4096 }, cost: { input: 2, output: 8 } } } }, "alibaba-coding-plan": { id: "alibaba-coding-plan", env: ["ALIBABA_CODING_PLAN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://coding-intl.dashscope.aliyuncs.com/v1", name: "Alibaba Coding Plan", doc: "https://www.alibabacloud.com/help/en/model-studio/coding-plan", models: { "qwen3.7-plus": { id: "qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5": { id: "glm-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 16384 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3.5-plus": { id: "qwen3.5-plus", name: "Qwen3.5 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3.7-max": { id: "qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5, cache_write: 3.125 } }, "qwen3-coder-plus": { id: "qwen3-coder-plus", name: "Qwen3 Coder Plus", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-4.7": { id: "glm-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 16384 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3-max-2026-01-23": { id: "qwen3-max-2026-01-23", name: "Qwen3 Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-23", last_updated: "2026-01-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "MiniMax-M2.5": { id: "MiniMax-M2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, input: 196601, output: 24576 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3.6-flash": { id: "qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.1875, output: 1.125, cache_write: 0.234375 } }, "qwen3-coder-next": { id: "qwen3-coder-next", name: "Qwen3 Coder Next", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-03", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3.6-plus": { id: "qwen3.6-plus", name: "Qwen3.6 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, watsonx: { id: "watsonx", env: ["WATSONX_AI_APIKEY", "WATSONX_AI_PROJECT_ID"], npm: "watsonx-ai-provider", name: "watsonx.ai", doc: "https://www.ibm.com/docs/en/watsonx/saas?topic=solutions-supported-foundation-models", models: { "mistralai/mistral-small-3-1-24b-instruct-2503": { id: "mistralai/mistral-small-3-1-24b-instruct-2503", name: "Mistral Small 3.1 24B", description: "Efficient multimodal model for instruction following, coding, reasoning, and function calling", family: "mistral-small", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06", release_date: "2025-03-17", last_updated: "2025-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.106, output: 0.318 } }, "ibm/granite-4-h-small": { id: "ibm/granite-4-h-small", name: "Granite-4.0-H-Small", description: "Open-weight hybrid model for enterprise chat, coding, retrieval-augmented generation, and tool-calling workloads", family: "granite", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-02", last_updated: "2025-10-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.0636, output: 0.265 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.159, output: 0.636 } }, "meta-llama/llama-4-maverick-17b-128e-instruct-fp8": { id: "meta-llama/llama-4-maverick-17b-128e-instruct-fp8", name: "Llama 4 Maverick 17B 128E Instruct FP8", description: "Open multimodal Llama for strong reasoning with efficient everyday serving", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.371, output: 1.484 } }, "meta-llama/llama-3-3-70b-instruct": { id: "meta-llama/llama-3-3-70b-instruct", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 4096 }, cost: { input: 0.7526, output: 0.7526 } } } }, submodel: { id: "submodel", env: ["SUBMODEL_INSTAGEN_ACCESS_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://llm.submodel.ai/v1", name: "submodel", doc: "https://submodel.gitbook.io", models: { "zai-org/GLM-4.5-Air": { id: "zai-org/GLM-4.5-Air", name: "GLM 4.5 Air", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-air", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.1, output: 0.5 } }, "zai-org/GLM-4.5-FP8": { id: "zai-org/GLM-4.5-FP8", name: "GLM 4.5 FP8", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.2, output: 0.8 } }, "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8": { id: "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", name: "Qwen3 Coder 480B A35B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-08-23", last_updated: "2025-08-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.2, output: 0.8 } }, "Qwen/Qwen3-235B-A22B-Instruct-2507": { id: "Qwen/Qwen3-235B-A22B-Instruct-2507", name: "Qwen3 235B A22B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-08-23", last_updated: "2025-08-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.2, output: 0.3 } }, "Qwen/Qwen3-235B-A22B-Thinking-2507": { id: "Qwen/Qwen3-235B-A22B-Thinking-2507", name: "Qwen3 235B A22B Thinking 2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-08-23", last_updated: "2025-08-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.2, output: 0.6 } }, "deepseek-ai/DeepSeek-R1-0528": { id: "deepseek-ai/DeepSeek-R1-0528", name: "DeepSeek R1 0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-08-23", last_updated: "2025-08-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 75000, output: 163840 }, cost: { input: 0.5, output: 2.15 } }, "deepseek-ai/DeepSeek-V3-0324": { id: "deepseek-ai/DeepSeek-V3-0324", name: "DeepSeek V3 0324", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-08-23", last_updated: "2025-08-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 75000, output: 163840 }, cost: { input: 0.2, output: 0.8 } }, "deepseek-ai/DeepSeek-V3.1": { id: "deepseek-ai/DeepSeek-V3.1", name: "DeepSeek V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-08-23", last_updated: "2025-08-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 75000, output: 163840 }, cost: { input: 0.2, output: 0.8 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-08-23", last_updated: "2025-08-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.1, output: 0.5 } } } }, neon: { id: "neon", env: ["NEON_AI_GATEWAY_BASE_URL", "NEON_AI_GATEWAY_TOKEN"], npm: "@ai-sdk/openai-compatible", api: "${NEON_AI_GATEWAY_BASE_URL}/v1", name: "Neon", doc: "https://neon.com/docs", models: { "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "gemini-3-5-flash": { id: "gemini-3-5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, input_audio: 1.5 } }, "gpt-5-4": { id: "gpt-5-4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 127999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gpt-5-4-nano": { id: "gpt-5-4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "gpt-oss-20b": { id: "gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 25000 }, cost: { input: 0.05, output: 0.2 } }, "gemini-3-1-pro": { id: "gemini-3-1-pro", name: "Gemini 3.1 Pro Preview Custom Tools", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "gemini-3-5-flash-lite": { id: "gemini-3-5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "gpt-5-5-pro": { id: "gpt-5-5-pro", name: "GPT-5.5 Pro", description: "Highest-accuracy GPT-5.5 tier for slower, precision-heavy reasoning and coding", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 30, output: 180, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "gemini-3-flash": { id: "gemini-3-flash", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, input_audio: 1 } }, "gpt-5-6-luna": { id: "gpt-5-6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 1, output: 6, cache_read: 0.1, tiers: [{ input: 2, output: 9, cache_read: 0.2, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 2, output: 9, cache_read: 0.2 } } }, "claude-opus-4-1": { id: "claude-opus-4-1", name: "Claude Opus 4.1 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 31999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "gpt-5": { id: "gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "gemini-3-1-flash-lite": { id: "gemini-3-1-flash-lite", name: "Gemini 3.1 Flash Lite Preview", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "claude-sonnet-4-5": { id: "claude-sonnet-4-5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gpt-5-4-mini": { id: "gpt-5-4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "glm-5-2": { id: "glm-5-2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 65536 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "gpt-5-3-codex": { id: "gpt-5-3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "llama-4-maverick": { id: "llama-4-maverick", name: "Llama 4 Maverick 17B Instruct", description: "Open multimodal Llama for strong reasoning with efficient everyday serving", family: "llama", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 8192 }, cost: { input: 0.5, output: 1.5 } }, "gpt-5-6-terra": { id: "gpt-5-6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "meta-llama-3-3-70b-instruct": { id: "meta-llama-3-3-70b-instruct", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.5, output: 1.5 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 25000 }, cost: { input: 0.072, output: 0.28 } }, "qwen35-122b-a10b": { id: "qwen35-122b-a10b", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 25000 }, cost: { input: 0.22, output: 2.2 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "meta-llama-3-1-8b-instruct": { id: "meta-llama-3-1-8b-instruct", name: "Llama 3.1 8B Instruct", description: "Meta's compact open-weight Llama 3.1 model for fast, low-cost text generation", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12-31", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.15, output: 0.45 } }, "gpt-5-6-sol": { id: "gpt-5-6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "gemini-3-6-flash": { id: "gemini-3-6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15, input_audio: 1.5 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 65536 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "gpt-5-nano": { id: "gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, inkling: { id: "inkling", name: "Inkling", description: "Multimodal MoE reasoning model (975B total, 41B active) for text, image, and audio", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high", "max"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 65536 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-opus-4-5": { id: "claude-opus-4-5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "gpt-5-2": { id: "gpt-5-2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5-1": { id: "gpt-5-1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "gemma-3-12b": { id: "gemma-3-12b", name: "Gemma 3 12B", description: "Google's open-weight Gemma 3 vision-language model for text and image understanding", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-08-31", release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.15, output: 0.5 } }, "claude-opus-5": { id: "claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "qwen3-next-80b-a3b-instruct": { id: "qwen3-next-80b-a3b-instruct", name: "Qwen3-Next 80B-A3B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 1e4 }, cost: { input: 0.15, output: 1.2 } }, "gpt-5-5": { id: "gpt-5-5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "${NEON_AI_GATEWAY_BASE_URL}/openai/v1", shape: "responses" }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } } } }, infomaniak: { id: "infomaniak", env: ["INFOMANIAK_API_KEY", "INFOMANIAK_PRODUCT_ID"], npm: "@ai-sdk/openai-compatible", api: "https://api.infomaniak.com/2/ai/${INFOMANIAK_PRODUCT_ID}/openai/v1", name: "Infomaniak", doc: "https://www.infomaniak.com/en/hosting/ai-services/open-source-models", models: { mini_lm_l12_v2: { id: "mini_lm_l12_v2", name: "All-MiniLM-L12-v2", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2021-08-30", last_updated: "2026-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128, input: 128, output: 384 }, cost: { input: 0, output: 0 } }, bge_multilingual_gemma2: { id: "bge_multilingual_gemma2", name: "BGE Multilingual Gemma2", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-07-25", last_updated: "2026-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8000, input: 8000, output: 3584 }, cost: { input: 0.08, output: 0 } }, "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-FP8": { id: "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-FP8", name: "Nemotron 3 Nano 30B A3B FP8", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, temperature: true, release_date: "2025-12-15", last_updated: "2026-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, input: 1e6, output: 262144 }, status: "beta", cost: { input: 0.06, output: 0.25 } }, "google/gemma-4-31B-it": { id: "google/gemma-4-31B-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e5, input: 1e5, output: 32768 }, cost: { input: 0.25, output: 0.5 } }, "mistralai/Mistral-Small-4-119B-2603": { id: "mistralai/Mistral-Small-4-119B-2603", name: "Mistral Small 4", description: "Fast Mistral production model for chat, extraction, and cost-sensitive agents", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: true, temperature: true, knowledge: "2025-06", release_date: "2026-03-16", last_updated: "2026-08-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0.25, output: 0.93 } }, "mistralai/Ministral-3-14B-Instruct-2512": { id: "mistralai/Ministral-3-14B-Instruct-2512", name: "Ministral 3 14B Instruct", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2026-08-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1e5, input: 1e5, output: 25600 }, status: "beta", cost: { input: 0.37, output: 0.5 } }, "swiss-ai/Apertus-v1.5-70B": { id: "swiss-ai/Apertus-v1.5-70B", name: "Apertus v1.5 70B", description: "Open, ethically-sourced Swiss AI model for multilingual, multimodal chat and instruction following", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-07-24", last_updated: "2026-08-01", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 1e5, input: 1e5, output: 8192 }, status: "beta", cost: { input: 0.87, output: 3.1 } }, "Qwen/Qwen3.5-397B-A17B-FP8": { id: "Qwen/Qwen3.5-397B-A17B-FP8", name: "Qwen3.5 397B-A17B FP8", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-08-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 65536 }, status: "beta", cost: { input: 0.99, output: 4.46 } }, "Qwen/Qwen3.5-122B-A10B-FP8": { id: "Qwen/Qwen3.5-122B-A10B-FP8", name: "Qwen3.5 122B-A10B FP8", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-08-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 200000, input: 200000, output: 65536 }, cost: { input: 0.5, output: 3.97 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-08-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, status: "beta", cost: { input: 0.74, output: 3.72 } } } }, ambient: { id: "ambient", env: ["AMBIENT_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.ambient.xyz/v1", name: "Ambient", doc: "https://ambient.xyz", models: { "zai-org/GLM-5.1-FP8": { id: "zai-org/GLM-5.1-FP8", name: "GLM 5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0, cache_write: 0 } }, "zai-org/GLM-5.2-FP8": { id: "zai-org/GLM-5.2-FP8", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, cost: { input: 1.2, output: 4.2, cache_read: 0.26, cache_write: 0 } }, "ambient/large": { id: "ambient/large", name: "Ambient Large", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, cost: { input: 1.05, output: 4.4, cache_read: 0.2, cache_write: 0 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek model for efficient chat, coding help, and agent loops", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028, cache_write: 0 } }, "deepseek/deepseek-v4-flash-0731": { id: "deepseek/deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Fast DeepSeek model for efficient chat, coding help, and agent loops", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028, cache_write: 0 } }, "xiaomi/mimo-v2.5": { id: "xiaomi/mimo-v2.5", name: "MiMo-V2.5", description: "MiMo omni model for text, image, video, audio, and agents", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.4, output: 2, cache_read: 0.08, cache_write: 0 } }, "z-ai/glm-5.2": { id: "z-ai/glm-5.2", name: "GLM-5.2", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, cost: { input: 1.05, output: 4.4, cache_read: 0.2, cache_write: 0 } }, "moonshotai/kimi-k2.6": { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.2, cache_write: 0 } }, "moonshotai/kimi-k2.7-code": { id: "moonshotai/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.7, output: 3.5, cache_read: 0.15, cache_write: 0 } }, "stepfun/step-3.7-flash": { id: "stepfun/step-3.7-flash", name: "Step 3.7 Flash", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.19, output: 1.14, cache_read: 0.03, cache_write: 0 } } } }, dinference: { id: "dinference", env: ["DINFERENCE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.dinference.com/v1", name: "DInference", doc: "https://dinference.com", models: { "glm-5": { id: "glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.75, output: 2.4 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 1.25, output: 3.89 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 1.25, output: 3.89 } }, "glm-4.7": { id: "glm-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.45, output: 1.65 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-08", last_updated: "2025-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.0675, output: 0.27 } }, "minimax-m2.5": { id: "minimax-m2.5", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 32000 }, cost: { input: 0.22, output: 0.88 } } } }, "privatemode-ai": { id: "privatemode-ai", env: ["PRIVATEMODE_API_KEY", "PRIVATEMODE_ENDPOINT"], npm: "@ai-sdk/openai-compatible", api: "http://localhost:8080/v1", name: "Privatemode AI", doc: "https://docs.privatemode.ai/api/overview", models: { "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0 } }, "whisper-large-v3": { id: "whisper-large-v3", name: "Whisper large-v3", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "whisper", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-09", release_date: "2023-09-01", last_updated: "2023-09-01", modalities: { input: ["audio"], output: ["text"] }, open_weights: true, limit: { context: 0, output: 4096 }, cost: { input: 0, output: 0 } }, "voxtral-mini-3b": { id: "voxtral-mini-3b", name: "Voxtral Mini 3B", description: "Speech-to-text model for audio transcription, translation, and audio understanding", family: "voxtral", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-07", last_updated: "2025-07", modalities: { input: ["audio"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 32000 }, cost: { input: 0, output: 0 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "gpt-oss-120b", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08", release_date: "2025-08-04", last_updated: "2025-08-14", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0, output: 0 } }, "qwen3-embedding-4b": { id: "qwen3-embedding-4b", name: "Qwen3-Embedding 4B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-06", release_date: "2025-06-06", last_updated: "2025-06-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 2560 }, cost: { input: 0, output: 0 } } } }, unorouter: { id: "unorouter", env: ["UNOROUTER_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.unorouter.com/v1", name: "UnoRouter", doc: "https://unorouter.com/models", models: { "step-3.7-flash:free": { id: "step-3.7-flash:free", name: "Step 3.7 Flash", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0, output: 0 } }, "nemotron-3-ultra-550b-a55b:free": { id: "nemotron-3-ultra-550b-a55b:free", name: "Nemotron 3 Ultra 550B A55B", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 0, output: 0 } }, "gpt-5.5:free": { id: "gpt-5.5:free", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0, output: 0 } }, "gemini-3.5-flash": { id: "gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.1857, output: 1.1142 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.0625, output: 0.125 } }, "minimax-m2.7": { id: "minimax-m2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.819, output: 3.276 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 0.425, output: 2.125 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.6001, output: 5.0288 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.2675, output: 5.3368 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0.1875, output: 1.125 } }, "qwen3.5-397b-a17b:free": { id: "qwen3.5-397b-a17b:free", name: "Qwen3.5 397B-A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0, output: 0 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.8999, output: 1.7999 } }, "deepseek-v4-flash:free": { id: "deepseek-v4-flash:free", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0, output: 0 } }, "glm-4.5-flash:free": { id: "glm-4.5-flash:free", name: "GLM-4.5-Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 98304 }, cost: { input: 0, output: 0 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 1.8, output: 10.8 } }, "gpt-5.2": { id: "gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.05, output: 8.4 } }, "claude-haiku-4-5-20251001": { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1.2, output: 6 } }, "gpt-5.4:free": { id: "gpt-5.4:free", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0, output: 0 } }, "glm-5.2:free": { id: "glm-5.2:free", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 1.44, output: 7.2 } }, "minimax-m2.7:free": { id: "minimax-m2.7:free", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0 } }, "deepseek-v4-pro:free": { id: "deepseek-v4-pro:free", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0, output: 0 } }, "gemma-4-31b-it:free": { id: "gemma-4-31b-it:free", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } } } }, frogbot: { id: "frogbot", env: ["FROGBOT_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://app.frogbot.ai/api/v1", name: "FrogBot", doc: "https://docs.frogbot.ai", models: { "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-02-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gpt-4o": { id: "gpt-4o", name: "GPT-4o", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-07-17", last_updated: "2025-07-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.075 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "kimi-k2-6": { id: "kimi-k2-6", name: "Kimi-K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "1970-01-01", last_updated: "1970-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi-K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "1970-01-01", last_updated: "1970-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "gpt-5-4-nano": { id: "gpt-5-4-nano", name: "GPT-5.4 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "zai-glm-5-1": { id: "zai-glm-5-1", name: "Z.AI GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-01-20", last_updated: "2025-02-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 198000, output: 8192 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "gpt-oss-20b": { id: "gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "1970-01-01", last_updated: "1970-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.07, output: 0.2 } }, "minimax-m2-5": { id: "minimax-m2-5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2025-01-15", last_updated: "2025-02-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 192000, output: 8192 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "minimax-m2-7": { id: "minimax-m2-7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 192000, output: 8192 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "grok-code-fast-1": { id: "grok-code-fast-1", name: "Grok 4.1 Fast (Reasoning)", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2023-10", release_date: "2025-08-28", last_updated: "2025-08-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 0.2, output: 1.5, cache_read: 0.02 } }, "gemini-3-flash-preview": { id: "gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05 } }, "qwen-3-6-plus": { id: "qwen-3-6-plus", name: "Qwen 3.6 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-03", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.5, output: 3, cache_read: 0.1 } }, "gpt-5-4-mini": { id: "gpt-5-4-mini", name: "GPT-5.4 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek v4 Pro", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2026-01", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 1.74, output: 3.48, cache_read: 0.14 } }, "grok-4-3": { id: "grok-4-3", name: "Grok 4.3", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-11", release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "grok-4-1-fast-reasoning": { id: "grok-4-1-fast-reasoning", name: "Grok 4.1 Fast (Reasoning)", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-11", release_date: "2025-11-25", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 128000 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "gpt-5-3-codex": { id: "gpt-5-3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "1970-01-01", last_updated: "1970-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 0.6 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-03-20", last_updated: "2025-06-05", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.31 } }, "grok-4-1-fast-non-reasoning": { id: "grok-4-1-fast-non-reasoning", name: "Grok 4.1 Fast (Non-Reasoning)", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-11", release_date: "2025-11-25", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 128000 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gemini-3-1-pro-preview": { id: "gemini-3-1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-01", release_date: "2026-02-18", last_updated: "2026-02-18", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 2, output: 12, cache_read: 0.2 } }, "gpt-5-5": { id: "gpt-5-5", name: "GPT-5.5", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 272000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25 } } } }, "the-grid-ai": { id: "the-grid-ai", env: ["THEGRID_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.thegrid.ai/v1", name: "The Grid AI", doc: "https://thegrid.ai/docs", models: { "agent-standard": { id: "agent-standard", name: "Agent Standard", description: "Price-optimized models for fast tool calls, simple agent loops, high-throughput automation, and orchestration. Any model that meets the contract spec can serve your request.", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-05-04", last_updated: "2026-07-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 120000, output: 16000 }, status: "beta" }, "text-prime": { id: "text-prime", name: "Text Prime", description: "Reliable models for everyday text generation, editing, and analysis across diverse workflows. Any model that meets the contract spec can serve your request.", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-26", last_updated: "2026-07-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 196608, input: 120000, output: 30000 } }, "agent-prime": { id: "agent-prime", name: "Agent Prime", description: "Reliable models for dependable agentic applications, multi-step tool use, and reasoning workflows. Any model that meets the contract spec can serve your request.", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-05-04", last_updated: "2026-07-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 196608, input: 120000, output: 30000 }, status: "beta" }, "code-standard": { id: "code-standard", name: "Code Standard", description: "Price-optimized models for rapid autocomplete, linting, high-frequency suggestions, and batch edits. Any model that meets the contract spec can serve your request.", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-05-04", last_updated: "2026-07-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 120000, output: 16000 }, status: "beta" }, "code-max": { id: "code-max", name: "Code Max", description: "Frontier models for complex research, architectural decisions, debugging, and multi-file development. Any model that meets the contract spec can serve your request.", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-05-04", last_updated: "2026-07-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 922000, output: 128000 }, status: "beta" }, "agent-max": { id: "agent-max", name: "Agent Max", description: "Frontier models for autonomous research, deep multi-step tool chains, and complex long-horizon tasks. Any model that meets the contract spec can serve your request.", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-05-04", last_updated: "2026-07-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 922000, output: 128000 }, status: "beta" }, "text-max": { id: "text-max", name: "Text Max", description: "Frontier models for deep reasoning, long context, and complex workflows. Any model that meets the contract spec can serve your request.", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-02-26", last_updated: "2026-07-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 922000, output: 128000 } }, "text-standard": { id: "text-standard", name: "Text Standard", description: "Price-optimized models with low-latency, high-throughput and shorter maximum outputs. Any model that meets the contract spec can serve your request.", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-26", last_updated: "2026-07-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 120000, output: 16000 } }, "code-prime": { id: "code-prime", name: "Code Prime", description: "Reliable models for everyday software tasks, code completion, review, and standard debugging. Any model that meets the contract spec can serve your request.", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-05-04", last_updated: "2026-07-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 196608, input: 120000, output: 30000 }, status: "beta" } } }, "sap-ai-core": { id: "sap-ai-core", env: ["AICORE_SERVICE_KEY"], npm: "@jerome-benoit/sap-ai-provider-v2", name: "SAP AI Core", doc: "https://help.sap.com/docs/sap-ai-core", models: { "anthropic--claude-4.5-sonnet": { id: "anthropic--claude-4.5-sonnet", name: "anthropic--claude-4.5-sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gpt-4.1-mini": { id: "gpt-4.1-mini", name: "gpt-4.1-mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "nvidia--llama-3.2-nv-embedqa-1b": { id: "nvidia--llama-3.2-nv-embedqa-1b", name: "nvidia--llama-3.2-nv-embedqa-1b", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 4096 }, cost: { input: 0.07, output: 0 } }, "gemini-3.5-flash": { id: "gemini-3.5-flash", name: "gemini-3.5-flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, input_audio: 1.5 } }, "anthropic--claude-4.8-opus": { id: "anthropic--claude-4.8-opus", name: "anthropic--claude-4.8-opus", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "gemini-2.5-flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-04-17", last_updated: "2025-06-05", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, input_audio: 1 } }, "anthropic--claude-4.6-opus": { id: "anthropic--claude-4.6-opus", name: "anthropic--claude-4.6-opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic--claude-4.5-opus": { id: "anthropic--claude-4.5-opus", name: "anthropic--claude-4.5-opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic--claude-3.7-sonnet": { id: "anthropic--claude-3.7-sonnet", name: "anthropic--claude-3.7-sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2024-10-31", release_date: "2025-02-24", last_updated: "2025-02-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, status: "deprecated", cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "amazon--titan-embed-text": { id: "amazon--titan-embed-text", name: "amazon--titan-embed-text", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-04-30", last_updated: "2024-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 }, cost: { input: 0.14, output: 0 } }, "gpt-4.1-nano": { id: "gpt-4.1-nano", name: "gpt-4.1-nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.08, output: 0.26 } }, "amazon--nova-micro": { id: "amazon--nova-micro", name: "amazon--nova-micro", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova-micro", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-12-03", last_updated: "2024-12-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.03, output: 0.1 } }, "amazon--nova-pro": { id: "amazon--nova-pro", name: "amazon--nova-pro", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "nova-pro", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2024-12-03", last_updated: "2024-12-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 8192 }, cost: { input: 0.56, output: 2.13 } }, "sonar-deep-research": { id: "sonar-deep-research", name: "sonar-deep-research", description: "Sonar search model for current answers, retrieval, and citation-backed chat", family: "sonar-deep-research", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: false, temperature: false, knowledge: "2025-01", release_date: "2025-02-01", last_updated: "2025-09-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32768 }, cost: { input: 2, output: 8, reasoning: 3 } }, "amazon--nova-lite": { id: "amazon--nova-lite", name: "amazon--nova-lite", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.3, output: 2.37 } }, sonar: { id: "sonar", name: "sonar", description: "Sonar search model for current answers, retrieval, and citation-backed chat", family: "sonar", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 1, output: 1 } }, "sonar-pro": { id: "sonar-pro", name: "sonar-pro", description: "Advanced Sonar search model for deeper research and cited synthesis", family: "sonar-pro", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 3, output: 15 } }, "anthropic--claude-4.5-haiku": { id: "anthropic--claude-4.5-haiku", name: "anthropic--claude-4.5-haiku", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "gpt-5.5": { id: "gpt-5.5", name: "gpt-5.5", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "gpt-5": { id: "gpt-5", name: "gpt-5", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "mistralai--mistral-small": { id: "mistralai--mistral-small", name: "mistralai--mistral-small", description: "Fast Mistral production model for chat, extraction, and cost-sensitive agents", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.07, output: 0.28 } }, "gpt-5.4": { id: "gpt-5.4", name: "gpt-5.4", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25 } }, "sap-abap-1": { id: "sap-abap-1", name: "sap-abap-1", description: "SAP-hosted model for ABAP code generation and enterprise development tasks", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-11-26", last_updated: "2025-11-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 4096 }, cost: { input: 0.48, output: 1.7 } }, "anthropic--claude-3-opus": { id: "anthropic--claude-3-opus", name: "anthropic--claude-3-opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-08-31", release_date: "2024-02-29", last_updated: "2024-02-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, status: "deprecated", cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic--claude-4-opus": { id: "anthropic--claude-4-opus", name: "anthropic--claude-4-opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, status: "deprecated", cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic--claude-4.7-opus": { id: "anthropic--claude-4.7-opus", name: "anthropic--claude-4.7-opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gemini-3.1-flash-lite": { id: "gemini-3.1-flash-lite", name: "gemini-3.1-flash-lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "gpt-5.2": { id: "gpt-5.2", name: "gpt-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 9.44, cache_read: 0.12 } }, "anthropic--claude-3-sonnet": { id: "anthropic--claude-3-sonnet", name: "anthropic--claude-3-sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-08-31", release_date: "2024-03-04", last_updated: "2024-03-04", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, status: "deprecated", cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gemini-embedding": { id: "gemini-embedding", name: "Gemini Embedding 001", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "gemini", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2025-05", release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 2048, output: 1 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "gpt-5-mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "anthropic--claude-4-sonnet": { id: "anthropic--claude-4-sonnet", name: "anthropic--claude-4-sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic--claude-3-haiku": { id: "anthropic--claude-3-haiku", name: "anthropic--claude-3-haiku", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-08-31", release_date: "2024-03-13", last_updated: "2024-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, cost: { input: 0.25, output: 1.25, cache_read: 0.03, cache_write: 0.3 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "gemini-2.5-pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-03-25", last_updated: "2025-06-05", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "mistralai--mistral-medium-instruct": { id: "mistralai--mistral-medium-instruct", name: "mistralai--mistral-medium-instruct", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-05-07", last_updated: "2025-05-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.36, output: 1.22 } }, "gpt-5-nano": { id: "gpt-5-nano", name: "gpt-5-nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "gemini-2.5-flash-lite": { id: "gemini-2.5-flash-lite", name: "gemini-2.5-flash-lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 512, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01, input_audio: 0.3 } }, "cohere--command-a-reasoning": { id: "cohere--command-a-reasoning", name: "cohere--command-a-reasoning", description: "Cohere reasoning model for multilingual enterprise agents, tools, and complex workflows", family: "command-a", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high"] }, { type: "budget_tokens", min: 1 }], tool_call: true, temperature: true, knowledge: "2024-06-01", release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 32000 }, cost: { input: 0.63, output: 5.05 } }, "gpt-4.1": { id: "gpt-4.1", name: "gpt-4.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.32 } }, "anthropic--claude-4.6-sonnet": { id: "anthropic--claude-4.6-sonnet", name: "anthropic--claude-4.6-sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-08", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "text-embedding-3-large": { id: "text-embedding-3-large", name: "text-embedding-3-large", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8191, output: 3072 }, cost: { input: 0.09, output: 0 } }, "anthropic--claude-3.5-sonnet": { id: "anthropic--claude-3.5-sonnet", name: "anthropic--claude-3.5-sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04-30", release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, status: "deprecated", cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "text-embedding-3-small": { id: "text-embedding-3-small", name: "text-embedding-3-small", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8191, output: 1536 }, cost: { input: 0.02, output: 0 } } } }, upstage: { id: "upstage", env: ["UPSTAGE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.upstage.ai/v1/solar", name: "Upstage", doc: "https://developers.upstage.ai/docs/apis/chat", models: { "solar-pro3": { id: "solar-pro3", name: "solar-pro3", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "solar-pro", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.25, output: 0.25 } }, "solar-mini": { id: "solar-mini", name: "solar-mini", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "solar-mini", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2024-06-12", last_updated: "2025-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 4096 }, cost: { input: 0.15, output: 0.15 } }, "solar-pro2": { id: "solar-pro2", name: "solar-pro2", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "solar-pro", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "high"] }], tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 65536, output: 8192 }, cost: { input: 0.25, output: 0.25 } }, "solar-pro4": { id: "solar-pro4", name: "Solar Pro 4", description: "Upstage's flagship model, specialized for agentic use", family: "solar-pro", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-02", release_date: "2026-08-06", last_updated: "2026-08-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 524288, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } } } }, "cline-pass": { id: "cline-pass", env: ["CLINE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.cline.bot/api/v1", name: "ClinePass", doc: "https://docs.cline.bot/getting-started/clinepass", models: { "cline-pass/qwen3.7-plus": { id: "cline-pass/qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.4, output: 1.6, cache_read: 0.04, cache_write: 0.5, tiers: [{ input: 1.2, output: 4.8, cache_read: 0.12, cache_write: 1.5, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 1.2, output: 4.8, cache_read: 0.12, cache_write: 1.5 } } }, "cline-pass/deepseek-v4-flash": { id: "cline-pass/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "cline-pass/glm-5.2": { id: "cline-pass/glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "cline-pass/qwen3.7-max": { id: "cline-pass/qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5, cache_write: 3.125 } }, "cline-pass/kimi-k2.6": { id: "cline-pass/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "cline-pass/minimax-m3": { id: "cline-pass/minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 512000, output: 128000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "cline-pass/deepseek-v4-pro": { id: "cline-pass/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 1.74, output: 3.48, cache_read: 0.0145 } }, "cline-pass/mimo-v2.5": { id: "cline-pass/mimo-v2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "cline-pass/kimi-k2.7-code": { id: "cline-pass/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "cline-pass/kimi-k3": { id: "cline-pass/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "cline-pass/mimo-v2.5-pro": { id: "cline-pass/mimo-v2.5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1.74, output: 3.48, cache_read: 0.0145 } } } }, "regolo-ai": { id: "regolo-ai", env: ["REGOLO_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.regolo.ai/v1", name: "Regolo AI", doc: "https://docs.regolo.ai/", models: { "gemma4-31b": { id: "gemma4-31b", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1e5, output: 1e5 }, cost: { input: 0.46, output: 2.42 } }, "brick-complexity-pro": { id: "brick-complexity-pro", name: "Brick Complexity Pro", description: "Complexity classifier that powers the Brick semantic router by extracting query difficulty", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-02-06", last_updated: "2026-02-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e5, output: 15000 }, cost: { input: 0.12, output: 0.46 } }, "qwen3.5-122b": { id: "qwen3.5-122b", name: "Qwen3.5-122B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-01", last_updated: "2026-02-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.9, output: 3.6 } }, "apertus-70b": { id: "apertus-70b", name: "Apertus 70B", description: "Fully open 70B multilingual LLM supporting 1800+ languages with 65K context. Trained on 15T tokens of compliant open data. Apache 2.0, EU AI Act compliant.", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-09-02", last_updated: "2025-09-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 30000, output: 30000 }, cost: { input: 0.46, output: 2.42 } }, "faster-whisper-large-v3": { id: "faster-whisper-large-v3", name: "Faster Whisper Large v3", description: "Open Whisper checkpoint for robust multilingual transcription and captioning", family: "whisper", attachment: false, reasoning: false, tool_call: false, release_date: "2024-10-01", last_updated: "2024-10-01", modalities: { input: ["audio"], output: ["text"] }, open_weights: true, limit: { context: 448, output: 4096 }, cost: { input: 0, output: 0 } }, "gpt-oss-20b": { id: "gpt-oss-20b", name: "GPT-OSS-20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2026-03-01", last_updated: "2026-03-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.4, output: 1.8 } }, "qwen3.5-9b": { id: "qwen3.5-9b", name: "Qwen3.5-9B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-01", last_updated: "2026-02-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 8192 }, cost: { input: 0.15, output: 0.6 } }, "qwen3.6-27b": { id: "qwen3.6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 120000, output: 120000 }, cost: { input: 0.58, output: 2.42 } }, "llama-3.3-70b-instruct": { id: "llama-3.3-70b-instruct", name: "Llama 3.3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-04-28", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.6, output: 2.7 } }, "brick-v1-beta": { id: "brick-v1-beta", name: "Brick v1 Beta", description: "Semantic router by Regolo.ai that directs each request to the most suitable model, optimizing costs and performance", family: "model-router", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-02-06", last_updated: "2026-02-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e5, output: 15000 }, status: "beta", cost: { input: 0, output: 0 } }, "qwen3-reranker-4b": { id: "qwen3-reranker-4b", name: "Qwen3-Reranker-4B", description: "Reranking model for improving retrieval quality in search and recommendation systems", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-02-01", last_updated: "2026-02-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 0.12, output: 0.12 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT-OSS-120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1, output: 4.2 } }, "deepseek-ocr-2": { id: "deepseek-ocr-2", name: "DeepSeek OCR 2", description: "High-accuracy OCR model for extracting text from documents, screenshots, receipts, and natural scenes", attachment: true, reasoning: false, tool_call: false, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 4000, output: 4000 }, cost: { input: 0, output: 0 } }, "mistral-small-4-119b": { id: "mistral-small-4-119b", name: "Mistral Small 4 119B", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-15", last_updated: "2026-03-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 16384 }, cost: { input: 0.75, output: 3 } }, "qwen-image": { id: "qwen-image", name: "Qwen-Image", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-03-01", last_updated: "2026-03-01", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 8192, output: 4096 }, cost: { input: 0.5, output: 2 } }, "glm5.2": { id: "glm5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 96000, output: 96000 }, cost: { input: 2.31, output: 6 } }, "qwen3-coder-next": { id: "qwen3-coder-next", name: "Qwen3-Coder-Next", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-01", last_updated: "2026-03-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.3, output: 1.2 } }, "qwen3-embedding-8b": { id: "qwen3-embedding-8b", name: "Qwen3-Embedding-8B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-02-01", last_updated: "2026-02-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 0.1, output: 0.1 } } } }, aiand: { id: "aiand", env: ["AIAND_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.aiand.com/v1", name: "ai&", doc: "https://docs.aiand.com/", models: { "google/gemma-4-31b-it": { id: "google/gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.2, output: 0.5 } }, "zai-org/glm-5.2": { id: "zai-org/glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1, output: 4 } }, "qwen/qwen3.6-27b": { id: "qwen/qwen3.6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0, output: 0 } }, "deepseek-ai/deepseek-v4-flash": { id: "deepseek-ai/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 0.15, output: 0.25 } }, "deepseek-ai/deepseek-v4-pro": { id: "deepseek-ai/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 1, output: 2.5 } }, "moonshotai/kimi-k2.7-code": { id: "moonshotai/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.75, output: 3.5 } }, "moonshotai/kimi-k3": { id: "moonshotai/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 12.5, cache_read: 0.5 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 0.6 } } } }, pioneer: { id: "pioneer", env: ["PIONEER_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.pioneer.ai/v1", name: "Pioneer", doc: "https://agent.pioneer.ai/llms.txt", models: { "qwen3.7-plus": { id: "qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.32, output: 1.28, cache_read: 0.064, cache_write: 0.4 } }, "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "mistral-medium-3.5": { id: "mistral-medium-3.5", name: "Mistral Medium 3.5", description: "Balanced Mistral model for enterprise assistants, multilingual work, and tools", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 1.5, output: 7.5, cache_read: 1.5, cache_write: 1.5 } }, "gpt-4.1-mini": { id: "gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.2, cache_write: 0.4 } }, "gpt-4o": { id: "gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25, cache_write: 2.5 } }, "gemini-3.5-flash": { id: "gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, cache_write: 0.083333 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "gemini-3.5-flash-lite": { id: "gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65000 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, cache_write: 0.3 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 11, output: 55, cache_read: 1.1, cache_write: 13.75 } }, "gemini-3.1-pro": { id: "gemini-3.1-pro", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 0.375 } }, "claude-3-7-sonnet-latest": { id: "claude-3-7-sonnet-latest", name: "Claude Sonnet 3.7", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-10-31", release_date: "2025-02-19", last_updated: "2025-02-19", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gpt-4.1-nano": { id: "gpt-4.1-nano", name: "GPT-4.1 nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.1, output: 0.4, cache_read: 0.05, cache_write: 0.1 } }, "qwen3.7-max": { id: "qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 1.25, output: 3.75, cache_read: 0.25, cache_write: 1.5625 } }, "gemini-3-flash": { id: "gemini-3-flash", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 0.083333 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 5 } }, "claude-opus-4-1": { id: "claude-opus-4-1", name: "Claude Opus 4.1 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "gpt-4o-mini": { id: "gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075, cache_write: 0.15 } }, "claude-sonnet-4-5": { id: "claude-sonnet-4-5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "mistral-large-3": { id: "mistral-large-3", name: "Mistral Large 3", description: "Mistral's largest general model for enterprise agents, coding, and multilingual reasoning", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 131072 }, cost: { input: 0.5, output: 1.5, cache_read: 0.5, cache_write: 0.5 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 2.5 } }, "gpt-5.4-nano": { id: "gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02, cache_write: 0.2 } }, "gemini-3.6-flash": { id: "gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15, cache_write: 1.5 } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075, cache_write: 0.75 } }, "gemini-3.1-flash-lite": { id: "gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65000 }, cost: { input: 0.25, output: 1.5, cache_read: 0.03, cache_write: 0.25 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 1, output: 6, cache_read: 0.1, cache_write: 1.25 } }, "gpt-5.3-codex": { id: "gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175, cache_write: 1.75 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025, cache_write: 0.25 } }, "grok-4.5": { id: "grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 131072 }, cost: { input: 2, output: 6, cache_read: 0.5, cache_write: 2 } }, "qwen3.6-flash": { id: "qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.1875, output: 1.125, cache_read: 0.0375, cache_write: 0.234375 } }, "gpt-5.1": { id: "gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125, cache_write: 1.25 } }, "gpt-5-nano": { id: "gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005, cache_write: 0.05 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 3.125 } }, "claude-opus-4-5": { id: "claude-opus-4-5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "qwen3.6-max-preview": { id: "qwen3.6-max-preview", name: "Qwen3.6 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 1.04, output: 6.24, cache_read: 0.208, cache_write: 1.3 } }, "devstral-2": { id: "devstral-2", name: "Devstral 2", description: "Mistral's coding-agent model for repository work, terminal tasks, and software fixes", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-12", release_date: "2025-12-09", last_updated: "2025-12-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 131072 }, cost: { input: 0.4, output: 2, cache_read: 0.4, cache_write: 0.4 } }, "gpt-4.1": { id: "gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 1, cache_write: 2 } }, "claude-opus-5": { id: "claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "qwen3.6-plus": { id: "qwen3.6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.325, output: 1.95, cache_read: 0.065, cache_write: 0.40625 } }, "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-FP8": { id: "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-FP8", name: "Nemotron 3 Super 120B A12B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 32000 }, cost: { input: 0.09, output: 0.45, cache_read: 0.09, cache_write: 0.09 } }, "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B-BF16": { id: "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B-BF16", name: "Nemotron 3 Ultra 550B A55B", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 65000 }, cost: { input: 0.5, output: 2.5, cache_read: 0.15, cache_write: 0.5 } }, "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16": { id: "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16", name: "Nemotron 3 Nano 30B A3B", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2025-12-15", last_updated: "2025-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.05, output: 0.2, cache_read: 0.05, cache_write: 0.05 } }, "google/gemma-4-12B-it": { id: "google/gemma-4-12B-it", name: "Gemma 4 12B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-05-31", last_updated: "2026-05-31", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.25, output: 0.25, cache_read: 0.25, cache_write: 0.25 } }, "google/gemma-3-4b-pt": { id: "google/gemma-3-4b-pt", name: "Gemma 3 4B (Pretrained)", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2025-02-28", last_updated: "2025-02-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.15, output: 0.15, cache_read: 0.15, cache_write: 0.15 } }, "google/diffusiongemma-26B-A4B-it": { id: "google/diffusiongemma-26B-A4B-it", name: "DiffusionGemma 26B-A4B IT", description: "Gemini model for general assistance, reasoning, and multimodal workflows", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-05-31", last_updated: "2026-05-31", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 131072 }, cost: { input: 0.5, output: 0.5, cache_read: 0.5, cache_write: 0.5 } }, "google/gemma-4-E2B-it": { id: "google/gemma-4-E2B-it", name: "Gemma 4 E2B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.1, output: 0.1, cache_read: 0.1, cache_write: 0.1 } }, "google/gemma-4-E4B-it": { id: "google/gemma-4-E4B-it", name: "Gemma 4 E4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.2, output: 0.2, cache_read: 0.2, cache_write: 0.2 } }, "google/gemma-4-31B-it": { id: "google/gemma-4-31B-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.5, output: 0.5, cache_read: 0.5, cache_write: 0.5 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 128000 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26, cache_write: 1.4 } }, "zai-org/GLM-5.1": { id: "zai-org/GLM-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 0.98, output: 3.08, cache_read: 0.182, cache_write: 0.98 } }, "sakana/fugu-ultra": { id: "sakana/fugu-ultra", name: "Fugu Ultra", description: "Quality-first multi-agent model for hard research, analysis, and competitions", family: "fugu", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-06-15", last_updated: "2026-06-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 5 } }, "fastino/gliner2-large-v1": { id: "fastino/gliner2-large-v1", name: "GLiNER2 Large", description: "Flagship model for demanding analysis, coding, and production agent workflows", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-06-30", last_updated: "2025-06-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 4096 }, cost: { input: 0.15, output: 0.15, cache_read: 0.15, cache_write: 0.15 } }, "fastino/gliguard-LLMGuardrails-300M": { id: "fastino/gliguard-LLMGuardrails-300M", name: "GLiGuard LLM Guardrails 300M", description: "Tool-capable chat model for instruction following and agentic application workflows", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 4096 }, cost: { input: 0.15, output: 0.15, cache_read: 0.15, cache_write: 0.15 } }, "fastino/gliner2-multi-v1": { id: "fastino/gliner2-multi-v1", name: "GLiNER2 Multi", description: "Tool-capable chat model for instruction following and agentic application workflows", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-11-30", last_updated: "2025-11-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 4096 }, cost: { input: 0.15, output: 0.15, cache_read: 0.15, cache_write: 0.15 } }, "fastino/gliner2-base-v1": { id: "fastino/gliner2-base-v1", name: "GLiNER2 Base", description: "Tool-capable chat model for instruction following and agentic application workflows", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-06-30", last_updated: "2025-06-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 4096 }, cost: { input: 0.15, output: 0.15, cache_read: 0.15, cache_write: 0.15 } }, "fastino/gliner2-multi-large-v1": { id: "fastino/gliner2-multi-large-v1", name: "GLiNER2 Multi Large", description: "Flagship model for demanding analysis, coding, and production agent workflows", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-11-30", last_updated: "2025-11-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 4096 }, cost: { input: 0.15, output: 0.15, cache_read: 0.15, cache_write: 0.15 } }, "fastino/gliner2-privacy-filter-PII-multi": { id: "fastino/gliner2-privacy-filter-PII-multi", name: "GLiNER2 Privacy Filter PII (Multi)", description: "Tool-capable chat model for instruction following and agentic application workflows", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 4096 }, cost: { input: 0.15, output: 0.15, cache_read: 0.15, cache_write: 0.15 } }, "mistralai/Mistral-Nemo-Instruct-2407": { id: "mistralai/Mistral-Nemo-Instruct-2407", name: "Mistral Nemo", description: "Efficient Mistral-NVIDIA open model for multilingual chat and local deployment", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-07-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 128000 }, cost: { input: 0.02, output: 0.03, cache_read: 0.02, cache_write: 0.02 } }, "mistralai/Mistral-Small-4-119B-2603": { id: "mistralai/Mistral-Small-4-119B-2603", name: "Mistral Small 4", description: "Fast Mistral production model for chat, extraction, and cost-sensitive agents", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-06", release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015, cache_write: 0.15 } }, "mistralai/Codestral-22B-v0.1": { id: "mistralai/Codestral-22B-v0.1", name: "Codestral-22B-v0.1", description: "Open Mistral code model for fill-in-the-middle and 80+ programming languages", family: "codestral", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-05-29", last_updated: "2024-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 0.3, output: 0.9, cache_read: 0.3, cache_write: 0.3 } }, "mistralai/Magistral-Small-2506": { id: "mistralai/Magistral-Small-2506", name: "Magistral Small", description: "Open Mistral reasoning model for transparent step-by-step problem solving", family: "magistral", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2025-06-10", last_updated: "2025-06-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 64000 }, cost: { input: 0.5, output: 1.5, cache_read: 0.5, cache_write: 0.5 } }, "mistralai/Mistral-7B-Instruct-v0.3": { id: "mistralai/Mistral-7B-Instruct-v0.3", name: "Mistral 7B Instruct v0.3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2023-04-30", last_updated: "2023-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.2, output: 0.2, cache_read: 0.2, cache_write: 0.2 } }, "mistralai/Ministral-8B-Instruct-2410": { id: "mistralai/Ministral-8B-Instruct-2410", name: "Ministral 8B Instruct", description: "Efficient open Mistral edge model for on-device chat and function calling", family: "ministral", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-10-16", last_updated: "2024-10-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 0.15, output: 0.15, cache_read: 0.15, cache_write: 0.15 } }, "mistralai/Pixtral-12B-2409": { id: "mistralai/Pixtral-12B-2409", name: "Pixtral 12B", description: "Mistral vision-language model for image understanding and multimodal chat", family: "pixtral", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2024-09-01", last_updated: "2024-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 0.15, output: 0.15, cache_read: 0.15, cache_write: 0.15 } }, "pioneer/auto": { id: "pioneer/auto", name: "Pioneer Auto", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2024-01-01", last_updated: "2025-06-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 4096 } }, "meta/muse-spark-1.1": { id: "meta/muse-spark-1.1", name: "Muse Spark 1.1", description: "Muse Spark is a natively multimodal reasoning model with support for tool-use, visual chain of thought, and multi-agent orchestration.", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-08", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15, cache_write: 1.25 } }, "Qwen/Qwen3.5-9B": { id: "Qwen/Qwen3.5-9B", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.3, output: 0.3, cache_read: 0.3, cache_write: 0.3 } }, "Qwen/Qwen3-235B-A22B-Instruct-2507": { id: "Qwen/Qwen3-235B-A22B-Instruct-2507", name: "Qwen3 235B-A22B Instruct 2507", description: "Updated large open Qwen3 MoE instruct model for multilingual chat, coding, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-07-21", last_updated: "2025-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 1.2, output: 1.2, cache_read: 1.2, cache_write: 1.2 } }, "Qwen/Qwen3-8B": { id: "Qwen/Qwen3-8B", name: "Qwen3 8B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-03-31", release_date: "2025-03-31", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.2, output: 0.2, cache_read: 0.2, cache_write: 0.2 } }, "Qwen/Qwen3.6-27B": { id: "Qwen/Qwen3.6-27B", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.6, output: 0.6, cache_read: 0.6, cache_write: 0.6 } }, "Qwen/Qwen3-1.7B-Base": { id: "Qwen/Qwen3-1.7B-Base", name: "Qwen3 1.7B Base", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2025-03-31", last_updated: "2025-03-31", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.1, output: 0.1, cache_read: 0.1, cache_write: 0.1 } }, "Qwen/Qwen3.6-35B-A3B": { id: "Qwen/Qwen3.6-35B-A3B", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.14, output: 1, cache_read: 0.028, cache_write: 0.175 } }, "Qwen/Qwen2.5-Coder-0.5B": { id: "Qwen/Qwen2.5-Coder-0.5B", name: "Qwen2.5-Coder-0.5B", description: "Tiny open Qwen code model for lightweight completion and on-device coding", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-11-12", last_updated: "2024-11-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.1, output: 0.1, cache_read: 0.1, cache_write: 0.1 } }, "Qwen/Qwen3-32B": { id: "Qwen/Qwen3-32B", name: "Qwen3 32B", description: "Dense open Qwen model for self-hosted chat, reasoning, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.9, output: 0.9, cache_read: 0.9, cache_write: 0.9 } }, "Qwen/Qwen3-4B-Instruct-2507": { id: "Qwen/Qwen3-4B-Instruct-2507", name: "Qwen3 4B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2025-07-31", last_updated: "2025-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 131072 }, cost: { input: 0.2, output: 0.2, cache_read: 0.2, cache_write: 0.2 } }, "Qwen/Qwen3-4B-Base": { id: "Qwen/Qwen3-4B-Base", name: "Qwen3 4B Base", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2025-03-31", last_updated: "2025-03-31", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.15, output: 0.15, cache_read: 0.15, cache_write: 0.15 } }, "LiquidAI/LFM2-24B-A2B": { id: "LiquidAI/LFM2-24B-A2B", name: "LFM2 24B A2B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "liquid", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-01-31", last_updated: "2026-02-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.03, output: 0.12, cache_read: 0.03, cache_write: 0.03 } }, "HuggingFaceTB/SmolLM3-3B-Base": { id: "HuggingFaceTB/SmolLM3-3B-Base", name: "SmolLM3 3B Base", description: "Tool-capable chat model for instruction following and agentic application workflows", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2025-06-30", last_updated: "2025-06-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.15, output: 0.15, cache_read: 0.15, cache_write: 0.15 } }, "MiniMaxAI/MiniMax-M2.7": { id: "MiniMaxAI/MiniMax-M2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.279, output: 1.2, cache_read: 0.279, cache_write: 0.279 } }, "MiniMaxAI/MiniMax-M3": { id: "MiniMaxAI/MiniMax-M3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06, cache_write: 0.3 } }, "poolside/laguna-s-2.1": { id: "poolside/laguna-s-2.1", name: "Laguna S 2.1", description: "Agentic coding model from Poolside in the XS size class for local deployment", family: "laguna", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0.1, output: 0.2, cache_read: 0.01, cache_write: 0.1 } }, "deepseek-ai/DeepSeek-V3": { id: "deepseek-ai/DeepSeek-V3", name: "DeepSeek-V3", description: "Open DeepSeek MoE chat model for coding, math, and general reasoning", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-12-26", last_updated: "2024-12-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 8192 }, cost: { input: 0.27, output: 1.12, cache_read: 0.135, cache_write: 0.27 } }, "deepseek-ai/DeepSeek-V3.1": { id: "deepseek-ai/DeepSeek-V3.1", name: "DeepSeek-V3.1", description: "Hybrid-reasoning DeepSeek model with thinking and non-thinking modes", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 131072 }, cost: { input: 0.56, output: 1.68, cache_read: 0.56, cache_write: 0.56 } }, "deepseek-ai/DeepSeek-V4-Flash": { id: "deepseek-ai/DeepSeek-V4-Flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0.1, output: 0.2, cache_read: 0.0197, cache_write: 0.1 } }, "deepseek-ai/DeepSeek-V4-Pro": { id: "deepseek-ai/DeepSeek-V4-Pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625, cache_write: 0.435 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.95, output: 4, cache_read: 0.34, cache_write: 0.95 } }, "moonshotai/Kimi-K2.7-Code": { id: "moonshotai/Kimi-K2.7-Code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.95, output: 4, cache_read: 0.19, cache_write: 0.95 } }, "moonshotai/Kimi-K3": { id: "moonshotai/Kimi-K3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.07, output: 0.3, cache_read: 0.035, cache_write: 0.07 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015, cache_write: 0.15 } }, "meta-llama/Llama-3.3-70B-Instruct": { id: "meta-llama/Llama-3.3-70B-Instruct", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.9, output: 0.9, cache_read: 0.9, cache_write: 0.9 } }, "meta-llama/Llama-3.1-8B-Instruct": { id: "meta-llama/Llama-3.1-8B-Instruct", name: "Llama 3.1 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2023-12-31", release_date: "2024-06-30", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.2, output: 0.2, cache_read: 0.2, cache_write: 0.2 } }, "meta-llama/Llama-3.2-1B-Instruct": { id: "meta-llama/Llama-3.2-1B-Instruct", name: "Llama 3.2 1B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2023-12-31", release_date: "2024-08-31", last_updated: "2024-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 60000 }, cost: { input: 0.1, output: 0.201, cache_read: 0.1, cache_write: 0.1 } }, "meta-llama/Llama-3.2-1B": { id: "meta-llama/Llama-3.2-1B", name: "Llama-3.2-1B", description: "Compact open Llama base model for lightweight and on-device use", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2023-12", release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.1, output: 0.1, cache_read: 0.1, cache_write: 0.1 } }, "meta-llama/Llama-3.2-3B": { id: "meta-llama/Llama-3.2-3B", name: "Llama-3.2-3B", description: "Small open Llama base model for lightweight text generation and self-hosting", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2023-12", release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.1, output: 0.1, cache_read: 0.1, cache_write: 0.1 } }, "meta-llama/Llama-3.2-3B-Instruct": { id: "meta-llama/Llama-3.2-3B-Instruct", name: "Llama 3.2 3B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2023-12-31", release_date: "2024-08-31", last_updated: "2024-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 80000 }, cost: { input: 0.1, output: 0.335, cache_read: 0.1, cache_write: 0.1 } }, "XiaomiMiMo/MiMo-V2.5-Pro": { id: "XiaomiMiMo/MiMo-V2.5-Pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1050000, output: 131072 }, cost: { input: 0.435, output: 0.87, cache_read: 0.0036, cache_write: 0.435 } }, "XiaomiMiMo/MiMo-V2.5": { id: "XiaomiMiMo/MiMo-V2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1050000, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028, cache_write: 0.14 } } } }, siliconflow: { id: "siliconflow", env: ["SILICONFLOW_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.siliconflow.com/v1", name: "SiliconFlow", doc: "https://cloud.siliconflow.com/models", models: { "google/gemma-4-26B-A4B-it": { id: "google/gemma-4-26B-A4B-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.12, output: 0.4 } }, "google/gemma-4-31B-it": { id: "google/gemma-4-31B-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.13, output: 0.4 } }, "zai-org/GLM-5": { id: "zai-org/GLM-5", name: "zai-org/GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-06-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 205000, output: 205000 }, cost: { input: 0.95, output: 2.55, cache_read: 0.2 } }, "zai-org/GLM-4.5-Air": { id: "zai-org/GLM-4.5-Air", name: "zai-org/GLM-4.5-Air", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-air", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-28", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.14, output: 0.86 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1049000, output: 262000 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26, cache_write: 0 } }, "zai-org/GLM-5.1": { id: "zai-org/GLM-5.1", name: "zai-org/GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-08", last_updated: "2026-04-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 205000, output: 205000 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26, cache_write: 0 } }, "zai-org/GLM-5V-Turbo": { id: "zai-org/GLM-5V-Turbo", name: "zai-org/GLM-5V-Turbo", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24, cache_write: 0 } }, "tencent/Hunyuan-A13B-Instruct": { id: "tencent/Hunyuan-A13B-Instruct", name: "tencent/Hunyuan-A13B-Instruct", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "hunyuan", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-06-30", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.14, output: 0.57 } }, "tencent/Hy3-preview": { id: "tencent/Hy3-preview", name: "Hy3 preview", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, temperature: true, release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.066, output: 0.26, cache_read: 0.029 } }, "Qwen/Qwen3.5-27B": { id: "Qwen/Qwen3.5-27B", name: "Qwen3.5 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.25, output: 2 } }, "Qwen/Qwen2.5-7B-Instruct": { id: "Qwen/Qwen2.5-7B-Instruct", name: "Qwen/Qwen2.5-7B-Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-09-18", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 33000, output: 4000 }, cost: { input: 0.05, output: 0.05 } }, "Qwen/Qwen3.5-9B": { id: "Qwen/Qwen3.5-9B", name: "Qwen/Qwen3.5-9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-03", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.1, output: 0.15 } }, "Qwen/Qwen3-14B": { id: "Qwen/Qwen3-14B", name: "Qwen/Qwen3-14B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-30", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.07, output: 0.28 } }, "Qwen/Qwen2.5-72B-Instruct": { id: "Qwen/Qwen2.5-72B-Instruct", name: "Qwen/Qwen2.5-72B-Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-09-18", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 33000, output: 4000 }, cost: { input: 0.59, output: 0.59 } }, "Qwen/Qwen3.5-122B-A10B": { id: "Qwen/Qwen3.5-122B-A10B", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.26, output: 2.08 } }, "Qwen/Qwen3-Coder-30B-A3B-Instruct": { id: "Qwen/Qwen3-Coder-30B-A3B-Instruct", name: "Qwen/Qwen3-Coder-30B-A3B-Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-01", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.07, output: 0.28 } }, "Qwen/Qwen3-VL-235B-A22B-Instruct": { id: "Qwen/Qwen3-VL-235B-A22B-Instruct", name: "Qwen/Qwen3-VL-235B-A22B-Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-04", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.3, output: 1.5 } }, "Qwen/Qwen3-8B": { id: "Qwen/Qwen3-8B", name: "Qwen/Qwen3-8B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-30", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.06, output: 0.06 } }, "Qwen/Qwen3.5-35B-A3B": { id: "Qwen/Qwen3.5-35B-A3B", name: "Qwen3.5 35B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.24, output: 1.8 } }, "Qwen/Qwen3.6-27B": { id: "Qwen/Qwen3.6-27B", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.3, output: 3.2 } }, "Qwen/Qwen3.5-397B-A17B": { id: "Qwen/Qwen3.5-397B-A17B", name: "Qwen3.5 397B-A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.39, output: 2.34 } }, "Qwen/Qwen3-VL-235B-A22B-Thinking": { id: "Qwen/Qwen3-VL-235B-A22B-Thinking", name: "Qwen/Qwen3-VL-235B-A22B-Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-04", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.45, output: 3.5 } }, "Qwen/Qwen3.6-35B-A3B": { id: "Qwen/Qwen3.6-35B-A3B", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.2, output: 1.6 } }, "Qwen/Qwen3-VL-30B-A3B-Thinking": { id: "Qwen/Qwen3-VL-30B-A3B-Thinking", name: "Qwen/Qwen3-VL-30B-A3B-Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-11", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.29, output: 1 } }, "Qwen/Qwen3-VL-8B-Instruct": { id: "Qwen/Qwen3-VL-8B-Instruct", name: "Qwen/Qwen3-VL-8B-Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-15", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.18, output: 0.68 } }, "Qwen/Qwen3-30B-A3B-Instruct-2507": { id: "Qwen/Qwen3-30B-A3B-Instruct-2507", name: "Qwen/Qwen3-30B-A3B-Instruct-2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-30", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.09, output: 0.3 } }, "Qwen/Qwen3-Coder-480B-A35B-Instruct": { id: "Qwen/Qwen3-Coder-480B-A35B-Instruct", name: "Qwen/Qwen3-Coder-480B-A35B-Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-31", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.25, output: 1 } }, "Qwen/Qwen3-VL-32B-Instruct": { id: "Qwen/Qwen3-VL-32B-Instruct", name: "Qwen/Qwen3-VL-32B-Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-21", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.2, output: 0.6 } }, "Qwen/Qwen3-VL-30B-A3B-Instruct": { id: "Qwen/Qwen3-VL-30B-A3B-Instruct", name: "Qwen/Qwen3-VL-30B-A3B-Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-05", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.29, output: 1 } }, "Qwen/Qwen3-32B": { id: "Qwen/Qwen3-32B", name: "Qwen/Qwen3-32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-30", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.14, output: 0.57 } }, "Qwen/Qwen3-VL-32B-Thinking": { id: "Qwen/Qwen3-VL-32B-Thinking", name: "Qwen/Qwen3-VL-32B-Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-21", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.2, output: 1.5 } }, "Qwen/Qwen3-235B-A22B-Thinking-2507": { id: "Qwen/Qwen3-235B-A22B-Thinking-2507", name: "Qwen/Qwen3-235B-A22B-Thinking-2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-28", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.13, output: 0.6 } }, "MiniMaxAI/MiniMax-M2.5": { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMaxAI/MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-15", last_updated: "2026-06-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 197000, output: 131000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "inclusionAI/Ling-flash-2.0": { id: "inclusionAI/Ling-flash-2.0", name: "inclusionAI/Ling-flash-2.0", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "ling", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-18", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.14, output: 0.57 } }, "ByteDance-Seed/Seed-OSS-36B-Instruct": { id: "ByteDance-Seed/Seed-OSS-36B-Instruct", name: "ByteDance-Seed/Seed-OSS-36B-Instruct", description: "Tool-capable chat model for instruction following and agentic application workflows", family: "seed", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-04", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.21, output: 0.57 } }, "deepseek-ai/DeepSeek-V3": { id: "deepseek-ai/DeepSeek-V3", name: "deepseek-ai/DeepSeek-V3", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-12-26", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.25, output: 1 } }, "deepseek-ai/DeepSeek-R1": { id: "deepseek-ai/DeepSeek-R1", name: "deepseek-ai/DeepSeek-R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-05-28", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.5, output: 2.18 } }, "deepseek-ai/DeepSeek-V3.2": { id: "deepseek-ai/DeepSeek-V3.2", name: "deepseek-ai/DeepSeek-V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-03", last_updated: "2025-12-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.27, output: 0.42 } }, "deepseek-ai/DeepSeek-V3.2-Exp": { id: "deepseek-ai/DeepSeek-V3.2-Exp", name: "deepseek-ai/DeepSeek-V3.2-Exp", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-10", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.27, output: 0.41 } }, "deepseek-ai/DeepSeek-V3.1": { id: "deepseek-ai/DeepSeek-V3.1", name: "deepseek-ai/DeepSeek-V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-25", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.27, output: 1 } }, "deepseek-ai/DeepSeek-V4-Flash": { id: "deepseek-ai/DeepSeek-V4-Flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "deepseek-ai/DeepSeek-V4-Pro": { id: "deepseek-ai/DeepSeek-V4-Pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 1.74, output: 3.48, cache_read: 0.145 } }, "deepseek-ai/DeepSeek-V3.1-Terminus": { id: "deepseek-ai/DeepSeek-V3.1-Terminus", name: "deepseek-ai/DeepSeek-V3.1-Terminus", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-29", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.27, output: 1 } }, "stepfun-ai/Step-3.5-Flash": { id: "stepfun-ai/Step-3.5-Flash", name: "stepfun-ai/Step-3.5-Flash", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", family: "step", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.1, output: 0.3 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "moonshotai/Kimi-K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-21", last_updated: "2026-06-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.77, output: 4, cache_read: 0.2 } }, "moonshotai/Kimi-K2.5": { id: "moonshotai/Kimi-K2.5", name: "moonshotai/Kimi-K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.45, output: 2.25, cache_read: 0.07 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "openai/gpt-oss-20b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-13", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 8000 }, cost: { input: 0.04, output: 0.18 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "openai/gpt-oss-120b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-13", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 8000 }, cost: { input: 0.05, output: 0.45 } }, "baidu/ERNIE-4.5-300B-A47B": { id: "baidu/ERNIE-4.5-300B-A47B", name: "baidu/ERNIE-4.5-300B-A47B", description: "Tool-capable chat model for instruction following and agentic application workflows", family: "ernie", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-02", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.28, output: 1.1 } } } }, "ai-router": { id: "ai-router", env: ["AI_ROUTER_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.ai-router.dev/v1", name: "AI-ROUTER", doc: "https://ai-router.dev/openai-compatible-api-gateway/", models: { "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 1, output: 6, cache_read: 0.1, cache_write: 1.25 } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 3.125 } } } }, zenmux: { id: "zenmux", env: ["ZENMUX_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://zenmux.ai/api/v1", name: "ZenMux", doc: "https://docs.zenmux.ai", models: { "kuaishou/kat-coder-pro-v2": { id: "kuaishou/kat-coder-pro-v2", name: "KAT-Coder-Pro-V2", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-30", last_updated: "2026-03-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 80000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "google/gemini-3.5-flash": { id: "google/gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15 } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["pdf", "image", "text", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048000, output: 64000 }, cost: { input: 0.3, output: 2.5, cache_read: 0.07, cache_write: 1 } }, "google/gemini-3.1-flash-lite-preview": { id: "google/gemini-3.1-flash-lite-preview", name: "Gemini 3.1 Flash Lite Preview", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-03-20", last_updated: "2025-03-20", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 65530 }, cost: { input: 0.25, output: 1.5 } }, "google/gemini-3-flash-preview": { id: "google/gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "pdf", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048000, output: 64000 }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 1 } }, "google/gemini-3.1-flash-lite": { id: "google/gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025 } }, "google/gemini-3.1-pro-preview": { id: "google/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2026-02-19", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "pdf", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048000, output: 64000 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 4.5 } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["pdf", "image", "text", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048000, output: 64000 }, cost: { input: 1.25, output: 10, cache_read: 0.31, cache_write: 4.5 } }, "google/gemini-2.5-flash-lite": { id: "google/gemini-2.5-flash-lite", name: "Gemini 2.5 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-07-22", last_updated: "2025-07-22", modalities: { input: ["pdf", "image", "text", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048000, output: 64000 }, cost: { input: 0.1, output: 0.4, cache_read: 0.03, cache_write: 1 } }, "qwen/qwen3.7-plus": { id: "qwen/qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.4, output: 1.6, cache_read: 0.08, cache_write: 0.5, tiers: [{ input: 1.2, output: 4.8, cache_read: 0.24, cache_write: 1.5, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 1.2, output: 4.8, cache_read: 0.24, cache_write: 1.5 } } }, "qwen/qwen3.5-plus": { id: "qwen/qwen3.5-plus", name: "Qwen3.5 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.8, output: 4.8 } }, "qwen/qwen3.7-max": { id: "qwen/qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5, cache_write: 3.125 } }, "qwen/qwen3.5-flash": { id: "qwen/qwen3.5-flash", name: "Qwen3.5 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1020000, output: 1020000 }, cost: { input: 0.1, output: 0.4 } }, "qwen/qwen3-max": { id: "qwen/qwen3-max", name: "Qwen3-Max-Thinking", description: "Qwen reasoning model for deliberate problem solving, math, and coding", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-01-23", last_updated: "2026-01-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 1.2, output: 6 } }, "qwen/qwen3-coder-plus": { id: "qwen/qwen3-coder-plus", name: "Qwen3-Coder-Plus", description: "Qwen coding model for software agents, repository edits, and code reasoning", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "qwen/qwen3.6-plus": { id: "qwen/qwen3.6-plus", name: "Qwen3.6-Plus", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-03-30", last_updated: "2026-03-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 0.625, tiers: [{ input: 2, output: 6, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.2, cache_write: 2.5 } } }, "tencent/hy3-preview": { id: "tencent/hy3-preview", name: "Hy3 preview", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, temperature: true, release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0.172, output: 0.572, cache_read: 0.058, cache_write: 0 } }, "sapiens-ai/agnes-1.5-pro": { id: "sapiens-ai/agnes-1.5-pro", name: "Agnes 1.5 Pro", description: "Flagship model for demanding analysis, coding, and production agent workflows", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-21", last_updated: "2026-03-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.16, output: 0.8 } }, "sapiens-ai/agnes-1.5-lite": { id: "sapiens-ai/agnes-1.5-lite", name: "Agnes 1.5 Lite", description: "Efficient model for low-latency assistance, extraction, and routine automation", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-26", last_updated: "2026-03-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.12, output: 0.6 } }, "volcengine/doubao-seed-code": { id: "volcengine/doubao-seed-code", name: "Doubao-Seed-Code", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-11-11", last_updated: "2025-11-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 0.17, output: 1.12, cache_read: 0.03 } }, "volcengine/doubao-seed-2.0-pro": { id: "volcengine/doubao-seed-2.0-pro", name: "Doubao-Seed-2.0-pro", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2026-02-14", release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 0.45, output: 2.24, cache_read: 0.09, cache_write: 0.0024 } }, "volcengine/doubao-seed-2.0-lite": { id: "volcengine/doubao-seed-2.0-lite", name: "Doubao-Seed-2.0-lite", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2026-02-14", release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 0.09, output: 0.51, cache_read: 0.02, cache_write: 0.0024 } }, "volcengine/doubao-seed-1.8": { id: "volcengine/doubao-seed-1.8", name: "Doubao-Seed-1.8", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-12-18", last_updated: "2025-12-18", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 0.11, output: 0.28, cache_read: 0.02, cache_write: 0.0024 } }, "volcengine/doubao-seed-2.0-code": { id: "volcengine/doubao-seed-2.0-code", name: "Doubao Seed 2.0 Code", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 }, cost: { input: 0.9, output: 4.48 } }, "volcengine/doubao-seed-2.0-mini": { id: "volcengine/doubao-seed-2.0-mini", name: "Doubao-Seed-2.0-mini", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2026-02-14", release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 0.03, output: 0.28, cache_read: 0.01, cache_write: 0.0024 } }, "inclusionai/ling-1t": { id: "inclusionai/ling-1t", name: "Ling-1T", description: "Tool-capable chat model for instruction following and agentic application workflows", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-10-09", last_updated: "2025-10-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, cost: { input: 0.56, output: 2.24, cache_read: 0.11 } }, "inclusionai/ring-1t": { id: "inclusionai/ring-1t", name: "Ring-1T", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-10-12", last_updated: "2025-10-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, cost: { input: 0.56, output: 2.24, cache_read: 0.11 } }, "inclusionai/ring-2.6-1t": { id: "inclusionai/ring-2.6-1t", name: "inclusionAI: Ring-2.6-1T", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-12-31", release_date: "2026-05-07", last_updated: "2026-05-14", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 65000 }, cost: { input: 0.3, output: 2.5, cache_read: 0.06 } }, "minimax/minimax-m2.7-highspeed": { id: "minimax/minimax-m2.7-highspeed", name: "MiniMax M2.7 highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131070 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 0.611, output: 2.4439 } }, "minimax/minimax-m2.5-lightning": { id: "minimax/minimax-m2.5-lightning", name: "MiniMax M2.5 highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-02-13", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131072 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 0.6, output: 4.8, cache_read: 0.06, cache_write: 0.75 } }, "minimax/minimax-m2.7": { id: "minimax/minimax-m2.7", name: "MiniMax M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131070 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 0.3055, output: 1.2219 } }, "minimax/minimax-m3": { id: "minimax/minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 512000, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 0.6, output: 2.4 } }, "minimax/minimax-m2.5": { id: "minimax/minimax-m2.5", name: "MiniMax M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-02-13", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131072 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "minimax/minimax-m2": { id: "minimax/minimax-m2", name: "MiniMax M2", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.38 } }, "minimax/minimax-m2.1": { id: "minimax/minimax-m2.1", name: "MiniMax M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.38 } }, "deepseek/deepseek-v3.2-exp": { id: "deepseek/deepseek-v3.2-exp", name: "DeepSeek-V3.2-Exp", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163000, output: 64000 }, cost: { input: 0.22, output: 0.33 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "deepseek/deepseek-v3.2": { id: "deepseek/deepseek-v3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-12-05", last_updated: "2025-12-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, cost: { input: 0.28, output: 0.43 } }, "deepseek/deepseek-chat": { id: "deepseek/deepseek-chat", name: "DeepSeek-V3.2 (Non-thinking Mode)", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, cost: { input: 0.28, output: 0.42, cache_read: 0.03 } }, "x-ai/grok-4": { id: "x-ai/grok-4", name: "Grok 4", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.75 } }, "x-ai/grok-4.2-fast": { id: "x-ai/grok-4.2-fast", name: "Grok 4.2 Fast", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 3, output: 9 } }, "x-ai/grok-4.1-fast": { id: "x-ai/grok-4.1-fast", name: "Grok 4.1 Fast", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 64000 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "x-ai/grok-4.3": { id: "x-ai/grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, cache_write: 0, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, cache_write: 0, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4, cache_write: 0 } } }, "x-ai/grok-4-fast": { id: "x-ai/grok-4-fast", name: "Grok 4 Fast", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-09-19", last_updated: "2025-09-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 64000 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "x-ai/grok-code-fast-1": { id: "x-ai/grok-code-fast-1", name: "Grok Code Fast 1", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 0.2, output: 1.5, cache_read: 0.02 } }, "x-ai/grok-4.2-fast-non-reasoning": { id: "x-ai/grok-4.2-fast-non-reasoning", name: "Grok 4.2 Fast Non Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 3, output: 9 } }, "x-ai/grok-4.5": { id: "x-ai/grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.5, tiers: [{ input: 4, output: 12, cache_read: 1, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 12, cache_read: 1 } } }, "x-ai/grok-build-0.1": { id: "x-ai/grok-build-0.1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1, output: 2, cache_read: 0.2 } }, "x-ai/grok-4.1-fast-non-reasoning": { id: "x-ai/grok-4.1-fast-non-reasoning", name: "Grok 4.1 Fast Non Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 64000 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "xiaomi/mimo-v2-omni": { id: "xiaomi/mimo-v2-omni", name: "MiMo V2 Omni", description: "MiMo omni model for text, image, video, audio, and agents", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 265000, output: 265000 }, cost: { input: 0.4, output: 2, cache_read: 0.08 } }, "xiaomi/mimo-v2-flash": { id: "xiaomi/mimo-v2-flash", name: "MiMo-V2-Flash", description: "MiMo flash model for fast multimodal assistance and agent workflows", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-12-01", release_date: "2025-12-16", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.1, output: 0.3, cache_read: 0.01 } }, "xiaomi/mimo-v2-pro": { id: "xiaomi/mimo-v2-pro", name: "MiMo V2 Pro", description: "Earlier MiMo Pro model for multimodal agents, reasoning, and code tasks", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 256000 }, cost: { input: 1, output: 3, cache_read: 0.2, tiers: [{ input: 2, output: 6, cache_read: 0.4, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.4 } } }, "xiaomi/mimo-v2.5": { id: "xiaomi/mimo-v2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.4, output: 2, cache_read: 0.08, tiers: [{ input: 0.8, output: 4, cache_read: 0.16, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.8, output: 4, cache_read: 0.16 } } }, "xiaomi/mimo-v2.5-pro": { id: "xiaomi/mimo-v2.5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1, output: 3, cache_read: 0.2, tiers: [{ input: 2, output: 6, cache_read: 0.4, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.4 } } }, "anthropic/claude-3.7-sonnet": { id: "anthropic/claude-3.7-sonnet", name: "Claude 3.7 Sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-02-24", last_updated: "2025-02-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-sonnet-4.6": { id: "anthropic/claude-sonnet-4.6", name: "Claude Sonnet 4.6", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-18", last_updated: "2026-02-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-fable-5": { id: "anthropic/claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4.1": { id: "anthropic/claude-opus-4.1", name: "Claude Opus 4.1", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-opus-4.5": { id: "anthropic/claude-opus-4.5", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-3.5-haiku": { id: "anthropic/claude-3.5-haiku", name: "Claude 3.5 Haiku", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2024-11-04", last_updated: "2024-11-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 0.8, output: 4, cache_read: 0.08, cache_write: 1 } }, "anthropic/claude-opus-4.7": { id: "anthropic/claude-opus-4.7", name: "Claude Opus 4.7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-5-free": { id: "anthropic/claude-sonnet-5-free", name: "Claude Sonnet 5 (Free)", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "anthropic/claude-sonnet-4.5": { id: "anthropic/claude-sonnet-4.5", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-sonnet-4": { id: "anthropic/claude-sonnet-4", name: "Claude Sonnet 4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-haiku-4.5": { id: "anthropic/claude-haiku-4.5", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "anthropic/claude-opus-4": { id: "anthropic/claude-opus-4", name: "Claude Opus 4", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-opus-4.8": { id: "anthropic/claude-opus-4.8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-5": { id: "anthropic/claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 4 } }, "anthropic/claude-opus-4.6": { id: "anthropic/claude-opus-4.6", name: "Claude Opus 4.6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-06", last_updated: "2026-02-06", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://zenmux.ai/api/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "z-ai/glm-4.6v": { id: "z-ai/glm-4.6v", name: "GLM 4.6V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0.14, output: 0.42, cache_read: 0.03 } }, "z-ai/glm-5": { id: "z-ai/glm-5", name: "GLM 5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01-01", release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.58, output: 2.6, cache_read: 0.14 } }, "z-ai/glm-4.5-air": { id: "z-ai/glm-4.5-air", name: "GLM 4.5 Air", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, cost: { input: 0.11, output: 0.56, cache_read: 0.02 } }, "z-ai/glm-5.1": { id: "z-ai/glm-5.1", name: "GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-03", last_updated: "2026-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 0.8781, output: 3.5126, cache_read: 0.1903 } }, "z-ai/glm-5.2": { id: "z-ai/glm-5.2", name: "GLM 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.5, cache_read: 0.26 } }, "z-ai/glm-4.7-flashx": { id: "z-ai/glm-4.7-flashx", name: "GLM 4.7 FlashX", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01-01", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0.07, output: 0.42, cache_read: 0.01 } }, "z-ai/glm-4.6": { id: "z-ai/glm-4.6", name: "GLM 4.6", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0.35, output: 1.54, cache_read: 0.07 } }, "z-ai/glm-4.7-flash-free": { id: "z-ai/glm-4.7-flash-free", name: "GLM 4.7 Flash (Free)", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01-01", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0, output: 0 } }, "z-ai/glm-4.6v-flash": { id: "z-ai/glm-4.6v-flash", name: "GLM 4.6V FlashX", description: "GLM vision model for visual reasoning, documents, and multimodal agents", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0.02, output: 0.21, cache_read: 0.0043 } }, "z-ai/glm-4.6v-flash-free": { id: "z-ai/glm-4.6v-flash-free", name: "GLM 4.6V Flash (Free)", description: "GLM vision model for visual reasoning, documents, and multimodal agents", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0, output: 0 } }, "z-ai/glm-4.5": { id: "z-ai/glm-4.5", name: "GLM 4.5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, cost: { input: 0.35, output: 1.54, cache_read: 0.07 } }, "z-ai/glm-5.2-free": { id: "z-ai/glm-5.2-free", name: "GLM 5.2 (Free)", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0 } }, "z-ai/glm-4.7": { id: "z-ai/glm-4.7", name: "GLM 4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01-01", release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0.28, output: 1.14, cache_read: 0.06 } }, "z-ai/glm-5-turbo": { id: "z-ai/glm-5-turbo", name: "GLM 5 Turbo", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 0.88, output: 3.48 } }, "z-ai/glm-5v-turbo": { id: "z-ai/glm-5v-turbo", name: "GLM 5V Turbo", description: "GLM vision model for visual reasoning, documents, and multimodal agents", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 0.726, output: 3.1946, cache_read: 0.1743 } }, "moonshotai/kimi-k2.5": { id: "moonshotai/kimi-k2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: false, knowledge: "2025-01-01", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 64000 }, cost: { input: 0.58, output: 3.02, cache_read: 0.1 } }, "moonshotai/kimi-k2-thinking-turbo": { id: "moonshotai/kimi-k2-thinking-turbo", name: "Kimi K2 Thinking Turbo", description: "Kimi reasoning model for long-horizon research, planning, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 64000 }, cost: { input: 1.15, output: 8, cache_read: 0.15 } }, "moonshotai/kimi-k2.6": { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: false, knowledge: "2025-01-01", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262140, output: 262140 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "moonshotai/kimi-k2.7-code-free": { id: "moonshotai/kimi-k2.7-code-free", name: "Kimi K2.7 Code (Free)", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0, cache_read: 0 } }, "moonshotai/kimi-k2.7-code": { id: "moonshotai/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "moonshotai/kimi-k2-thinking": { id: "moonshotai/kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 64000 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "moonshotai/kimi-k3": { id: "moonshotai/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "moonshotai/kimi-k3-free": { id: "moonshotai/kimi-k3-free", name: "Kimi K3 (Free)", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0 } }, "moonshotai/kimi-k2-0905": { id: "moonshotai/kimi-k2-0905", name: "Kimi K2 0905", description: "Kimi model for long-context chat, coding, and agentic reasoning", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-09-04", last_updated: "2025-09-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 64000 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "openai/gpt-5.1-codex-mini": { id: "openai/gpt-5.1-codex-mini", name: "GPT-5.1-Codex-Mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 64000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 0.25, output: 2, cache_read: 0.03 } }, "openai/gpt-5.2-pro": { id: "openai/gpt-5.2-pro", name: "GPT-5.2-Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 21, output: 168 } }, "openai/gpt-5.5-pro": { id: "openai/gpt-5.5-pro", name: "GPT-5.5 Pro", description: "Highest-accuracy GPT-5.5 tier for slower, precision-heavy reasoning and coding", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "openai/gpt-5.4-pro": { id: "openai/gpt-5.4-pro", name: "GPT-5.4 Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 45, output: 225 } }, "openai/gpt-5.6-sol": { id: "openai/gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 45, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1, cache_write: 12.5 } } }, "openai/gpt-5.5-instant": { id: "openai/gpt-5.5-instant", name: "GPT-5.5 Instant", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-12-01", release_date: "2026-05-05", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 400000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 12.5, output: 75, cache_read: 1.25 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT-5", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 64000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 1.25, output: 10, cache_read: 0.12 } }, "openai/gpt-5.1-chat": { id: "openai/gpt-5.1-chat", name: "GPT-5.1 Chat", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 1.25, output: 10, cache_read: 0.12 } }, "openai/gpt-5-codex": { id: "openai/gpt-5-codex", name: "GPT-5 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 64000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 1.25, output: 10, cache_read: 0.12 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT-5.4", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 3.75, output: 18.75 } }, "openai/gpt-5.2-codex": { id: "openai/gpt-5.2-codex", name: "GPT-5.2-Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2025-01-01", release_date: "2026-01-15", last_updated: "2026-01-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 64000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 1.75, output: 14, cache_read: 0.17 } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT-5.4 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 0.2, output: 1.25 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT-5.4 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 0.75, output: 4.5 } }, "openai/gpt-5.6-luna": { id: "openai/gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 1, output: 6, cache_read: 0.1, cache_write: 1.25, tiers: [{ input: 2, output: 9, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 2, output: 9, cache_read: 0.2, cache_write: 2.5 } } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2025-01-01", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 64000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 1.75, output: 14, cache_read: 0.17 } }, "openai/gpt-5.3-codex": { id: "openai/gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 1.75, output: 14 } }, "openai/gpt-5.3-chat": { id: "openai/gpt-5.3-chat", name: "GPT-5.3 Chat", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16380 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 1.75, output: 14 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT-5.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 64000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 1.25, output: 10, cache_read: 0.12 } }, "openai/gpt-5.1-codex": { id: "openai/gpt-5.1-codex", name: "GPT-5.1-Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 64000 }, provider: { npm: "@ai-sdk/openai", api: "https://zenmux.ai/api/v1" }, cost: { input: 1.25, output: 10, cache_read: 0.12 } }, "openai/gpt-5.6-terra": { id: "openai/gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 3.125, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, cache_write: 6.25, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5, cache_write: 6.25 } } }, "baidu/ernie-5.0-thinking-preview": { id: "baidu/ernie-5.0-thinking-preview", name: "ERNIE 5.0", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-01-22", last_updated: "2026-01-22", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, cost: { input: 0.84, output: 3.37 } }, "stepfun/step-3.5-flash": { id: "stepfun/step-3.5-flash", name: "Step 3.5 Flash", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-02-02", last_updated: "2026-02-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 0.1, output: 0.3 } }, "stepfun/step-3.7-flash": { id: "stepfun/step-3.7-flash", name: "Step 3.7 Flash", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0.2, output: 1.15 } }, "stepfun/step-3": { id: "stepfun/step-3", name: "Step-3", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01-01", release_date: "2025-07-31", last_updated: "2025-07-31", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: false, limit: { context: 65536, output: 64000 }, cost: { input: 0.21, output: 0.57 } }, "stepfun/step-3.7-flash-free": { id: "stepfun/step-3.7-flash-free", name: "Step 3.7 Flash (Free)", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0, output: 0 } } } }, inference: { id: "inference", env: ["INFERENCE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://inference.net/v1", name: "Inference", doc: "https://inference.net/models", models: { "google/gemma-3": { id: "google/gemma-3", name: "Google Gemma 3", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 125000, output: 4096 }, cost: { input: 0.15, output: 0.3 } }, "qwen/qwen-2.5-7b-vision-instruct": { id: "qwen/qwen-2.5-7b-vision-instruct", name: "Qwen 2.5 7B Vision Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 125000, output: 4096 }, cost: { input: 0.2, output: 0.2 } }, "qwen/qwen3-embedding-4b": { id: "qwen/qwen3-embedding-4b", name: "Qwen 3 Embedding 4B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2024-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 2048 }, cost: { input: 0.01, output: 0 } }, "meta/llama-3.2-1b-instruct": { id: "meta/llama-3.2-1b-instruct", name: "Llama 3.2 1B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16000, output: 4096 }, cost: { input: 0.01, output: 0.01 } }, "meta/llama-3.2-3b-instruct": { id: "meta/llama-3.2-3b-instruct", name: "Llama 3.2 3B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16000, output: 4096 }, cost: { input: 0.02, output: 0.02 } }, "meta/llama-3.1-8b-instruct": { id: "meta/llama-3.1-8b-instruct", name: "Llama 3.1 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16000, output: 4096 }, cost: { input: 0.025, output: 0.025 } }, "meta/llama-3.2-11b-vision-instruct": { id: "meta/llama-3.2-11b-vision-instruct", name: "Llama 3.2 11B Vision Instruct", description: "Open Llama multimodal model for image understanding and text reasoning", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 16000, output: 4096 }, cost: { input: 0.055, output: 0.055 } }, "osmosis/osmosis-structure-0.6b": { id: "osmosis/osmosis-structure-0.6b", name: "Osmosis Structure 0.6B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "osmosis", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 4000, output: 2048 }, cost: { input: 0.1, output: 0.5 } }, "mistral/mistral-nemo-12b-instruct": { id: "mistral/mistral-nemo-12b-instruct", name: "Mistral Nemo 12B Instruct", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16000, output: 4096 }, cost: { input: 0.038, output: 0.1 } } } }, evroc: { id: "evroc", env: ["EVROC_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://models.think.evroc.com/v1", name: "evroc", doc: "https://docs.evroc.com/products/think/overview.html", models: { "intfloat/multilingual-e5-large-instruct": { id: "intfloat/multilingual-e5-large-instruct", name: "E5 Multi-Lingual Large Embeddings 0.6B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, release_date: "2024-06-01", last_updated: "2024-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512, output: 512 }, cost: { input: 0.114, output: 0.114 } }, "nvidia/Llama-3.3-70B-Instruct-FP8": { id: "nvidia/Llama-3.3-70B-Instruct-FP8", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 1.15, output: 1.15 } }, "google/gemma-4-26B-A4B-it": { id: "google/gemma-4-26B-A4B-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.144, output: 0.575 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1.4375, output: 5.75 } }, "mistralai/Mistral-Medium-3.5-128B": { id: "mistralai/Mistral-Medium-3.5-128B", name: "Mistral Medium 3.5", description: "Balanced Mistral model for enterprise assistants, multilingual work, and tools", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.725, output: 6.9 } }, "mistralai/Voxtral-Small-24B-2507": { id: "mistralai/Voxtral-Small-24B-2507", name: "Voxtral Small 24B", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "voxtral", attachment: false, reasoning: false, tool_call: false, release_date: "2025-03-01", last_updated: "2025-03-01", modalities: { input: ["audio", "text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 32000 }, cost: { input: 0.0023, output: 0.0023, output_audio: 2.3 } }, "evroc/roc": { id: "evroc/roc", name: "roc", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2026-01", release_date: "2026-06-06", last_updated: "2026-06-06", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 2.875, output: 11.516 } }, "Qwen/Qwen3-Embedding-8B": { id: "Qwen/Qwen3-Embedding-8B", name: "Qwen3 Embedding 8B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, release_date: "2025-07-30", last_updated: "2025-07-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 4096 }, cost: { input: 0.115, output: 0.115 } }, "Qwen/Qwen3.6-35B-A3B-FP8": { id: "Qwen/Qwen3.6-35B-A3B-FP8", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.345, output: 1.38 } }, "Qwen/Qwen3-Reranker-4B": { id: "Qwen/Qwen3-Reranker-4B", name: "Qwen3 Reranker 4B", description: "Reranking model for improving retrieval quality in search and recommendation systems", family: "qwen", attachment: false, reasoning: false, tool_call: false, release_date: "2025-07-30", last_updated: "2025-07-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 4096 }, cost: { input: 0.0575, output: 0 } }, "Qwen/Qwen3-VL-30B-A3B-Instruct": { id: "Qwen/Qwen3-VL-30B-A3B-Instruct", name: "Qwen3 VL 30B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, release_date: "2025-07-30", last_updated: "2025-07-30", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e5, output: 1e5 }, cost: { input: 0.23, output: 0.92 } }, "KBLab/kb-whisper-large": { id: "KBLab/kb-whisper-large", name: "KB Whisper", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "whisper", attachment: false, reasoning: false, tool_call: false, release_date: "2024-10-01", last_updated: "2024-10-01", modalities: { input: ["audio"], output: ["text"] }, open_weights: true, limit: { context: 448, output: 448 }, cost: { input: 0.0023, output: 0.0023, output_audio: 2.3 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.4375, output: 5.75 } }, "openai/whisper-large-v3": { id: "openai/whisper-large-v3", name: "Whisper 3 Large", description: "Open Whisper checkpoint for robust multilingual transcription and captioning", family: "whisper", attachment: false, reasoning: false, tool_call: false, release_date: "2024-10-01", last_updated: "2024-10-01", modalities: { input: ["audio"], output: ["text"] }, open_weights: true, limit: { context: 448, output: 4096 }, cost: { input: 0.0023, output: 0.0023, output_audio: 2.3 } }, "openai/whisper-large-v3-turbo": { id: "openai/whisper-large-v3-turbo", name: "Whisper Large v3 Turbo", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "whisper", attachment: false, reasoning: false, tool_call: false, release_date: "2024-10-01", last_updated: "2024-10-01", modalities: { input: ["audio"], output: ["text"] }, open_weights: true, limit: { context: 448, output: 448 }, cost: { input: 0.0023, output: 0.0023, output_audio: 2.3 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 0.23, output: 0.92 } } } }, abacus: { id: "abacus", env: ["ABACUS_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://routellm.abacus.ai/v1", name: "Abacus", doc: "https://abacus.ai/help/api", models: { "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15 } }, "gpt-4.1-mini": { id: "gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "gpt-4o": { id: "gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "muse-spark-1.1": { id: "muse-spark-1.1", name: "Muse Spark 1.1", description: "Muse Spark is a natively multimodal reasoning model with support for tool-use, visual chain of thought, and multi-agent orchestration.", family: "muse", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-08", last_updated: "2026-07-09", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32000 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "gemini-3.5-flash": { id: "gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "claude-3-7-sonnet-20250219": { id: "claude-3-7-sonnet-20250219", name: "Claude Sonnet 3.7", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-10-31", release_date: "2025-02-19", last_updated: "2025-02-19", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15 } }, "grok-4-0709": { id: "grok-4-0709", name: "Grok 4", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 16384 }, cost: { input: 3, output: 15 } }, "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.6, output: 3 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25 } }, "gpt-4.1-nano": { id: "gpt-4.1-nano", name: "GPT-4.1 nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "grok-4.3": { id: "grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "gemini-3-pro-image-preview": { id: "gemini-3-pro-image-preview", name: "Nano Banana Pro", description: "Nano Banana Pro for higher-fidelity image generation and design-heavy edits", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 32768 }, cost: { input: 2, output: 12, cache_read: 0.2 } }, "gemini-3.1-flash-lite-preview": { id: "gemini-3.1-flash-lite-preview", name: "Gemini 3.1 Flash Lite Preview", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-01", last_updated: "2026-03-01", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, cache_write: 1 } }, "gpt-5.2-chat-latest": { id: "gpt-5.2-chat-latest", name: "GPT-5.2 Chat Latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-09-30", release_date: "2026-01-01", last_updated: "2026-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.75, output: 14 } }, "o3-mini": { id: "o3-mini", name: "o3-mini", description: "Smaller o-series reasoner for economical coding, math, and planning tasks", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "grok-code-fast-1": { id: "grok-code-fast-1", name: "Grok Code Fast 1", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-09-01", last_updated: "2025-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 16384 }, cost: { input: 0.2, output: 1.5 } }, "gpt-5.3-codex-xhigh": { id: "gpt-5.3-codex-xhigh", name: "GPT-5.3 Codex XHigh", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14 } }, "llama-3.3-70b-versatile": { id: "llama-3.3-70b-versatile", name: "Llama 3.3 70B Versatile", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.59, output: 0.79 } }, "mimo-v2-pro": { id: "mimo-v2-pro", name: "MiMo-V2-Pro", description: "Earlier MiMo Pro model for multimodal agents, reasoning, and code tasks", family: "mimo", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, cost: { input: 1, output: 3, cache_read: 0.2 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "gemini-3-flash-preview": { id: "gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05 } }, "o3-pro": { id: "o3-pro", name: "o3-pro", description: "High-effort o3 tier for difficult technical reasoning and careful answers", family: "o-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-06-10", last_updated: "2025-06-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 20, output: 40 } }, "gpt-4o-mini": { id: "gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6 } }, "gpt-5": { id: "gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "gemini-3.1-flash-image-preview": { id: "gemini-3.1-flash-image-preview", name: "Nano Banana 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 1048576, output: 32768 }, cost: { input: 0.5, output: 3 } }, "qwen3-max": { id: "qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-05-28", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 1.2, output: 6 } }, "gpt-5-codex": { id: "gpt-5-codex", name: "GPT-5-Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "grok-4-fast-non-reasoning": { id: "grok-4-fast-non-reasoning", name: "Grok 4 Fast (Non-Reasoning)", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 16384 }, cost: { input: 0.2, output: 0.5 } }, "gpt-4o-2024-11-20": { id: "gpt-4o-2024-11-20", name: "GPT-4o (2024-11-20)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-11-20", last_updated: "2024-11-20", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25 } }, "gpt-5.3-chat-latest": { id: "gpt-5.3-chat-latest", name: "GPT-5.3 Chat Latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-01", last_updated: "2026-03-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.75, output: 14 } }, "kimi-k2-turbo-preview": { id: "kimi-k2-turbo-preview", name: "Kimi K2 Turbo Preview", description: "Fast Kimi model for responsive chat, coding help, and agent loops", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-07-08", last_updated: "2025-07-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 8192 }, cost: { input: 0.15, output: 8 } }, "claude-sonnet-4-5-20250929": { id: "claude-sonnet-4-5-20250929", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15 } }, "gpt-5.2-codex": { id: "gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Code-specialist GPT for repository edits, reviews, and long-running software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "claude-opus-4-5-20251101": { id: "claude-opus-4-5-20251101", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-01", last_updated: "2025-11-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25 } }, "gpt-5.4-nano": { id: "gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "route-llm": { id: "route-llm", name: "RouteLLM", description: "RouteLLM routes prompts to an appropriate Abacus-backed text-generation model", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2024-01-01", last_updated: "2026-07-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, cost: { input: 3, output: 15 } }, "gemini-3.1-flash-lite": { id: "gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 1, output: 6, cache_read: 0.1 } }, "gpt-5.2": { id: "gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gemini-2.5-flash-image": { id: "gemini-2.5-flash-image", name: "Nano Banana", description: "Nano Banana image model for fast generation, edits, and character-consistent assets", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2024-06", release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.3, output: 30 } }, "gpt-5.3-codex": { id: "gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.18 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "grok-4.5": { id: "grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 32768 }, cost: { input: 2, output: 6 } }, "claude-haiku-4-5-20251001": { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5 } }, "qwen-2.5-coder-32b": { id: "qwen-2.5-coder-32b", name: "Qwen 2.5 Coder 32B", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-11-11", last_updated: "2024-11-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.79, output: 0.79 } }, "gemini-3.1-pro-preview": { id: "gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2 } }, "gpt-5.1": { id: "gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "grok-4-1-fast-non-reasoning": { id: "grok-4-1-fast-non-reasoning", name: "Grok 4.1 Fast (Non-Reasoning)", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-11-17", last_updated: "2025-11-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 16384 }, cost: { input: 0.2, output: 0.5 } }, "gpt-5.1-codex": { id: "gpt-5.1-codex", name: "GPT-5.1 Codex", description: "Codex GPT for repository edits, code review, and practical software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "gpt-5-nano": { id: "gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25 } }, "claude-sonnet-4-20250514": { id: "claude-sonnet-4-20250514", name: "Claude Sonnet 4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-05-14", last_updated: "2025-05-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15 } }, o3: { id: "o3", name: "o3", description: "Deliberate o-series reasoner for hard math, coding, and multi-step analysis", family: "o", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15 } }, "gpt-4.1": { id: "gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "o4-mini": { id: "o4-mini", name: "o4-mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4 } }, "claude-opus-4-20250514": { id: "claude-opus-4-20250514", name: "Claude Opus 4", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-05-14", last_updated: "2025-05-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75 } }, "gpt-5.1-codex-max": { id: "gpt-5.1-codex-max", name: "GPT-5.1 Codex Max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10 } }, "gpt-5.1-chat-latest": { id: "gpt-5.1-chat-latest", name: "GPT-5.1 Chat Latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10 } }, "claude-opus-4-1-20250805": { id: "claude-opus-4-1-20250805", name: "Claude Opus 4.1", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75 } }, "google/gemma-4-31b-it": { id: "google/gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.14, output: 0.4 } }, "zai-org/GLM-5": { id: "zai-org/GLM-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 1, output: 3.2 } }, "zai-org/GLM-4.5": { id: "zai-org/GLM-4.5", name: "GLM-4.5", description: "Hybrid-reasoning GLM release that made the 4.5 line broadly useful", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 96000 }, cost: { input: 0.6, output: 2.2 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "zai-org/GLM-5.1": { id: "zai-org/GLM-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "zai-org/GLM-4.6": { id: "zai-org/GLM-4.6", name: "GLM-4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 0.6, output: 2.2 } }, "zai-org/GLM-4.7": { id: "zai-org/GLM-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2 } }, "Qwen/Qwen3-235B-A22B-Instruct-2507": { id: "Qwen/Qwen3-235B-A22B-Instruct-2507", name: "Qwen3 235B A22B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-07-01", last_updated: "2025-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 8192 }, cost: { input: 0.13, output: 0.6 } }, "Qwen/Qwen2.5-72B-Instruct": { id: "Qwen/Qwen2.5-72B-Instruct", name: "Qwen 2.5 72B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-09-19", last_updated: "2024-09-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.11, output: 0.38 } }, "Qwen/Qwen3.6-27B": { id: "Qwen/Qwen3.6-27B", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 8192 }, cost: { input: 0.32, output: 3.2 } }, "Qwen/QwQ-32B": { id: "Qwen/QwQ-32B", name: "QwQ 32B", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2024-11-28", last_updated: "2024-11-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.4, output: 0.4 } }, "Qwen/Qwen3-Coder-480B-A35B-Instruct": { id: "Qwen/Qwen3-Coder-480B-A35B-Instruct", name: "Qwen3-Coder 480B-A35B Instruct", description: "Open Qwen coding heavyweight for repository reasoning and agentic engineering", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.29, output: 1.2 } }, "Qwen/Qwen3-32B": { id: "Qwen/Qwen3-32B", name: "Qwen3 32B", description: "Dense open Qwen model for self-hosted chat, reasoning, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.09, output: 0.29 } }, "MiniMaxAI/MiniMax-M2.7": { id: "MiniMaxAI/MiniMax-M2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "MiniMaxAI/MiniMax-M3": { id: "MiniMaxAI/MiniMax-M3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "deepseek/deepseek-v3.1": { id: "deepseek/deepseek-v3.1", name: "DeepSeek V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-01-20", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.55, output: 1.66 } }, "deepseek-ai/DeepSeek-R1": { id: "deepseek-ai/DeepSeek-R1", name: "DeepSeek R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-01-20", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 3, output: 7 } }, "deepseek-ai/DeepSeek-V3.2": { id: "deepseek-ai/DeepSeek-V3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-06-15", last_updated: "2025-06-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.27, output: 0.4 } }, "deepseek-ai/DeepSeek-V4-Flash": { id: "deepseek-ai/DeepSeek-V4-Flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 32768 }, cost: { input: 0.14, output: 0.28, cache_read: 0.03 } }, "deepseek-ai/DeepSeek-V4-Pro": { id: "deepseek-ai/DeepSeek-V4-Pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 32768 }, cost: { input: 1.74, output: 3.48, cache_read: 0.15 } }, "deepseek-ai/DeepSeek-V3.1-Terminus": { id: "deepseek-ai/DeepSeek-V3.1-Terminus", name: "DeepSeek V3.1 Terminus", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-06-01", last_updated: "2025-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.27, output: 1 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.08, output: 0.44 } }, "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8": { id: "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", name: "Llama 4 Maverick 17B Instruct", description: "Open multimodal Llama for strong reasoning with efficient everyday serving", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 8192 }, cost: { input: 0.14, output: 0.59 } }, "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo": { id: "meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo", name: "Llama 3.1 405B Instruct Turbo", description: "Compact Llama instruction model for fast chat and local deployment", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 3.5, output: 3.5 } }, "meta-llama/Meta-Llama-3.1-8B-Instruct": { id: "meta-llama/Meta-Llama-3.1-8B-Instruct", name: "Llama 3.1 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.02, output: 0.05 } }, "meta-llama/Meta-Llama-3.3-70B-Instruct": { id: "meta-llama/Meta-Llama-3.3-70B-Instruct", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.59, output: 0.79 } } } }, inceptron: { id: "inceptron", env: ["INCEPTRON_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.inceptron.io/v1", name: "Inceptron", doc: "https://docs.inceptron.io", models: { "zai-org/GLM-5.1-FP8": { id: "zai-org/GLM-5.1-FP8", name: "GLM 5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26, cache_write: 0 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.2, output: 4.2, cache_read: 0.26, cache_write: 0 } }, "MiniMaxAI/MiniMax-M2.5": { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 196608 }, cost: { input: 0.15, output: 0.9, cache_read: 0.05, cache_write: 0 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.66, output: 3.5, cache_read: 0.2, cache_write: 0 } }, "moonshotai/Kimi-K2.6-Fast": { id: "moonshotai/Kimi-K2.6-Fast", name: "Kimi K2.6 Fast", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "alpha", cost: { input: 1.32, output: 7, cache_read: 0.4, cache_write: 0 } }, "moonshotai/Kimi-K2.7-Code": { id: "moonshotai/Kimi-K2.7-Code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.75, output: 3.5, cache_read: 0.2, cache_write: 0 } } } }, empiriolabs: { id: "empiriolabs", env: ["EMPIRIOLABS_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.empiriolabs.ai/v1", name: "EmpirioLabs AI", doc: "https://docs.empiriolabs.ai", models: { "mimo-v2-5": { id: "mimo-v2-5", name: "MiMo V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 0.7, output: 1.4, cache_read: 0.014 } }, "minimax-m2-7-highspeed": { id: "minimax-m2-7-highspeed", name: "MiniMax M2.7 Highspeed", description: "Low-latency M2.7 variant for interactive coding plans and agent loops", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 32768 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "qwen3-5-397b-a17b": { id: "qwen3-5-397b-a17b", name: "Qwen3.5 397B-A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 80000 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0.172, output: 1.032, cache_read: 0.172, tiers: [{ input: 0.43, output: 2.58, cache_read: 0.43, tier: { type: "context", size: 128000 } }] } }, "glm-4-7-flash": { id: "glm-4-7-flash", name: "GLM 4.7 Flash", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0, output: 0 } }, "qwen3-5-flash": { id: "qwen3-5-flash", name: "Qwen3.5 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.09, output: 0.368, cache_read: 0.09 } }, "qwen3-5-122b-a10b": { id: "qwen3-5-122b-a10b", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 80000 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0.115, output: 0.917, cache_read: 0.115, tiers: [{ input: 0.287, output: 2.294, cache_read: 0.287, tier: { type: "context", size: 128000 } }] } }, "kimi-k2-7-code-highspeed": { id: "kimi-k2-7-code-highspeed", name: "Kimi K2.7 Code Highspeed", description: "Lower-latency Kimi Code variant for interactive edits and coding-agent loops", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 131072 }, cost: { input: 1.9, output: 8, cache_read: 1.9 } }, "qwen3-5-9b": { id: "qwen3-5-9b", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.09, output: 0.13, cache_read: 0.045 } }, "kimi-k2-6": { id: "kimi-k2-6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16000 }, cost: { input: 0.8939, output: 3.7131, cache_read: 0.1788 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 393216 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-06-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 393216 }, cost: { input: 0.14, output: 0.28, cache_read: 0.14 } }, "qwen3-6-plus": { id: "qwen3-6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.5, tiers: [{ input: 2, output: 6, cache_read: 2, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 2 } } }, "qwen3-6-35b-a3b": { id: "qwen3-6-35b-a3b", name: "Qwen3.6 35B A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.07, output: 0.42, cache_read: 0.035 } }, "step-3-7-flash": { id: "step-3-7-flash", name: "Step 3.7 Flash", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 131072 }, cost: { input: 0.2, output: 1.15, cache_read: 0.04 } }, "minimax-m2-7": { id: "minimax-m2-7", name: "MiniMax M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 32768 }, cost: { input: 0.15, output: 0.6, cache_read: 0.03 } }, "qwen3-7-max": { id: "qwen3-7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 64000 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-06-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 2.5 } }, "minimax-m3": { id: "minimax-m3", name: "MiniMax M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 524288 }, cost: { input: 0.225, output: 0.9, cache_read: 0.045, tiers: [{ input: 0.45, output: 1.8, cache_read: 0.09, tier: { type: "context", size: 512000 } }], context_over_200k: { input: 0.45, output: 1.8, cache_read: 0.09 } } }, "kimi-k2-7-code": { id: "kimi-k2-7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 131072 }, cost: { input: 0.95, output: 4, cache_read: 0.95 } }, "glm-4-5-flash": { id: "glm-4-5-flash", name: "GLM 4.5 Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 98304 }, cost: { input: 0, output: 0 } }, "qwen3-max": { id: "qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen3 model for coding agents, complex reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 65536 }, cost: { input: 1.08, output: 5.52, cache_read: 1.08, tiers: [{ input: 2.16, output: 11.04, cache_read: 2.16, tier: { type: "context", size: 32000 } }, { input: 2.7, output: 13.8, cache_read: 2.7, tier: { type: "context", size: 128000 } }] } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 393216 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-06-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 393216 }, cost: { input: 1.65, output: 3.3, cache_read: 1.65 } }, "glm-5-2": { id: "glm-5-2", name: "GLM 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 1.4 } }, "qwen3-8-max": { id: "qwen3-8-max", name: "Qwen3.8 Max", description: "2.4-trillion-parameter MoE flagship for coding, professional work, multimodal understanding, and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 262144 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 2, output: 6, cache_read: 2 } }, "muse-spark-1-1": { id: "muse-spark-1-1", name: "Muse Spark 1.1", description: "Muse Spark is a natively multimodal reasoning model with support for tool-use, visual chain of thought, and multi-agent orchestration.", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-08", last_updated: "2026-07-09", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, cost: { input: 1.25, output: 4.25, cache_read: 1 } }, "deepseek-v4-flash-0731": { id: "deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 393216 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 393216 }, cost: { input: 0.14, output: 0.28, cache_read: 0.14 } }, "qwen3-7-plus": { id: "qwen3-7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 256000 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.4, output: 1.6, cache_read: 0.4, tiers: [{ input: 1.2, output: 4.8, cache_read: 1.2, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 1.2, output: 4.8, cache_read: 1.2 } } }, "qwen3-5-4b": { id: "qwen3-5-4b", name: "Qwen3.5 4B", description: "Qwen3.5 4B is a low-cost multimodal reasoning model with 256K context, image and video input, function tools, and structured output.", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-02", last_updated: "2026-03-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.04, output: 0.07, cache_read: 0.02 } }, "qwen3-6-max-preview": { id: "qwen3-6-max-preview", name: "Qwen3.6 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 393216 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 65536 }, cost: { input: 1.31, output: 7.88, cache_read: 1.31, tiers: [{ input: 1.97, output: 11.82, cache_read: 1.97, tier: { type: "context", size: 128000 } }] } }, "gemma-4-26b-a4b": { id: "gemma-4-26b-a4b", name: "Gemma 4 26B-A4B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.05, output: 0.29, cache_read: 0.025 } }, "qwen3-6-27b": { id: "qwen3-6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 80000 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0.412564, output: 2.475384, cache_read: 0.412564 } }, "qwen3-5-plus": { id: "qwen3-5-plus", name: "Qwen3.5 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.36, output: 2.21, cache_read: 0.36, tiers: [{ input: 1.08, output: 6.62, cache_read: 1.08, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 1.08, output: 6.62, cache_read: 1.08 } } }, "qwen3-6-flash": { id: "qwen3-6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 64000 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.25, tiers: [{ input: 1, output: 4, cache_read: 1, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 1, output: 4, cache_read: 1 } } }, "qwen3-5-35b-a3b": { id: "qwen3-5-35b-a3b", name: "Qwen3.5 35B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 80000 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0.057, output: 0.459, cache_read: 0.057, tiers: [{ input: 0.229, output: 1.835, cache_read: 0.229, tier: { type: "context", size: 128000 } }] } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 3, output: 15, cache_read: 3 } }, "glm-5-1": { id: "glm-5-1", name: "GLM 5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 38912 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-06-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202000, output: 128000 }, cost: { input: 0.825, output: 3.301, cache_read: 0.165, tiers: [{ input: 1.1, output: 3.851, cache_read: 0.22, tier: { type: "context", size: 32000 } }] } }, "step-3-5-flash-2603": { id: "step-3-5-flash-2603", name: "Step 3.5 Flash 2603", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 131072 }, cost: { input: 0.1, output: 0.3, cache_read: 0.02 } }, "qwen3-7-flash": { id: "qwen3-7-flash", name: "Qwen3.7 Flash", description: "Lightweight multimodal Qwen model for high-throughput text, image, and video tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 131072 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 991000, output: 65536 }, cost: { input: 0.03, output: 0.13, cache_read: 0.006, tiers: [{ input: 0.1, output: 0.4, cache_read: 0.02, tier: { type: "context", size: 32000 } }, { input: 0.2, output: 0.8, cache_read: 0.04, tier: { type: "context", size: 256000 } }] } }, "deepseek-v3-2": { id: "deepseek-v3-2", name: "DeepSeek V3.2", description: "Hybrid-reasoning DeepSeek model with thinking and non-thinking modes, sparse attention, and tool-use", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 393216 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.57, output: 1.71, cache_read: 0.57 } }, "mistral-medium-3": { id: "mistral-medium-3", name: "Mistral Medium 3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-05-07", last_updated: "2025-05-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 130000, output: 40000 }, cost: { input: 0, output: 0 } }, "step-3-5-flash": { id: "step-3-5-flash", name: "Step 3.5 Flash", description: "StepFun flash lane for quick multimodal reasoning and coding assistance", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01-29", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 131072 }, cost: { input: 0.1, output: 0.3, cache_read: 0.02 } }, "mistral-small-4": { id: "mistral-small-4", name: "Mistral Small 4", description: "Fast Mistral production model for chat, extraction, and cost-sensitive agents", family: "mistral-small", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-06", release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 65536 }, cost: { input: 0.15, output: 0.6, cache_read: 0.15 } }, "mimo-v2-5-pro": { id: "mimo-v2-5-pro", name: "MiMo V2.5 Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 2.175, output: 4.35, cache_read: 0.018 } }, "qwen3-5-27b": { id: "qwen3-5-27b", name: "Qwen3.5 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1, max: 80000 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0.086, output: 0.688, cache_read: 0.086, tiers: [{ input: 0.258, output: 2.064, cache_read: 0.258, tier: { type: "context", size: 128000 } }] } } } }, "alibaba-token-plan": { id: "alibaba-token-plan", env: ["ALIBABA_TOKEN_PLAN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1", name: "Alibaba Token Plan", doc: "https://www.alibabacloud.com/help/en/model-studio/token-plan-overview", models: { "qwen3.7-plus": { id: "qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3.8-max-preview": { id: "qwen3.8-max-preview", name: "Qwen3.8 Max Preview", description: "Preview Qwen flagship for million-token multimodal reasoning and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "xhigh"] }, { type: "budget_tokens", min: 0, max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-07-19", last_updated: "2026-07-19", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, status: "beta", cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5": { id: "glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 16384 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 128000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 98304 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "wan2.7-image-pro": { id: "wan2.7-image-pro", name: "Wan2.7 Image Pro", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 8192, output: 0 }, cost: { input: 0, output: 0 } }, "qwen3.7-max": { id: "qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "wan2.7-image": { id: "wan2.7-image", name: "Wan2.7 Image", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 8192, output: 0 }, cost: { input: 0, output: 0 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "happyhorse-1.1-i2v": { id: "happyhorse-1.1-i2v", name: "HappyHorse 1.1 Image-to-Video", description: "Video model for image-to-video generation", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2026-07-17", last_updated: "2026-07-17", modalities: { input: ["image", "text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 0, output: 0 } }, "qwen3.8-max": { id: "qwen3.8-max", name: "Qwen3.8 Max", description: "2.4-trillion-parameter MoE flagship for coding, professional work, multimodal understanding, and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "xhigh"] }, { type: "budget_tokens", min: 0, max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "deepseek-v4-flash-0731": { id: "deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "deepseek-v3.2": { id: "deepseek-v3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-03", last_updated: "2025-12-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0, output: 0 } }, "happyhorse-1.1-r2v": { id: "happyhorse-1.1-r2v", name: "HappyHorse 1.1 Reference-to-Video", description: "Video model for reference-guided video generation", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2026-07-17", last_updated: "2026-07-17", modalities: { input: ["image", "text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 0, output: 0 } }, "qwen-image-2.0-pro": { id: "qwen-image-2.0-pro", name: "Qwen Image 2.0 Pro", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 8192, output: 0 }, cost: { input: 0, output: 0 } }, "MiniMax-M2.5": { id: "MiniMax-M2.5", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, input: 196601, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3.6-flash": { id: "qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 131072 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "happyhorse-1.1-t2v": { id: "happyhorse-1.1-t2v", name: "HappyHorse 1.1 Text-to-Video", description: "Video model for prompt-driven text-to-video generation", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-07-17", last_updated: "2026-07-17", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 0, output: 0 } }, "qwen-image-2.0": { id: "qwen-image-2.0", name: "Qwen Image 2.0", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 8192, output: 0 }, cost: { input: 0, output: 0 } }, "qwen3.6-plus": { id: "qwen3.6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 131072 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, meta: { id: "meta", env: ["META_MODEL_API_KEY"], npm: "@ai-sdk/openai", api: "https://api.meta.ai/v1", name: "Meta", doc: "https://dev.meta.ai/docs", models: { "muse-spark-1.1": { id: "muse-spark-1.1", name: "Muse Spark 1.1", description: "Muse Spark is a natively multimodal reasoning model with support for tool-use, visual chain of thought, and multi-agent orchestration.", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-08", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32000 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "muse-spark-1.2-contributor": { id: "muse-spark-1.2-contributor", name: "Muse Spark 1.2 Contributor", description: "Muse Spark 1.2 is a coding-focused update to Muse Spark 1.1 with improvements in code generation, complex debugging, codebase understanding, and end-to-end developer workflows.", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-05", last_updated: "2026-08-05", modalities: { input: ["text", "image", "video", "pdf", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, cost: { input: 0.1, output: 0.2, cache_read: 0.002 } }, "muse-spark-1.2": { id: "muse-spark-1.2", name: "Muse Spark 1.2", description: "Muse Spark 1.2 is a coding-focused update to Muse Spark 1.1 with improvements in code generation, complex debugging, codebase understanding, and end-to-end developer workflows.", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-05", last_updated: "2026-08-05", modalities: { input: ["text", "image", "video", "pdf", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } } } }, "azure-cognitive-services": { id: "azure-cognitive-services", env: ["AZURE_COGNITIVE_SERVICES_RESOURCE_NAME", "AZURE_COGNITIVE_SERVICES_API_KEY"], npm: "@ai-sdk/azure", name: "Azure Cognitive Services", doc: "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", models: { "gpt-chat-latest": { id: "gpt-chat-latest", name: "GPT Chat Latest", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-05-05", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 111616, output: 16384 }, status: "beta", cost: { input: 5, output: 30, cache_read: 0.5 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_COGNITIVE_SERVICES_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "gpt-5.4-pro": { id: "gpt-5.4-pro", name: "GPT-5.4 Pro", description: "More exact GPT-5.4 tier for demanding professional reasoning and agent tasks", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, status: "beta", cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-07-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_COGNITIVE_SERVICES_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://${AZURE_COGNITIVE_SERVICES_RESOURCE_NAME}.services.ai.azure.com/models", shape: "completions" }, cost: { input: 0.6, output: 3 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2025-12-31", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_COGNITIVE_SERVICES_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://${AZURE_COGNITIVE_SERVICES_RESOURCE_NAME}.services.ai.azure.com/models", shape: "completions" }, cost: { input: 0.95, output: 4 } }, "claude-opus-4-1": { id: "claude-opus-4-1", name: "Claude Opus 4.1", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_COGNITIVE_SERVICES_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "claude-sonnet-4-5": { id: "claude-sonnet-4-5", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_COGNITIVE_SERVICES_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "gpt-5.4-nano": { id: "gpt-5.4-nano", name: "GPT-5.4 Nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 Mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, status: "beta", cost: { input: 1, output: 6, cache_read: 0.1, cache_write: 1.25, tiers: [{ input: 2, output: 9, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 2, output: 9, cache_read: 0.2, cache_write: 2.5 } } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, status: "beta", cost: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 3.125, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, cache_write: 6.25, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5, cache_write: 6.25 } } }, "claude-opus-4-5": { id: "claude-opus-4-5", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-24", last_updated: "2025-08-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_COGNITIVE_SERVICES_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-opus-5": { id: "claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_COGNITIVE_SERVICES_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "text-embedding-3-small": { id: "text-embedding-3-small", name: "text-embedding-3-small", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8191, output: 1536 }, cost: { input: 0.02, output: 0 } }, "cohere-embed-v3-english": { id: "cohere-embed-v3-english", name: "Embed v3 English", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "cohere-embed", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2023-11-07", last_updated: "2023-11-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512, output: 1024 }, cost: { input: 0.1, output: 0 } }, "llama-4-scout-17b-16e-instruct": { id: "llama-4-scout-17b-16e-instruct", name: "Llama 4 Scout 17B 16E Instruct", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.2, output: 0.78 } }, "text-embedding-3-large": { id: "text-embedding-3-large", name: "text-embedding-3-large", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8191, output: 3072 }, cost: { input: 0.13, output: 0 } }, "cohere-command-a": { id: "cohere-command-a", name: "Command A", description: "Cohere command model for multilingual enterprise agents, tools, and chat", family: "command-a", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-06-01", release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 2.5, output: 10 } }, "o4-mini": { id: "o4-mini", name: "o4-mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 1.1, output: 4.4, cache_read: 0.275 } }, "gpt-4.1": { id: "gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, status: "deprecated", cost: { input: 2, output: 8, cache_read: 0.5 } }, "cohere-embed-v3-multilingual": { id: "cohere-embed-v3-multilingual", name: "Embed v3 Multilingual", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "cohere-embed", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2023-11-07", last_updated: "2023-11-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512, output: 1024 }, cost: { input: 0.1, output: 0 } }, "codestral-2501": { id: "codestral-2501", name: "Codestral 25.01", description: "Mistral coding model for code completion, generation, and developer workflows", family: "codestral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-03", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.3, output: 0.9 } }, "gpt-3.5-turbo-0125": { id: "gpt-3.5-turbo-0125", name: "GPT-3.5 Turbo 0125", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2021-08", release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 16384 }, status: "deprecated", cost: { input: 0.5, output: 1.5 } }, "gpt-3.5-turbo-instruct": { id: "gpt-3.5-turbo-instruct", name: "GPT-3.5 Turbo Instruct", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2021-08", release_date: "2023-09-21", last_updated: "2023-09-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 4096, output: 4096 }, status: "deprecated", cost: { input: 1.5, output: 2 } }, o3: { id: "o3", name: "o3", description: "Deliberate o-series reasoner for hard math, coding, and multi-step analysis", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "gpt-5-nano": { id: "gpt-5-nano", name: "GPT-5 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.01 } }, "gpt-5.1-codex": { id: "gpt-5.1-codex", name: "GPT-5.1 Codex", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text", "image", "audio"], output: ["text", "image", "audio"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "phi-4-mini": { id: "phi-4-mini", name: "Phi-4-mini", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "phi", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-10", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.075, output: 0.3 } }, "gpt-4-turbo": { id: "gpt-4-turbo", name: "GPT-4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, status: "deprecated", cost: { input: 10, output: 30 } }, "gpt-5.1": { id: "gpt-5.1", name: "GPT-5.1", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text", "image", "audio"], output: ["text", "image", "audio"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "GPT-5 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.03 } }, "phi-4-reasoning-plus": { id: "phi-4-reasoning-plus", name: "Phi-4-reasoning-plus", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "phi", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2023-10", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 4096 }, cost: { input: 0.125, output: 0.5 } }, "gpt-5.3-codex": { id: "gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-24", last_updated: "2026-02-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "deepseek-r1": { id: "deepseek-r1", name: "DeepSeek-R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 163840 }, status: "deprecated", cost: { input: 1.35, output: 5.4 } }, "gpt-5.2": { id: "gpt-5.2", name: "GPT-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.125 } }, o1: { id: "o1", name: "o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2023-09", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 15, output: 60, cache_read: 7.5 } }, "mistral-small-2503": { id: "mistral-small-2503", name: "Mistral Small 3.1", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2025-03-01", last_updated: "2025-03-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32768 }, cost: { input: 0.1, output: 0.3 } }, "cohere-embed-v-4-0": { id: "cohere-embed-v-4-0", name: "Embed v4", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "cohere-embed", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 1536 }, cost: { input: 0.12, output: 0 } }, "deepseek-v3.2": { id: "deepseek-v3.2", name: "DeepSeek-V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.58, output: 1.68 } }, "gpt-5-pro": { id: "gpt-5-pro", name: "GPT-5 Pro", description: "Higher-accuracy GPT-5 tier for tough analysis, coding reviews, and planning", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 272000 }, cost: { input: 15, output: 120 } }, "gpt-5.2-codex": { id: "gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-01-14", last_updated: "2026-01-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "phi-4-mini-reasoning": { id: "phi-4-mini-reasoning", name: "Phi-4-mini-reasoning", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "phi", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2023-10", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.075, output: 0.3 } }, "gpt-4-turbo-vision": { id: "gpt-4-turbo-vision", name: "GPT-4 Turbo Vision", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-11", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, status: "deprecated", cost: { input: 10, output: 30 } }, "llama-3.3-70b-instruct": { id: "llama-3.3-70b-instruct", name: "Llama-3.3-70B-Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.71, output: 0.71 } }, "gpt-5-codex": { id: "gpt-5-codex", name: "GPT-5-Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "phi-4-reasoning": { id: "phi-4-reasoning", name: "Phi-4-reasoning", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "phi", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2023-10", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 4096 }, cost: { input: 0.125, output: 0.5 } }, "mistral-medium-2505": { id: "mistral-medium-2505", name: "Mistral Medium 3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-05-07", last_updated: "2025-05-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.4, output: 2 } }, "gpt-5": { id: "gpt-5", name: "GPT-5", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "llama-4-maverick-17b-128e-instruct-fp8": { id: "llama-4-maverick-17b-128e-instruct-fp8", name: "Llama 4 Maverick 17B 128E Instruct FP8", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 16384 }, cost: { input: 0.25, output: 1 } }, "gpt-4o-mini": { id: "gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, status: "deprecated", cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "ministral-3b": { id: "ministral-3b", name: "Ministral 3B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-03", release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.04, output: 0.04 } }, "o3-mini": { id: "o3-mini", name: "o3-mini", description: "Smaller o-series reasoner for economical coding, math, and planning tasks", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "model-router": { id: "model-router", name: "Model Router", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "model-router", attachment: true, reasoning: false, tool_call: true, release_date: "2025-05-19", last_updated: "2025-11-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 16384 }, cost: { input: 0.14, output: 0 } }, "phi-4": { id: "phi-4", name: "Phi-4", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "phi", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2023-10", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.125, output: 0.5 } }, "deepseek-v3.2-speciale": { id: "deepseek-v3.2-speciale", name: "DeepSeek-V3.2-Speciale", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.58, output: 1.68 } }, "gpt-3.5-turbo-1106": { id: "gpt-3.5-turbo-1106", name: "GPT-3.5 Turbo 1106", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2021-08", release_date: "2023-11-06", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 16384 }, status: "deprecated", cost: { input: 1, output: 2 } }, "gpt-4.1-nano": { id: "gpt-4.1-nano", name: "GPT-4.1 nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, status: "deprecated", cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "text-embedding-ada-002": { id: "text-embedding-ada-002", name: "text-embedding-ada-002", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, release_date: "2022-12-15", last_updated: "2022-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 }, cost: { input: 0.1, output: 0 } }, "phi-4-multimodal": { id: "phi-4-multimodal", name: "Phi-4-multimodal", description: "Multimodal model for analyzing text, images, documents, and rich media", family: "phi", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2023-10", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.08, output: 0.32, input_audio: 4 } }, "codex-mini": { id: "codex-mini", name: "Codex Mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-04", release_date: "2025-05-16", last_updated: "2025-05-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 1.5, output: 6, cache_read: 0.375 } }, "gpt-4o": { id: "gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, status: "deprecated", cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "gpt-4.1-mini": { id: "gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, status: "deprecated", cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "gpt-5.1-codex-mini": { id: "gpt-5.1-codex-mini", name: "GPT-5.1 Codex Mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } } } }, "wafer.ai": { id: "wafer.ai", env: ["WAFER_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://pass.wafer.ai/v1", name: "Wafer", doc: "https://docs.wafer.ai/wafer-pass", models: { "Kimi-K2.6": { id: "Kimi-K2.6", name: "Kimi K2.6", description: "Kimi K2.6 sparse MoE model with a 262K context window. Available serverless and not included in standard Wafer Pass. Non-ZDR only: requests with `Wafer-ZDR: required` are rejected.", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 1.14, output: 4.8, cache_read: 0.19, cache_write: 0 } }, "GLM-5.2": { id: "GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1.2, output: 4.1, cache_read: 0.2, cache_write: 0 } }, "GLM-5.1": { id: "GLM-5.1", name: "GLM-5.1", description: "General Language Model 5.1 \u2014 high-quality bilingual (EN/ZH) generation with strong coding and reasoning capabilities.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-07", last_updated: "2026-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.1, cache_write: 0 } }, "glm5.2-fast": { id: "glm5.2-fast", name: "GLM5.2-Fast", description: "The same model served for high TPS.", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 10.25, cache_read: 0.5, cache_write: 0 } }, "MiniMax-M3": { id: "MiniMax-M3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 128000 }, cost: { input: 0.33, output: 1.32, cache_read: 0.07, cache_write: 0, tiers: [{ input: 0.66, output: 2.64, cache_read: 0.13, cache_write: 0, tier: { type: "context", size: 512000 } }], context_over_200k: { input: 0.66, output: 2.64, cache_read: 0.13, cache_write: 0 } } } } }, clarifai: { id: "clarifai", env: ["CLARIFAI_PAT"], npm: "@ai-sdk/openai-compatible", api: "https://api.clarifai.com/v2/ext/openai/v1", name: "Clarifai", doc: "https://docs.clarifai.com/compute/inference/", models: { "qwen/qwenCoder/models/Qwen3-Coder-30B-A3B-Instruct": { id: "qwen/qwenCoder/models/Qwen3-Coder-30B-A3B-Instruct", name: "Qwen3 Coder 30B A3B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-31", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.11458, output: 0.74812 } }, "qwen/qwenLM/models/Qwen3-30B-A3B-Thinking-2507": { id: "qwen/qwenLM/models/Qwen3-30B-A3B-Thinking-2507", name: "Qwen3 30B A3B Thinking 2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-31", last_updated: "2026-02-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.36, output: 1.3 } }, "qwen/qwenLM/models/Qwen3-30B-A3B-Instruct-2507": { id: "qwen/qwenLM/models/Qwen3-30B-A3B-Instruct-2507", name: "Qwen3 30B A3B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-30", last_updated: "2026-02-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.3, output: 0.5 } }, "mistralai/completion/models/Ministral-3-3B-Reasoning-2512": { id: "mistralai/completion/models/Ministral-3-3B-Reasoning-2512", name: "Ministral 3 3B Reasoning 2512", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-12", last_updated: "2026-02-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.039, output: 0.54825 } }, "mistralai/completion/models/Ministral-3-14B-Reasoning-2512": { id: "mistralai/completion/models/Ministral-3-14B-Reasoning-2512", name: "Ministral 3 14B Reasoning 2512", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-12", release_date: "2025-12-01", last_updated: "2025-12-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 2.5, output: 1.7 } }, "clarifai/main/models/mm-poly-8b": { id: "clarifai/main/models/mm-poly-8b", name: "MM Poly 8B", description: "Multimodal model for analyzing text, images, documents, and rich media", family: "mm-poly", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-06", last_updated: "2026-02-25", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 4096 }, cost: { input: 0.658, output: 1.11 } }, "deepseek-ai/deepseek-ocr/models/DeepSeek-OCR": { id: "deepseek-ai/deepseek-ocr/models/DeepSeek-OCR", name: "DeepSeek OCR", description: "OCR model for extracting structured text from documents and screenshots", family: "deepseek", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-10-20", last_updated: "2026-02-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0.2, output: 0.7 } }, "arcee_ai/AFM/models/trinity-mini": { id: "arcee_ai/AFM/models/trinity-mini", name: "Trinity Mini", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "trinity-mini", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-12", last_updated: "2026-02-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.045, output: 0.15 } }, "moonshotai/chat-completion/models/Kimi-K2_6": { id: "moonshotai/chat-completion/models/Kimi-K2_6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4 } }, "openai/chat-completion/models/gpt-oss-20b": { id: "openai/chat-completion/models/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-12-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.045, output: 0.18 } }, "openai/chat-completion/models/gpt-oss-120b-high-throughput": { id: "openai/chat-completion/models/gpt-oss-120b-high-throughput", name: "GPT OSS 120B High Throughput", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-08-05", last_updated: "2026-02-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.09, output: 0.36 } }, "minimaxai/chat-completion/models/MiniMax-M2_5-high-throughput": { id: "minimaxai/chat-completion/models/MiniMax-M2_5-high-throughput", name: "MiniMax-M2.5 High Throughput", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2 } } } }, iflowcn: { id: "iflowcn", env: ["IFLOW_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://apis.iflow.cn/v1", name: "iFlow", doc: "https://platform.iflow.cn/en/docs", models: { "qwen3-vl-plus": { id: "qwen3-vl-plus", name: "Qwen3-VL-Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 }, cost: { input: 0, output: 0 } }, "qwen3-32b": { id: "qwen3-32b", name: "Qwen3-32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32000 }, cost: { input: 0, output: 0 } }, "qwen3-235b-a22b-thinking-2507": { id: "qwen3-235b-a22b-thinking-2507", name: "Qwen3-235B-A22B-Thinking", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-01", last_updated: "2025-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0, output: 0 } }, "qwen3-235b": { id: "qwen3-235b", name: "Qwen3-235B-A22B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32000 }, cost: { input: 0, output: 0 } }, "qwen3-max-preview": { id: "qwen3-max-preview", name: "Qwen3-Max-Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 }, cost: { input: 0, output: 0 } }, "qwen3-max": { id: "qwen3-max", name: "Qwen3-Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 }, cost: { input: 0, output: 0 } }, "glm-4.6": { id: "glm-4.6", name: "GLM-4.6", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-01", last_updated: "2025-11-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 0, output: 0 } }, "qwen3-coder-plus": { id: "qwen3-coder-plus", name: "Qwen3-Coder-Plus", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-01", last_updated: "2025-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0, output: 0 } }, "deepseek-v3": { id: "deepseek-v3", name: "DeepSeek-V3", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-26", last_updated: "2024-12-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32000 }, cost: { input: 0, output: 0 } }, "deepseek-v3.2": { id: "deepseek-v3.2", name: "DeepSeek-V3.2-Exp", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 64000 }, cost: { input: 0, output: 0 } }, "deepseek-r1": { id: "deepseek-r1", name: "DeepSeek-R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-20", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32000 }, cost: { input: 0, output: 0 } }, "kimi-k2": { id: "kimi-k2", name: "Kimi-K2", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, cost: { input: 0, output: 0 } }, "qwen3-235b-a22b-instruct": { id: "qwen3-235b-a22b-instruct", name: "Qwen3-235B-A22B-Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-01", last_updated: "2025-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0, output: 0 } }, "kimi-k2-0905": { id: "kimi-k2-0905", name: "Kimi-K2-0905", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 0, output: 0 } } } }, gitlab: { id: "gitlab", env: ["GITLAB_TOKEN"], npm: "gitlab-ai-provider", name: "GitLab Duo", doc: "https://docs.gitlab.com/user/duo_agent_platform/", models: { "duo-chat-gpt-5-5": { id: "duo-chat-gpt-5-5", name: "Agentic Chat (GPT-5.5)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0, output: 0 } }, "duo-chat-gpt-5-codex": { id: "duo-chat-gpt-5-codex", name: "Agentic Chat (GPT-5 Codex)", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2026-01-22", last_updated: "2026-01-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0, output: 0 } }, "duo-chat-haiku-4-5": { id: "duo-chat-haiku-4-5", name: "Agentic Chat (Claude Haiku 4.5)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2026-01-08", last_updated: "2026-01-08", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "duo-chat-opus-4-8": { id: "duo-chat-opus-4-8", name: "Agentic Chat (Claude Opus 4.8)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "duo-chat-gpt-5-1": { id: "duo-chat-gpt-5-1", name: "Agentic Chat (GPT-5.1)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2026-01-22", last_updated: "2026-01-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0, output: 0 } }, "duo-chat-opus-4-6": { id: "duo-chat-opus-4-6", name: "Agentic Chat (Claude Opus 4.6)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "duo-chat-gpt-5-6-terra": { id: "duo-chat-gpt-5-6-terra", name: "Agentic Chat (GPT-5.6 Terra)", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "duo-chat-gpt-5-2-codex": { id: "duo-chat-gpt-5-2-codex", name: "Agentic Chat (GPT-5.2 Codex)", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-01-22", last_updated: "2026-01-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0, output: 0 } }, "duo-chat-gpt-5-6-luna": { id: "duo-chat-gpt-5-6-luna", name: "Agentic Chat (GPT-5.6 Luna)", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "duo-chat-sonnet-4-6": { id: "duo-chat-sonnet-4-6", name: "Agentic Chat (Claude Sonnet 4.6)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-02-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "duo-chat-gpt-5-mini": { id: "duo-chat-gpt-5-mini", name: "Agentic Chat (GPT-5 Mini)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2026-01-22", last_updated: "2026-01-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0, output: 0 } }, "duo-chat-gpt-5-3-codex": { id: "duo-chat-gpt-5-3-codex", name: "Agentic Chat (GPT-5.3 Codex)", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0, output: 0 } }, "duo-chat-gpt-5-4-nano": { id: "duo-chat-gpt-5-4-nano", name: "Agentic Chat (GPT-5.4 Nano)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0, output: 0 } }, "duo-chat-gpt-5-4-mini": { id: "duo-chat-gpt-5-4-mini", name: "Agentic Chat (GPT-5.4 Mini)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0, output: 0 } }, "duo-chat-gpt-5-2": { id: "duo-chat-gpt-5-2", name: "Agentic Chat (GPT-5.2)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-01-23", last_updated: "2026-01-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0, output: 0 } }, "duo-chat-fable-5": { id: "duo-chat-fable-5", name: "Agentic Chat (Claude Fable 5)", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "duo-chat-gpt-5-4": { id: "duo-chat-gpt-5-4", name: "Agentic Chat (GPT-5.4)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0, output: 0 } }, "duo-chat-sonnet-4-5": { id: "duo-chat-sonnet-4-5", name: "Agentic Chat (Claude Sonnet 4.5)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2026-01-08", last_updated: "2026-01-08", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "duo-chat-opus-4-7": { id: "duo-chat-opus-4-7", name: "Agentic Chat (Claude Opus 4.7)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "duo-chat-sonnet-5": { id: "duo-chat-sonnet-5", name: "Agentic Chat (Claude Sonnet 5)", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "duo-chat-opus-4-5": { id: "duo-chat-opus-4-5", name: "Agentic Chat (Claude Opus 4.5)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2026-01-08", last_updated: "2026-01-08", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "duo-chat-gpt-5-6-sol": { id: "duo-chat-gpt-5-6-sol", name: "Agentic Chat (GPT-5.6 Sol)", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "duo-chat-opus-5": { id: "duo-chat-opus-5", name: "Agentic Chat (Claude Opus 5)", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, bailing: { id: "bailing", env: ["BAILING_API_TOKEN"], npm: "@ai-sdk/openai-compatible", api: "https://api.tbox.cn/api/llm/v1/chat/completions", name: "Bailing", doc: "https://alipaytbox.yuque.com/sxs0ba/ling/intro", models: { "Ling-1T": { id: "Ling-1T", name: "Ling-1T", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "ling", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06", release_date: "2025-10", last_updated: "2025-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32000 }, cost: { input: 0.57, output: 2.29 } }, "Ring-1T": { id: "Ring-1T", name: "Ring-1T", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "ring", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2024-06", release_date: "2025-10", last_updated: "2025-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32000 }, cost: { input: 0.57, output: 2.29 } } } }, venice: { id: "venice", env: ["VENICE_API_KEY"], npm: "venice-ai-sdk-provider", name: "Venice AI", doc: "https://docs.venice.ai", models: { "olafangensan-glm-4.7-flash-heretic": { id: "olafangensan-glm-4.7-flash-heretic", name: "GLM 4.7 Flash Heretic", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2026-02-04", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 24000 }, cost: { input: 0.07, output: 0.4, cache_read: 0.035 } }, "qwen3-coder-480b-a35b-instruct-turbo": { id: "qwen3-coder-480b-a35b-instruct-turbo", name: "Qwen 3 Coder 480B Turbo", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-01-27", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 65536 }, cost: { input: 0.35, output: 1.5, cache_read: 0.04 } }, "grok-4-5": { id: "grok-4-5", name: "Grok 4.5", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-07", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 32000 }, cost: { input: 2.27, output: 6.8, cache_read: 0.34, tiers: [{ input: 4.53, output: 13.6, cache_read: 0.68, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4.53, output: 13.6, cache_read: 0.68 } } }, "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3.6, output: 18, cache_read: 0.36, cache_write: 4.5 } }, "grok-build-0-1": { id: "grok-build-0-1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 65536 }, cost: { input: 1, output: 2, cache_read: 0.2, tiers: [{ input: 2, output: 4, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2, output: 4, cache_read: 0.4 } } }, "qwen3-5-397b-a17b": { id: "qwen3-5-397b-a17b", name: "Qwen 3.5 397B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-16", last_updated: "2026-06-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.75, output: 4.5 } }, "openai-gpt-54-pro": { id: "openai-gpt-54-pro", name: "GPT-5.4 Pro", description: "More exact GPT-5.4 tier for demanding professional reasoning and agent tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 922000, output: 128000 }, cost: { input: 37.5, output: 225, tiers: [{ input: 75, output: 337.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 75, output: 337.5 } } }, "qwen-3-8-max": { id: "qwen-3-8-max", name: "Qwen 3.8 Max", description: "Preview Qwen flagship for million-token multimodal reasoning and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-07-22", last_updated: "2026-07-19", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 2.5, output: 7.5, cache_read: 0.3125, cache_write: 3.125 } }, "minimax-m25": { id: "minimax-m25", name: "MiniMax M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 198000, output: 32768 }, cost: { input: 0.27, output: 0.95, cache_read: 0.03 } }, "llama-3.3-70b": { id: "llama-3.3-70b", name: "Llama 3.3 70B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, release_date: "2025-04-06", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.7, output: 2.8 } }, "nvidia-nemotron-3-ultra-550b-a55b": { id: "nvidia-nemotron-3-ultra-550b-a55b", name: "NVIDIA Nemotron 3 Ultra", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 32768 }, cost: { input: 0.625, output: 3.125, cache_read: 0.1875 } }, "mistral-small-3-2-24b-instruct": { id: "mistral-small-3-2-24b-instruct", name: "Mistral Small 3.2 24B Instruct", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-01-15", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 0.09375, output: 0.25 } }, "gemini-3-5-flash": { id: "gemini-3-5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-22", last_updated: "2026-06-11", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 1.55, output: 9.45, cache_read: 0.155, cache_write: 0.086 } }, "minimax-m3-preview": { id: "minimax-m3-preview", name: "MiniMax M3 Preview", description: "MiniMax multimodal coding model for long-context reasoning and agent tasks", family: "minimax-m3", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, release_date: "2026-06-12", last_updated: "2026-06-13", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 65536 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "openai-gpt-55": { id: "openai-gpt-55", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 922000, output: 131072 }, cost: { input: 6.25, output: 37.5, cache_read: 0.625, tiers: [{ input: 12.5, output: 56.25, cache_read: 1.25, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 12.5, output: 56.25, cache_read: 1.25 } } }, "gemma-4-uncensored": { id: "gemma-4-uncensored", name: "Gemma 4 Uncensored", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-04-13", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8192 }, cost: { input: 0.1625, output: 0.5 } }, "aion-labs-aion-3-0": { id: "aion-labs-aion-3-0", name: "Aion 3.0", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32768 }, cost: { input: 3.75, output: 7.5, cache_read: 0.9375 } }, "qwen3-235b-a22b-thinking-2507": { id: "qwen3-235b-a22b-thinking-2507", name: "Qwen 3 235B A22B Thinking 2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, release_date: "2025-04-29", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.45, output: 3.5 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 6, output: 30, cache_read: 0.6, cache_write: 7.5 } }, "qwen3-5-9b": { id: "qwen3-5-9b", name: "Qwen 3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-05", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 32768 }, cost: { input: 0.1, output: 0.15 } }, "kimi-k2-6": { id: "kimi-k2-6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-20", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 65536 }, cost: { input: 0.75, output: 3.5, cache_read: 0.16 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-10", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 12, output: 60, cache_read: 1.2, cache_write: 15 } }, "openai-gpt-54-mini": { id: "openai-gpt-54-mini", name: "GPT-5.4 Mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-27", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.9375, output: 5.625, cache_read: 0.09375 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash 0423", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 32768 }, cost: { input: 0.138, output: 0.275, cache_read: 0.028 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 6, output: 30, cache_read: 0.6, cache_write: 7.5 } }, "zai-org-glm-5": { id: "zai-org-glm-5", name: "GLM 5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-11", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 198000, output: 32000 }, cost: { input: 1, output: 3.2, cache_read: 0.2 } }, "openai-gpt-56-luna-pro": { id: "openai-gpt-56-luna-pro", name: "GPT-5.6 Luna Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 0.26666667, output: 1.6, cache_read: 0.02666667, cache_write: 0.33333334 } }, "venice-uncensored-1-2": { id: "venice-uncensored-1-2", name: "Venice Uncensored 1.2", description: "Multimodal model for analyzing text, images, documents, and rich media", family: "venice", attachment: true, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-04-01", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.2, output: 0.9 } }, "qwen3-vl-235b-a22b": { id: "qwen3-vl-235b-a22b", name: "Qwen3 VL 235B", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-01-16", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.21, output: 1.9, cache_read: 0.1 } }, "gemini-3-5-flash-lite": { id: "gemini-3-5-flash-lite", name: "Gemini 3.5 Flash-Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-09", last_updated: "2026-07-21", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.375, output: 3.125, cache_read: 0.0375 } }, "qwen3-6-35b-a3b": { id: "qwen3-6-35b-a3b", name: "Qwen 3.6 35B A3B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-20", last_updated: "2026-07-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 65536 }, cost: { input: 0.1, output: 1 } }, "google-gemma-3-27b-it": { id: "google-gemma-3-27b-it", name: "Google Gemma 3 27B Instruct", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, release_date: "2025-11-04", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 198000, output: 16384 }, cost: { input: 0.12, output: 0.2 } }, "minimax-m27": { id: "minimax-m27", name: "MiniMax M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 198000, output: 32768 }, cost: { input: 0.375, output: 1.5, cache_read: 0.06875 } }, "zai-org-glm-4.6": { id: "zai-org-glm-4.6", name: "GLM 4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2024-04-01", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 198000, output: 16384 }, cost: { input: 0.43, output: 1.75, cache_read: 0.08 } }, "gemini-3-flash-preview": { id: "gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-19", last_updated: "2026-06-11", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 65536 }, cost: { input: 0.7, output: 3.75, cache_read: 0.07 } }, "openai-gpt-4o-mini-2024-07-18": { id: "openai-gpt-4o-mini-2024-07-18", name: "GPT-4o Mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2026-02-28", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.1875, output: 0.75, cache_read: 0.09375 } }, "openai-gpt-54": { id: "openai-gpt-54", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 922000, output: 131072 }, cost: { input: 3.13, output: 18.8, cache_read: 0.313 } }, "qwen-3-7-max": { id: "qwen-3-7-max", name: "Qwen 3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-05-22", last_updated: "2026-06-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 2.7, output: 8.05, cache_read: 0.27, cache_write: 3.35 } }, "qwen-3-7-plus": { id: "qwen-3-7-plus", name: "Qwen 3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.5, output: 2, cache_read: 0.05, cache_write: 0.625, tiers: [{ input: 1.5, output: 6, cache_read: 0.15, cache_write: 1.875, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 1.5, output: 6, cache_read: 0.15, cache_write: 1.875 } } }, "kimi-k2-7-code": { id: "kimi-k2-7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-13", last_updated: "2026-06-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 65536 }, cost: { input: 0.75, output: 3.5, cache_read: 0.16 } }, "qwen-3-6-plus": { id: "qwen-3-6-plus", name: "Qwen 3.6 Plus Uncensored", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-06", last_updated: "2026-06-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.625, output: 3.75, cache_read: 0.0625, cache_write: 0.78, tiers: [{ input: 2.5, output: 7.5, cache_read: 0.0625, cache_write: 0.78, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2.5, output: 7.5, cache_read: 0.0625, cache_write: 0.78 } } }, "claude-sonnet-4-5": { id: "claude-sonnet-4-5", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-01-15", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 198000, output: 64000 }, cost: { input: 3.75, output: 18.75, cache_read: 0.375, cache_write: 4.69 } }, "openai-gpt-4o-2024-11-20": { id: "openai-gpt-4o-2024-11-20", name: "GPT-4o", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2026-02-28", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 3.125, output: 12.5 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 32768 }, cost: { input: 1.65, output: 3.301, cache_read: 0.33 } }, "openai-gpt-52": { id: "openai-gpt-52", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-13", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 272000, output: 65536 }, cost: { input: 2.19, output: 17.5, cache_read: 0.219 } }, "grok-4-3": { id: "grok-4-3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-18", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32000 }, cost: { input: 1.42, output: 2.83, cache_read: 0.23, tiers: [{ input: 2.83, output: 5.67, cache_read: 0.45, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.83, output: 5.67, cache_read: 0.45 } } }, "kimi-k2-5": { id: "kimi-k2-5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2024-04", release_date: "2026-01-27", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 65536 }, cost: { input: 0.56, output: 3.5, cache_read: 0.22 } }, "nvidia-nemotron-3-nano-30b-a3b": { id: "nvidia-nemotron-3-nano-30b-a3b", name: "NVIDIA Nemotron 3 Nano 30B", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01-27", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.075, output: 0.3 } }, "zai-org-glm-4.7-flash": { id: "zai-org-glm-4.7-flash", name: "GLM 4.7 Flash", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-29", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.06, output: 0.4, cache_read: 0.01 } }, "llama-3.2-3b": { id: "llama-3.2-3b", name: "Llama 3.2 3B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-10-03", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.15, output: 0.6 } }, "openai-gpt-55-pro": { id: "openai-gpt-55-pro", name: "GPT-5.5 Pro", description: "Highest-accuracy GPT-5.5 tier for slower, precision-heavy reasoning and coding", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-24", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 922000, output: 128000 }, cost: { input: 37.5, output: 225 } }, "deepseek-v4-flash-0731": { id: "deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.175, output: 0.35, cache_read: 0.035 } }, "qwen3-235b-a22b-instruct-2507": { id: "qwen3-235b-a22b-instruct-2507", name: "Qwen 3 235B A22B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-29", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.75 } }, "mistral-small-2603": { id: "mistral-small-2603", name: "Mistral Small 4", description: "Fast Mistral production model for chat, extraction, and cost-sensitive agents", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-06", release_date: "2026-03-16", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 65536 }, cost: { input: 0.1875, output: 0.75 } }, "aion-labs-aion-3-0-mini": { id: "aion-labs-aion-3-0-mini", name: "Aion 3.0 Mini", description: "Efficient model for low-latency assistance, extraction, and routine automation", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32768 }, cost: { input: 0.875, output: 1.75, cache_read: 0.225 } }, "claude-opus-5-fast": { id: "claude-opus-5-fast", name: "Claude Opus 5 Fast", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-23", last_updated: "2026-07-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 12, output: 60, cache_read: 1.2, cache_write: 15 } }, "deepseek-v3.2": { id: "deepseek-v3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-04", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 160000, output: 32768 }, cost: { input: 0.33, output: 0.48, cache_read: 0.16 } }, "qwen3-6-27b": { id: "qwen3-6-27b", name: "Qwen 3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-24", last_updated: "2026-06-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 65536 }, cost: { input: 0.325, output: 3.25 } }, "openai-gpt-56-sol-pro": { id: "openai-gpt-56-sol-pro", name: "GPT-5.6 Sol Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 6.25, output: 37.5, cache_read: 0.625, cache_write: 7.8125 } }, "hermes-3-llama-3.1-405b": { id: "hermes-3-llama-3.1-405b", name: "Hermes 3 Llama 3.1 405b", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "hermes", attachment: false, reasoning: false, tool_call: false, release_date: "2025-09-25", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 1.1, output: 3 } }, "z-ai-glm-5-turbo": { id: "z-ai-glm-5-turbo", name: "GLM 5 Turbo", description: "Faster GLM-5 lane for coding agents that need lower latency", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-15", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 32768 }, cost: { input: 1.2, output: 4, cache_read: 0.24 } }, "venice-uncensored-role-play": { id: "venice-uncensored-role-play", name: "Venice Role Play Uncensored", description: "Multimodal model for analyzing text, images, documents, and rich media", family: "venice", attachment: true, reasoning: false, tool_call: true, structured_output: true, release_date: "2026-02-20", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.5, output: 2 } }, "google-gemma-4-26b-a4b-it": { id: "google-gemma-4-26b-a4b-it", name: "Google Gemma 4 26B A4B Instruct", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-06-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8192 }, cost: { input: 0.13, output: 0.4, cache_read: 0.05 } }, "google-gemma-4-31b-it": { id: "google-gemma-4-31b-it", name: "Google Gemma 4 31B Instruct", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-03", last_updated: "2026-06-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8192 }, cost: { input: 0.12, output: 0.36, cache_read: 0.09 } }, "openai-gpt-52-codex": { id: "openai-gpt-52-codex", name: "GPT-5.2 Codex", description: "Code-specialist GPT for repository edits, reviews, and long-running software agents", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08", release_date: "2025-01-15", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 272000, output: 65536 }, cost: { input: 2.19, output: 17.5, cache_read: 0.219 } }, "seed-2-1-turbo": { id: "seed-2-1-turbo", name: "Seed 2.1 Turbo", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-06-28", last_updated: "2026-07-24", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 65536 }, cost: { input: 0.625, output: 3.125, cache_read: 0.125 } }, "xiaomi-mimo-v2-5": { id: "xiaomi-mimo-v2-5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-06-11", last_updated: "2026-06-11", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 65536 }, cost: { input: 0.14, output: 0.28, cache_read: 0.05 } }, "grok-4-20-multi-agent": { id: "grok-4-20-multi-agent", name: "Grok 4.20 Multi-Agent", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, release_date: "2026-03-12", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 128000 }, cost: { input: 1.42, output: 2.83, cache_read: 0.23, tiers: [{ input: 2.83, output: 5.67, cache_read: 0.45, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.83, output: 5.67, cache_read: 0.45 } } }, "qwen3-next-80b": { id: "qwen3-next-80b", name: "Qwen 3 Next 80b", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2025-04-29", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 0.35, output: 1.9 } }, "openai-gpt-56-luna": { id: "openai-gpt-56-luna", name: "GPT-5.6 Luna", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 0.26666667, output: 1.6, cache_read: 0.02666667, cache_write: 0.33333334 } }, "qwen3-5-35b-a3b": { id: "qwen3-5-35b-a3b", name: "Qwen 3.5 35B A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-25", last_updated: "2026-06-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 0.3125, output: 1.25, cache_read: 0.15625 } }, "gemini-3-6-flash": { id: "gemini-3-6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-09", last_updated: "2026-07-21", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 1.875, output: 9.375, cache_read: 0.1875 } }, "zai-org-glm-5-2": { id: "zai-org-glm-5-2", name: "GLM 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-16", last_updated: "2026-06-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 3.75, output: 18.75, cache_read: 0.375 } }, inkling: { id: "inkling", name: "Inkling", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-16", last_updated: "2026-07-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 65536 }, cost: { input: 1.25, output: 5.0625, cache_read: 0.2125 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 6, output: 30, cache_read: 0.6, cache_write: 7.5 } }, "claude-opus-4-5": { id: "claude-opus-4-5", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-12-06", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 198000, output: 32768 }, cost: { input: 6, output: 30, cache_read: 0.6, cache_write: 7.5 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-29", last_updated: "2026-07-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "zai-org-glm-4.7": { id: "zai-org-glm-4.7", name: "GLM 4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-24", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 198000, output: 16384 }, cost: { input: 0.55, output: 2.65, cache_read: 0.11 } }, "grok-4-20": { id: "grok-4-20", name: "Grok 4.20", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, release_date: "2026-03-12", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 128000 }, cost: { input: 1.42, output: 2.83, cache_read: 0.23, tiers: [{ input: 2.83, output: 5.67, cache_read: 0.45, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.83, output: 5.67, cache_read: 0.45 } } }, "z-ai-glm-5v-turbo": { id: "z-ai-glm-5v-turbo", name: "GLM 5V Turbo", description: "Fast GLM vision model for screenshots, documents, and multimodal agent tasks", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-01", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32768 }, cost: { input: 1.5, output: 5, cache_read: 0.3 } }, "openai-gpt-56-terra-pro": { id: "openai-gpt-56-terra-pro", name: "GPT-5.6 Terra Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3.125, output: 18.75, cache_read: 0.3125, cache_write: 3.90625 } }, "openai-gpt-53-codex": { id: "openai-gpt-53-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-24", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 2.19, output: 17.5, cache_read: 0.219 } }, "openai-gpt-56-sol": { id: "openai-gpt-56-sol", name: "GPT-5.6 Sol", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 6.25, output: 37.5, cache_read: 0.625, cache_write: 7.8125 } }, "mercury-2": { id: "mercury-2", name: "Mercury 2", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "mercury", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2026-02-20", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 50000 }, cost: { input: 0.3125, output: 0.9375, cache_read: 0.03125 } }, "openai-gpt-oss-120b": { id: "openai-gpt-oss-120b", name: "OpenAI GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-11-06", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.07, output: 0.3 } }, "claude-opus-5": { id: "claude-opus-5", name: "Claude Opus 5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-23", last_updated: "2026-07-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 6, output: 30, cache_read: 0.6, cache_write: 7.5 } }, "zai-org-glm-5-1": { id: "zai-org-glm-5-1", name: "GLM 5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-06-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 80000 }, cost: { input: 1.54, output: 4.84, cache_read: 0.286 } }, "claude-opus-4-8-fast": { id: "claude-opus-4-8-fast", name: "Claude Opus 4.8 Fast", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-06-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 12, output: 60, cache_read: 1.2, cache_write: 15 } }, "openai-gpt-56-terra": { id: "openai-gpt-56-terra", name: "GPT-5.6 Terra", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3.125, output: 18.75, cache_read: 0.3125, cache_write: 3.90625 } }, "gemini-3-1-pro-preview": { id: "gemini-3-1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-06-11", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 2.5, output: 15, cache_read: 0.5, cache_write: 0.5, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, cache_write: 0.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5, cache_write: 0.5 } } }, "kimi-k3-fast-api": { id: "kimi-k3-fast-api", name: "Kimi K3 Fast", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 4.5, output: 22.5, cache_read: 0.45 } } } }, mixlayer: { id: "mixlayer", env: ["MIXLAYER_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://models.mixlayer.ai/v1", name: "Mixlayer", doc: "https://docs.mixlayer.com", models: { "qwen/qwen3.5-27b": { id: "qwen/qwen3.5-27b", name: "Qwen3.5 27B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.3, output: 2.4 } }, "qwen/qwen3.5-9b": { id: "qwen/qwen3.5-9b", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.1, output: 0.4 } }, "qwen/qwen3.5-35b-a3b": { id: "qwen/qwen3.5-35b-a3b", name: "Qwen3.5 35B A3B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.25, output: 1.3 } }, "qwen/qwen3.5-397b-a17b": { id: "qwen/qwen3.5-397b-a17b", name: "Qwen3.5 397B A17B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3.6 } }, "qwen/qwen3.5-122b-a10b": { id: "qwen/qwen3.5-122b-a10b", name: "Qwen3.5 122B A10B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.4, output: 3.2 } } } }, scaleway: { id: "scaleway", env: ["SCALEWAY_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.scaleway.ai/v1", name: "Scaleway", doc: "https://www.scaleway.com/en/docs/generative-apis/", models: { "mistral-medium-3.5-128b": { id: "mistral-medium-3.5-128b", name: "Mistral Medium 3.5 128B", description: "Balanced Mistral model for enterprise assistants, multilingual work, and tools", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 1.5, output: 7.5 } }, "qwen3.6-35b-a3b": { id: "qwen3.6-35b-a3b", name: "Qwen3.6 35B A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-05-01", last_updated: "2026-05-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, status: "beta", cost: { input: 0.25, output: 1.5 } }, "bge-multilingual-gemma2": { id: "bge-multilingual-gemma2", name: "BGE Multilingual Gemma2", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-07-26", last_updated: "2025-06-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8191, output: 3072 }, cost: { input: 0.1, output: 0 } }, "qwen3-coder-30b-a3b-instruct": { id: "qwen3-coder-30b-a3b-instruct", name: "Qwen3-Coder 30B-A3B Instruct", description: "Smaller Qwen coder for efficient local agents and repo-level fixes", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2026-03-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.2, output: 0.8 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 1.8, output: 5.5 } }, "pixtral-12b-2409": { id: "pixtral-12b-2409", name: "Pixtral 12B 2409", description: "Mistral vision-language model for image understanding and multimodal chat", family: "pixtral", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2024-09-25", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.2, output: 0.2 } }, "gemma-4-26b-a4b-it": { id: "gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-01", last_updated: "2026-05-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, status: "beta", cost: { input: 0.25, output: 0.5 } }, "llama-3.3-70b-instruct": { id: "llama-3.3-70b-instruct", name: "Llama-3.3-70B-Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2026-03-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e5, output: 16384 }, cost: { input: 0.9, output: 0.9 } }, "whisper-large-v3": { id: "whisper-large-v3", name: "Whisper Large v3", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "whisper", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2023-09", release_date: "2023-09-01", last_updated: "2026-03-17", modalities: { input: ["audio"], output: ["text"] }, open_weights: true, limit: { context: 0, output: 8192 }, cost: { input: 0.003, output: 0 } }, "qwen3-235b-a22b-instruct-2507": { id: "qwen3-235b-a22b-instruct-2507", name: "Qwen3 235B A22B Instruct 2507", description: "Large open Qwen MoE for multilingual reasoning, coding, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-01", last_updated: "2026-03-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 260000, output: 16384 }, cost: { input: 0.75, output: 2.25, reasoning: 8.4 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT-OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2024-01-01", last_updated: "2026-03-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.15, output: 0.6 } }, "mistral-small-3.2-24b-instruct-2506": { id: "mistral-small-3.2-24b-instruct-2506", name: "Mistral Small 3.2 24B Instruct (2506)", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-06-20", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.15, output: 0.35 } }, "qwen3.5-397b-a17b": { id: "qwen3.5-397b-a17b", name: "Qwen3.5 397B A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 0.6, output: 3.6 } }, "qwen3-embedding-8b": { id: "qwen3-embedding-8b", name: "Qwen3 Embedding 8B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-06-05", last_updated: "2026-03-17", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 4096 }, cost: { input: 0.1, output: 0 } } } }, togetherai: { id: "togetherai", env: ["TOGETHER_API_KEY"], npm: "@ai-sdk/togetherai", name: "Together AI", doc: "https://docs.together.ai/docs/serverless-models", models: { "nvidia/nemotron-3-ultra-550b-a55b": { id: "nvidia/nemotron-3-ultra-550b-a55b", name: "Nemotron 3 Ultra 550B A55B", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512300, output: 512300 }, cost: { input: 0.6, output: 3.6, cache_read: 0.2 } }, "deepcogito/cogito-v2-1-671b": { id: "deepcogito/cogito-v2-1-671b", name: "Cogito v2.1 671B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "cogito", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, temperature: true, release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 163840 }, cost: { input: 1.25, output: 1.25 } }, "google/gemma-3n-E4B-it": { id: "google/gemma-3n-E4B-it", name: "Gemma 3N E4B Instruct", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.06, output: 0.12 } }, "google/gemma-4-31B-it": { id: "google/gemma-4-31B-it", name: "Gemma 4 31B Instruct", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.39, output: 0.97 } }, "thinkingmachines/Inkling": { id: "thinkingmachines/Inkling", name: "Inkling", description: "Multimodal MoE reasoning model (975B total, 41B active) for text, image, and audio", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["max", "xhigh", "high", "medium", "low", "none"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 131072 }, cost: { input: 1, output: 4.05, cache_read: 0.17 } }, "zai-org/GLM-5": { id: "zai-org/GLM-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, status: "deprecated", cost: { input: 1, output: 3.2 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-16", last_updated: "2026-06-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 164000 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "zai-org/GLM-5.1": { id: "zai-org/GLM-5.1", name: "GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-11", release_date: "2026-04-07", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, status: "deprecated", cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "pearl-ai/gemma-4-31b-it": { id: "pearl-ai/gemma-4-31b-it", name: "Pearl AI Gemma 4 31B Instruct", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 }, cost: { input: 0.28, output: 0.86 } }, "essentialai/Rnj-1-Instruct": { id: "essentialai/Rnj-1-Instruct", name: "Rnj-1 Instruct", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "rnj", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-12-05", last_updated: "2025-12-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, status: "deprecated", cost: { input: 0.15, output: 0.15 } }, "Qwen/Qwen3.5-9B": { id: "Qwen/Qwen3.5-9B", name: "Qwen3.5 9B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.17, output: 0.25 } }, "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8": { id: "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8", name: "Qwen3 Coder 480B A35B Instruct", description: "Legacy model retained for compatibility with older integrations", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 2, output: 2 } }, "Qwen/Qwen3-Coder-Next-FP8": { id: "Qwen/Qwen3-Coder-Next-FP8", name: "Qwen3 Coder Next FP8", description: "Legacy model retained for compatibility with older integrations", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2026-02-03", release_date: "2026-02-03", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0.5, output: 1.2 } }, "Qwen/Qwen3.7-Max": { id: "Qwen/Qwen3.7-Max", name: "Qwen3.7 Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 500000 }, cost: { input: 1.25, output: 3.75, cache_read: 0.125 } }, "Qwen/Qwen3-235B-A22B-Instruct-2507-tput": { id: "Qwen/Qwen3-235B-A22B-Instruct-2507-tput", name: "Qwen3 235B A22B Instruct 2507 FP8", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0.2, output: 0.6 } }, "Qwen/Qwen3.5-397B-A17B": { id: "Qwen/Qwen3.5-397B-A17B", name: "Qwen3.5 397B A17B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-02-16", last_updated: "2026-06-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 130000 }, status: "deprecated", cost: { input: 0.6, output: 3.6, cache_read: 0.35 } }, "Qwen/Qwen3.6-Plus": { id: "Qwen/Qwen3.6-Plus", name: "Qwen3.6 Plus", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 500000 }, cost: { input: 0.5, output: 3 } }, "Qwen/Qwen2.5-7B-Instruct-Turbo": { id: "Qwen/Qwen2.5-7B-Instruct-Turbo", name: "Qwen 2.5 7B Instruct Turbo", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-09-19", last_updated: "2024-09-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.3, output: 0.3 } }, "LiquidAI/LFM2-24B-A2B": { id: "LiquidAI/LFM2-24B-A2B", name: "LFM2-24B-A2B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "liquid", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-02-25", last_updated: "2026-02-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.03, output: 0.12 } }, "MiniMaxAI/MiniMax-M2.7": { id: "MiniMaxAI/MiniMax-M2.7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "MiniMaxAI/MiniMax-M2.5": { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax-M2.5", description: "Legacy model retained for compatibility with older integrations", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, status: "deprecated", cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "MiniMaxAI/MiniMax-M3": { id: "MiniMaxAI/MiniMax-M3", name: "MiniMax-M3", description: "MiniMax multimodal coding model for long-context reasoning and agent tasks", family: "minimax", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 250000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "deepseek-ai/DeepSeek-V3": { id: "deepseek-ai/DeepSeek-V3", name: "DeepSeek-V3", description: "Legacy model retained for compatibility with older integrations", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-12-26", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, status: "deprecated", cost: { input: 1.25, output: 1.25 } }, "deepseek-ai/DeepSeek-V4-Flash-0731": { id: "deepseek-ai/DeepSeek-V4-Flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.03 } }, "deepseek-ai/DeepSeek-R1": { id: "deepseek-ai/DeepSeek-R1", name: "DeepSeek-R1", description: "Legacy model retained for compatibility with older integrations", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-03-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163839, output: 163839 }, status: "deprecated", cost: { input: 3, output: 7 } }, "deepseek-ai/DeepSeek-V3-1": { id: "deepseek-ai/DeepSeek-V3-1", name: "DeepSeek V3.1", description: "Legacy model retained for compatibility with older integrations", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-08", release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, status: "deprecated", cost: { input: 0.6, output: 1.7 } }, "deepseek-ai/DeepSeek-V4-Pro": { id: "deepseek-ai/DeepSeek-V4-Pro", name: "DeepSeek V4 Pro", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512000, output: 384000 }, cost: { input: 1.74, output: 3.48, cache_read: 0.2 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131000 }, cost: { input: 1.2, output: 4.5, cache_read: 0.2 } }, "moonshotai/Kimi-K2.5": { id: "moonshotai/Kimi-K2.5", name: "Kimi K2.5", description: "Legacy model retained for compatibility with older integrations", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, temperature: true, knowledge: "2026-01", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0.5, output: 2.8 } }, "moonshotai/Kimi-K2.7-Code": { id: "moonshotai/Kimi-K2.7-Code", name: "Kimi K2.7 Code", description: "Kimi coding model for software agents, refactors, and repository reasoning", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-14", last_updated: "2026-06-14", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "moonshotai/Kimi-K3": { id: "moonshotai/Kimi-K3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.05, output: 0.2 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-08", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.15, output: 0.6 } }, "meta-llama/Meta-Llama-3-8B-Instruct-Lite": { id: "meta-llama/Meta-Llama-3-8B-Instruct-Lite", name: "Meta Llama 3 8B Instruct Lite", description: "Compact Llama instruction model for fast chat and local deployment", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-04-18", last_updated: "2024-04-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0.14, output: 0.14 } }, "meta-llama/Llama-3.3-70B-Instruct-Turbo": { id: "meta-llama/Llama-3.3-70B-Instruct-Turbo", name: "Llama 3.3 70B", description: "Compact Llama instruction model for fast chat and local deployment", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 1.04, output: 1.04 } } } }, digitalocean: { id: "digitalocean", env: ["DIGITALOCEAN_ACCESS_TOKEN"], npm: "@ai-sdk/openai-compatible", api: "https://inference.do-ai.run/v1", name: "DigitalOcean", doc: "https://docs.digitalocean.com/products/gradient-ai-platform/details/models/", models: { "anthropic-claude-opus-4.8": { id: "anthropic-claude-opus-4.8", name: "Anthropic Claude Opus 4.8", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, release_date: "2026-05-28", last_updated: "2026-05-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "openai-gpt-image-1": { id: "openai-gpt-image-1", name: "GPT Image 1", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-04-24", last_updated: "2025-04-24", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 5, output: 40, cache_read: 1.25 } }, "anthropic-claude-3.5-sonnet": { id: "anthropic-claude-3.5-sonnet", name: "Claude 3.5 Sonnet", description: "Legacy model retained for compatibility with older integrations", family: "claude-sonnet", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-06-20", last_updated: "2024-10-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, status: "deprecated", cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "openai-gpt-5.6-terra": { id: "openai-gpt-5.6-terra", name: "OpenAI GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "glm-5": { id: "glm-5", name: "GLM 5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-11", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 64000, output: 12800 }, cost: { input: 0.75, output: 2.4, cache_read: 0.2 } }, "openai-gpt-4.1": { id: "openai-gpt-4.1", name: "OpenAI GPT-4.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "gte-large-en-v1.5": { id: "gte-large-en-v1.5", name: "GTE Large (v1.5)", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-03-27", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 1024 }, cost: { input: 0.09, output: 0 } }, "anthropic-claude-opus-5": { id: "anthropic-claude-opus-5", name: "Anthropic Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "mistral-3-14B": { id: "mistral-3-14B", name: "Ministral 3 14B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-15", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 128000 }, cost: { input: 0.2, output: 0.2 } }, "openai-gpt-5.4-pro": { id: "openai-gpt-5.4-pro", name: "OpenAI GPT-5.4 Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, cost: { input: 30, output: 180, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "ministral-3-8b-instruct-2512": { id: "ministral-3-8b-instruct-2512", name: "Ministral 3 8B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-12-15", last_updated: "2025-12-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 } }, "openai-gpt-oss-20b": { id: "openai-gpt-oss-20b", name: "OpenAI GPT-oss-20b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06", release_date: "2025-08-05", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.05, output: 0.45 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 32768 }, cost: { input: 0.975, output: 4.3, cache_read: 0.26 } }, "nemotron-nano-12b-v2-vl": { id: "nemotron-nano-12b-v2-vl", name: "Nemotron-nano 12b v2-vl", description: "Nemotron multimodal model for visual reasoning and agentic AI workflows", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, temperature: true, release_date: "2025-10-28", last_updated: "2025-10-28", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.2, output: 0.6 } }, "anthropic-claude-4.5-sonnet": { id: "anthropic-claude-4.5-sonnet", name: "Anthropic Claude 4.5 Sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "nvidia-nemotron-3-super-120b": { id: "nvidia-nemotron-3-super-120b", name: "NVIDIA Nemotron 3 Super 120B (Public Preview)", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 32768 }, cost: { input: 0.165, output: 0.3575, cache_read: 0.06 } }, "anthropic-claude-opus-4.5": { id: "anthropic-claude-opus-4.5", name: "Anthropic Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 52429 }, cost: { input: 0.375, output: 2.025, cache_read: 0.203 } }, "all-mini-lm-l6-v2": { id: "all-mini-lm-l6-v2", name: "All-MiniLM-L6-v2", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2021-08-30", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256, output: 384 }, cost: { input: 0.009, output: 0 } }, "mistral-nemo-instruct-2407": { id: "mistral-nemo-instruct-2407", name: "Mistral Nemo Instruct", description: "Legacy model retained for compatibility with older integrations", family: "mistral", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, status: "deprecated", cost: { input: 0.3, output: 0.3 } }, "openai-gpt-5.3-codex": { id: "openai-gpt-5.3-codex", name: "OpenAI GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 52429 }, cost: { input: 1.4, output: 4.4, cache_read: 0.21 } }, "openai-gpt-4o": { id: "openai-gpt-4o", name: "OpenAI GPT-4o", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "anthropic-claude-haiku-4.5": { id: "anthropic-claude-haiku-4.5", name: "Anthropic Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 52429 }, cost: { input: 0.76, output: 3.2, cache_read: 0.19 } }, "anthropic-claude-fable-5": { id: "anthropic-claude-fable-5", name: "Anthropic Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, release_date: "2026-06-09", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "qwen-2.5-14b-instruct": { id: "qwen-2.5-14b-instruct", name: "Qwen 2.5 14B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2024-09-19", last_updated: "2024-09-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 } }, "deepseek-r1-distill-llama-70b": { id: "deepseek-r1-distill-llama-70b", name: "DeepSeek R1 Distill Llama 70B", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-01-30", last_updated: "2025-01-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32678, output: 8192 }, cost: { input: 0.99, output: 0.99 } }, "anthropic-claude-3-opus": { id: "anthropic-claude-3-opus", name: "Claude 3 Opus", description: "Legacy model retained for compatibility with older integrations", family: "claude-opus", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-08", release_date: "2024-02-29", last_updated: "2024-02-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, status: "deprecated", cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "nemotron-3-nano-omni": { id: "nemotron-3-nano-omni", name: "Nemotron 3 Nano Omni", description: "Open Nemotron omni model combining reasoning with text, vision, and audio", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-28", last_updated: "2026-04-28", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 13107 }, cost: { input: 0.5, output: 0.9 } }, "stable-diffusion-3.5-large": { id: "stable-diffusion-3.5-large", name: "Stable Diffusion 3.5 Large", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "stable-diffusion", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-10-22", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["image"] }, open_weights: true, limit: { context: 256, output: 1 }, cost: { input: 0.08, output: 0 } }, "deepseek-4-flash": { id: "deepseek-4-flash", name: "Deepseek V4 Flash", description: "Fast DeepSeek model for efficient chat, coding help, and agent loops", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-05-27", last_updated: "2026-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 384000 }, cost: { input: 0.084, output: 0.168, cache_read: 0.0168 } }, "openai-gpt-5.4": { id: "openai-gpt-5.4", name: "OpenAI GPT-5.4", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "anthropic-claude-4.1-opus": { id: "anthropic-claude-4.1-opus", name: "Anthropic Claude 4.1 Opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic-claude-3.5-haiku": { id: "anthropic-claude-3.5-haiku", name: "Claude 3.5 Haiku", description: "Legacy model retained for compatibility with older integrations", family: "claude-haiku", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-11-05", last_updated: "2024-11-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, status: "deprecated", cost: { input: 0.8, output: 4, cache_read: 0.08, cache_write: 1 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "Deepseek V4 Pro", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 0.87, output: 1.74, cache_read: 0.174 } }, "anthropic-claude-sonnet-4": { id: "anthropic-claude-sonnet-4", name: "Claude Sonnet 4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.3, cache_write: 3.75, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.3, cache_write: 3.75 } } }, "openai-gpt-5-mini": { id: "openai-gpt-5-mini", name: "OpenAI GPT-5 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai-gpt-5.5": { id: "openai-gpt-5.5", name: "OpenAI GPT-5.5", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "qwen3-coder-flash": { id: "qwen3-coder-flash", name: "Qwen3 Coder Flash", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 52429 }, cost: { input: 0.45, output: 1.7, cache_read: 0.09 } }, "deepseek-v4-flash-0731": { id: "deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 209715 }, cost: { input: 0.08, output: 0.252, cache_read: 0.0252 } }, "deepseek-v3": { id: "deepseek-v3", name: "DeepSeek V3", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-12-26", last_updated: "2025-03-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 131072 } }, "alibaba-qwen3-32b": { id: "alibaba-qwen3-32b", name: "Qwen3 32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-30", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 6554 }, cost: { input: 0.25, output: 0.55 } }, "openai-gpt-image-1.5": { id: "openai-gpt-image-1.5", name: "OpenAI GPT Image 1.5", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-11-25", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["image", "text"] }, open_weights: false, limit: { context: 0, output: 16384 }, cost: { input: 5, output: 10, cache_read: 1 } }, "llama-4-maverick": { id: "llama-4-maverick", name: "Llama 4 Maverick", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.2, output: 0.696 } }, "openai-gpt-5.2-pro": { id: "openai-gpt-5.2-pro", name: "OpenAI GPT-5.2 Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 21, output: 168 } }, "anthropic-claude-4.5-haiku": { id: "anthropic-claude-4.5-haiku", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 1, cache_write: 1.25 } }, "openai-gpt-5.4-mini": { id: "openai-gpt-5.4-mini", name: "OpenAI GPT-5.4 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "minimax-m2.5": { id: "minimax-m2.5", name: "MiniMax M2.5 (Public Preview)", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax-m2.5", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-08", release_date: "2026-02-12", last_updated: "2026-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 13107 }, cost: { input: 0.225, output: 0.9, cache_read: 0.06 } }, "arcee-trinity-large-thinking": { id: "arcee-trinity-large-thinking", name: "Arcee Trinity Large Thinking (Public Preview)", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "trinity", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32000 }, cost: { input: 0.25, output: 0.9, cache_read: 0.06 } }, "openai-gpt-5.1-codex-max": { id: "openai-gpt-5.1-codex-max", name: "GPT-5.1 Codex Max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai-o1": { id: "openai-o1", name: "OpenAI o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2023-09", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 15, output: 60, cache_read: 7.5 } }, "openai-gpt-5-nano": { id: "openai-gpt-5-nano", name: "OpenAI GPT-5 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "anthropic-claude-opus-4.6": { id: "anthropic-claude-opus-4.6", name: "Anthropic Claude Opus 4.6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "anthropic-claude-4.6-sonnet": { id: "anthropic-claude-4.6-sonnet", name: "Anthropic Claude Sonnet 4.6", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "llama3.3-70b-instruct": { id: "llama3.3-70b-instruct", name: "Llama 3.3 Instruct (70B)", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.65, output: 0.65 } }, "openai-gpt-4o-mini": { id: "openai-gpt-4o-mini", name: "OpenAI GPT-4o mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "openai-gpt-image-2": { id: "openai-gpt-image-2", name: "OpenAI GPT Image 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-04-24", last_updated: "2025-04-24", modalities: { input: ["text", "image"], output: ["image", "text"] }, open_weights: false, limit: { context: 0, output: 16384 }, cost: { input: 8, output: 30 } }, "wan2-2-t2v-a14b": { id: "wan2-2-t2v-a14b", name: "Wan2.2-T2V-A14B", description: "Video model for prompt-guided generation, editing, and motion workflows", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-07-28", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["video"] }, open_weights: true, limit: { context: 100, output: 1 }, cost: { input: 0.6, output: 0 } }, "openai-gpt-5.6-sol": { id: "openai-gpt-5.6-sol", name: "OpenAI GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 2.85, output: 14.25, cache_read: 0.285 } }, "mimo-v2.5-pro": { id: "mimo-v2.5-pro", name: "MiMo V2.5 Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 52429 }, cost: { input: 0.4, output: 1.5, cache_read: 0.08 } }, "qwen3.5-397b-a17b": { id: "qwen3.5-397b-a17b", name: "Qwen 3.5 397B A17B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-04-30", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 26214 }, cost: { input: 0.3025, output: 1.925, cache_read: 0.111 } }, "multi-qa-mpnet-base-dot-v1": { id: "multi-qa-mpnet-base-dot-v1", name: "Multi-QA-mpnet-base-dot-v1", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2021-08-30", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512, output: 768 }, cost: { input: 0.009, output: 0 } }, "qwen3-embedding-0.6b": { id: "qwen3-embedding-0.6b", name: "Qwen3 Embedding 0.6B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-06-03", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8000, output: 1024 }, status: "beta", cost: { input: 0.04, output: 0 } }, "openai-gpt-5.6-luna": { id: "openai-gpt-5.6-luna", name: "OpenAI GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, tiers: [{ input: 0.4, output: 1.8, cache_read: 0.04, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 0.4, output: 1.8, cache_read: 0.04 } } }, "anthropic-claude-5-sonnet": { id: "anthropic-claude-5-sonnet", name: "Anthropic Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "nemotron-3-ultra-550b": { id: "nemotron-3-ultra-550b", name: "Nemotron 3 Ultra", description: "Flagship Nemotron model for high-throughput reasoning and complex agents", family: "nemotron", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 26214 }, cost: { input: 0.9, output: 1.7 } }, "openai-o3": { id: "openai-o3", name: "OpenAI o3", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "llama3-8b-instruct": { id: "llama3-8b-instruct", name: "Llama 3.1 Instruct (8B)", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.198, output: 0.198 } }, "bge-reranker-v2-m3": { id: "bge-reranker-v2-m3", name: "BGE Reranker v2 M3", description: "Reranking model for improving retrieval quality in search and recommendation systems", family: "bge", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-03-12", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 1 }, cost: { input: 0.01, output: 0 } }, "nemotron-3-nano-30b": { id: "nemotron-3-nano-30b", name: "Nemotron 3 Nano 30B A3B", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, temperature: true, release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 } }, "anthropic-claude-3.7-sonnet": { id: "anthropic-claude-3.7-sonnet", name: "Claude 3.7 Sonnet", description: "Legacy model retained for compatibility with older integrations", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2025-02-24", last_updated: "2025-02-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, status: "deprecated", cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic-claude-opus-4": { id: "anthropic-claude-opus-4", name: "Claude Opus 4", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "openai-gpt-oss-120b": { id: "openai-gpt-oss-120b", name: "OpenAI GPT-oss-120b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-06", release_date: "2025-08-05", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.055, output: 0.385, cache_read: 0.02 } }, "anthropic-claude-opus-4.7": { id: "anthropic-claude-opus-4.7", name: "Anthropic Claude Opus 4.7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "openai-gpt-5": { id: "openai-gpt-5", name: "OpenAI GPT-5", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "gemma-4-31B-it": { id: "gemma-4-31B-it", name: "Gemma 4", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-30", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8192 }, cost: { input: 0.18, output: 0.5, cache_read: 0.036 } }, "openai-o3-mini": { id: "openai-o3-mini", name: "OpenAI o3 mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "mistral-7b-instruct-v0.3": { id: "mistral-7b-instruct-v0.3", name: "Mistral 7B Instruct v0.3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-05-22", last_updated: "2024-05-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 } }, "qwen3-tts-voicedesign": { id: "qwen3-tts-voicedesign", name: "Qwen3 TTS VoiceDesign", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-21", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 32768, output: 1 } }, "e5-large-v2": { id: "e5-large-v2", name: "E5 Large v2", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2023-05-19", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512, output: 1024 }, cost: { input: 0.02, output: 0 } }, "deepseek-3.2": { id: "deepseek-3.2", name: "Deepseek 3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2025-12-02", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 32768 }, cost: { input: 0.25, output: 0.8, cache_read: 0.075 } }, "bge-m3": { id: "bge-m3", name: "BGE M3", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "bge", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-01-30", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 1024 }, cost: { input: 0.02, output: 0 } }, "openai-gpt-5.2": { id: "openai-gpt-5.2", name: "OpenAI GPT-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai-gpt-5.4-nano": { id: "openai-gpt-5.4-nano", name: "OpenAI GPT-5.4 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "fal-ai/fast-sdxl": { id: "fal-ai/fast-sdxl", name: "Fast SDXL", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "stable-diffusion", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2023-07-26", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["image"] }, open_weights: true, limit: { context: 0, output: 0 } }, "fal-ai/stable-audio-25/text-to-audio": { id: "fal-ai/stable-audio-25/text-to-audio", name: "Stable Audio 2.5 (Text-to-Audio)", description: "Speech generation model for controllable voice, narration, and audio delivery", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-10-08", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "fal-ai/flux/schnell": { id: "fal-ai/flux/schnell", name: "FLUX.1 [schnell]", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-08-01", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["image"] }, open_weights: true, limit: { context: 0, output: 0 } }, "fal-ai/elevenlabs/tts/multilingual-v2": { id: "fal-ai/elevenlabs/tts/multilingual-v2", name: "ElevenLabs Multilingual TTS v2", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "elevenlabs", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2023-08-22", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } } } }, "moonshotai-cn": { id: "moonshotai-cn", env: ["MOONSHOT_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.moonshot.cn/v1", name: "Moonshot AI (China)", doc: "https://platform.moonshot.cn/docs/api/chat", models: { "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "kimi-k2-thinking": { id: "kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Thinking Kimi model for slower research passes, planning, and hard technical questions", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-08", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "kimi-k2-0905-preview": { id: "kimi-k2-0905-preview", name: "Kimi K2 0905", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "kimi-k2-turbo-preview": { id: "kimi-k2-turbo-preview", name: "Kimi K2 Turbo", description: "Fast Kimi model for responsive chat, coding help, and agent loops", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 2.4, output: 10, cache_read: 0.6 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "kimi-k2.7-code-highspeed": { id: "kimi-k2.7-code-highspeed", name: "Kimi K2.7 Code HighSpeed", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.9, output: 8, cache_read: 0.38 } }, "kimi-k2-0711-preview": { id: "kimi-k2-0711-preview", name: "Kimi K2 0711", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-07-14", last_updated: "2025-07-14", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "kimi-k2-thinking-turbo": { id: "kimi-k2-thinking-turbo", name: "Kimi K2 Thinking Turbo", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-08", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.15, output: 8, cache_read: 0.15 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } } } }, "model-oracle-ai": { id: "model-oracle-ai", env: ["MODEL_ORACLE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.modeloracle.com/api/v1", name: "Model Oracle AI", doc: "https://modeloracle.com/setup/", models: { "gpt-4.1-mini": { id: "gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 } }, "gpt-5": { id: "gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 } }, "gpt-5.4-nano": { id: "gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 } }, "claude-haiku-4.5": { id: "claude-haiku-4.5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 } }, auto: { id: "auto", name: "Auto", description: "Model Oracle AI decision engine that selects and routes among configured coding-agent models", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-29", last_updated: "2026-07-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 } }, "claude-opus-4.8": { id: "claude-opus-4.8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 } }, "gpt-4.1": { id: "gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 } }, "o4-mini": { id: "o4-mini", name: "o4-mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 } } } }, drun: { id: "drun", env: ["DRUN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://chat.d.run/v1", name: "D.Run (China)", doc: "https://www.d.run", models: { "public/minimax-m25": { id: "public/minimax-m25", name: "MiniMax M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_details" }, temperature: true, release_date: "2025-03-01", last_updated: "2025-03-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131072 }, cost: { input: 0.29, output: 1.16 } }, "public/deepseek-v3": { id: "public/deepseek-v3", name: "DeepSeek V3", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-12-26", last_updated: "2024-12-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.28, output: 1.1 } }, "public/deepseek-r1": { id: "public/deepseek-r1", name: "DeepSeek R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2025-01-20", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32000 }, cost: { input: 0.55, output: 2.2 } } } }, lmstudio: { id: "lmstudio", env: ["LMSTUDIO_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "http://127.0.0.1:1234/v1", name: "LMStudio", doc: "https://lmstudio.ai/models", models: { "qwen/qwen3-coder-30b": { id: "qwen/qwen3-coder-30b", name: "Qwen3 Coder 30B", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0, output: 0 } }, "qwen/qwen3-30b-a3b-2507": { id: "qwen/qwen3-30b-a3b-2507", name: "Qwen3 30B A3B 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-30", last_updated: "2025-07-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0, output: 0 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0, output: 0 } } } }, ovhcloud: { id: "ovhcloud", env: ["OVHCLOUD_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://oai.endpoints.kepler.ai.cloud.ovh.net/v1", name: "OVHcloud AI Endpoints", doc: "https://www.ovhcloud.com/en/public-cloud/ai-endpoints/catalog//", models: { "qwen3-32b": { id: "qwen3-32b", name: "Qwen3-32B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-16", last_updated: "2025-07-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.09, output: 0.25 } }, "qwen3-coder-30b-a3b-instruct": { id: "qwen3-coder-30b-a3b-instruct", name: "Qwen3-Coder-30B-A3B-Instruct", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-28", last_updated: "2025-10-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.07, output: 0.26 } }, "gpt-oss-20b": { id: "gpt-oss-20b", name: "gpt-oss-20b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2025-08-28", last_updated: "2025-08-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.05, output: 0.18 } }, "mistral-nemo-instruct-2407": { id: "mistral-nemo-instruct-2407", name: "Mistral-Nemo-Instruct-2407", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-11-20", last_updated: "2024-11-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 0.14, output: 0.14 } }, "meta-llama-3_3-70b-instruct": { id: "meta-llama-3_3-70b-instruct", name: "Meta-Llama-3_3-70B-Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-01", last_updated: "2025-04-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.74, output: 0.74 } }, "qwen3.5-9b": { id: "qwen3.5-9b", name: "Qwen3.5-9B", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.12, output: 0.18 } }, "qwen3.6-27b": { id: "qwen3.6-27b", name: "Qwen3.6-27B", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.47, output: 3.19 } }, "qwen3guard-gen-8b": { id: "qwen3guard-gen-8b", name: "Qwen3Guard-Gen-8B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-22", last_updated: "2026-01-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 16384 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "gpt-oss-120b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, release_date: "2025-08-28", last_updated: "2025-08-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.09, output: 0.47 } }, "mistral-small-3.2-24b-instruct-2506": { id: "mistral-small-3.2-24b-instruct-2506", name: "Mistral-Small-3.2-24B-Instruct-2506", description: "Efficient Mistral model for fast chat, extraction, and production assistants", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-16", last_updated: "2025-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.1, output: 0.31 } }, "qwen3.5-397b-a17b": { id: "qwen3.5-397b-a17b", name: "Qwen3.5-397B-A17B", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-18", last_updated: "2026-05-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.71, output: 4.25 } }, "qwen3guard-gen-0.6b": { id: "qwen3guard-gen-0.6b", name: "Qwen3Guard-Gen-0.6B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-22", last_updated: "2026-01-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 16384 } }, "mistral-7b-instruct-v0.3": { id: "mistral-7b-instruct-v0.3", name: "Mistral-7B-Instruct-v0.3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-01", last_updated: "2025-04-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 0.11, output: 0.11 } }, "qwen2.5-vl-72b-instruct": { id: "qwen2.5-vl-72b-instruct", name: "Qwen2.5-VL-72B-Instruct", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-03-31", last_updated: "2025-03-31", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 1.01, output: 1.01 } } } }, zeldoc: { id: "zeldoc", env: ["ZELDOC_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.zeldoc.ai/v1", name: "Zeldoc", doc: "https://docs.zeldoc.ai", models: { zdev: { id: "zdev", name: "ZDev", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-15", last_updated: "2026-04-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0 } } } }, auriko: { id: "auriko", env: ["AURIKO_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.auriko.ai/v1", name: "Auriko", doc: "https://docs.auriko.ai", models: { "minimax-m2-7-highspeed": { id: "minimax-m2-7-highspeed", name: "MiniMax-M2.7-highspeed", description: "Low-latency M2.7 variant for interactive coding plans and agent loops", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.4, cache_write: 0.375 } }, "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.5, output: 2.8 } }, "grok-4.3": { id: "grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "minimax-m2-7": { id: "minimax-m2-7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_write: 0.375 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "qwen-3.6-plus": { id: "qwen-3.6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.1, tiers: [{ input: 2, output: 6, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.2, cache_write: 2.5 } } }, "gemini-3.1-pro-preview": { id: "gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } } } }, azure: { id: "azure", env: ["AZURE_RESOURCE_NAME", "AZURE_API_KEY"], npm: "@ai-sdk/azure", name: "Azure", doc: "https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models", models: { "gpt-5.1-codex-mini": { id: "gpt-5.1-codex-mini", name: "GPT-5.1 Codex Mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "gpt-image-2": { id: "gpt-image-2", name: "GPT-Image-2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 5, output: 30, cache_read: 1.25 } }, "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gpt-chat-latest": { id: "gpt-chat-latest", name: "GPT Chat Latest", description: "Compact GPT model for low-latency assistance and high-volume workloads", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-05-05", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 111616, output: 16384 }, status: "beta", cost: { input: 5, output: 30, cache_read: 0.5 } }, "gpt-4.1-mini": { id: "gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, status: "deprecated", cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "gpt-4o": { id: "gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, status: "deprecated", cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "codex-mini": { id: "codex-mini", name: "Codex Mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-04", release_date: "2025-05-16", last_updated: "2025-05-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 1.5, output: 6, cache_read: 0.375 } }, "phi-4-multimodal": { id: "phi-4-multimodal", name: "Phi-4-multimodal", description: "Multimodal model for analyzing text, images, documents, and rich media", family: "phi", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2023-10", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.08, output: 0.32, input_audio: 4 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "gpt-5.4-pro": { id: "gpt-5.4-pro", name: "GPT-5.4 Pro", description: "More exact GPT-5.4 tier for demanding professional reasoning and agent tasks", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, status: "beta", cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "text-embedding-ada-002": { id: "text-embedding-ada-002", name: "text-embedding-ada-002", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, release_date: "2022-12-15", last_updated: "2022-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 }, cost: { input: 0.1, output: 0 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-07-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek-V4-Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/models", shape: "completions" }, cost: { input: 0.19, output: 0.51 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-06", last_updated: "2026-02-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/models", shape: "completions" }, cost: { input: 0.6, output: 3 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2025-12-31", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "gpt-4.1-nano": { id: "gpt-4.1-nano", name: "GPT-4.1 nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, status: "deprecated", cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "gpt-3.5-turbo-1106": { id: "gpt-3.5-turbo-1106", name: "GPT-3.5 Turbo 1106", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2021-08", release_date: "2023-11-06", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 16384 }, status: "deprecated", cost: { input: 1, output: 2 } }, "deepseek-v3.2-speciale": { id: "deepseek-v3.2-speciale", name: "DeepSeek-V3.2-Speciale", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.58, output: 1.68 } }, "phi-4": { id: "phi-4", name: "Phi-4", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "phi", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2023-10", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.125, output: 0.5 } }, "model-router": { id: "model-router", name: "Model Router", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "model-router", attachment: true, reasoning: false, tool_call: true, release_date: "2025-05-19", last_updated: "2025-11-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 16384 }, cost: { input: 0.14, output: 0 } }, "o3-mini": { id: "o3-mini", name: "o3-mini", description: "Smaller o-series reasoner for economical coding, math, and planning tasks", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/models", shape: "completions" }, cost: { input: 0.95, output: 4 } }, "ministral-3b": { id: "ministral-3b", name: "Ministral 3B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-03", release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.04, output: 0.04 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "claude-opus-4-1": { id: "claude-opus-4-1", name: "Claude Opus 4.1", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "gpt-4o-mini": { id: "gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, status: "deprecated", cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "llama-4-maverick-17b-128e-instruct-fp8": { id: "llama-4-maverick-17b-128e-instruct-fp8", name: "Llama 4 Maverick 17B 128E Instruct FP8", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 16384 }, cost: { input: 0.25, output: 1 } }, "gpt-5": { id: "gpt-5", name: "GPT-5", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "mistral-medium-2505": { id: "mistral-medium-2505", name: "Mistral Medium 3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-05-07", last_updated: "2025-05-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.4, output: 2 } }, "phi-4-reasoning": { id: "phi-4-reasoning", name: "Phi-4-reasoning", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "phi", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2023-10", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 4096 }, cost: { input: 0.125, output: 0.5 } }, "gpt-5-codex": { id: "gpt-5-codex", name: "GPT-5-Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "llama-3.3-70b-instruct": { id: "llama-3.3-70b-instruct", name: "Llama-3.3-70B-Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.71, output: 0.71 } }, "claude-sonnet-4-5": { id: "claude-sonnet-4-5", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek-V4-Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/models", shape: "completions" }, cost: { input: 1.74, output: 3.48 } }, "gpt-4-turbo-vision": { id: "gpt-4-turbo-vision", name: "GPT-4 Turbo Vision", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-11", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, status: "deprecated", cost: { input: 10, output: 30 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "grok-4-1-fast-reasoning": { id: "grok-4-1-fast-reasoning", name: "Grok 4.1 Fast (Reasoning)", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-06-27", last_updated: "2025-06-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 8192 }, status: "beta", cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "phi-4-mini-reasoning": { id: "phi-4-mini-reasoning", name: "Phi-4-mini-reasoning", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "phi", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2023-10", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.075, output: 0.3 } }, "gpt-image-1.5": { id: "gpt-image-1.5", name: "GPT-Image-1.5", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-11-25", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 5, output: 32, cache_read: 1.25 } }, "gpt-5.2-codex": { id: "gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-01-14", last_updated: "2026-01-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5.4-nano": { id: "gpt-5.4-nano", name: "GPT-5.4 Nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "gpt-5-pro": { id: "gpt-5-pro", name: "GPT-5 Pro", description: "Higher-accuracy GPT-5 tier for tough analysis, coding reviews, and planning", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 272000 }, cost: { input: 15, output: 120 } }, "deepseek-v3.2": { id: "deepseek-v3.2", name: "DeepSeek-V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.58, output: 1.68 } }, "cohere-embed-v-4-0": { id: "cohere-embed-v-4-0", name: "Embed v4", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "cohere-embed", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 1536 }, cost: { input: 0.12, output: 0 } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 Mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "mistral-small-2503": { id: "mistral-small-2503", name: "Mistral Small 3.1", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2025-03-01", last_updated: "2025-03-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32768 }, cost: { input: 0.1, output: 0.3 } }, o1: { id: "o1", name: "o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2023-09", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 15, output: 60, cache_read: 7.5 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, status: "beta", cost: { input: 1, output: 6, cache_read: 0.1, cache_write: 1.25, tiers: [{ input: 2, output: 9, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 2, output: 9, cache_read: 0.2, cache_write: 2.5 } } }, "gpt-5.2": { id: "gpt-5.2", name: "GPT-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.125 } }, "deepseek-r1": { id: "deepseek-r1", name: "DeepSeek-R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 163840 }, status: "deprecated", cost: { input: 1.35, output: 5.4 } }, "gpt-5.3-codex": { id: "gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-24", last_updated: "2026-02-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "phi-4-reasoning-plus": { id: "phi-4-reasoning-plus", name: "Phi-4-reasoning-plus", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "phi", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2023-10", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 4096 }, cost: { input: 0.125, output: 0.5 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "GPT-5 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.03 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/models", shape: "completions" }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "gpt-5.1": { id: "gpt-5.1", name: "GPT-5.1", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text", "image", "audio"], output: ["text", "image", "audio"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "gpt-4-turbo": { id: "gpt-4-turbo", name: "GPT-4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, status: "deprecated", cost: { input: 10, output: 30 } }, "phi-4-mini": { id: "phi-4-mini", name: "Phi-4-mini", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "phi", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-10", release_date: "2024-12-11", last_updated: "2024-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.075, output: 0.3 } }, "grok-4-1-fast-non-reasoning": { id: "grok-4-1-fast-non-reasoning", name: "Grok 4.1 Fast (Non-Reasoning)", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-06-27", last_updated: "2025-06-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 128000, output: 8192 }, status: "beta", cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "gpt-5.1-codex": { id: "gpt-5.1-codex", name: "GPT-5.1 Codex", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text", "image", "audio"], output: ["text", "image", "audio"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "gpt-5-nano": { id: "gpt-5-nano", name: "GPT-5 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.01 } }, o3: { id: "o3", name: "o3", description: "Deliberate o-series reasoner for hard math, coding, and multi-step analysis", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "gpt-3.5-turbo-instruct": { id: "gpt-3.5-turbo-instruct", name: "GPT-3.5 Turbo Instruct", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2021-08", release_date: "2023-09-21", last_updated: "2023-09-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 4096, output: 4096 }, status: "deprecated", cost: { input: 1.5, output: 2 } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, status: "beta", cost: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 3.125, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, cache_write: 6.25, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5, cache_write: 6.25 } } }, "gpt-image-1": { id: "gpt-image-1", name: "GPT-Image-1", description: "OpenAI image model for production generation, edits, and brand-safe visual workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-04-24", last_updated: "2025-04-24", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 5, output: 40, cache_read: 1.25 } }, "claude-opus-4-5": { id: "claude-opus-4-5", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-24", last_updated: "2025-08-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gpt-3.5-turbo-0125": { id: "gpt-3.5-turbo-0125", name: "GPT-3.5 Turbo 0125", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2021-08", release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 16384 }, status: "deprecated", cost: { input: 0.5, output: 1.5 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, status: "beta", provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "codestral-2501": { id: "codestral-2501", name: "Codestral 25.01", description: "Mistral coding model for code completion, generation, and developer workflows", family: "codestral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-03", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.3, output: 0.9 } }, "cohere-embed-v3-multilingual": { id: "cohere-embed-v3-multilingual", name: "Embed v3 Multilingual", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "cohere-embed", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2023-11-07", last_updated: "2023-11-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512, output: 1024 }, cost: { input: 0.1, output: 0 } }, "gpt-4.1": { id: "gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, status: "deprecated", cost: { input: 2, output: 8, cache_read: 0.5 } }, "o4-mini": { id: "o4-mini", name: "o4-mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 1.1, output: 4.4, cache_read: 0.275 } }, "cohere-command-a": { id: "cohere-command-a", name: "Command A", description: "Cohere command model for multilingual enterprise agents, tools, and chat", family: "command-a", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-06-01", release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 2.5, output: 10 } }, "grok-4-20-reasoning": { id: "grok-4-20-reasoning", name: "Grok 4.20 (Reasoning)", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2026-04-08", last_updated: "2026-04-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 8192 }, status: "beta", cost: { input: 2, output: 6 } }, "claude-opus-5": { id: "claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://${AZURE_RESOURCE_NAME}.services.ai.azure.com/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gpt-5.1-codex-max": { id: "gpt-5.1-codex-max", name: "GPT-5.1 Codex Max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "text-embedding-3-large": { id: "text-embedding-3-large", name: "text-embedding-3-large", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8191, output: 3072 }, cost: { input: 0.13, output: 0 } }, "llama-4-scout-17b-16e-instruct": { id: "llama-4-scout-17b-16e-instruct", name: "Llama 4 Scout 17B 16E Instruct", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.2, output: 0.78 } }, "cohere-embed-v3-english": { id: "cohere-embed-v3-english", name: "Embed v3 English", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "cohere-embed", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2023-11-07", last_updated: "2023-11-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512, output: 1024 }, cost: { input: 0.1, output: 0 } }, "grok-4-20-non-reasoning": { id: "grok-4-20-non-reasoning", name: "Grok 4.20 (Non-Reasoning)", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2026-04-08", last_updated: "2026-04-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 8192 }, status: "beta", cost: { input: 2, output: 6 } }, "text-embedding-3-small": { id: "text-embedding-3-small", name: "text-embedding-3-small", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8191, output: 1536 }, cost: { input: 0.02, output: 0 } } } }, "kuae-cloud-coding-plan": { id: "kuae-cloud-coding-plan", env: ["KUAE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://coding-plan-endpoint.kuaecloud.net/v1", name: "KUAE Cloud Coding Plan", doc: "https://docs.mthreads.com/kuaecloud/kuaecloud-doc-online/coding_plan/", models: { "GLM-4.7": { id: "GLM-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, modal: { id: "modal", env: ["MODAL_PROXY_TOKEN"], npm: "@ai-sdk/openai-compatible", api: "https://inference.us-west.modal.direct/v1", name: "Modal", doc: "https://modal.com/docs/guide/endpoints", models: { "thinkingmachines/Inkling-NVFP4": { id: "thinkingmachines/Inkling-NVFP4", name: "Inkling", description: "Multimodal MoE reasoning model (975B total, 41B active) for text, image, and audio", family: "ling", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 262144 }, cost: { input: 1.2, output: 5, cache_read: 0.27 } }, "moonshotai/Kimi-K3": { id: "moonshotai/Kimi-K3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, reasoning: 15, cache_read: 0.3 } } } }, "qihang-ai": { id: "qihang-ai", env: ["QIHANG_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.qhaigc.net/v1", name: "QiHang", doc: "https://www.qhaigc.net/docs", models: { "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.09, output: 0.71, tiers: [{ input: 0.09, output: 0.71, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 0.09, output: 0.71 } } }, "gemini-3-flash-preview": { id: "gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.07, output: 0.43, tiers: [{ input: 0.07, output: 0.43, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 0.07, output: 0.43 } } }, "claude-sonnet-4-5-20250929": { id: "claude-sonnet-4-5-20250929", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0.43, output: 2.14 } }, "gpt-5.2-codex": { id: "gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.14, output: 1.14 } }, "claude-opus-4-5-20251101": { id: "claude-opus-4-5-20251101", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-11-01", last_updated: "2025-11-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 0.71, output: 3.57 } }, "gpt-5.2": { id: "gpt-5.2", name: "GPT-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "GPT-5-Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-09-30", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0.04, output: 0.29 } }, "claude-haiku-4-5-20251001": { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-10-01", last_updated: "2025-10-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 0.14, output: 0.71 } }, "gemini-3-pro-preview": { id: "gemini-3-pro-preview", name: "Gemini 3 Pro Preview", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-11", release_date: "2025-11-19", last_updated: "2025-11-19", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65000 }, cost: { input: 0.57, output: 3.43 } } } }, berget: { id: "berget", env: ["BERGET_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.berget.ai/v1", name: "Berget.AI", doc: "https://api.berget.ai", models: { "google/gemma-4-31B-it": { id: "google/gemma-4-31B-it", name: "Gemma 4 31B Instruct", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-12", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["audio", "image", "text", "video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.275, output: 0.55 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 32768 }, cost: { input: 1.54, output: 4.84 } }, "zai-org/GLM-4.7": { id: "zai-org/GLM-4.7", name: "GLM 4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-12", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.77, output: 2.75 } }, "mistralai/Mistral-Medium-3.5-128B": { id: "mistralai/Mistral-Medium-3.5-128B", name: "Mistral Medium 3.5 128B", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-04", release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 1.65, output: 5.5 } }, "mistralai/Mistral-Small-3.2-24B-Instruct-2506": { id: "mistralai/Mistral-Small-3.2-24B-Instruct-2506", name: "Mistral Small 3.2 24B Instruct 2506", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-09", release_date: "2025-10-01", last_updated: "2025-10-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 8192 }, cost: { input: 0.33, output: 0.33 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.83, output: 3.85, cache_read: 0.16 } }, "moonshotai/Kimi-K3": { id: "moonshotai/Kimi-K3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-27", last_updated: "2026-07-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 327680, output: 32768 }, cost: { input: 3, output: 15 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT-OSS-120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.22, output: 0.83 } }, "meta-llama/Llama-3.3-70B-Instruct": { id: "meta-llama/Llama-3.3-70B-Instruct", name: "Llama 3.3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2025-04-27", last_updated: "2025-04-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.99, output: 0.99 } } } }, "google-vertex-anthropic": { id: "google-vertex-anthropic", env: ["GOOGLE_VERTEX_PROJECT", "GOOGLE_VERTEX_LOCATION", "GOOGLE_APPLICATION_CREDENTIALS"], npm: "@ai-sdk/google-vertex/anthropic", name: "Vertex (Anthropic)", doc: "https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/claude", models: { "claude-sonnet-4-5@20250929": { id: "claude-sonnet-4-5@20250929", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "claude-sonnet-5@default": { id: "claude-sonnet-5@default", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "claude-opus-5@default": { id: "claude-opus-5@default", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-haiku-4-5@20251001": { id: "claude-haiku-4-5@20251001", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "claude-opus-4-7@default": { id: "claude-opus-4-7@default", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "claude-opus-4@20250514": { id: "claude-opus-4@20250514", name: "Claude Opus 4", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, status: "deprecated", cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "claude-opus-4-8@default": { id: "claude-opus-4-8@default", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "claude-opus-4-5@20251101": { id: "claude-opus-4-5@20251101", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-01", last_updated: "2025-11-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-opus-4-6@default": { id: "claude-opus-4-6@default", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "claude-sonnet-4@20250514": { id: "claude-sonnet-4@20250514", name: "Claude Sonnet 4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, status: "deprecated", cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "claude-sonnet-4-6@default": { id: "claude-sonnet-4-6@default", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "claude-opus-4-1@20250805": { id: "claude-opus-4-1@20250805", name: "Claude Opus 4.1", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, status: "deprecated", cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } } } }, moark: { id: "moark", env: ["MOARK_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://moark.com/v1", name: "Moark", doc: "https://moark.com/docs/openapi/v1#tag/%E6%96%87%E6%9C%AC%E7%94%9F%E6%88%90", models: { "MiniMax-M2.1": { id: "MiniMax-M2.1", name: "MiniMax-M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 2.1, output: 8.4, cache_read: 2.1, cache_write: 8.4 } }, "GLM-4.7": { id: "GLM-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 3.5, output: 14 } } } }, nova: { id: "nova", env: ["NOVA_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.nova.amazon.com/v1", name: "Nova", doc: "https://nova.amazon.com/dev/documentation", models: { "nova-2-lite-v1": { id: "nova-2-lite-v1", name: "Nova 2 Lite", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "nova-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0, output: 0, reasoning: 0 } }, "nova-2-pro-v1": { id: "nova-2-pro-v1", name: "Nova 2 Pro", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "nova-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-12-03", last_updated: "2026-01-03", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0, output: 0, reasoning: 0 } } } }, vultr: { id: "vultr", env: ["VULTR_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.vultrinference.com/v1", name: "Vultr", doc: "https://api.vultrinference.com/", models: { "nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning-BF16": { id: "nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning-BF16", name: "NVIDIA Nemotron 3 Nano Omni", description: "Open Nemotron omni model combining reasoning with text, vision, and audio", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-28", last_updated: "2026-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.13, output: 0.38 } }, "nvidia/DeepSeek-V3.2-NVFP4": { id: "nvidia/DeepSeek-V3.2-NVFP4", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.55, output: 1.65 } }, "nvidia/Nemotron-Cascade-2-30B-A3B": { id: "nvidia/Nemotron-Cascade-2-30B-A3B", name: "NVIDIA Nemotron Cascade 2", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.15, output: 0.6 } }, "zai-org/GLM-5.2-FP8": { id: "zai-org/GLM-5.2-FP8", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 393216, output: 131072 }, cost: { input: 0.85, output: 3.1 } }, "Qwen/Qwen3.6-27B": { id: "Qwen/Qwen3.6-27B", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.3, output: 2 } }, "Qwen/Qwen3.5-397B-A17B": { id: "Qwen/Qwen3.5-397B-A17B", name: "Qwen3.5 397B-A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.3, output: 2 } }, "MiniMaxAI/MiniMax-M2.7": { id: "MiniMaxAI/MiniMax-M2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "deepseek-ai/DeepSeek-V4-Flash": { id: "deepseek-ai/DeepSeek-V4-Flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.3, output: 1 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "XiaomiMiMo/MiMo-V2.5-Pro": { id: "XiaomiMiMo/MiMo-V2.5-Pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.55, output: 1.65 } } } }, "io-net": { id: "io-net", env: ["IOINTELLIGENCE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.intelligence.io.solutions/api/v1", name: "IO.NET", doc: "https://io.net/docs/guides/intelligence/io-intelligence", models: { "zai-org/GLM-4.6": { id: "zai-org/GLM-4.6", name: "GLM 4.6", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-11-15", last_updated: "2024-11-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, cost: { input: 0.4, output: 1.75, cache_read: 0.2, cache_write: 0.8 } }, "mistralai/Devstral-Small-2505": { id: "mistralai/Devstral-Small-2505", name: "Devstral Small 2505", description: "Mistral coding agent model for repository tasks and software engineering workflows", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-05-01", last_updated: "2025-05-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 0.05, output: 0.22, cache_read: 0.025, cache_write: 0.1 } }, "mistralai/Mistral-Large-Instruct-2411": { id: "mistralai/Mistral-Large-Instruct-2411", name: "Mistral Large Instruct 2411", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-11-01", last_updated: "2024-11-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 2, output: 6, cache_read: 1, cache_write: 4 } }, "mistralai/Mistral-Nemo-Instruct-2407": { id: "mistralai/Mistral-Nemo-Instruct-2407", name: "Mistral Nemo Instruct 2407", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-05", release_date: "2024-07-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.02, output: 0.04, cache_read: 0.01, cache_write: 0.04 } }, "mistralai/Magistral-Small-2506": { id: "mistralai/Magistral-Small-2506", name: "Magistral Small 2506", description: "Mistral reasoning model for transparent analysis, math, and complex decisions", family: "magistral-small", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-01", last_updated: "2025-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 0.5, output: 1.5, cache_read: 0.25, cache_write: 1 } }, "Qwen/Qwen2.5-VL-32B-Instruct": { id: "Qwen/Qwen2.5-VL-32B-Instruct", name: "Qwen 2.5 VL 32B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2024-11-01", last_updated: "2024-11-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 4096 }, cost: { input: 0.05, output: 0.22, cache_read: 0.025, cache_write: 0.1 } }, "Qwen/Qwen3-Next-80B-A3B-Instruct": { id: "Qwen/Qwen3-Next-80B-A3B-Instruct", name: "Qwen 3 Next 80B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-10", last_updated: "2025-01-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 4096 }, cost: { input: 0.1, output: 0.8, cache_read: 0.05, cache_write: 0.2 } }, "Qwen/Qwen3-235B-A22B-Thinking-2507": { id: "Qwen/Qwen3-235B-A22B-Thinking-2507", name: "Qwen 3 235B Thinking", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-07-01", last_updated: "2025-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 4096 }, cost: { input: 0.11, output: 0.6, cache_read: 0.055, cache_write: 0.22 } }, "Intel/Qwen3-Coder-480B-A35B-Instruct-int4-mixed-ar": { id: "Intel/Qwen3-Coder-480B-A35B-Instruct-int4-mixed-ar", name: "Qwen 3 Coder 480B", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-15", last_updated: "2025-01-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 106000, output: 4096 }, cost: { input: 0.22, output: 0.95, cache_read: 0.11, cache_write: 0.44 } }, "deepseek-ai/DeepSeek-R1-0528": { id: "deepseek-ai/DeepSeek-R1-0528", name: "DeepSeek R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 2, output: 8.75, cache_read: 1, cache_write: 4 } }, "moonshotai/Kimi-K2-Instruct-0905": { id: "moonshotai/Kimi-K2-Instruct-0905", name: "Kimi K2 Instruct", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2024-09-05", last_updated: "2024-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 4096 }, cost: { input: 0.39, output: 1.9, cache_read: 0.195, cache_write: 0.78 } }, "moonshotai/Kimi-K2-Thinking": { id: "moonshotai/Kimi-K2-Thinking", name: "Kimi K2 Thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2024-11-01", last_updated: "2024-11-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 4096 }, cost: { input: 0.55, output: 2.25, cache_read: 0.275, cache_write: 1.1 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT-OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 64000, output: 4096 }, cost: { input: 0.03, output: 0.14, cache_read: 0.015, cache_write: 0.06 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT-OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 4096 }, cost: { input: 0.04, output: 0.4, cache_read: 0.02, cache_write: 0.08 } }, "meta-llama/Llama-3.3-70B-Instruct": { id: "meta-llama/Llama-3.3-70B-Instruct", name: "Llama 3.3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.13, output: 0.38, cache_read: 0.065, cache_write: 0.26 } }, "meta-llama/Llama-3.2-90B-Vision-Instruct": { id: "meta-llama/Llama-3.2-90B-Vision-Instruct", name: "Llama 3.2 90B Vision Instruct", description: "Open Llama multimodal model for image understanding and text reasoning", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 16000, output: 4096 }, cost: { input: 0.35, output: 0.4, cache_read: 0.175, cache_write: 0.7 } }, "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8": { id: "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", name: "Llama 4 Maverick 17B 128E Instruct", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-01-15", last_updated: "2025-01-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 430000, output: 4096 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075, cache_write: 0.3 } } } }, neuralwatt: { id: "neuralwatt", env: ["NEURALWATT_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.neuralwatt.com/v1", name: "Neuralwatt", doc: "https://portal.neuralwatt.com/docs", models: { "glm-5.2-short-fast": { id: "glm-5.2-short-fast", name: "GLM 5.2 Short Fast", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-06-17", last_updated: "2026-06-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 199984, output: 199984 }, cost: { input: 1.45, output: 4.5, cache_read: 0.3625 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048560, output: 65536 }, cost: { input: 0.104, output: 0.207, cache_read: 0.026 } }, "glm-5.2-short": { id: "glm-5.2-short", name: "GLM 5.2 Short", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }, { type: "budget_tokens" }], tool_call: true, temperature: true, release_date: "2026-06-17", last_updated: "2026-06-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 199984, output: 199984 }, cost: { input: 1.45, output: 4.5, cache_read: 0.3625 } }, "glm-5.2": { id: "glm-5.2", name: "GLM 5.2", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }, { type: "budget_tokens" }], tool_call: true, temperature: true, release_date: "2026-06-17", last_updated: "2026-06-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048560, output: 1048560 }, cost: { input: 1.45, output: 4.5, cache_read: 0.3625 } }, "glm-5.2-short-flex": { id: "glm-5.2-short-flex", name: "GLM 5.2 Short Flex", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }, { type: "budget_tokens" }], tool_call: true, temperature: true, release_date: "2026-06-17", last_updated: "2026-06-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 199984, output: 199984 }, cost: { input: 0.725, output: 2.25, cache_read: 0.18125 } }, "kimi-k2.6-flex": { id: "kimi-k2.6-flex", name: "Kimi K2.6 Flex", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262128, output: 262128 }, cost: { input: 0.345, output: 1.61, cache_read: 0.08625 } }, "kimi-k2.5-fast": { id: "kimi-k2.5-fast", name: "Kimi K2.5 Fast", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262128, output: 262128 }, cost: { input: 0.52, output: 2.59, cache_read: 0.13 } }, "qwen3.6-35b-fast": { id: "qwen3.6-35b-fast", name: "Qwen3.6 35B Fast", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "qwen3.6", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131056, output: 131056 }, cost: { input: 0.29, output: 1.15, cache_read: 0.0725 } }, "qwen3.5-397b-fast": { id: "qwen3.5-397b-fast", name: "Qwen3.5 397B Fast", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-02-01", last_updated: "2026-02-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262128, output: 262128 }, cost: { input: 0.69, output: 4.14, cache_read: 0.1725 } }, "glm-5.2-fast": { id: "glm-5.2-fast", name: "GLM 5.2 Fast", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-06-17", last_updated: "2026-06-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048560, output: 1048560 }, cost: { input: 1.45, output: 4.5, cache_read: 0.3625 } }, "gemma-4-31b": { id: "gemma-4-31b", name: "Gemma 4 31B", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262128, output: 16384 }, cost: { input: 0.144, output: 0.42, cache_read: 0.036 } }, "kimi-k2.7-code-flex": { id: "kimi-k2.7-code-flex", name: "Kimi K2.7 Code Flex", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.475, output: 2, cache_read: 0.11875 } }, "kimi-k2.6-fast": { id: "kimi-k2.6-fast", name: "Kimi K2.6 Fast", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262128, output: 262128 }, cost: { input: 0.69, output: 3.22, cache_read: 0.1725 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048560, output: 1048560 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "glm-5.2-flex": { id: "glm-5.2-flex", name: "GLM 5.2 Flex", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }, { type: "budget_tokens" }], tool_call: true, temperature: true, release_date: "2026-06-17", last_updated: "2026-06-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048560, output: 1048560 }, cost: { input: 0.725, output: 2.25, cache_read: 0.18125 } }, "glm-5.2-short-fast-flex": { id: "glm-5.2-short-fast-flex", name: "GLM 5.2 Short Fast Flex", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-06-17", last_updated: "2026-06-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 199984, output: 199984 }, cost: { input: 0.725, output: 2.25, cache_read: 0.18125 } }, "kimi-k3-fast": { id: "kimi-k3-fast", name: "Kimi K3 Fast", description: "Kimi K3 with thinking disabled for low-latency tool calling, vision, and JSON work", family: "kimi-k3", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048560, output: 1048560 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "Qwen/Qwen3.6-35B-A3B": { id: "Qwen/Qwen3.6-35B-A3B", name: "Qwen3.6 35B A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131056, output: 131056 }, cost: { input: 0.29, output: 1.15, cache_read: 0.0725 } }, "Qwen/Qwen3.5-397B-A17B-FP8": { id: "Qwen/Qwen3.5-397B-A17B-FP8", name: "Qwen3.5 397B A17B FP8", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-01", last_updated: "2026-02-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262128, output: 262128 }, cost: { input: 0.69, output: 4.14, cache_read: 0.1725 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262128, output: 262128 }, cost: { input: 0.69, output: 3.22, cache_read: 0.1725 } }, "moonshotai/Kimi-K2.5": { id: "moonshotai/Kimi-K2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262128, output: 262128 }, cost: { input: 0.52, output: 2.59, cache_read: 0.13 } }, "moonshotai/Kimi-K2.7-Code": { id: "moonshotai/Kimi-K2.7-Code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.2375 } } } }, "aki-io": { id: "aki-io", env: ["AKI_IO_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://aki.io/v1", name: "AKI.IO", doc: "https://aki.io/docs/", models: { "mistral4-119b": { id: "mistral4-119b", name: "Mistral Small 4", description: "Fast Mistral production model for chat, extraction, and cost-sensitive agents", family: "mistral-small", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 81920 }, cost: { input: 0.2, output: 0.6 } }, "minimax-m2.5-230b": { id: "minimax-m2.5-230b", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 65536 }, cost: { input: 0.25, output: 1.2 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.15, output: 0.55 } }, "gemma4-26b": { id: "gemma4-26b", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 32768 }, cost: { input: 0.1, output: 0.5 } }, "kimi-k2.7-code-1100b": { id: "kimi-k2.7-code-1100b", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 81920 }, cost: { input: 0.86, output: 3 } }, "qwen3.6-35b": { id: "qwen3.6-35b", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 32768 }, cost: { input: 0.15, output: 0.5 } } } }, xai: { id: "xai", env: ["XAI_API_KEY"], npm: "@ai-sdk/xai", name: "xAI", doc: "https://docs.x.ai/docs/models", models: { "grok-imagine-video": { id: "grok-imagine-video", name: "Grok Imagine Video", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "grok", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-01-28", last_updated: "2026-01-28", modalities: { input: ["text", "image", "video", "pdf"], output: ["video"] }, open_weights: false, limit: { context: 1024, output: 0 } }, "grok-4.3": { id: "grok-4.3", name: "Grok 4.3", description: "xAI's Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "grok-4.20-0309-non-reasoning": { id: "grok-4.20-0309-non-reasoning", name: "Grok 4.20 (Non-Reasoning)", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "grok-imagine-video-1.5": { id: "grok-imagine-video-1.5", name: "Grok Imagine Video 1.5", description: "Video model for image-to-video generation, editing, and extension workflows", family: "grok", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-05-30", last_updated: "2026-05-30", modalities: { input: ["text", "image", "audio", "pdf"], output: ["video"] }, open_weights: false, limit: { context: 1024, output: 0 } }, "grok-4.20-multi-agent-0309": { id: "grok-4.20-multi-agent-0309", name: "Grok 4.20 Multi-Agent", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: false, structured_output: true, temperature: true, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "grok-imagine-image-quality": { id: "grok-imagine-image-quality", name: "Grok Imagine Image Quality", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "grok", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-03", last_updated: "2026-04-03", modalities: { input: ["text", "image", "pdf"], output: ["image", "pdf"] }, open_weights: false, limit: { context: 8000, output: 0 } }, "grok-4.5": { id: "grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.3, tiers: [{ input: 4, output: 12, cache_read: 0.6, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 12, cache_read: 0.6 } } }, "grok-build-0.1": { id: "grok-build-0.1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1, output: 2, cache_read: 0.2, tiers: [{ input: 2, output: 4, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2, output: 4, cache_read: 0.4 } } }, "grok-4.20-0309-reasoning": { id: "grok-4.20-0309-reasoning", name: "Grok 4.20 (Reasoning)", description: "Reasoning Grok for document-heavy analysis and long-horizon tool use", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "grok-imagine-image": { id: "grok-imagine-image", name: "Grok Imagine Image", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "grok", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-01-28", last_updated: "2026-01-28", modalities: { input: ["text", "image", "pdf"], output: ["image", "pdf"] }, open_weights: false, limit: { context: 8000, output: 0 } } } }, hetzner: { id: "hetzner", env: ["HETZNER_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://inference.hetzner.com/api/v1", name: "Hetzner", doc: "https://experiments.hetzner.com/docs/inference", models: { "Qwen/Qwen3.6-35B-A3B-FP8": { id: "Qwen/Qwen3.6-35B-A3B-FP8", name: "Qwen3.6 35B A3B FP8", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "beta", cost: { input: 0, output: 0, cache_read: 0 } } } }, zenifra: { id: "zenifra", env: ["ZENIFRA_AI_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://ai.zenifra.com/v1", name: "Zenifra", doc: "https://docs.zenifra.com", models: { "alibaba/qwen3.6-35b-a3b": { id: "alibaba/qwen3.6-35b-a3b", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, provider: { shape: "completions" }, cost: { input: 0.19, output: 0.48 } } } }, aihubmix: { id: "aihubmix", env: ["AIHUBMIX_API_KEY"], npm: "@aihubmix/ai-sdk-provider", name: "AIHubMix", doc: "https://docs.aihubmix.com", models: { "gpt-5.1-codex-mini": { id: "gpt-5.1-codex-mini", name: "GPT-5.1 Codex mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "xiaomi-mimo-v2.5-free": { id: "xiaomi-mimo-v2.5-free", name: "Xiaomi MiMo-V2.5 (free)", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo-v2.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-05-13", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0 } }, "qwen3.7-plus": { id: "qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 991000, output: 64000 }, cost: { input: 0.282, output: 1.128, cache_read: 0.0564, cache_write: 0.3525 } }, "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, interleaved: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "deep-deepseek-v4-pro": { id: "deep-deepseek-v4-pro", name: "DeepSeek V4 Pro (DeepSeek)", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.478, output: 0.956, cache_read: 0.004302 } }, "gemini-3.5-flash": { id: "gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 1.5, output: 9, cache_read: 1.5 } }, "deep-deepseek-v4-flash": { id: "deep-deepseek-v4-flash", name: "DeepSeek V4 Flash (DeepSeek)", description: "Fast DeepSeek model for efficient chat, coding help, and agent loops", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.154, output: 0.308, cache_read: 0.0308 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-03-20", last_updated: "2025-06-05", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, input_audio: 1 } }, "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "xiaomi-mimo-v2.5": { id: "xiaomi-mimo-v2.5", name: "Xiaomi MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo-v2.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-05-13", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.44, output: 2.2, cache_read: 0.088, tiers: [{ input: 0.88, output: 4.4, cache_read: 0.176, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.88, output: 4.4, cache_read: 0.176 } } }, "claude-opus-4-7-think": { id: "claude-opus-4-7-think", name: "Claude Opus 4.7 Thinking", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "zai-glm-5.1": { id: "zai-glm-5.1", name: "GLM-5.1 (Z.ai)", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-27", last_updated: "2026-03-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.845, output: 3.38, cache_read: 0.183112 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, interleaved: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 11, output: 55, cache_read: 1.1, cache_write: 13.75 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "minimax-m2.7": { id: "minimax-m2.7", name: "MiniMax M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 128000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06, cache_write: 0.375 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "grok-4.3": { id: "grok-4.3", name: "Grok 4.3", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-01", last_updated: "2026-05-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 1.1268, output: 3.9438, cache_read: 0.2817 } }, "qwen3.7-max": { id: "qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 991000, output: 64000 }, cost: { input: 1.69, output: 5.07, cache_read: 0.169, cache_write: 2.1125 } }, "kimi-k2.7-code-highspeed": { id: "kimi-k2.7-code-highspeed", name: "Kimi K2.7 Code Highspeed", description: "Lower-latency Kimi Code variant for interactive edits and coding-agent loops", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 1.9, output: 7.999, cache_read: 0.32167 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "alicloud-deepseek-v4-pro": { id: "alicloud-deepseek-v4-pro", name: "DeepSeek V4 Pro (Alibaba Cloud)", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 1.69, output: 3.38, cache_read: 0.13 } }, "xiaomi-mimo-v2.5-pro-free": { id: "xiaomi-mimo-v2.5-pro-free", name: "Xiaomi MiMo-V2.5-Pro (free)", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo-v2.5-pro", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-05-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0 } }, "doubao-seed-2-0-code-preview": { id: "doubao-seed-2-0-code-preview", name: "Doubao Seed 2.0 Code Preview", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 0.48, output: 2.41, cache_read: 0.09644, tiers: [{ input: 0.72, output: 3.62, cache_read: 0.144656, tier: { type: "context", size: 32000 } }, { input: 1.45, output: 7.23, cache_read: 0.28932, tier: { type: "context", size: 128000 } }] } }, "claude-opus-4-6-think": { id: "claude-opus-4-6-think", name: "Claude Opus 4.6 Thinking", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "coding-xiaomi-mimo-v2.5-pro": { id: "coding-xiaomi-mimo-v2.5-pro", name: "Coding Xiaomi MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo-v2.5-pro", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-05-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.2, output: 0.6, cache_read: 0.04, tiers: [{ input: 0.4, output: 1.2, cache_read: 0.08, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.4, output: 1.2, cache_read: 0.08 } } }, "coding-minimax-m2.7-highspeed": { id: "coding-minimax-m2.7-highspeed", name: "Coding MiniMax M2.7 Highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 128100 }, cost: { input: 0.2, output: 0.2 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 12.5, output: 75, cache_read: 1.25 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "gemini-3-flash-preview": { id: "gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, tiers: [{ input: 0.5, output: 3, cache_read: 0.05, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 0.5, output: 3, cache_read: 0.05 } } }, "gemini-3.1-pro-preview-customtools": { id: "gemini-3.1-pro-preview-customtools", name: "Gemini 3.1 Pro Preview Custom Tools", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "coding-xiaomi-mimo-v2.5": { id: "coding-xiaomi-mimo-v2.5", name: "Coding Xiaomi MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo-v2.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-05-13", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.08, output: 0.4, cache_read: 0.016, tiers: [{ input: 0.16, output: 0.8, cache_read: 0.032, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.16, output: 0.8, cache_read: 0.032 } } }, "alicloud-deepseek-v4-flash": { id: "alicloud-deepseek-v4-flash", name: "DeepSeek V4 Flash (Alibaba Cloud)", description: "Fast DeepSeek model for efficient chat, coding help, and agent loops", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 5, output: 30, cache_read: 0.5 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "gpt-5.2-codex": { id: "gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "hy3-preview": { id: "hy3-preview", name: "Hy3 Preview", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 128000 }, cost: { input: 0.17, output: 0.566661, cache_read: 0.051 } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 1.5, output: 9, cache_read: 0.15 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "gemini-3.1-flash-lite": { id: "gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, cache_write: 1 } }, "xiaomi-mimo-v2.5-pro": { id: "xiaomi-mimo-v2.5-pro", name: "Xiaomi MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo-v2.5-pro", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-05-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1.1, output: 3.3, cache_read: 0.22, tiers: [{ input: 2.2, output: 6.6, cache_read: 0.44, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2.2, output: 6.6, cache_read: 0.44 } } }, "coding-minimax-m2.7": { id: "coding-minimax-m2.7", name: "Coding MiniMax M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 128100 }, cost: { input: 0.2, output: 0.2 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 1, output: 6, cache_read: 0.1, cache_write: 1.25 } }, "gpt-5.2": { id: "gpt-5.2", name: "GPT-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "coding-minimax-m2.7-free": { id: "coding-minimax-m2.7-free", name: "Coding MiniMax M2.7 (Free)", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax-free", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 128100 }, cost: { input: 0, output: 0 } }, "gpt-5.3-codex": { id: "gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "doubao-seed-2-0-mini-260428": { id: "doubao-seed-2-0-mini-260428", name: "Doubao Seed 2.0 Mini 260428", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-28", last_updated: "2026-04-28", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 0.03, output: 0.28, cache_read: 0.00564, input_audio: 0.423, tiers: [{ input: 0.06, output: 0.56, cache_read: 0.01128, input_audio: 0.846, tier: { type: "context", size: 32000 } }, { input: 0.11, output: 1.13, cache_read: 0.02256, input_audio: 1.692, tier: { type: "context", size: 128000 } }] } }, "grok-4.5": { id: "grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 2, output: 6, cache_read: 0.5 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.95, output: 3.9995, cache_read: 0.160835 } }, "gemini-3.1-pro-preview": { id: "gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "doubao-seed-2-0-lite-260428": { id: "doubao-seed-2-0-lite-260428", name: "Doubao Seed 2.0 Lite 260428", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-28", last_updated: "2026-04-28", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 0.08, output: 0.51, cache_read: 0.01692, input_audio: 1.269, tiers: [{ input: 0.13, output: 0.76, cache_read: 0.02536, input_audio: 1.902, tier: { type: "context", size: 32000 } }, { input: 0.25, output: 1.52, cache_read: 0.05072, input_audio: 3.804, tier: { type: "context", size: 128000 } }] } }, "claude-sonnet-4-6-think": { id: "claude-sonnet-4-6-think", name: "Claude Sonnet 4.6 Thinking", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "qwen3.6-flash": { id: "qwen3.6-flash", name: "Qwen3.6 Flash", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 991000, output: 64000 }, cost: { input: 0.17, output: 1.01, cache_read: 0.0169, cache_write: 0.21125, tiers: [{ input: 0.68, output: 4.06, cache_read: 0.0676, cache_write: 0.845, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.68, output: 4.06, cache_read: 0.0676, cache_write: 0.845 } } }, "gpt-5.1": { id: "gpt-5.1", name: "GPT-5.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "grok-build-0.1": { id: "grok-build-0.1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1, output: 2, cache_read: 0.2 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-03-20", last_updated: "2025-06-05", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "gpt-5.1-codex": { id: "gpt-5.1-codex", name: "GPT-5.1 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "coding-glm-5.1-free": { id: "coding-glm-5.1-free", name: "Coding GLM 5.1 (free)", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm-free", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-11", last_updated: "2026-04-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0, output: 0 } }, "glm-5v-turbo": { id: "glm-5v-turbo", name: "GLM 5 Vision Turbo", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glmv", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-05-09", last_updated: "2026-05-09", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 0.7042, output: 3.09848, cache_read: 0.169008 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 3.125 } }, "claude-opus-4-8-think": { id: "claude-opus-4-8-think", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "alicloud-glm-5.1": { id: "alicloud-glm-5.1", name: "GLM-5.1 (Alibaba Cloud)", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-27", last_updated: "2026-03-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.84, output: 3.38, cache_read: 0.169, cache_write: 1.05625 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "qwen3.6-max-preview": { id: "qwen3.6-max-preview", name: "Qwen3.6 Max Preview", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "qwen3.6", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-05-09", last_updated: "2026-05-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 240000, output: 64000 }, cost: { input: 1.27, output: 7.61, cache_read: 0.1268, cache_write: 1.585, tiers: [{ input: 2.11, output: 12.67, cache_read: 0.2112, cache_write: 2.64, tier: { type: "context", size: 128000 } }] } }, "doubao-seed-2-0-pro": { id: "doubao-seed-2-0-pro", name: "Doubao Seed 2.0 Pro", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 0.48, output: 2.41, cache_read: 0.09644, tiers: [{ input: 0.72, output: 3.62, cache_read: 0.144656, tier: { type: "context", size: 32000 } }, { input: 1.45, output: 7.23, cache_read: 0.28932, tier: { type: "context", size: 128000 } }] } }, "coding-glm-5.1": { id: "coding-glm-5.1", name: "Coding GLM 5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-11", last_updated: "2026-04-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.06, output: 0.22, cache_read: 0.013 } }, "qwen3.6-plus": { id: "qwen3.6-plus", name: "Qwen3.6 Plus", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-05-09", last_updated: "2026-05-09", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 991000, output: 64000 }, cost: { input: 0.28, output: 1.69, cache_read: 0.0282, cache_write: 0.3525, tiers: [{ input: 1.13, output: 6.77, cache_read: 0.1128, cache_write: 1.41, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 1.13, output: 6.77, cache_read: 0.1128, cache_write: 1.41 } } } } }, morph: { id: "morph", env: ["MORPH_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.morphllm.com/v1", name: "Morph", doc: "https://docs.morphllm.com/api-reference/introduction", models: { "morph-v3-large": { id: "morph-v3-large", name: "Morph v3 Large", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "morph", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-08-15", last_updated: "2024-08-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 }, cost: { input: 0.9, output: 1.9 } }, auto: { id: "auto", name: "Auto", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-06-01", last_updated: "2024-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 }, cost: { input: 0.85, output: 1.55 } }, "morph-v3-fast": { id: "morph-v3-fast", name: "Morph v3 Fast", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "morph", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-08-15", last_updated: "2024-08-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16000, output: 16000 }, cost: { input: 0.8, output: 1.2 } } } }, "umans-ai-coding-plan": { id: "umans-ai-coding-plan", env: ["UMANS_AI_CODING_PLAN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.code.umans.ai/v1", name: "Umans AI Coding Plan", doc: "https://app.umans.ai/offers/code/docs", models: { "umans-flash": { id: "umans-flash", name: "Umans Flash", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "umans-deepseek-v4-flash-0731": { id: "umans-deepseek-v4-flash-0731", name: "DeepSeek V4 Flash", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 393215 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "umans-kimi-k3": { id: "umans-kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "umans-coder": { id: "umans-coder", name: "Umans Coder", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "umans-glm-5.2": { id: "umans-glm-5.2", name: "GLM 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 405504, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "umans-kimi-k2.7": { id: "umans-kimi-k2.7", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "umans-qwen3.6-35b-a3b": { id: "umans-qwen3.6-35b-a3b", name: "Qwen3.6 35B A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "umans-glm-5.1": { id: "umans-glm-5.1", name: "GLM 5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, mistral: { id: "mistral", env: ["MISTRAL_API_KEY"], npm: "@ai-sdk/mistral", name: "Mistral", doc: "https://docs.mistral.ai/getting-started/models/", models: { "mistral-small-2506": { id: "mistral-small-2506", name: "Mistral Small 3.2", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-06-20", last_updated: "2025-06-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 0.1, output: 0.3 } }, "pixtral-large-latest": { id: "pixtral-large-latest", name: "Pixtral Large (latest)", description: "Mistral's larger vision model for document-heavy image understanding and chat", family: "pixtral", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2024-11-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 2, output: 6 } }, "pixtral-12b": { id: "pixtral-12b", name: "Pixtral 12B", description: "Mistral vision-language model for image understanding and multimodal chat", family: "pixtral", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2024-09-01", last_updated: "2024-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.15, output: 0.15 } }, "open-mixtral-8x7b": { id: "open-mixtral-8x7b", name: "Mixtral 8x7B", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mixtral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-01", release_date: "2023-12-11", last_updated: "2023-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 32000 }, cost: { input: 0.7, output: 0.7 } }, "labs-devstral-small-2512": { id: "labs-devstral-small-2512", name: "Devstral Small 2", description: "Legacy model retained for compatibility with older integrations", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-12", release_date: "2025-12-09", last_updated: "2025-12-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, status: "deprecated", cost: { input: 0, output: 0 } }, "magistral-medium-latest": { id: "magistral-medium-latest", name: "Magistral Medium (latest)", description: "Mistral reasoning model for transparent analysis, math, and complex decisions", family: "magistral-medium", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-03-17", last_updated: "2025-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 2, output: 5 } }, "mistral-medium-2508": { id: "mistral-medium-2508", name: "Mistral Medium 3.1", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-08-12", last_updated: "2025-08-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.4, output: 2 } }, "mistral-large-2411": { id: "mistral-large-2411", name: "Mistral Large 2.1", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-18", last_updated: "2024-11-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 2, output: 6 } }, "voxtral-mini-tts-latest": { id: "voxtral-mini-tts-latest", name: "Voxtral Mini TTS (latest)", description: "Multilingual text-to-speech model with zero-shot voice cloning", family: "voxtral", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-03-01", last_updated: "2026-03-01", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "mistral-medium-latest": { id: "mistral-medium-latest", name: "Mistral Medium (latest)", description: "Balanced Mistral model for enterprise assistants, multilingual work, and tools", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.5, output: 7.5 } }, "devstral-small-2507": { id: "devstral-small-2507", name: "Devstral Small", description: "Legacy model retained for compatibility with older integrations", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-07-10", last_updated: "2025-07-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, status: "deprecated", cost: { input: 0.1, output: 0.3 } }, "open-mistral-7b": { id: "open-mistral-7b", name: "Mistral 7B", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2023-09-27", last_updated: "2023-09-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8000, output: 8000 }, cost: { input: 0.25, output: 0.25 } }, "mistral-medium-2505": { id: "mistral-medium-2505", name: "Mistral Medium 3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-05-07", last_updated: "2025-05-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.4, output: 2 } }, "ministral-3b-latest": { id: "ministral-3b-latest", name: "Ministral 3B (latest)", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-10-01", last_updated: "2024-10-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.04, output: 0.04 } }, "mistral-small-latest": { id: "mistral-small-latest", name: "Mistral Small (latest)", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.15, output: 0.6 } }, "open-mixtral-8x22b": { id: "open-mixtral-8x22b", name: "Mixtral 8x22B", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mixtral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-04-17", last_updated: "2024-04-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 64000, output: 64000 }, cost: { input: 2, output: 6 } }, "mistral-nemo": { id: "mistral-nemo", name: "Mistral Nemo", description: "Efficient Mistral-NVIDIA open model for multilingual chat and local deployment", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-07-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.15, output: 0.15 } }, "mistral-small-2603": { id: "mistral-small-2603", name: "Mistral Small 4", description: "Fast Mistral production model for chat, extraction, and cost-sensitive agents", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.15, output: 0.6 } }, "mistral-medium-2604": { id: "mistral-medium-2604", name: "Mistral Medium 3.5", description: "Balanced Mistral model for enterprise assistants, multilingual work, and tools", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.5, output: 7.5 } }, "voxtral-mini-latest": { id: "voxtral-mini-latest", name: "Voxtral Mini (latest)", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "voxtral", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-02-01", last_updated: "2026-02-01", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 } }, "voxtral-small-latest": { id: "voxtral-small-latest", name: "Voxtral Small (latest)", description: "Instruct model with native audio input for speech understanding and tool use", family: "voxtral", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2025-07-15", last_updated: "2025-07-15", modalities: { input: ["text", "audio"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 32000 }, cost: { input: 0.1, output: 0.3 } }, "devstral-latest": { id: "devstral-latest", name: "Devstral 2", description: "Legacy model retained for compatibility with older integrations", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-12", release_date: "2025-12-09", last_updated: "2025-12-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0.4, output: 2 } }, "ministral-8b-latest": { id: "ministral-8b-latest", name: "Ministral 8B (latest)", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-10-01", last_updated: "2024-10-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.1, output: 0.1 } }, "mistral-embed": { id: "mistral-embed", name: "Mistral Embed", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "mistral-embed", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2023-12-11", last_updated: "2023-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8000, output: 3072 }, cost: { input: 0.1, output: 0 } }, "codestral-latest": { id: "codestral-latest", name: "Codestral (latest)", description: "Mistral code model for completions, refactors, and developer IDE workflows", family: "codestral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-05-29", last_updated: "2025-01-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 4096 }, cost: { input: 0.3, output: 0.9 } }, "devstral-medium-latest": { id: "devstral-medium-latest", name: "Devstral 2 (latest)", description: "Legacy model retained for compatibility with older integrations", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-12", release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0.4, output: 2 } }, "devstral-2512": { id: "devstral-2512", name: "Devstral 2", description: "Mistral's coding-agent model for repository work, terminal tasks, and software fixes", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-12", release_date: "2025-12-09", last_updated: "2025-12-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0.4, output: 2 } }, "mistral-large-latest": { id: "mistral-large-latest", name: "Mistral Large (latest)", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.5, output: 1.5 } }, "devstral-medium-2507": { id: "devstral-medium-2507", name: "Devstral Medium", description: "Legacy model retained for compatibility with older integrations", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-07-10", last_updated: "2025-07-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, status: "deprecated", cost: { input: 0.4, output: 2 } }, "devstral-small-2505": { id: "devstral-small-2505", name: "Devstral Small 2505", description: "Legacy model retained for compatibility with older integrations", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-05-07", last_updated: "2025-05-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, status: "deprecated", cost: { input: 0.1, output: 0.3 } }, "magistral-small": { id: "magistral-small", name: "Magistral Small", description: "Mistral reasoning model for transparent analysis, math, and complex decisions", family: "magistral-small", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-03-17", last_updated: "2025-03-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.5, output: 1.5 } }, "open-mistral-nemo": { id: "open-mistral-nemo", name: "Open Mistral Nemo", description: "Legacy model retained for compatibility with older integrations", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-07-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, status: "deprecated", cost: { input: 0.15, output: 0.15 } }, "mistral-large-2512": { id: "mistral-large-2512", name: "Mistral Large 3", description: "Mistral's largest general model for enterprise agents, coding, and multilingual reasoning", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.5, output: 1.5 } } } }, "umans-ai": { id: "umans-ai", env: ["UMANS_AI_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.code.umans.ai/v1", name: "Umans AI", doc: "https://app.umans.ai/offers/code/docs/orgs", models: { "umans-flash": { id: "umans-flash", name: "Umans Flash", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.15, output: 1, cache_read: 0.05 } }, "umans-deepseek-v4-flash-0731": { id: "umans-deepseek-v4-flash-0731", name: "DeepSeek V4 Flash", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 393215 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "umans-kimi-k3": { id: "umans-kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "umans-coder": { id: "umans-coder", name: "Umans Coder", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "umans-glm-5.2": { id: "umans-glm-5.2", name: "GLM 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 405504, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "umans-kimi-k2.7": { id: "umans-kimi-k2.7", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "umans-glm-5.1": { id: "umans-glm-5.1", name: "GLM 5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.29 } } } }, ofox: { id: "ofox", env: ["OFOX_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.ofox.ai/v1", name: "Ofox", doc: "https://ofox.ai/docs", models: { "google/gemini-3.5-flash": { id: "google/gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, cache_write: 0.83, input_audio: 3 } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, cache_write: 1, input_audio: 1 } }, "google/gemini-3-flash-preview": { id: "google/gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 1 } }, "google/gemini-3.6-flash": { id: "google/gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15, cache_write: 0.083 } }, "google/gemini-3.1-flash-lite": { id: "google/gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, cache_write: 1, input_audio: 0.5 } }, "google/gemini-3.1-pro-preview": { id: "google/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 4.5 } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, cache_write: 4.5 } }, "google/gemini-2.5-flash-lite": { id: "google/gemini-2.5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 512, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.025, cache_write: 1, input_audio: 0.3 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.45, output: 0.88, cache_read: 0.0037 } }, "deepseek/deepseek-v3.2": { id: "deepseek/deepseek-v3.2", name: "DeepSeek V3.2", description: "Hybrid-reasoning DeepSeek model with thinking and non-thinking modes, sparse attention, and tool-use", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32000 }, cost: { input: 0.29, output: 0.43, cache_read: 0.06 } }, "x-ai/grok-4.1-fast": { id: "x-ai/grok-4.1-fast", name: "Grok 4.1 Fast", description: "xAI's fast agentic tool-calling model with a 2M context window; non-reasoning variant for low-latency responses", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-11-19", last_updated: "2025-11-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "x-ai/grok-4.3": { id: "x-ai/grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "x-ai/grok-4.20": { id: "x-ai/grok-4.20", name: "Grok 4.20 (Reasoning)", description: "Reasoning Grok for document-heavy analysis and long-horizon tool use", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 128000 }, cost: { input: 4, output: 12, cache_read: 0.4 } }, "anthropic/claude-sonnet-4.6": { id: "anthropic/claude-sonnet-4.6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://api.ofox.ai/anthropic/v1" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-fable-5": { id: "anthropic/claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://api.ofox.ai/anthropic/v1" }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4.5": { id: "anthropic/claude-opus-4.5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://api.ofox.ai/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4.7": { id: "anthropic/claude-opus-4.7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://api.ofox.ai/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-haiku-4.5": { id: "anthropic/claude-haiku-4.5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://api.ofox.ai/anthropic/v1" }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "anthropic/claude-opus-4.8": { id: "anthropic/claude-opus-4.8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://api.ofox.ai/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-5": { id: "anthropic/claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://api.ofox.ai/anthropic/v1" }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "anthropic/claude-opus-5": { id: "anthropic/claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://api.ofox.ai/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4.6": { id: "anthropic/claude-opus-4.6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic", api: "https://api.ofox.ai/anthropic/v1" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "z-ai/glm-5": { id: "z-ai/glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.2 } }, "z-ai/glm-5.1": { id: "z-ai/glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "z-ai/glm-5.2": { id: "z-ai/glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "z-ai/glm-4.7-flashx": { id: "z-ai/glm-4.7-flashx", name: "GLM-4.7-FlashX", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.072, output: 0.43, cache_read: 0.015 } }, "z-ai/glm-4.6": { id: "z-ai/glm-4.6", name: "GLM-4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.4, output: 1.9, cache_read: 0.11 } }, "z-ai/glm-4.7": { id: "z-ai/glm-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.4, output: 2, cache_read: 0.08 } }, "z-ai/glm-5-turbo": { id: "z-ai/glm-5-turbo", name: "GLM-5-Turbo", description: "Faster GLM-5 lane for coding agents that need lower latency", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24 } }, "moonshotai/kimi-k2.5": { id: "moonshotai/kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "moonshotai/kimi-k2.7-code-highspeed": { id: "moonshotai/kimi-k2.7-code-highspeed", name: "Kimi K2.7 Code Highspeed", description: "Lower-latency Kimi Code variant for interactive edits and coding-agent loops", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.9, output: 8, cache_read: 0.38 } }, "moonshotai/kimi-k2.6": { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "moonshotai/kimi-k3": { id: "moonshotai/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "openai/gpt-5.1-codex-mini": { id: "openai/gpt-5.1-codex-mini", name: "GPT-5.1 Codex mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 65536 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 0.25, output: 2, cache_read: 0.03 } }, "openai/gpt-4.1-mini": { id: "openai/gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "openai/gpt-4o": { id: "openai/gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.6-sol": { id: "openai/gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "openai/gpt-4o-mini": { id: "openai/gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "openai/gpt-5.2-codex": { id: "openai/gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Code-specialist GPT for repository edits, reviews, and long-running software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 1.75, output: 14, cache_read: 0.18 } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "openai/gpt-5.6-luna": { id: "openai/gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, cache_write: 0.25 } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 1.75, output: 14, cache_read: 0.18 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32768 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 0.25, output: 2, cache_read: 0.03 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "openai/gpt-5.6-terra": { id: "openai/gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 2.5 } }, "openai/gpt-4.1": { id: "openai/gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/gpt-5.1-codex-max": { id: "openai/gpt-5.1-codex-max", name: "GPT-5.1 Codex Max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, provider: { npm: "@ai-sdk/openai", api: "https://api.ofox.ai/v1" }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "bailian/qwen3.7-plus": { id: "bailian/qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.4, output: 1.6, cache_read: 0.08, cache_write: 0.5 } }, "bailian/qwen-max": { id: "bailian/qwen-max", name: "Qwen Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-04-03", last_updated: "2025-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 8192 }, cost: { input: 0.35, output: 1.38, cache_read: 0.069 } }, "bailian/qwen3.5-plus": { id: "bailian/qwen3.5-plus", name: "Qwen3.5 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.4, output: 2.4, cache_read: 0.04, cache_write: 0.4 } }, "bailian/qwen-vl-max": { id: "bailian/qwen-vl-max", name: "Qwen-VL Max", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-04-08", last_updated: "2025-08-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.23, output: 0.58, cache_read: 0.046 } }, "bailian/qwen3.5-27b": { id: "bailian/qwen3.5-27b", name: "Qwen3.5 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.29, output: 2.05, cache_read: 0.29 } }, "bailian/qwen3.7-max": { id: "bailian/qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5, cache_write: 3.125 } }, "bailian/qwen3.6-27b": { id: "bailian/qwen3.6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0.6, output: 3.6 } }, "bailian/qwen3.5-flash": { id: "bailian/qwen3.5-flash", name: "Qwen3.5 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01, cache_write: 0.125 } }, "bailian/qwen3-max": { id: "bailian/qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen3 model for coding agents, complex reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.36, output: 1.43, cache_read: 0.072 } }, "bailian/qwen3-coder-plus": { id: "bailian/qwen3-coder-plus", name: "Qwen3 Coder Plus", description: "Hosted Qwen coder for software agents, repo edits, and long-context code", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.8, output: 9, cache_read: 0.2, cache_write: 1 } }, "bailian/qwen3.8-max": { id: "bailian/qwen3.8-max", name: "Qwen3.8 Max", description: "2.4-trillion-parameter MoE flagship for coding, professional work, multimodal understanding, and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "xhigh"] }, { type: "budget_tokens", min: 0, max: 262144 }], tool_call: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 2, output: 6, cache_read: 0.25, cache_write: 2.5 } }, "bailian/qwen3-coder-flash": { id: "bailian/qwen3-coder-flash", name: "Qwen3 Coder Flash", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.5, output: 2.5, cache_read: 0.06, cache_write: 0.27 } }, "bailian/qwen-flash": { id: "bailian/qwen-flash", name: "Qwen Flash", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.022, output: 0.22, cache_read: 0.0043, cache_write: 0.027 } }, "bailian/qwen-turbo": { id: "bailian/qwen-turbo", name: "Qwen Turbo", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-11-01", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.05, output: 0.09, cache_read: 0.0086 } }, "bailian/qwen3.6-flash": { id: "bailian/qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, cache_write: 0.31 } }, "bailian/qwen3.5-397b-a17b": { id: "bailian/qwen3.5-397b-a17b", name: "Qwen3.5 397B-A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0.55, output: 3.5, cache_read: 0.55 } }, "bailian/qwen3.6-max-preview": { id: "bailian/qwen3.6-max-preview", name: "Qwen3.6 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 2 } }, "bailian/qwen3-coder-next": { id: "bailian/qwen3-coder-next", name: "Qwen3 Coder Next", description: "Open-weight Qwen coding model for agents, repository edits, and multi-turn tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-09", release_date: "2026-02-03", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.2, output: 1.5 } }, "bailian/qwen3.6-plus": { id: "bailian/qwen3.6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 0.625 } }, "bailian/qwen3.5-122b-a10b": { id: "bailian/qwen3.5-122b-a10b", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0.29, output: 2.29, cache_read: 0.29 } } } }, orcarouter: { id: "orcarouter", env: ["ORCAROUTER_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.orcarouter.ai/v1", name: "OrcaRouter", doc: "https://docs.orcarouter.ai", models: { "google/gemini-flash-latest": { id: "google/gemini-flash-latest", name: "Gemini Flash Latest", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, input_audio: 1.5 } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, input_audio: 1 } }, "google/gemini-3.1-flash-lite-preview": { id: "google/gemini-3.1-flash-lite-preview", name: "Gemini 3.1 Flash Lite Preview", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "google/gemini-3-flash-preview": { id: "google/gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, input_audio: 1 } }, "google/gemini-3.1-pro-preview-customtools": { id: "google/gemini-3.1-pro-preview-customtools", name: "Gemini 3.1 Pro Preview Custom Tools", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 4, output: 18, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "google/gemma-4-26b-a4b-it": { id: "google/gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.06, output: 0.33 } }, "google/gemma-4-31b-it": { id: "google/gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.13, output: 0.38 } }, "google/gemini-3.1-pro-preview": { id: "google/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 4, output: 18, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "google/gemini-flash-lite-latest": { id: "google/gemini-flash-lite-latest", name: "Gemini Flash-Lite Latest", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2.5, output: 15, cache_read: 0.125, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "google/gemini-3-pro-preview": { id: "google/gemini-3-pro-preview", name: "Gemini 3 Pro Preview", description: "Preview Gemini flagship for complex reasoning, coding, and rich multimodal prompts", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 4, output: 18, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "google/gemini-2.5-flash-lite": { id: "google/gemini-2.5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01, input_audio: 0.3 } }, "qwen/qwen3.6-35b-a3b": { id: "qwen/qwen3.6-35b-a3b", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.248, output: 1.485 } }, "qwen/qwen3.5-plus": { id: "qwen/qwen3.5-plus", name: "Qwen3.5 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.115, output: 0.688, reasoning: 2.4 } }, "qwen/qwen3.5-27b": { id: "qwen/qwen3.5-27b", name: "Qwen3.5 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.086, output: 0.688 } }, "qwen/qwen3.5-35b-a3b": { id: "qwen/qwen3.5-35b-a3b", name: "Qwen3.5 35B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.057, output: 0.459 } }, "qwen/qwen3-max": { id: "qwen/qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen3 model for coding agents, complex reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.359, output: 1.434 } }, "qwen/qwen3.5-397b-a17b": { id: "qwen/qwen3.5-397b-a17b", name: "Qwen3.5 397B-A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.172, output: 1.032 } }, "qwen/qwen3.6-plus": { id: "qwen/qwen3.6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 0.625, tiers: [{ input: 2, output: 6, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.2, cache_write: 2.5 } } }, "qwen/qwen3.5-122b-a10b": { id: "qwen/qwen3.5-122b-a10b", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.115, output: 0.917 } }, "orcarouter/auto": { id: "orcarouter/auto", name: "OrcaRouter Auto", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-01-01", last_updated: "2026-05-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "grok/grok-4.3": { id: "grok/grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 30000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "minimax/minimax-m2.7-highspeed": { id: "minimax/minimax-m2.7-highspeed", name: "MiniMax-M2.7-highspeed", description: "Low-latency M2.7 variant for interactive coding plans and agent loops", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.4, cache_read: 0.06, cache_write: 0.375 } }, "minimax/minimax-m2.7": { id: "minimax/minimax-m2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06, cache_write: 0.375 } }, "minimax/minimax-m2.5-highspeed": { id: "minimax/minimax-m2.5-highspeed", name: "MiniMax-M2.5-highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-13", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.4, cache_read: 0.06, cache_write: 0.375 } }, "minimax/minimax-m2.5": { id: "minimax/minimax-m2.5", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.19, output: 0.37, cache_read: 0.0028 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.56, output: 1.12, cache_read: 0.003625 } }, "deepseek/deepseek-chat": { id: "deepseek/deepseek-chat", name: "DeepSeek Chat", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-12-01", last_updated: "2026-02-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "deepseek/deepseek-reasoner": { id: "deepseek/deepseek-reasoner", name: "DeepSeek Reasoner", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-09", release_date: "2025-12-01", last_updated: "2026-02-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.435, output: 0.87, cache_read: 0.028 } }, "anthropic/claude-sonnet-4.6": { id: "anthropic/claude-sonnet-4.6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-opus-4.1": { id: "anthropic/claude-opus-4.1", name: "Claude Opus 4.1 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-opus-4.5": { id: "anthropic/claude-opus-4.5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4.7": { id: "anthropic/claude-opus-4.7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-4.5": { id: "anthropic/claude-sonnet-4.5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-sonnet-4": { id: "anthropic/claude-sonnet-4", name: "Claude Sonnet 4 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-haiku-4.5": { id: "anthropic/claude-haiku-4.5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "anthropic/claude-opus-4": { id: "anthropic/claude-opus-4", name: "Claude Opus 4 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-opus-4.6": { id: "anthropic/claude-opus-4.6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "z-ai/glm-5": { id: "z-ai/glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.2, cache_write: 0 } }, "z-ai/glm-4.5-air": { id: "z-ai/glm-4.5-air", name: "GLM-4.5-Air", description: "Lighter GLM-4.5 variant for fast coding assistance and cheaper agents", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.2, output: 1.1, cache_read: 0.03, cache_write: 0 } }, "z-ai/glm-5.1": { id: "z-ai/glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26, cache_write: 0 } }, "z-ai/glm-4.6": { id: "z-ai/glm-4.6", name: "GLM-4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "z-ai/glm-4.5": { id: "z-ai/glm-4.5", name: "GLM-4.5", description: "Hybrid-reasoning GLM release that made the 4.5 line broadly useful", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "z-ai/glm-4.7": { id: "z-ai/glm-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "openai/gpt-5.1-codex-mini": { id: "openai/gpt-5.1-codex-mini", name: "GPT-5.1 Codex mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/gpt-5.2-pro": { id: "openai/gpt-5.2-pro", name: "GPT-5.2 Pro", description: "Higher-accuracy GPT-5.2 variant for tougher reasoning and review workflows", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 21, output: 168 } }, "openai/gpt-5.5-pro": { id: "openai/gpt-5.5-pro", name: "GPT-5.5 Pro", description: "Highest-accuracy GPT-5.5 tier for slower, precision-heavy reasoning and coding", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "openai/gpt-4.1-mini": { id: "openai/gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "openai/gpt-4o": { id: "openai/gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.4-pro": { id: "openai/gpt-5.4-pro", name: "GPT-5.4 Pro", description: "More exact GPT-5.4 tier for demanding professional reasoning and agent tasks", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 60, output: 270, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "openai/gpt-4.1-nano": { id: "openai/gpt-4.1-nano", name: "GPT-4.1 nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "openai/gpt-5.2-chat-latest": { id: "openai/gpt-5.2-chat-latest", name: "GPT-5.2 Chat", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 12.5, output: 75, cache_read: 1.25 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "openai/gpt-4o-mini": { id: "openai/gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-5-codex": { id: "openai/gpt-5-codex", name: "GPT-5-Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-3.5-turbo": { id: "openai/gpt-3.5-turbo", name: "GPT-3.5-turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2021-09-01", release_date: "2023-03-01", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16385, output: 4096 }, cost: { input: 0.5, output: 1.5, cache_read: 0 } }, "openai/gpt-4o-2024-05-13": { id: "openai/gpt-4o-2024-05-13", name: "GPT-4o (2024-05-13)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-05-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 5, output: 15 } }, "openai/gpt-5-chat-latest": { id: "openai/gpt-5-chat-latest", name: "GPT-5 Chat (latest)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4o-2024-11-20": { id: "openai/gpt-4o-2024-11-20", name: "GPT-4o (2024-11-20)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-11-20", last_updated: "2024-11-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 5, output: 30, cache_read: 0.5 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 5, output: 22.5, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "openai/gpt-5.3-chat-latest": { id: "openai/gpt-5.3-chat-latest", name: "GPT-5.3 Chat (latest)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.2-codex": { id: "openai/gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Code-specialist GPT for repository edits, reviews, and long-running software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "openai/gpt-5-pro": { id: "openai/gpt-5-pro", name: "GPT-5 Pro", description: "Higher-accuracy GPT-5 tier for tough analysis, coding reviews, and planning", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 272000 }, cost: { input: 15, output: 120 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 1.5, output: 9, cache_read: 0.15 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.3-codex": { id: "openai/gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4-turbo": { id: "openai/gpt-4-turbo", name: "GPT-4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-12", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 10, output: 30 } }, "openai/gpt-4o-2024-08-06": { id: "openai/gpt-4o-2024-08-06", name: "GPT-4o (2024-08-06)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-08-06", last_updated: "2024-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.1-codex": { id: "openai/gpt-5.1-codex", name: "GPT-5.1 Codex", description: "Codex GPT for repository edits, code review, and practical software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-5-nano": { id: "openai/gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "openai/gpt-4.1": { id: "openai/gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/gpt-5.1-codex-max": { id: "openai/gpt-5.1-codex-max", name: "GPT-5.1 Codex Max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4": { id: "openai/gpt-4", name: "GPT-4", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-11", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 8192 }, cost: { input: 30, output: 60 } }, "openai/gpt-5.1-chat-latest": { id: "openai/gpt-5.1-chat-latest", name: "GPT-5.1 Chat", description: "Chat-tuned GPT-5.1 for polished assistants, writing, and product conversations", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "kimi/kimi-k2.5": { id: "kimi/kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "kimi/kimi-k2.6": { id: "kimi/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } } } }, "xiaomi-token-plan-cn": { id: "xiaomi-token-plan-cn", env: ["XIAOMI_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://token-plan-cn.xiaomimimo.com/v1", name: "Xiaomi Token Plan (China)", doc: "https://platform.xiaomimimo.com/#/docs", models: { "mimo-v2.5-tts": { id: "mimo-v2.5-tts", name: "MiMo-V2.5-TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "mimo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } }, "mimo-v2-tts": { id: "mimo-v2-tts", name: "MiMo-V2-TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "mimo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } }, "mimo-v2-pro": { id: "mimo-v2-pro", name: "MiMo-V2-Pro", description: "Earlier MiMo Pro model for multimodal agents, reasoning, and code tasks", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "mimo-v2.5-tts-voicedesign": { id: "mimo-v2.5-tts-voicedesign", name: "MiMo-V2.5-TTS-VoiceDesign", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "mimo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } }, "mimo-v2.5": { id: "mimo-v2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0 } }, "mimo-v2.5-tts-voiceclone": { id: "mimo-v2.5-tts-voiceclone", name: "MiMo-V2.5-TTS-VoiceClone", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "mimo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } }, "mimo-v2.5-pro": { id: "mimo-v2.5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0 } } } }, v0: { id: "v0", env: ["V0_API_KEY"], npm: "@ai-sdk/vercel", name: "v0", doc: "https://sdk.vercel.ai/providers/ai-sdk-providers/vercel", models: { "v0-1.0-md": { id: "v0-1.0-md", name: "v0-1.0-md", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "v0", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 }, cost: { input: 3, output: 15 } }, "v0-1.5-lg": { id: "v0-1.5-lg", name: "v0-1.5-lg", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "v0", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-06-09", last_updated: "2025-06-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 512000, output: 32000 }, cost: { input: 15, output: 75 } }, "v0-1.5-md": { id: "v0-1.5-md", name: "v0-1.5-md", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "v0", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-06-09", last_updated: "2025-06-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 }, cost: { input: 3, output: 15 } } } }, poolside: { id: "poolside", env: ["POOLSIDE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://inference.poolside.ai/v1", name: "Poolside", doc: "https://platform.poolside.ai", models: { "poolside/laguna-xs-2.1": { id: "poolside/laguna-xs-2.1", name: "Laguna XS 2.1", description: "Agentic coding model from Poolside in the XS size class for local deployment", family: "laguna", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, release_date: "2026-07-02", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "poolside/laguna-s-2.1": { id: "poolside/laguna-s-2.1", name: "Laguna S 2.1", description: "Agentic coding model from Poolside in the XS size class for local deployment", family: "laguna", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "poolside/laguna-m.1": { id: "poolside/laguna-m.1", name: "Laguna M.1", description: "Poolside's open-weight model for agentic coding and long-horizon work", family: "laguna", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, release_date: "2026-04-28", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, "routing-run": { id: "routing-run", env: ["ROUTING_RUN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.routing.run/v1", name: "routing.run", doc: "https://docs.routing.run/api-reference/models", models: { "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15 } }, "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 64000 }, cost: { input: 0.112, output: 0.224 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32000 }, cost: { input: 5, output: 25 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 32000 }, cost: { input: 0.8, output: 2.4 } }, "qwen3.5-9b": { id: "qwen3.5-9b", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32000 }, cost: { input: 0.16, output: 0.48 } }, "nemotron-3-ultra": { id: "nemotron-3-ultra", name: "Nemotron 3 Ultra 550B A55B", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32000 }, cost: { input: 0.1, output: 0.1 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 32000 }, cost: { input: 0.275, output: 1.1 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 64000 }, cost: { input: 0.348, output: 0.696 } }, "glm-5.2-nitro": { id: "glm-5.2-nitro", name: "GLM 5.2 Nitro", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 32000 }, cost: { input: 0.8, output: 2.4 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 922000, output: 128000 }, cost: { input: 0.7, output: 4.2 } }, "kimi-k2.6-nitro": { id: "kimi-k2.6-nitro", name: "Kimi K2.6 Nitro", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 32000 }, cost: { input: 0.275, output: 1.1 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 32000 }, cost: { input: 0.275, output: 1.1 } }, "kimi-k2.7-code-nitro": { id: "kimi-k2.7-code-nitro", name: "Kimi K2.7 Code Nitro", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 32000 }, cost: { input: 0.275, output: 1.1 } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 922000, output: 128000 }, cost: { input: 1.5, output: 9 } } } }, "google-vertex": { id: "google-vertex", env: ["GOOGLE_VERTEX_PROJECT", "GOOGLE_VERTEX_LOCATION", "GOOGLE_APPLICATION_CREDENTIALS"], npm: "@ai-sdk/google-vertex", name: "Vertex", doc: "https://cloud.google.com/vertex-ai/generative-ai/docs/models", models: { "gemini-flash-latest": { id: "gemini-flash-latest", name: "Gemini Flash Latest", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, input_audio: 1.5 } }, "claude-sonnet-4-5@20250929": { id: "claude-sonnet-4-5@20250929", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/google-vertex/anthropic" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gemini-3.5-flash": { id: "gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, input_audio: 1.5 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.075, cache_write: 0.383 } }, "gemini-3.5-flash-lite": { id: "gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "gemini-2.5-pro-tts": { id: "gemini-2.5-pro-tts", name: "Gemini 2.5 Pro TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gemini-pro", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2025-01", release_date: "2025-09-30", last_updated: "2025-12-10", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 32768, output: 16384 }, cost: { input: 1, output: 20 } }, "claude-sonnet-5@default": { id: "claude-sonnet-5@default", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/google-vertex/anthropic" }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "gemini-3.1-flash-lite-preview": { id: "gemini-3.1-flash-lite-preview", name: "Gemini 3.1 Flash Lite Preview", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, status: "deprecated", cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "gemini-2.5-flash-tts": { id: "gemini-2.5-flash-tts", name: "Gemini 2.5 Flash TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gemini-flash", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2025-01", release_date: "2025-09-30", last_updated: "2025-12-10", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 32768, output: 16384 }, cost: { input: 0.5, output: 10 } }, "claude-opus-5@default": { id: "claude-opus-5@default", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/google-vertex/anthropic" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gemini-3-flash-preview": { id: "gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, input_audio: 1 } }, "gemini-3.1-pro-preview-customtools": { id: "gemini-3.1-pro-preview-customtools", name: "Gemini 3.1 Pro Preview Custom Tools", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "claude-haiku-4-5@20251001": { id: "claude-haiku-4-5@20251001", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/google-vertex/anthropic" }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "claude-opus-4-7@default": { id: "claude-opus-4-7@default", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/google-vertex/anthropic" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "claude-opus-4@20250514": { id: "claude-opus-4@20250514", name: "Claude Opus 4", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, status: "deprecated", provider: { npm: "@ai-sdk/google-vertex/anthropic" }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "claude-opus-4-8@default": { id: "claude-opus-4-8@default", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/google-vertex/anthropic" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "gemini-embedding-001": { id: "gemini-embedding-001", name: "Gemini Embedding 001", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "gemini", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2025-05", release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 2048, output: 1 }, cost: { input: 0.15, output: 0 } }, "gemini-3.6-flash": { id: "gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15, input_audio: 1.5 } }, "claude-opus-4-5@20251101": { id: "claude-opus-4-5@20251101", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-01", last_updated: "2025-11-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, provider: { npm: "@ai-sdk/google-vertex/anthropic" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gemini-3.1-flash-lite": { id: "gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "gemini-3.1-flash-image": { id: "gemini-3.1-flash-image", name: "Nano Banana 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "high"] }], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "video", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.5, output: 60 } }, "gemini-2.5-flash-image": { id: "gemini-2.5-flash-image", name: "Nano Banana", description: "Nano Banana image model for fast generation, edits, and character-consistent assets", family: "gemini-flash", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-06", release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.3, output: 30 } }, "claude-opus-4-6@default": { id: "claude-opus-4-6@default", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/google-vertex/anthropic" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "gemini-3-pro-image": { id: "gemini-3-pro-image", name: "Nano Banana Pro", description: "Nano Banana Pro for higher-fidelity image generation and design-heavy edits", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 32768 }, cost: { input: 2, output: 120 } }, "gemini-3.1-pro-preview": { id: "gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "gemini-flash-lite-latest": { id: "gemini-flash-lite-latest", name: "Gemini Flash-Lite Latest", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "claude-sonnet-4@20250514": { id: "claude-sonnet-4@20250514", name: "Claude Sonnet 4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, status: "deprecated", provider: { npm: "@ai-sdk/google-vertex/anthropic" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "gemini-2.5-flash-lite": { id: "gemini-2.5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 512, max: 24576 }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01, input_audio: 0.3 } }, "claude-sonnet-4-6@default": { id: "claude-sonnet-4-6@default", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/google-vertex/anthropic" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "claude-opus-4-1@20250805": { id: "claude-opus-4-1@20250805", name: "Claude Opus 4.1", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, status: "deprecated", provider: { npm: "@ai-sdk/google-vertex/anthropic" }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "zai-org/glm-5-maas": { id: "zai-org/glm-5-maas", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, status: "deprecated", provider: { npm: "@ai-sdk/openai-compatible", api: "https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}/endpoints/openapi" }, cost: { input: 1, output: 3.2, cache_read: 0.1 } }, "zai-org/glm-4.7-maas": { id: "zai-org/glm-4.7-maas", name: "GLM-4.7", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-06", last_updated: "2026-01-06", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, status: "deprecated", provider: { npm: "@ai-sdk/openai-compatible", api: "https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}/endpoints/openapi" }, cost: { input: 0.6, output: 2.2 } }, "qwen/qwen3-235b-a22b-instruct-2507-maas": { id: "qwen/qwen3-235b-a22b-instruct-2507-maas", name: "Qwen3 235B A22B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-13", last_updated: "2025-08-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, status: "deprecated", provider: { npm: "@ai-sdk/openai-compatible", api: "https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}/endpoints/openapi" }, cost: { input: 0.22, output: 0.88 } }, "meta/llama-4-maverick-17b-128e-instruct-maas": { id: "meta/llama-4-maverick-17b-128e-instruct-maas", name: "Llama 4 Maverick 17B 128E Instruct", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-29", last_updated: "2025-04-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 8192 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}/endpoints/openapi" }, cost: { input: 0.35, output: 1.15 } }, "meta/llama-3.3-70b-instruct-maas": { id: "meta/llama-3.3-70b-instruct-maas", name: "Llama 3.3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2025-04-29", last_updated: "2025-04-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, status: "deprecated", provider: { npm: "@ai-sdk/openai-compatible", api: "https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}/endpoints/openapi" }, cost: { input: 0.72, output: 0.72 } }, "deepseek-ai/deepseek-v3.1-maas": { id: "deepseek-ai/deepseek-v3.1-maas", name: "DeepSeek V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-28", last_updated: "2025-08-28", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 32768 }, status: "deprecated", provider: { npm: "@ai-sdk/openai-compatible", api: "https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}/endpoints/openapi" }, cost: { input: 0.6, output: 1.7 } }, "deepseek-ai/deepseek-v3.2-maas": { id: "deepseek-ai/deepseek-v3.2-maas", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-17", last_updated: "2026-04-04", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 65536 }, status: "deprecated", provider: { npm: "@ai-sdk/openai-compatible", api: "https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}/endpoints/openapi" }, cost: { input: 0.56, output: 1.68, cache_read: 0.056 } }, "moonshotai/kimi-k2-thinking-maas": { id: "moonshotai/kimi-k2-thinking-maas", name: "Kimi K2 Thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-08", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", provider: { npm: "@ai-sdk/openai-compatible", api: "https://${GOOGLE_VERTEX_ENDPOINT}/v1/projects/${GOOGLE_VERTEX_PROJECT}/locations/${GOOGLE_VERTEX_LOCATION}/endpoints/openapi" }, cost: { input: 0.6, output: 2.5 } }, "openai/gpt-oss-20b-maas": { id: "openai/gpt-oss-20b-maas", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, status: "deprecated", cost: { input: 0.07, output: 0.25 } }, "openai/gpt-oss-120b-maas": { id: "openai/gpt-oss-120b-maas", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.09, output: 0.36 } } } }, "tencent-token-plan": { id: "tencent-token-plan", env: ["TENCENT_TOKEN_PLAN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.lkeap.cloud.tencent.com/plan/v3", name: "Tencent Token Plan", doc: "https://cloud.tencent.com/document/product/1823/130060", models: { hy3: { id: "hy3", name: "Hy3", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, synthetic: { id: "synthetic", env: ["SYNTHETIC_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.synthetic.new/openai/v1", name: "Synthetic", doc: "https://synthetic.new/pricing", models: { "hf:Qwen/Qwen3.6-27B": { id: "hf:Qwen/Qwen3.6-27B", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.45, output: 3.6, cache_read: 0.45 } }, "hf:nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4": { id: "hf:nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4", name: "Nemotron 3 Super 120B A12B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.3, output: 1, cache_read: 0.3 } }, "hf:moonshotai/Kimi-K2.7-Code": { id: "hf:moonshotai/Kimi-K2.7-Code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.95, output: 4, cache_read: 0.95 } }, "hf:moonshotai/Kimi-K3": { id: "hf:moonshotai/Kimi-K3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-07-16", last_updated: "2026-07-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 65536 }, cost: { input: 3, output: 15, cache_read: 0.45 } }, "hf:openai/gpt-oss-120b": { id: "hf:openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.1, output: 0.1, cache_read: 0.1 } }, "hf:zai-org/GLM-4.7-Flash": { id: "hf:zai-org/GLM-4.7-Flash", name: "GLM-4.7-Flash", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 65536 }, cost: { input: 0.1, output: 0.5, cache_read: 0.1 } }, "hf:zai-org/GLM-5.2": { id: "hf:zai-org/GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 524288, input: 365178, output: 65536 }, cost: { input: 1.4, output: 4.4, cache_read: 1.4 } }, "hf:MiniMaxAI/MiniMax-M3": { id: "hf:MiniMaxAI/MiniMax-M3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 65536 }, cost: { input: 0.6, output: 1.2, cache_read: 0.6 } } } }, "zai-coding-plan": { id: "zai-coding-plan", env: ["ZHIPU_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.z.ai/api/coding/paas/v4", name: "Z.AI Coding Plan", doc: "https://docs.z.ai/devpack/overview", models: { "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5.2-highspeed": { id: "glm-5.2-highspeed", name: "GLM-5.2 Highspeed", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-4.7": { id: "glm-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5-turbo": { id: "glm-5-turbo", name: "GLM-5-Turbo", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, gmicloud: { id: "gmicloud", env: ["GMICLOUD_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.gmi-serving.com/v1", name: "GMI Cloud", doc: "https://docs.gmicloud.ai/inference-engine/api-reference/llm-api-reference", models: { "zai-org/GLM-5.1-FP8": { id: "zai-org/GLM-5.1-FP8", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 0.98, output: 3.08, cache_read: 0.182 } }, "zai-org/GLM-5-FP8": { id: "zai-org/GLM-5-FP8", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 0.6, output: 1.92, cache_read: 0.12 } }, "zai-org/GLM-5.2-FP8": { id: "zai-org/GLM-5.2-FP8", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0.979, output: 3.08, cache_read: 0.182 } }, "Qwen/Qwen3.7-Max": { id: "Qwen/Qwen3.7-Max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 0.25, cache_write: 3.125 } }, "deepseek-ai/DeepSeek-V4-Flash": { id: "deepseek-ai/DeepSeek-V4-Flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048575, output: 384000 }, cost: { input: 0.112, output: 0.224, cache_read: 0.022 } }, "deepseek-ai/DeepSeek-V4-Pro": { id: "deepseek-ai/DeepSeek-V4-Pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 1.392, output: 2.784, cache_read: 0.116 } }, "anthropic/claude-sonnet-4.6": { id: "anthropic/claude-sonnet-4.6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 409600, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "anthropic/claude-opus-4.7": { id: "anthropic/claude-opus-4.7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 409600, output: 128000 }, experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 4.5, output: 22.5, cache_read: 0.45 } }, "anthropic/claude-opus-4.8": { id: "anthropic/claude-opus-4.8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "anthropic/claude-opus-4.6": { id: "anthropic/claude-opus-4.6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 127999 }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 409600, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "moonshotai/kimi-k2.7-code-highspeed": { id: "moonshotai/kimi-k2.7-code-highspeed", name: "Kimi K2.7 Code Highspeed", description: "Lower-latency Kimi Code variant for interactive edits and coding-agent loops", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.9, output: 8, cache_read: 0.38 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 0.855, output: 3.6, cache_read: 0.144 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } } } }, freemodel: { id: "freemodel", env: ["FREEMODEL_API_KEY"], npm: "@ai-sdk/anthropic", api: "https://cc.freemodel.dev/v1", name: "FreeModel", doc: "https://freemodel.dev", models: { "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://api.freemodel.dev/v1" }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 5 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://api.freemodel.dev/v1" }, cost: { input: 2.5, output: 15, cache_read: 0.25, cache_write: 2.5 } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://api.freemodel.dev/v1" }, cost: { input: 0.75, output: 4.5, cache_read: 0.075, cache_write: 0.75 } }, "gpt-5.3-codex": { id: "gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "@ai-sdk/openai-compatible", api: "https://api.freemodel.dev/v1" }, cost: { input: 1.75, output: 14, cache_read: 0.175, cache_write: 1.75 } }, "claude-haiku-4-5-20251001": { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } } } }, "amazon-bedrock": { id: "amazon-bedrock", env: ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_REGION", "AWS_BEARER_TOKEN_BEDROCK"], npm: "@ai-sdk/amazon-bedrock", name: "Amazon Bedrock", doc: "https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html", models: { "zai.glm-4.7-flash": { id: "zai.glm-4.7-flash", name: "GLM-4.7-Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0.07, output: 0.4 } }, "us.deepseek.r1-v1:0": { id: "us.deepseek.r1-v1:0", name: "DeepSeek-R1 (US)", description: "Classic open reasoning model for transparent math, coding, and deliberate problem solving", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 1.35, output: 5.4 } }, "qwen.qwen3-next-80b-a3b": { id: "qwen.qwen3-next-80b-a3b", name: "Qwen/Qwen3-Next-80B-A3B-Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-18", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.14, output: 1.4 } }, "global.anthropic.claude-opus-4-8": { id: "global.anthropic.claude-opus-4-8", name: "Claude Opus 4.8 (Global)", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "nvidia.nemotron-super-3-120b": { id: "nvidia.nemotron-super-3-120b", name: "NVIDIA Nemotron 3 Super 120B A12B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.15, output: 0.65 } }, "eu.anthropic.claude-opus-4-5-20251101-v1:0": { id: "eu.anthropic.claude-opus-4-5-20251101-v1:0", name: "Claude Opus 4.5 (EU)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-24", last_updated: "2025-08-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5.5, output: 27.5, cache_read: 0.55, cache_write: 6.875 } }, "mistral.mistral-large-3-675b-instruct": { id: "mistral.mistral-large-3-675b-instruct", name: "Mistral Large 3", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8192 }, cost: { input: 0.5, output: 1.5 } }, "moonshot.kimi-k2-thinking": { id: "moonshot.kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: true, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262143, output: 16000 }, cost: { input: 0.6, output: 2.5 } }, "mistral.devstral-2-123b": { id: "mistral.devstral-2-123b", name: "Devstral 2 123B", description: "Mistral coding agent model for repository tasks and software engineering workflows", family: "devstral", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-17", last_updated: "2026-02-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8192 }, cost: { input: 0.4, output: 2 } }, "minimax.minimax-m2": { id: "minimax.minimax-m2", name: "MiniMax M2", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204608, output: 128000 }, cost: { input: 0.3, output: 1.2 } }, "jp.anthropic.claude-opus-4-8": { id: "jp.anthropic.claude-opus-4-8", name: "Claude Opus 4.8 (JP)", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "mistral.voxtral-small-24b-2507": { id: "mistral.voxtral-small-24b-2507", name: "Voxtral Small 24B 2507", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-01", last_updated: "2025-07-01", modalities: { input: ["text", "audio"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 8192 }, cost: { input: 0.15, output: 0.35 } }, "openai.gpt-5.6-sol": { id: "openai.gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 272000, output: 128000 }, provider: { npm: "@ai-sdk/amazon-bedrock/mantle", api: "https://bedrock-mantle.${AWS_REGION}.api.aws/openai/v1", shape: "responses" }, cost: { input: 5.5, output: 33, cache_read: 0.55, cache_write: 6.88 } }, "au.anthropic.claude-haiku-4-5-20251001-v1:0": { id: "au.anthropic.claude-haiku-4-5-20251001-v1:0", name: "Claude Haiku 4.5 (AU)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "mistral.magistral-small-2509": { id: "mistral.magistral-small-2509", name: "Magistral Small 1.2", description: "Mistral reasoning model for transparent analysis, math, and complex decisions", family: "magistral", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 40000 }, cost: { input: 0.5, output: 1.5 } }, "eu.anthropic.claude-haiku-4-5-20251001-v1:0": { id: "eu.anthropic.claude-haiku-4-5-20251001-v1:0", name: "Claude Haiku 4.5 (EU)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1.1, output: 5.5, cache_read: 0.11, cache_write: 1.375 } }, "anthropic.claude-opus-4-6-v1": { id: "anthropic.claude-opus-4-6-v1", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic.claude-fable-5": { id: "anthropic.claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "us.anthropic.claude-sonnet-5": { id: "us.anthropic.claude-sonnet-5", name: "Claude Sonnet 5 (US)", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "meta.llama3-3-70b-instruct-v1:0": { id: "meta.llama3-3-70b-instruct-v1:0", name: "Llama 3.3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.72, output: 0.72 } }, "mistral.ministral-3-8b-instruct": { id: "mistral.ministral-3-8b-instruct", name: "Ministral 3 8B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 0.15, output: 0.15 } }, "au.anthropic.claude-sonnet-4-5-20250929-v1:0": { id: "au.anthropic.claude-sonnet-4-5-20250929-v1:0", name: "Claude Sonnet 4.5 (AU)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "openai.gpt-5.6-terra": { id: "openai.gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 272000, output: 128000 }, provider: { npm: "@ai-sdk/amazon-bedrock/mantle", api: "https://bedrock-mantle.${AWS_REGION}.api.aws/openai/v1", shape: "responses" }, cost: { input: 2.2, output: 13.2, cache_read: 0.22, cache_write: 2.75 } }, "openai.gpt-oss-20b": { id: "openai.gpt-oss-20b", name: "gpt-oss-20b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, provider: { npm: "@ai-sdk/amazon-bedrock/mantle", api: "https://bedrock-mantle.${AWS_REGION}.api.aws/v1", shape: "responses" }, cost: { input: 0.07, output: 0.3 } }, "writer.palmyra-x4-v1:0": { id: "writer.palmyra-x4-v1:0", name: "Palmyra X4", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "palmyra", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-04-28", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 122880, output: 8192 }, cost: { input: 2.5, output: 10 } }, "zai.glm-4.7": { id: "zai.glm-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2 } }, "anthropic.claude-sonnet-5": { id: "anthropic.claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "us.anthropic.claude-sonnet-4-6": { id: "us.anthropic.claude-sonnet-4-6", name: "Claude Sonnet 4.6 (US)", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "au.anthropic.claude-sonnet-4-6": { id: "au.anthropic.claude-sonnet-4-6", name: "AU Anthropic Claude Sonnet 4.6", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08", release_date: "2026-02-17", last_updated: "2026-02-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3.3, output: 16.5, cache_read: 0.33, cache_write: 4.125 } }, "openai.gpt-oss-safeguard-120b": { id: "openai.gpt-oss-safeguard-120b", name: "GPT OSS Safeguard 120B", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "gpt-oss", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-29", last_updated: "2025-10-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6 } }, "global.anthropic.claude-sonnet-5": { id: "global.anthropic.claude-sonnet-5", name: "Claude Sonnet 5 (Global)", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "meta.llama3-1-8b-instruct-v1:0": { id: "meta.llama3-1-8b-instruct-v1:0", name: "Llama 3.1 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.22, output: 0.22 } }, "jp.anthropic.claude-sonnet-5": { id: "jp.anthropic.claude-sonnet-5", name: "Claude Sonnet 5 (JP)", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "nvidia.nemotron-nano-12b-v2": { id: "nvidia.nemotron-nano-12b-v2", name: "NVIDIA Nemotron Nano 12B v2 VL BF16", description: "Nemotron multimodal model for visual reasoning and agentic AI workflows", family: "nemotron", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 0.2, output: 0.6 } }, "us.anthropic.claude-opus-4-6-v1": { id: "us.anthropic.claude-opus-4-6-v1", name: "Claude Opus 4.6 (US)", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "eu.anthropic.claude-opus-4-8": { id: "eu.anthropic.claude-opus-4-8", name: "Claude Opus 4.8 (EU)", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5.5, output: 27.5, cache_read: 0.55, cache_write: 6.875 } }, "openai.gpt-5.6-luna": { id: "openai.gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 272000, output: 128000 }, provider: { npm: "@ai-sdk/amazon-bedrock/mantle", api: "https://bedrock-mantle.${AWS_REGION}.api.aws/openai/v1", shape: "responses" }, cost: { input: 0.22, output: 1.32, cache_read: 0.022, cache_write: 0.275 } }, "nvidia.nemotron-nano-9b-v2": { id: "nvidia.nemotron-nano-9b-v2", name: "NVIDIA Nemotron Nano 9B v2", description: "Compact Nemotron model for efficient reasoning and deployable AI agents", family: "nemotron", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 0.06, output: 0.23 } }, "meta.llama3-1-70b-instruct-v1:0": { id: "meta.llama3-1-70b-instruct-v1:0", name: "Llama 3.1 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.72, output: 0.72 } }, "jp.anthropic.claude-sonnet-4-6": { id: "jp.anthropic.claude-sonnet-4-6", name: "Claude Sonnet 4.6 (JP)", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "us.meta.llama4-scout-17b-instruct-v1:0": { id: "us.meta.llama4-scout-17b-instruct-v1:0", name: "Llama 4 Scout 17B Instruct (US)", description: "Open Llama with long-context vision for efficient multimodal agents", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 3500000, output: 16384 }, cost: { input: 0.17, output: 0.66 } }, "anthropic.claude-sonnet-4-5-20250929-v1:0": { id: "anthropic.claude-sonnet-4-5-20250929-v1:0", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "jp.anthropic.claude-opus-5": { id: "jp.anthropic.claude-opus-5", name: "Claude Opus 5 (JP)", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "global.anthropic.claude-haiku-4-5-20251001-v1:0": { id: "global.anthropic.claude-haiku-4-5-20251001-v1:0", name: "Claude Haiku 4.5 (Global)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "jp.anthropic.claude-sonnet-4-5-20250929-v1:0": { id: "jp.anthropic.claude-sonnet-4-5-20250929-v1:0", name: "Claude Sonnet 4.5 (JP)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "openai.gpt-oss-120b-1:0": { id: "openai.gpt-oss-120b-1:0", name: "gpt-oss-120b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6 } }, "us.anthropic.claude-sonnet-4-5-20250929-v1:0": { id: "us.anthropic.claude-sonnet-4-5-20250929-v1:0", name: "Claude Sonnet 4.5 (US)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "mistral.voxtral-mini-3b-2507": { id: "mistral.voxtral-mini-3b-2507", name: "Voxtral Mini 3B 2507", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["audio", "text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 0.04, output: 0.04 } }, "openai.gpt-oss-20b-1:0": { id: "openai.gpt-oss-20b-1:0", name: "gpt-oss-20b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.07, output: 0.3 } }, "eu.anthropic.claude-opus-4-6-v1": { id: "eu.anthropic.claude-opus-4-6-v1", name: "Claude Opus 4.6 (EU)", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5.5, output: 27.5, cache_read: 0.55, cache_write: 6.875 } }, "us.meta.llama4-maverick-17b-instruct-v1:0": { id: "us.meta.llama4-maverick-17b-instruct-v1:0", name: "Llama 4 Maverick 17B Instruct (US)", description: "Open multimodal Llama for strong reasoning with efficient everyday serving", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 16384 }, cost: { input: 0.24, output: 0.97 } }, "us.anthropic.claude-haiku-4-5-20251001-v1:0": { id: "us.anthropic.claude-haiku-4-5-20251001-v1:0", name: "Claude Haiku 4.5 (US)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "global.anthropic.claude-fable-5": { id: "global.anthropic.claude-fable-5", name: "Claude Fable 5 (Global)", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "meta.llama4-scout-17b-instruct-v1:0": { id: "meta.llama4-scout-17b-instruct-v1:0", name: "Llama 4 Scout 17B Instruct", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 3500000, output: 16384 }, cost: { input: 0.17, output: 0.66 } }, "jp.anthropic.claude-haiku-4-5-20251001-v1:0": { id: "jp.anthropic.claude-haiku-4-5-20251001-v1:0", name: "Claude Haiku 4.5 (JP)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "qwen.qwen3-32b-v1:0": { id: "qwen.qwen3-32b-v1:0", name: "Qwen3 32B (dense)", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-09-18", last_updated: "2025-09-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, output: 16384 }, cost: { input: 0.15, output: 0.6 } }, "global.anthropic.claude-sonnet-4-5-20250929-v1:0": { id: "global.anthropic.claude-sonnet-4-5-20250929-v1:0", name: "Claude Sonnet 4.5 (Global)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "google.gemma-3-4b-it": { id: "google.gemma-3-4b-it", name: "Gemma 3 4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 0.04, output: 0.08 } }, "qwen.qwen3-coder-30b-a3b-v1:0": { id: "qwen.qwen3-coder-30b-a3b-v1:0", name: "Qwen3 Coder 30B A3B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-09-18", last_updated: "2025-09-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 131072 }, cost: { input: 0.15, output: 0.6 } }, "amazon.nova-pro-v1:0": { id: "amazon.nova-pro-v1:0", name: "Nova Pro", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "nova-pro", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-03", last_updated: "2024-12-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 8192 }, cost: { input: 0.8, output: 3.2, cache_read: 0.2 } }, "us.anthropic.claude-opus-4-7": { id: "us.anthropic.claude-opus-4-7", name: "Claude Opus 4.7 (US)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "moonshotai.kimi-k2.5": { id: "moonshotai.kimi-k2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: true, structured_output: true, temperature: true, release_date: "2026-02-06", last_updated: "2026-02-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262143, output: 16000 }, cost: { input: 0.6, output: 3 } }, "zai.glm-5": { id: "zai.glm-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 101376 }, cost: { input: 1, output: 3.2 } }, "amazon.nova-micro-v1:0": { id: "amazon.nova-micro-v1:0", name: "Nova Micro", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova-micro", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-03", last_updated: "2024-12-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.035, output: 0.14, cache_read: 0.00875 } }, "deepseek.r1-v1:0": { id: "deepseek.r1-v1:0", name: "DeepSeek-R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32768 }, cost: { input: 1.35, output: 5.4 } }, "au.anthropic.claude-sonnet-5": { id: "au.anthropic.claude-sonnet-5", name: "Claude Sonnet 5 (AU)", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "deepseek.v3.2": { id: "deepseek.v3.2", name: "DeepSeek-V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2026-02-06", last_updated: "2026-02-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 81920 }, cost: { input: 0.62, output: 1.85 } }, "qwen.qwen3-coder-480b-a35b-v1:0": { id: "qwen.qwen3-coder-480b-a35b-v1:0", name: "Qwen3 Coder 480B A35B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-09-18", last_updated: "2025-09-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0.22, output: 1.8 } }, "au.anthropic.claude-opus-4-8": { id: "au.anthropic.claude-opus-4-8", name: "Claude Opus 4.8 (AU)", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic.claude-sonnet-4-6": { id: "anthropic.claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic.claude-haiku-4-5-20251001-v1:0": { id: "anthropic.claude-haiku-4-5-20251001-v1:0", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "openai.gpt-5.4": { id: "openai.gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-06-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 272000, output: 128000 }, provider: { npm: "@ai-sdk/amazon-bedrock/mantle", api: "https://bedrock-mantle.${AWS_REGION}.api.aws/openai/v1", shape: "responses" }, cost: { input: 2.75, output: 16.5, cache_read: 0.275 } }, "global.anthropic.claude-sonnet-4-6": { id: "global.anthropic.claude-sonnet-4-6", name: "Claude Sonnet 4.6 (Global)", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "eu.anthropic.claude-opus-4-7": { id: "eu.anthropic.claude-opus-4-7", name: "Claude Opus 4.7 (EU)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5.5, output: 27.5, cache_read: 0.55, cache_write: 6.875 } }, "eu.anthropic.claude-sonnet-4-5-20250929-v1:0": { id: "eu.anthropic.claude-sonnet-4-5-20250929-v1:0", name: "Claude Sonnet 4.5 (EU)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3.3, output: 16.5, cache_read: 0.33, cache_write: 4.125 } }, "mistral.ministral-3-14b-instruct": { id: "mistral.ministral-3-14b-instruct", name: "Ministral 14B 3.0", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 0.2, output: 0.2 } }, "us.anthropic.claude-opus-5": { id: "us.anthropic.claude-opus-5", name: "Claude Opus 5 (US)", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic.claude-opus-4-5-20251101-v1:0": { id: "anthropic.claude-opus-4-5-20251101-v1:0", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-24", last_updated: "2025-08-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "global.anthropic.claude-opus-4-6-v1": { id: "global.anthropic.claude-opus-4-6-v1", name: "Claude Opus 4.6 (Global)", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "google.gemma-3-12b-it": { id: "google.gemma-3-12b-it", name: "Google Gemma 3 12B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.049999999999999996, output: 0.09999999999999999 } }, "eu.anthropic.claude-sonnet-5": { id: "eu.anthropic.claude-sonnet-5", name: "Claude Sonnet 5 (EU)", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2.2, output: 11, cache_read: 0.22, cache_write: 2.75 } }, "global.anthropic.claude-opus-5": { id: "global.anthropic.claude-opus-5", name: "Claude Opus 5 (Global)", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "minimax.minimax-m2.5": { id: "minimax.minimax-m2.5", name: "MiniMax M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 98304 }, cost: { input: 0.3, output: 1.2 } }, "mistral.ministral-3-3b-instruct": { id: "mistral.ministral-3-3b-instruct", name: "Ministral 3 3B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8192 }, cost: { input: 0.1, output: 0.1 } }, "anthropic.claude-opus-4-8": { id: "anthropic.claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "eu.anthropic.claude-opus-5": { id: "eu.anthropic.claude-opus-5", name: "Claude Opus 5 (EU)", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5.5, output: 27.5, cache_read: 0.55, cache_write: 6.875 } }, "global.anthropic.claude-opus-4-5-20251101-v1:0": { id: "global.anthropic.claude-opus-4-5-20251101-v1:0", name: "Claude Opus 4.5 (Global)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-24", last_updated: "2025-08-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic.claude-opus-4-7": { id: "anthropic.claude-opus-4-7", name: "Claude Opus 4.7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "google.gemma-3-27b-it": { id: "google.gemma-3-27b-it", name: "Google Gemma 3 27B Instruct", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-27", last_updated: "2025-07-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 8192 }, cost: { input: 0.12, output: 0.2 } }, "anthropic.claude-opus-5": { id: "anthropic.claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "xai.grok-4.3": { id: "xai.grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-06-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, provider: { npm: "@ai-sdk/amazon-bedrock/mantle", api: "https://bedrock-mantle.${AWS_REGION}.api.aws/openai/v1", shape: "responses" }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "us.anthropic.claude-opus-4-8": { id: "us.anthropic.claude-opus-4-8", name: "Claude Opus 4.8 (US)", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "deepseek.v3-v1:0": { id: "deepseek.v3-v1:0", name: "DeepSeek-V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-09-18", last_updated: "2025-09-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 81920 }, cost: { input: 0.58, output: 1.68 } }, "qwen.qwen3-235b-a22b-2507-v1:0": { id: "qwen.qwen3-235b-a22b-2507-v1:0", name: "Qwen3 235B A22B 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-09-18", last_updated: "2025-09-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.22, output: 0.88 } }, "us.anthropic.claude-fable-5": { id: "us.anthropic.claude-fable-5", name: "Claude Fable 5 (US)", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "us.anthropic.claude-opus-4-5-20251101-v1:0": { id: "us.anthropic.claude-opus-4-5-20251101-v1:0", name: "Claude Opus 4.5 (US)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-24", last_updated: "2025-08-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "nvidia.nemotron-nano-3-30b": { id: "nvidia.nemotron-nano-3-30b", name: "NVIDIA Nemotron Nano 3 30B", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.06, output: 0.24 } }, "global.anthropic.claude-opus-4-7": { id: "global.anthropic.claude-opus-4-7", name: "Claude Opus 4.7 (Global)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "au.anthropic.claude-opus-4-6-v1": { id: "au.anthropic.claude-opus-4-6-v1", name: "AU Anthropic Claude Opus 4.6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 16.5, output: 82.5, cache_read: 1.65, cache_write: 20.625 } }, "eu.anthropic.claude-fable-5": { id: "eu.anthropic.claude-fable-5", name: "Claude Fable 5 (EU)", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 11, output: 55, cache_read: 1.1, cache_write: 13.75 } }, "qwen.qwen3-coder-next": { id: "qwen.qwen3-coder-next", name: "Qwen3 Coder Next", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-06", last_updated: "2026-02-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0.22, output: 1.8 } }, "openai.gpt-oss-safeguard-20b": { id: "openai.gpt-oss-safeguard-20b", name: "GPT OSS Safeguard 20B", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "gpt-oss", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-29", last_updated: "2025-10-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.07, output: 0.2 } }, "qwen.qwen3-vl-235b-a22b": { id: "qwen.qwen3-vl-235b-a22b", name: "Qwen/Qwen3-VL-235B-A22B-Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-04", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.3, output: 1.5 } }, "writer.palmyra-x5-v1:0": { id: "writer.palmyra-x5-v1:0", name: "Palmyra X5", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "palmyra", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-04-28", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1040000, output: 8192 }, cost: { input: 0.6, output: 6 } }, "amazon.nova-lite-v1:0": { id: "amazon.nova-lite-v1:0", name: "Nova Lite", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova-lite", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-03", last_updated: "2024-12-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 8192 }, cost: { input: 0.06, output: 0.24, cache_read: 0.015 } }, "anthropic.claude-opus-4-1-20250805-v1:0": { id: "anthropic.claude-opus-4-1-20250805-v1:0", name: "Claude Opus 4.1", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, status: "deprecated", cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "minimax.minimax-m2.1": { id: "minimax.minimax-m2.1", name: "MiniMax M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "openai.gpt-5.5": { id: "openai.gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-06-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 272000, output: 128000 }, provider: { npm: "@ai-sdk/amazon-bedrock/mantle", api: "https://bedrock-mantle.${AWS_REGION}.api.aws/openai/v1", shape: "responses" }, cost: { input: 5.5, output: 33, cache_read: 0.55 } }, "meta.llama4-maverick-17b-instruct-v1:0": { id: "meta.llama4-maverick-17b-instruct-v1:0", name: "Llama 4 Maverick 17B Instruct", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 16384 }, cost: { input: 0.24, output: 0.97 } }, "au.anthropic.claude-opus-5": { id: "au.anthropic.claude-opus-5", name: "Claude Opus 5 (AU)", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "amazon.nova-2-lite-v1:0": { id: "amazon.nova-2-lite-v1:0", name: "Nova 2 Lite", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "nova", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 0.33, output: 2.75 } }, "us.anthropic.claude-opus-4-1-20250805-v1:0": { id: "us.anthropic.claude-opus-4-1-20250805-v1:0", name: "Claude Opus 4.1 (US)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, status: "deprecated", cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "jp.anthropic.claude-opus-4-7": { id: "jp.anthropic.claude-opus-4-7", name: "Claude Opus 4.7 (JP)", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "eu.anthropic.claude-sonnet-4-6": { id: "eu.anthropic.claude-sonnet-4-6", name: "Claude Sonnet 4.6 (EU)", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3.3, output: 16.5, cache_read: 0.33, cache_write: 4.125 } }, "mistral.pixtral-large-2502-v1:0": { id: "mistral.pixtral-large-2502-v1:0", name: "Pixtral Large (25.02)", description: "Mistral vision-language model for image understanding and multimodal chat", family: "mistral", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-04-08", last_updated: "2025-04-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 2, output: 6 } }, "openai.gpt-oss-120b": { id: "openai.gpt-oss-120b", name: "gpt-oss-120b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, provider: { npm: "@ai-sdk/amazon-bedrock/mantle", api: "https://bedrock-mantle.${AWS_REGION}.api.aws/v1", shape: "responses" }, cost: { input: 0.15, output: 0.6 } } } }, "xiaomi-token-plan-ams": { id: "xiaomi-token-plan-ams", env: ["XIAOMI_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://token-plan-ams.xiaomimimo.com/v1", name: "Xiaomi Token Plan (Europe)", doc: "https://platform.xiaomimimo.com/#/docs", models: { "mimo-v2.5-pro": { id: "mimo-v2.5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0 } }, "mimo-v2.5-tts-voiceclone": { id: "mimo-v2.5-tts-voiceclone", name: "MiMo-V2.5-TTS-VoiceClone", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "mimo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } }, "mimo-v2.5": { id: "mimo-v2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0 } }, "mimo-v2.5-tts-voicedesign": { id: "mimo-v2.5-tts-voicedesign", name: "MiMo-V2.5-TTS-VoiceDesign", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "mimo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } }, "mimo-v2-pro": { id: "mimo-v2-pro", name: "MiMo-V2-Pro", description: "Earlier MiMo Pro model for multimodal agents, reasoning, and code tasks", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "mimo-v2-tts": { id: "mimo-v2-tts", name: "MiMo-V2-TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "mimo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } }, "mimo-v2.5-tts": { id: "mimo-v2.5-tts", name: "MiMo-V2.5-TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "mimo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } } } }, minimax: { id: "minimax", env: ["MINIMAX_API_KEY"], npm: "@ai-sdk/anthropic", api: "https://api.minimax.io/anthropic/v1", name: "MiniMax (minimax.io)", doc: "https://platform.minimax.io/docs/guides/quickstart", models: { "MiniMax-M2": { id: "MiniMax-M2", name: "MiniMax-M2", description: "Efficient open MiniMax model built for coding agents and tool-heavy workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 128000 }, cost: { input: 0.3, output: 1.2 } }, "MiniMax-M2.7": { id: "MiniMax-M2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06, cache_write: 0.375 } }, "MiniMax-M2.1": { id: "MiniMax-M2.1", name: "MiniMax-M2.1", description: "Earlier MiniMax agent model for practical coding and productivity tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "MiniMax-M2.5": { id: "MiniMax-M2.5", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "MiniMax-M2.5-highspeed": { id: "MiniMax-M2.5-highspeed", name: "MiniMax-M2.5-highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-13", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.4, cache_read: 0.06, cache_write: 0.375 } }, "MiniMax-M2.7-highspeed": { id: "MiniMax-M2.7-highspeed", name: "MiniMax-M2.7-highspeed", description: "Low-latency M2.7 variant for interactive coding plans and agent loops", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.4, cache_read: 0.06, cache_write: 0.375 } }, "MiniMax-M3": { id: "MiniMax-M3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-25", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06, tiers: [{ input: 0.6, output: 2.4, cache_read: 0.12, tier: { type: "context", size: 512000 } }], context_over_200k: { input: 0.6, output: 2.4, cache_read: 0.12 } } } } }, groq: { id: "groq", env: ["GROQ_API_KEY"], npm: "@ai-sdk/groq", name: "Groq", doc: "https://console.groq.com/docs/models", models: { "llama-3.3-70b-versatile": { id: "llama-3.3-70b-versatile", name: "Llama 3.3 70B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.59, output: 0.79 } }, "llama-3.1-8b-instant": { id: "llama-3.1-8b-instant", name: "Llama 3.1 8B", description: "Compact Llama instruction model for fast chat and local deployment", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.05, output: 0.08 } }, "whisper-large-v3": { id: "whisper-large-v3", name: "Whisper", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "whisper", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2023-09-01", last_updated: "2025-09-05", modalities: { input: ["audio"], output: ["text"] }, open_weights: true, limit: { context: 0, output: 0 } }, "allam-2-7b": { id: "allam-2-7b", name: "ALLaM-2-7b", description: "ALLaM-2-7b instruction tuned model by SDAIA", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-01-23", last_updated: "2025-01-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 4096, output: 4096 }, cost: { input: 0, output: 0 } }, "whisper-large-v3-turbo": { id: "whisper-large-v3-turbo", name: "Whisper Large V3 Turbo", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "whisper", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-10-01", last_updated: "2024-10-01", modalities: { input: ["audio"], output: ["text"] }, open_weights: true, limit: { context: 0, output: 0 } }, "qwen/qwen3.6-27b": { id: "qwen/qwen3.6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "default"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.6, output: 3, cache_read: 0.3 } }, "canopylabs/orpheus-arabic-saudi": { id: "canopylabs/orpheus-arabic-saudi", name: "Canopy Labs Orpheus Arabic Saudi", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "canopylabs", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 4000, output: 50000 }, status: "beta" }, "canopylabs/orpheus-v1-english": { id: "canopylabs/orpheus-v1-english", name: "Canopy Labs Orpheus V1 English", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "canopylabs", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-12-19", last_updated: "2025-12-19", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 4000, output: 50000 }, status: "beta" }, "groq/compound-mini": { id: "groq/compound-mini", name: "Compound Mini", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "groq", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-09-04", last_updated: "2025-09-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 } }, "groq/compound": { id: "groq/compound", name: "Compound", description: "General-purpose chat model for instruction following, writing, and analysis", family: "groq", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-09-04", last_updated: "2025-09-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0.075, output: 0.3, cache_read: 0.0375 } }, "openai/gpt-oss-safeguard-20b": { id: "openai/gpt-oss-safeguard-20b", name: "Safety GPT OSS 20B", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-29", last_updated: "2026-06-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, status: "beta", cost: { input: 0.075, output: 0.3 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-10-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "meta-llama/llama-prompt-guard-2-22m": { id: "meta-llama/llama-prompt-guard-2-22m", name: "Llama Prompt Guard 2 22M", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-05-29", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512, output: 512 }, status: "beta", cost: { input: 0.03, output: 0.03 } }, "meta-llama/llama-prompt-guard-2-86m": { id: "meta-llama/llama-prompt-guard-2-86m", name: "Prompt Guard 2 86M", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-05-29", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512, output: 512 }, status: "beta", cost: { input: 0.04, output: 0.04 } } } }, deepseek: { id: "deepseek", env: ["DEEPSEEK_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.deepseek.com", name: "DeepSeek", doc: "https://api-docs.deepseek.com/quick_start/pricing", models: { "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, reasoning: 0.28, cache_read: 0.0028 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.435, output: 0.87, reasoning: 0.87, cache_read: 0.003625 } }, "deepseek-chat": { id: "deepseek-chat", name: "DeepSeek Chat", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-12-01", last_updated: "2026-02-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "deepseek-reasoner": { id: "deepseek-reasoner", name: "DeepSeek Reasoner", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-09", release_date: "2025-12-01", last_updated: "2026-02-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, reasoning: 0.28, cache_read: 0.0028 } } } }, "kimi-for-coding": { id: "kimi-for-coding", env: ["KIMI_API_KEY"], npm: "@ai-sdk/anthropic", api: "https://api.kimi.com/coding/v1", name: "Kimi For Coding", doc: "https://www.kimi.com/code/docs/en/third-party-tools/other-coding-agents.html", models: { k3: { id: "k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "kimi-for-coding": { id: "kimi-for-coding", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "kimi-for-coding-highspeed": { id: "kimi-for-coding-highspeed", name: "Kimi For Coding HighSpeed", description: "Lower-latency Kimi Code variant for interactive edits and coding-agent loops", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "k3-256k": { id: "k3-256k", name: "Kimi K3-256K", description: "256K-context version of Kimi K3, reducing token consumption for shorter coding sessions", family: "kimi-k3", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, requesty: { id: "requesty", env: ["REQUESTY_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://router.requesty.ai/v1", name: "Requesty", doc: "https://requesty.ai/solution/llm-routing/models", models: { "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "claude-opus-5@eu": { id: "claude-opus-5@eu", name: "Claude Opus 5 (EU)", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5.5, output: 27.5, cache_read: 0.55, cache_write: 6.875 } }, "deepseek-v4-flash-0731@eu": { id: "deepseek-v4-flash-0731@eu", name: "DeepSeek V4 Flash 0731 (EU)", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.07 } }, "gemini-3.5-flash@eu": { id: "gemini-3.5-flash@eu", name: "Gemini 3.5 Flash (EU)", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 1.5, output: 9, cache_read: 0.15, cache_write: 1.583 } }, "claude-sonnet-4-6@eu": { id: "claude-sonnet-4-6@eu", name: "Claude Sonnet 4.6 (EU)", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3.3, output: 16.5, cache_read: 0.3, cache_write: 4.125 } }, "gpt-4.1-mini@eu": { id: "gpt-4.1-mini@eu", name: "GPT-4.1 mini (EU)", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.44, output: 1.76, cache_read: 0.11 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "claude-opus-4-7@eu": { id: "claude-opus-4-7@eu", name: "Claude Opus 4.7 (EU)", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5.5, output: 27.5, cache_read: 0.55, cache_write: 6.875 } }, "gemini-3.5-flash-lite": { id: "gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "claude-sonnet-4-5@eu": { id: "claude-sonnet-4-5@eu", name: "Claude Sonnet 4.5 (latest) (EU)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3.3, output: 16.5, cache_read: 0.3, cache_write: 4.125, tiers: [{ input: 6.6, output: 24.75, cache_read: 0.6, cache_write: 8.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6.6, output: 24.75, cache_read: 0.6, cache_write: 8.25 } } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "kimi-k3@eu": { id: "kimi-k3@eu", name: "Kimi K3 (EU)", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 262144 }, cost: { input: 2.25, output: 11.25, cache_read: 0.225 } }, "glm-5.2@eu": { id: "glm-5.2@eu", name: "GLM-5.2 (EU)", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1.2, output: 4.2, cache_read: 0.26 } }, "claude-sonnet-4@eu": { id: "claude-sonnet-4@eu", name: "Claude Sonnet 4 (latest) (EU)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1.2, output: 4.2, cache_read: 0.26 } }, "claude-opus-4-6@eu": { id: "claude-opus-4-6@eu", name: "Claude Opus 4.6 (EU)", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5.5, output: 27.5, cache_read: 0.55, cache_write: 6.88 } }, "gpt-5.5@eu": { id: "gpt-5.5@eu", name: "GPT-5.5 (EU)", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "gpt-5.6-sol@eu": { id: "gpt-5.6-sol@eu", name: "GPT-5.6 Sol (EU)", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5.5, output: 33, cache_read: 0.55 } }, "claude-opus-4-1": { id: "claude-opus-4-1", name: "Claude Opus 4.1 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "gpt-5.1@eu": { id: "gpt-5.1@eu", name: "GPT-5.1 (EU)", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.375, output: 11, cache_read: 0.1375 } }, "gpt-5@eu": { id: "gpt-5@eu", name: "GPT-5 (EU)", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.375, output: 11, cache_read: 0.1375 } }, "gpt-5.4@eu": { id: "gpt-5.4@eu", name: "GPT-5.4 (EU)", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "gpt-5-nano@eu": { id: "gpt-5-nano@eu", name: "GPT-5 Nano (EU)", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 0.055, output: 0.44, cache_read: 0.0055 } }, "gpt-4.1-nano@eu": { id: "gpt-4.1-nano@eu", name: "GPT-4.1 nano (EU)", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.11, output: 0.44, cache_read: 0.0275 } }, "claude-sonnet-4-5": { id: "claude-sonnet-4-5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "gemini-2.5-flash@eu": { id: "gemini-2.5-flash@eu", name: "Gemini 2.5 Flash (EU)", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.3, output: 2.5, cache_read: 0.075, cache_write: 0.55 } }, "gpt-5-mini@eu": { id: "gpt-5-mini@eu", name: "GPT-5 Mini (EU)", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 0.275, output: 2.2, cache_read: 0.0275 } }, "claude-opus-4-8@eu": { id: "claude-opus-4-8@eu", name: "Claude Opus 4.8 (EU)", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5.5, output: 27.5, cache_read: 0.55, cache_write: 6.875 } }, "gpt-4o-mini@eu": { id: "gpt-4o-mini@eu", name: "GPT-4o mini (EU)", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16000 }, cost: { input: 0.165, output: 0.66, cache_read: 0.0825 } }, "deepseek-v4-flash-0731": { id: "deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.07 } }, "gemini-3.6-flash": { id: "gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 1.5, output: 7, cache_read: 0.15 } }, "grok-4.5": { id: "grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.5, cache_write: 2, tiers: [{ input: 4, output: 12, cache_read: 1, cache_write: 4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 12, cache_read: 1, cache_write: 4 } } }, "gpt-5.6-luna@eu": { id: "gpt-5.6-luna@eu", name: "GPT-5.6 Luna (EU)", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 1.1, output: 6.6, cache_read: 0.11 } }, "o4-mini@eu": { id: "o4-mini@eu", name: "o4-mini (EU)", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.21, output: 4.84, cache_read: 0.3025 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 262144 }, cost: { input: 2.25, output: 11.25, cache_read: 0.225 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-sonnet-5@eu": { id: "claude-sonnet-5@eu", name: "Claude Sonnet 5 (EU)", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2.2, output: 11, cache_read: 0.22, cache_write: 2.75 } }, "claude-opus-4-5@eu": { id: "claude-opus-4-5@eu", name: "Claude Opus 4.5 (latest) (EU)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5.5, output: 27.5, cache_read: 0.55, cache_write: 6.875 } }, "claude-opus-4-5": { id: "claude-opus-4-5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "gemini-3.1-flash-lite@eu": { id: "gemini-3.1-flash-lite@eu", name: "Gemini 3.1 Flash Lite (EU)", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, cache_write: 0.08333, tiers: [{ input: 0.5, output: 2.25, cache_read: 0.025, cache_write: 0.08333, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 0.5, output: 2.25, cache_read: 0.025, cache_write: 0.08333 } } }, "claude-haiku-4-5@eu": { id: "claude-haiku-4-5@eu", name: "Claude Haiku 4.5 (latest) (EU)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1.1, output: 5.5, cache_read: 0.11, cache_write: 1.375 } }, "gpt-4.1@eu": { id: "gpt-4.1@eu", name: "GPT-4.1 (EU)", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2.2, output: 8.8, cache_read: 0.55 } }, "claude-opus-5": { id: "claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "gpt-5.6-terra@eu": { id: "gpt-5.6-terra@eu", name: "GPT-5.6 Terra (EU)", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.75, output: 16.5, cache_read: 0.275 } } } }, tensorx: { id: "tensorx", env: ["TENSORX_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.tensorx.ai/v1", name: "TensorX", doc: "https://docs.tensorx.ai/", models: { "nvidia/nemotron-3-super-120b-a12b": { id: "nvidia/nemotron-3-super-120b-a12b", name: "Nemotron 3 Super 120B A12B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.3, output: 0.9, cache_read: 0.075, cache_write: 0.375 } }, "qwen/qwen3-coder-30b-a3b-instruct": { id: "qwen/qwen3-coder-30b-a3b-instruct", name: "Qwen3-Coder 30B-A3B Instruct", description: "Smaller Qwen coder for efficient local agents and repo-level fixes", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 65536 }, cost: { input: 0.06, output: 0.25, cache_read: 0.015, cache_write: 0.075 } }, "qwen/qwen3.5-9b": { id: "qwen/qwen3.5-9b", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.15, output: 0.2, cache_read: 0.0375, cache_write: 0.1875 } }, "qwen/qwen3-vl-235b-a22b-instruct": { id: "qwen/qwen3-vl-235b-a22b-instruct", name: "Qwen3 VL 235B-A22B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 131072 }, cost: { input: 0.21, output: 1.9, cache_read: 0.0525, cache_write: 0.2625 } }, "qwen/qwen3-235b-a22b-2507": { id: "qwen/qwen3-235b-a22b-2507", name: "Qwen3 235B-A22B-2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-06-30", release_date: "2025-07-21", last_updated: "2025-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 262144 }, cost: { input: 0.072, output: 0.464, cache_read: 0.018, cache_write: 0.09 } }, "qwen/qwen3.5-122b-a10b": { id: "qwen/qwen3.5-122b-a10b", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.5, output: 3.5, cache_read: 0.125, cache_write: 0.625 } }, "minimax/minimax-m3": { id: "minimax/minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.4, output: 2, cache_read: 0.1 } }, "minimax/minimax-m2.5": { id: "minimax/minimax-m2.5", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 65536 }, cost: { input: 0.3, output: 1.2, cache_read: 0.075, cache_write: 0.375 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 0.15, output: 0.3, cache_read: 0.0375, cache_write: 0.1875 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 1.75, output: 3.5, cache_read: 0.4375, cache_write: 2.185 } }, "deepseek/deepseek-r1-0528": { id: "deepseek/deepseek-r1-0528", name: "DeepSeek R1-0528", description: "Classic open reasoning model for transparent math, coding, and deliberate problem solving", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-05-28", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 164000, output: 8192 }, cost: { input: 0.66, output: 2.6, cache_read: 0.165, cache_write: 0.825 } }, "deepseek/deepseek-v4-flash-0731": { id: "deepseek/deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 0.25, output: 0.3, cache_read: 0.06 } }, "deepseek/deepseek-v3.2": { id: "deepseek/deepseek-v3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 163840 }, cost: { input: 0.3, output: 0.5, cache_read: 0.075, cache_write: 0.375 } }, "deepseek/deepseek-chat-v3.1": { id: "deepseek/deepseek-chat-v3.1", name: "DeepSeek Chat V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 164000, output: 163840 }, cost: { input: 0.2, output: 0.8, cache_read: 0.05, cache_write: 0.25 } }, "z-ai/glm-5": { id: "z-ai/glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, cost: { input: 1, output: 3.2, cache_read: 0.25, cache_write: 1.25 } }, "z-ai/glm-5.1": { id: "z-ai/glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, cost: { input: 1.4, output: 4.4, cache_read: 0.35, cache_write: 1.75 } }, "z-ai/glm-5.2": { id: "z-ai/glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1.5, output: 4.5, cache_read: 0.375 } }, "z-ai/glm-4.7": { id: "z-ai/glm-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 200000 }, cost: { input: 0.6, output: 2.2, cache_read: 0.15, cache_write: 0.75 } }, "z-ai/glm-5-turbo": { id: "z-ai/glm-5-turbo", name: "GLM-5-Turbo", description: "Faster GLM-5 lane for coding agents that need lower latency", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.3, cache_write: 1.5 } }, "z-ai/glm-5v-turbo": { id: "z-ai/glm-5v-turbo", name: "GLM-5V-Turbo", description: "Fast GLM vision model for screenshots, documents, and multimodal agent tasks", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.3, cache_write: 1.5 } }, "moonshotai/kimi-k2.5": { id: "moonshotai/kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.5, output: 2.8, cache_read: 0.125, cache_write: 0.625 } }, "moonshotai/kimi-k2.6": { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1, output: 4, cache_read: 0.25, cache_write: 1.25 } }, "moonshotai/kimi-k2.7-code": { id: "moonshotai/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.25, output: 4.5, cache_read: 0.3125 } }, "moonshotai/kimi-k3": { id: "moonshotai/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.75 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.04, output: 0.2, cache_read: 0.01, cache_write: 0.05 } } } }, llama: { id: "llama", env: ["LLAMA_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.llama.com/compat/v1/", name: "Llama", doc: "https://llama.developer.meta.com/docs/models", models: { "cerebras-llama-4-maverick-17b-128e-instruct": { id: "cerebras-llama-4-maverick-17b-128e-instruct", name: "Cerebras-Llama-4-Maverick-17B-128E-Instruct", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "cerebras-llama-4-scout-17b-16e-instruct": { id: "cerebras-llama-4-scout-17b-16e-instruct", name: "Cerebras-Llama-4-Scout-17B-16E-Instruct", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "llama-4-scout-17b-16e-instruct-fp8": { id: "llama-4-scout-17b-16e-instruct-fp8", name: "Llama-4-Scout-17B-16E-Instruct-FP8", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "llama-4-maverick-17b-128e-instruct-fp8": { id: "llama-4-maverick-17b-128e-instruct-fp8", name: "Llama-4-Maverick-17B-128E-Instruct-FP8", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "llama-3.3-70b-instruct": { id: "llama-3.3-70b-instruct", name: "Llama-3.3-70B-Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "llama-3.3-8b-instruct": { id: "llama-3.3-8b-instruct", name: "Llama-3.3-8B-Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "groq-llama-4-maverick-17b-128e-instruct": { id: "groq-llama-4-maverick-17b-128e-instruct", name: "Groq-Llama-4-Maverick-17B-128E-Instruct", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } } } }, kilo: { id: "kilo", env: ["KILO_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.kilo.ai/api/gateway", name: "Kilo Gateway", doc: "https://kilo.ai", models: { "~openai/gpt-latest": { id: "~openai/gpt-latest", name: "OpenAI GPT Latest", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "~openai/gpt-mini-latest": { id: "~openai/gpt-mini-latest", name: "OpenAI GPT Mini Latest", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "microsoft/phi-4": { id: "microsoft/phi-4", name: "Microsoft: Phi 4", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "phi", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-01-10", last_updated: "2025-01-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 16384 }, cost: { input: 0.07, output: 0.14 } }, "microsoft/wizardlm-2-8x22b": { id: "microsoft/wizardlm-2-8x22b", name: "WizardLM-2 8x22B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2024-04-16", last_updated: "2024-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 65535, output: 8000 }, cost: { input: 0.62, output: 0.62 } }, "cohere/command-r-08-2024": { id: "cohere/command-r-08-2024", name: "Command R", description: "Cohere retrieval model for long-context chat and enterprise RAG workflows", family: "command-r", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-08-30", last_updated: "2024-08-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 0.15, output: 0.6 } }, "cohere/command-a": { id: "cohere/command-a", name: "Cohere: Command A", description: "Cohere command model for multilingual enterprise agents, tools, and chat", family: "command-a", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 8192 }, cost: { input: 2.5, output: 10 } }, "cohere/command-r-plus-08-2024": { id: "cohere/command-r-plus-08-2024", name: "Command R+", description: "Cohere retrieval model for long-context chat and enterprise RAG workflows", family: "command-r", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-08-30", last_updated: "2024-08-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 2.5, output: 10 } }, "cohere/command-r7b-12-2024": { id: "cohere/command-r7b-12-2024", name: "Command R7B", description: "Cohere command model for multilingual enterprise agents, tools, and chat", family: "command-r", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-12-02", last_updated: "2024-12-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 0.0375, output: 0.15 } }, "cohere/north-mini-code:free": { id: "cohere/north-mini-code:free", name: "Cohere: North Mini Code (free)", description: "North Mini Code is Cohere's first agentic coding model and the debut of its North family. A sparse mixture-of-experts model with 30B total parameters and 3B active, it is optimized...", family: "north", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-06-17", last_updated: "2026-06-17", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-ultra-550b-a55b:free": { id: "nvidia/nemotron-3-ultra-550b-a55b:free", name: "NVIDIA: Nemotron 3 Ultra (free)", description: "NVIDIA Nemotron 3 Ultra is an open frontier-reasoning and orchestration model from NVIDIA, with 55B active parameters out of 550B total (MoE). Built on a hybrid Transformer-Mamba mixture-of-experts architecture, it... **Terms of service** For NVIDIA free endpoints (Super/Ultra/etc): Trial use only - do not submit personal or confidential data. Your use is logged for security purposes and to improve NVIDIA products and services. The logged session data for improvement purposes is not linked to your identity or any persistent identifier. For more information about our data processing practices, see our [Privacy Policy](https://www.nvidia.com/en-us/about-nvidia/privacy-policy/). By interacting with this endpoint, you consent to our collection, recording, and use of such information and the [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "medium", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-nano-30b-a3b": { id: "nvidia/nemotron-3-nano-30b-a3b", name: "Nemotron 3 Nano 30B A3B", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-15", last_updated: "2025-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.05, output: 0.2, cache_read: 0.03 } }, "nvidia/nemotron-3-super-120b-a12b": { id: "nvidia/nemotron-3-super-120b-a12b", name: "Nemotron 3 Super 120B A12B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.085, output: 0.4 } }, "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free": { id: "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free", name: "NVIDIA: Nemotron 3 Nano Omni (free)", description: "Open Nemotron omni model combining reasoning with text, vision, and audio", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-28", last_updated: "2026-04-28", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 65536 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3.5-content-safety:free": { id: "nvidia/nemotron-3.5-content-safety:free", name: "NVIDIA: Nemotron 3.5 Content Safety (free)", description: "NVIDIA Nemotron 3.5 Content Safety is a compact 4B-parameter multimodal guardrail model from NVIDIA, fine-tuned from Google Gemma-3-4B. It moderates both inputs to and responses from LLMs and VLMs, accepting... **Terms of service** For NVIDIA free endpoints (Super/Ultra/etc): Trial use only - do not submit personal or confidential data. Your use is logged for security purposes and to improve NVIDIA products and services. The logged session data for improvement purposes is not linked to your identity or any persistent identifier. For more information about our data processing practices, see our [Privacy Policy](https://www.nvidia.com/en-us/about-nvidia/privacy-policy/). By interacting with this endpoint, you consent to our collection, recording, and use of such information and the [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf).", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-ultra-550b-a55b": { id: "nvidia/nemotron-3-ultra-550b-a55b", name: "Nemotron 3 Ultra 550B A55B", description: "NVIDIA Nemotron 3 Ultra is an open frontier-reasoning and orchestration model from NVIDIA, with 55B active parameters out of 550B total (MoE). Built on a hybrid Transformer-Mamba mixture-of-experts architecture, it...", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512288, output: 512288 }, cost: { input: 0.5, output: 2.2, cache_read: 0.1 } }, "nvidia/nemotron-3-super-120b-a12b:free": { id: "nvidia/nemotron-3-super-120b-a12b:free", name: "NVIDIA: Nemotron 3 Super (free)", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0 } }, "deepcogito/cogito-v2.1-671b": { id: "deepcogito/cogito-v2.1-671b", name: "Deep Cogito: Cogito v2.1 671B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "cogito", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: true, temperature: true, release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32768 }, cost: { input: 1.25, output: 1.25 } }, "google/lyria-3-pro-preview": { id: "google/lyria-3-pro-preview", name: "Lyria 3 Pro Preview", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "lyria", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-03-25", last_updated: "2026-03-25", modalities: { input: ["text", "image"], output: ["text", "audio"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0, output: 0 } }, "google/gemini-3.5-flash": { id: "google/gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, reasoning: 9, cache_read: 0.15, cache_write: 0.083333 } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.3, output: 2.5, reasoning: 2.5, cache_read: 0.03, cache_write: 0.083333 } }, "google/gemma-3-4b-it": { id: "google/gemma-3-4b-it", name: "Google: Gemma 3 4B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0.05, output: 0.1 } }, "google/gemini-3.5-flash-lite": { id: "google/gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Gemini 3.5 Flash Lite is a high-efficiency model from Google with upgraded agentic capabilities. It is suited for subagents that execute focused tasks within complex, multi-agent workflows.", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, reasoning: 2.5, cache_read: 0.03, cache_write: 0.083333 } }, "google/gemini-2.5-pro-preview": { id: "google/gemini-2.5-pro-preview", name: "Google: Gemini 2.5 Pro Preview 06-05", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-06-05", last_updated: "2025-06-05", modalities: { input: ["pdf", "image", "text", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, reasoning: 10, cache_read: 0.125, cache_write: 0.375 } }, "google/lyria-3-clip-preview": { id: "google/lyria-3-clip-preview", name: "Lyria 3 Clip Preview", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "lyria", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-03-25", last_updated: "2026-03-25", modalities: { input: ["text", "image"], output: ["text", "audio"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0, output: 0 } }, "google/gemini-3-pro-image-preview": { id: "google/gemini-3-pro-image-preview", name: "Nano Banana Pro", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: false, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["image", "text", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 32768 }, cost: { input: 2, output: 12, reasoning: 12, cache_read: 0.2, cache_write: 0.375 } }, "google/gemini-3.1-flash-lite-preview": { id: "google/gemini-3.1-flash-lite-preview", name: "Gemini 3.1 Flash Lite Preview", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, reasoning: 1.5, cache_read: 0.025, cache_write: 0.083333 } }, "google/gemini-3-flash-preview": { id: "google/gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, reasoning: 3, cache_read: 0.05, cache_write: 0.083333 } }, "google/gemini-3.1-pro-preview-customtools": { id: "google/gemini-3.1-pro-preview-customtools", name: "Gemini 3.1 Pro Preview Custom Tools", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, reasoning: 12, cache_read: 0.2, cache_write: 0.375 } }, "google/gemini-3.1-flash-lite-image": { id: "google/gemini-3.1-flash-lite-image", name: "Nano Banana 2 Lite", description: "Nano Banana 2 Lite (Gemini 3.1 Flash Lite Image) is Google's fastest, most cost-efficient Gemini image model, built for high-velocity developer pipelines and rapid-fire visual exploration. It delivers text-to-image generation...", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "high"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["image", "text", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 65536 }, cost: { input: 0.25, output: 1.5 } }, "google/gemini-3.1-flash-image-preview": { id: "google/gemini-3.1-flash-image-preview", name: "Nano Banana 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "high"] }], tool_call: false, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 65536 }, cost: { input: 0.5, output: 3 } }, "google/gemma-4-26b-a4b-it": { id: "google/gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.07, output: 0.34 } }, "google/gemma-2-27b-it": { id: "google/gemma-2-27b-it", name: "Google: Gemma 2 27B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-07-13", last_updated: "2024-07-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 2048 }, cost: { input: 0.65, output: 0.65 } }, "google/gemma-3-27b-it": { id: "google/gemma-3-27b-it", name: "Google: Gemma 3 27B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-03-12", last_updated: "2025-03-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.08, output: 0.16 } }, "google/gemini-3.6-flash": { id: "google/gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Gemini 3.6 Flash is a high-efficiency model from Google for coding, agentic workflows, and web and app development. It is designed to produce polished outputs with fewer unnecessary edits and...", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, reasoning: 7.5, cache_read: 0.15, cache_write: 0.083333 } }, "google/gemini-3.1-flash-lite": { id: "google/gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, reasoning: 1.5, cache_read: 0.025, cache_write: 0.083333 } }, "google/gemini-2.5-pro-preview-05-06": { id: "google/gemini-2.5-pro-preview-05-06", name: "Google: Gemini 2.5 Pro Preview 05-06", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-05-07", last_updated: "2025-05-07", modalities: { input: ["text", "image", "pdf", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 1.25, output: 10, reasoning: 10, cache_read: 0.125, cache_write: 0.375 } }, "google/gemma-3-12b-it": { id: "google/gemma-3-12b-it", name: "Google: Gemma 3 12B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0.05, output: 0.15 } }, "google/gemma-4-31b-it": { id: "google/gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.08, output: 0.35, cache_read: 0.01 } }, "google/gemini-3.1-flash-image": { id: "google/gemini-3.1-flash-image", name: "Nano Banana 2", description: 'Gemini 3.1 Flash Image, a.k.a. "Nano Banana 2," is Google\u2019s latest state of the art image generation and editing model, delivering Pro-level visual quality at Flash speed. It combines advanced...', family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "high"] }], tool_call: false, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["image", "text", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.5, output: 3 } }, "google/gemini-2.5-flash-image": { id: "google/gemini-2.5-flash-image", name: "Nano Banana", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-flash", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-06", release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["image", "text", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 32768, output: 8192 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, cache_write: 0.083333 } }, "google/gemma-3n-e4b-it": { id: "google/gemma-3n-e4b-it", name: "Google: Gemma 3n 4B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 6554 }, cost: { input: 0.06, output: 0.12 } }, "google/gemini-3-pro-image": { id: "google/gemini-3-pro-image", name: "Nano Banana Pro", description: "Nano Banana Pro is Google\u2019s most advanced image-generation and editing model, built on Gemini 3 Pro. It extends the original Nano Banana with significantly improved multimodal reasoning, real-world grounding, and...", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["image", "text", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 32768 }, cost: { input: 2, output: 12, reasoning: 12, cache_read: 0.2, cache_write: 0.375 } }, "google/gemini-3.1-pro-preview": { id: "google/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, reasoning: 12, cache_read: 0.2, cache_write: 0.375 } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, reasoning: 10, cache_read: 0.125, cache_write: 0.375 } }, "google/gemini-2.5-flash-lite": { id: "google/gemini-2.5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.1, output: 0.4, reasoning: 0.4, cache_read: 0.01, cache_write: 0.083333 } }, "thinkingmachines/inkling-small": { id: "thinkingmachines/inkling-small", name: "Inkling Small", description: "Inkling Small is an open-weight multimodal mixture-of-experts model from Thinking Machines Lab, with 12B active parameters out of 276B total. It is positioned as the smaller, more efficient member of...", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-30", last_updated: "2026-07-30", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 262144 }, cost: { input: 0.45, output: 1.2, cache_read: 0.1 } }, "thinkingmachines/inkling": { id: "thinkingmachines/inkling", name: "Inkling", description: "Inkling is an open-weight multimodal mixture-of-experts model from Thinking Machines Lab, with 41B active parameters out of 975B total. It is designed for general-purpose reasoning, coding, agentic and tool-use systems,...", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "max"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 262144 }, cost: { input: 0.95, output: 4.05, cache_read: 0.16 } }, "relace/relace-apply-3": { id: "relace/relace-apply-3", name: "Relace: Relace Apply 3", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, release_date: "2025-09-26", last_updated: "2025-09-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 0.85, output: 1.25 } }, "relace/relace-search": { id: "relace/relace-search", name: "Relace: Relace Search", description: "Tool-capable chat model for instruction following and agentic application workflows", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 1, output: 3 } }, "~deepseek/deepseek-v4-flash-latest": { id: "~deepseek/deepseek-v4-flash-latest", name: "DeepSeek V4 Flash Latest", description: "This model always redirects to the latest model in the DeepSeek V4 Flash family.", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-01", last_updated: "2026-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, cost: { input: 0.079996, output: 0.252, cache_read: 0.0252 } }, "perceptron/perceptron-mk1": { id: "perceptron/perceptron-mk1", name: "Perceptron: Perceptron Mk1", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: true, temperature: true, release_date: "2026-05-12", last_updated: "2026-05-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 8192 }, cost: { input: 0.15, output: 1.5 } }, "sakana/fugu-ultra": { id: "sakana/fugu-ultra", name: "Fugu Ultra", description: "Fugu Ultra is the higher-performance model in Sakana AI's Fugu family. Rather than a single monolithic model, Fugu is a learned multi-agent orchestration system: a language model trained to route...", family: "fugu", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-06-15", last_updated: "2026-06-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "~google/gemini-flash-latest": { id: "~google/gemini-flash-latest", name: "Google Gemini Flash Latest", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video", "pdf", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, reasoning: 7.5, cache_read: 0.15, cache_write: 0.083333 } }, "~google/gemini-pro-latest": { id: "~google/gemini-pro-latest", name: "Google Gemini Pro Latest", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["audio", "pdf", "image", "text", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, reasoning: 12, cache_read: 0.2, cache_write: 0.375 } }, "qwen/qwen3.5-flash-02-23": { id: "qwen/qwen3.5-flash-02-23", name: "Qwen: Qwen3.5-Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-25", last_updated: "2026-02-25", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.065, output: 0.26 } }, "qwen/qwen3.7-flash": { id: "qwen/qwen3.7-flash", name: "Qwen3.7 Flash", description: "Qwen3.7 Flash is a vision-language reasoning model from Alibaba. It is suited for multimodal agents, visual coding, search, and computer interaction, with strengths in object recognition, spatial understanding, and real-world...", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 991000, output: 65536 }, cost: { input: 0.03, output: 0.13, cache_read: 0.006, cache_write: 0.038 } }, "qwen/qwen3.7-plus": { id: "qwen/qwen3.7-plus", name: "Qwen3.7 Plus", description: "Qwen3.7-Plus is a cost-effective model in Alibaba's Qwen3.7 series. It supports text and image input with text output, building on the series' text capabilities with a comprehensive upgrade to its...", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 0.32, output: 1.28, cache_read: 0.032, cache_write: 0.4 } }, "qwen/qwen3-32b": { id: "qwen/qwen3-32b", name: "Qwen3 32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 16384 }, cost: { input: 0.104, output: 0.416 } }, "qwen/qwen3.6-35b-a3b": { id: "qwen/qwen3.6-35b-a3b", name: "Qwen3.6 35B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.15, output: 1, cache_read: 0.05 } }, "qwen/qwen3-30b-a3b": { id: "qwen/qwen3-30b-a3b", name: "Qwen: Qwen3 30B A3B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-04-28", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 40960, output: 16384 }, cost: { input: 0.13, output: 0.52 } }, "qwen/qwen3-235b-a22b-thinking-2507": { id: "qwen/qwen3-235b-a22b-thinking-2507", name: "Qwen: Qwen3 235B A22B Thinking 2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 262144 }, cost: { input: 0.23, output: 2.3 } }, "qwen/qwen3-vl-30b-a3b-thinking": { id: "qwen/qwen3-vl-30b-a3b-thinking", name: "Qwen: Qwen3 VL 30B A3B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.2, output: 2.4 } }, "qwen/qwen3-coder-30b-a3b-instruct": { id: "qwen/qwen3-coder-30b-a3b-instruct", name: "Qwen3-Coder 30B-A3B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 160000, output: 32768 }, cost: { input: 0.2925, output: 1.4625 } }, "qwen/qwen3.5-plus-02-15": { id: "qwen/qwen3.5-plus-02-15", name: "Qwen: Qwen3.5 Plus 2026-02-15", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.26, output: 1.56 } }, "qwen/qwen3.5-27b": { id: "qwen/qwen3.5-27b", name: "Qwen3.5 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.195, output: 1.56 } }, "qwen/qwen3.7-max": { id: "qwen/qwen3.7-max", name: "Qwen3.7 Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 1.25, output: 3.75, cache_read: 0.125, cache_write: 1.5625 } }, "qwen/qwen3-next-80b-a3b-thinking": { id: "qwen/qwen3-next-80b-a3b-thinking", name: "Qwen3-Next 80B-A3B (Thinking)", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.15, output: 1.2 } }, "qwen/qwen3.5-9b": { id: "qwen/qwen3.5-9b", name: "Qwen3.5 9B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.1, output: 0.15 } }, "qwen/qwen3.6-27b": { id: "qwen/qwen3.6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.45, output: 2.7 } }, "qwen/qwen3.5-35b-a3b": { id: "qwen/qwen3.5-35b-a3b", name: "Qwen3.5 35B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.1625, output: 1.3 } }, "qwen/qwen-2.5-7b-instruct": { id: "qwen/qwen-2.5-7b-instruct", name: "Qwen: Qwen2.5 7B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-10-16", last_updated: "2024-10-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.1, output: 0.2 } }, "qwen/qwen3-14b": { id: "qwen/qwen3-14b", name: "Qwen: Qwen3 14B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-28", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.2275, output: 0.91 } }, "qwen/qwen3-235b-a22b": { id: "qwen/qwen3-235b-a22b", name: "Qwen3 235B-A22B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.455, output: 1.82 } }, "qwen/qwen3-max": { id: "qwen/qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.78, output: 3.9, cache_read: 0.156, cache_write: 0.975 } }, "qwen/qwen3-vl-8b-instruct": { id: "qwen/qwen3-vl-8b-instruct", name: "Qwen: Qwen3 VL 8B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-14", last_updated: "2025-10-14", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.117, output: 0.455 } }, "qwen/qwen3-8b": { id: "qwen/qwen3-8b", name: "Qwen: Qwen3 8B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-04-28", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.117, output: 0.455 } }, "qwen/qwen3-coder-plus": { id: "qwen/qwen3-coder-plus", name: "Qwen3 Coder Plus", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.65, output: 3.25, cache_read: 0.13, cache_write: 0.8125 } }, "qwen/qwen3.8-max": { id: "qwen/qwen3.8-max", name: "Qwen3.8 Max", description: "Qwen3.8 Max is the flagship model in Alibaba's Qwen3.8 series, the general-availability successor to the Qwen3.8 Max Preview. It is a multimodal reasoning model intended for complex reasoning, visual understanding,...", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 2, output: 6, cache_read: 0.25, cache_write: 2.5 } }, "qwen/qwen3-coder-flash": { id: "qwen/qwen3-coder-flash", name: "Qwen3 Coder Flash", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.195, output: 0.975, cache_read: 0.039, cache_write: 0.24375 } }, "qwen/qwen3-vl-235b-a22b-instruct": { id: "qwen/qwen3-vl-235b-a22b-instruct", name: "Qwen: Qwen3 VL 235B A22B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.26, output: 1.04 } }, "qwen/qwen3-vl-32b-instruct": { id: "qwen/qwen3-vl-32b-instruct", name: "Qwen: Qwen3 VL 32B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-23", last_updated: "2025-10-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.104, output: 0.416 } }, "qwen/qwen-2.5-72b-instruct": { id: "qwen/qwen-2.5-72b-instruct", name: "Qwen2.5 72B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-09-19", last_updated: "2024-09-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 16384 }, cost: { input: 0.36, output: 0.4 } }, "qwen/qwen-plus-2025-07-28:thinking": { id: "qwen/qwen-plus-2025-07-28:thinking", name: "Qwen: Qwen Plus 0728 (thinking)", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-08", last_updated: "2025-09-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.4, output: 1.2, cache_write: 0.5 } }, "qwen/qwen-plus": { id: "qwen/qwen-plus", name: "Qwen Plus", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2024-01-25", last_updated: "2025-09-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.26, output: 0.78, cache_read: 0.052, cache_write: 0.325 } }, "qwen/qwen3-30b-a3b-thinking-2507": { id: "qwen/qwen3-30b-a3b-thinking-2507", name: "Qwen: Qwen3 30B A3B Thinking 2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-28", last_updated: "2025-08-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 81920, output: 32768 }, cost: { input: 0.2, output: 2.4 } }, "qwen/qwen3-vl-8b-thinking": { id: "qwen/qwen3-vl-8b-thinking", name: "Qwen: Qwen3 VL 8B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-14", last_updated: "2025-10-14", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.18, output: 2.1 } }, "qwen/qwen3-235b-a22b-2507": { id: "qwen/qwen3-235b-a22b-2507", name: "Qwen: Qwen3 235B A22B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-21", last_updated: "2025-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 16384 }, cost: { input: 0.1495, output: 0.598 } }, "qwen/qwen3.6-flash": { id: "qwen/qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.1875, output: 1.125, cache_write: 0.234375 } }, "qwen/qwen3-30b-a3b-instruct-2507": { id: "qwen/qwen3-30b-a3b-instruct-2507", name: "Qwen: Qwen3 30B A3B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-29", last_updated: "2025-07-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 }, cost: { input: 0.13, output: 0.52 } }, "qwen/qwen3-vl-30b-a3b-instruct": { id: "qwen/qwen3-vl-30b-a3b-instruct", name: "Qwen: Qwen3 VL 30B A3B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 16384 }, cost: { input: 0.13, output: 0.52 } }, "qwen/qwen3.5-397b-a17b": { id: "qwen/qwen3.5-397b-a17b", name: "Qwen3.5 397B-A17B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.39, output: 2.34 } }, "qwen/qwen-2.5-coder-32b-instruct": { id: "qwen/qwen-2.5-coder-32b-instruct", name: "Qwen2.5 Coder 32B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2024-11-11", last_updated: "2024-11-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.66, output: 1 } }, "qwen/qwen3-vl-235b-a22b-thinking": { id: "qwen/qwen3-vl-235b-a22b-thinking", name: "Qwen: Qwen3 VL 235B A22B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.4, output: 4 } }, "qwen/qwen3.6-max-preview": { id: "qwen/qwen3.6-max-preview", name: "Qwen3.6 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 1.027, output: 6.162, cache_write: 1.28375 } }, "qwen/qwen3-max-thinking": { id: "qwen/qwen3-max-thinking", name: "Qwen: Qwen3 Max Thinking", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-09", last_updated: "2026-02-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.78, output: 3.9 } }, "qwen/qwen3-coder": { id: "qwen/qwen3-coder", name: "Qwen: Qwen3 Coder 480B A35B", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.975, output: 4.875 } }, "qwen/qwen3-coder-next": { id: "qwen/qwen3-coder-next", name: "Qwen3 Coder Next", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-09", release_date: "2026-02-03", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.3, output: 1.5 } }, "qwen/qwen3.6-plus": { id: "qwen/qwen3.6-plus", name: "Qwen3.6 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.325, output: 1.95, cache_write: 0.40625 } }, "qwen/qwen3.5-122b-a10b": { id: "qwen/qwen3.5-122b-a10b", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 81920 }, cost: { input: 0.26, output: 2.08 } }, "qwen/qwen3.5-plus-20260420": { id: "qwen/qwen3.5-plus-20260420", name: "Qwen: Qwen3.5 Plus 2026-04-20", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.3, output: 1.8, cache_write: 0.375 } }, "qwen/qwen-plus-2025-07-28": { id: "qwen/qwen-plus-2025-07-28", name: "Qwen: Qwen Plus 0728", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-08", last_updated: "2025-09-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.26, output: 0.78 } }, "qwen/qwen3-next-80b-a3b-instruct": { id: "qwen/qwen3-next-80b-a3b-instruct", name: "Qwen3-Next 80B-A3B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.0975, output: 0.78 } }, "qwen/qwen2.5-vl-72b-instruct": { id: "qwen/qwen2.5-vl-72b-instruct", name: "Qwen: Qwen2.5 VL 72B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-02-01", last_updated: "2025-02-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 128000 }, cost: { input: 0.25, output: 0.75 } }, "stealth/claude-sonnet-4.6": { id: "stealth/claude-sonnet-4.6", name: "Stealth: Claude Sonnet 4.6 (20% off)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 2.4, output: 12, reasoning: 0, cache_read: 0.24, cache_write: 3 } }, "stealth/gpt-5.6-sol": { id: "stealth/gpt-5.6-sol", name: "Stealth: GPT-5.6 Sol (20% off)", description: "Your prompts and completions may be retained and used to train or improve the provider's services. This third-party-served variant of GPT-5.6 Sol is offered at 20% lower cost than standard GPT-5.6 Sol pricing and is not served by OpenAI or Kilo Code.", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, cost: { input: 4, output: 24, reasoning: 0, cache_read: 0.4, cache_write: 5 } }, "stealth/claude-opus-4.7": { id: "stealth/claude-opus-4.7", name: "Stealth: Claude Opus 4.7 (20% off)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 4, output: 20, reasoning: 0, cache_read: 0.4, cache_write: 5 } }, "stealth/claude-opus-4.8": { id: "stealth/claude-opus-4.8", name: "Stealth: Claude Opus 4.8 (20% off)", description: "Your prompts and completions may be retained and used to train or improve the provider's services. This third-party-served variant of Claude Opus 4.8 is offered at 20% lower cost than standard Claude Opus 4.8 pricing and is not served by Anthropic or Kilo Code.", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 4, output: 20, reasoning: 0, cache_read: 0.4, cache_write: 5 } }, "stealth/qwen3.6-plus": { id: "stealth/qwen3.6-plus", name: "Stealth: Qwen3.6 Plus (50% off)", description: "Your prompts and completions may be retained and used to train or improve the provider's services. This third-party-served variant of Qwen3.6 Plus is offered at 50% lower cost than standard Qwen3.6 Plus pricing and is not served by Alibaba or Kilo Code. Note: a surcharge applies to long-context workloads exceeding 256K input tokens.", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.25, output: 1.5, reasoning: 0, cache_read: 0.025, cache_write: 0.3125 } }, "stealth/claude-opus-4.6": { id: "stealth/claude-opus-4.6", name: "Stealth: Claude Opus 4.6 (20% off)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 4, output: 20, reasoning: 0, cache_read: 0.4, cache_write: 5 } }, "inception/mercury-2": { id: "inception/mercury-2", name: "Inception: Mercury 2", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "mercury", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-04", last_updated: "2026-03-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 50000 }, cost: { input: 0.25, output: 0.75, cache_read: 0.025 } }, "rekaai/reka-edge": { id: "rekaai/reka-edge", name: "Reka Edge", description: "Multimodal model for analyzing text, images, documents, and rich media", family: "reka", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 16384 }, cost: { input: 0.1, output: 0.1 } }, "rekaai/reka-flash-3": { id: "rekaai/reka-flash-3", name: "Reka Flash 3", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "reka", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: false, structured_output: true, temperature: true, release_date: "2025-03-12", last_updated: "2025-03-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 65536, output: 65536 }, cost: { input: 0.1, output: 0.2 } }, "tencent/hunyuan-a13b-instruct": { id: "tencent/hunyuan-a13b-instruct", name: "Tencent: Hunyuan A13B Instruct", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "hunyuan", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: true, temperature: true, release_date: "2025-07-08", last_updated: "2025-07-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.14, output: 0.57 } }, "tencent/hy3": { id: "tencent/hy3", name: "Hy3", description: "Hy3 is a 295B-parameter Mixture-of-Experts model from Tencent (21B active, 192 experts with top-8 routing) built for reasoning, agentic workflows, and real-world production use. It supports a configurable reasoning effort:...", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 128000 }, cost: { input: 0.14, output: 0.58, cache_read: 0.035 } }, "tencent/hy3-preview": { id: "tencent/hy3-preview", name: "Hy3 preview", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.18, output: 0.6, cache_read: 0.06 } }, "tencent/hy3:free": { id: "tencent/hy3:free", name: "Tencent: Hy3 (free)", description: "Hy3 is a 295B-parameter Mixture-of-Experts model from Tencent, activating 21B parameters per token. It supports configurable reasoning effort, agentic workflows, reliable tool calling, and long-context tasks across coding, document processing, financial analysis, and frontend development.", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 128000 }, cost: { input: 0, output: 0, reasoning: 0, cache_read: 0 } }, "upstage/solar-pro-3": { id: "upstage/solar-pro-3", name: "Upstage: Solar Pro 3", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "solar-pro", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015 } }, "~x-ai/grok-latest": { id: "~x-ai/grok-latest", name: "xAI: Grok Latest", description: "This model always redirects to the latest Grok model from xAI.", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.3 } }, "mistralai/mistral-large": { id: "mistralai/mistral-large", name: "Mistral Large", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-02-26", last_updated: "2024-02-26", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 25600 }, cost: { input: 2, output: 6, cache_read: 0.2 } }, "mistralai/ministral-8b-2512": { id: "mistralai/ministral-8b-2512", name: "Mistral: Ministral 3 8B 2512", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.15, output: 0.15, cache_read: 0.015 } }, "mistralai/ministral-14b-2512": { id: "mistralai/ministral-14b-2512", name: "Mistral: Ministral 3 14B 2512", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 52429 }, cost: { input: 0.2, output: 0.2, cache_read: 0.02 } }, "mistralai/ministral-3b-2512": { id: "mistralai/ministral-3b-2512", name: "Mistral: Ministral 3 3B 2512", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.1, output: 0.1, cache_read: 0.01 } }, "mistralai/mistral-small-24b-instruct-2501": { id: "mistralai/mistral-small-24b-instruct-2501", name: "Mistral: Mistral Small 3", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-01-30", last_updated: "2025-01-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 16384 }, cost: { input: 0.05, output: 0.08 } }, "mistralai/mistral-large-2407": { id: "mistralai/mistral-large-2407", name: "Mistral Large 2407", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-11-19", last_updated: "2024-11-19", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 2, output: 6, cache_read: 0.2 } }, "mistralai/mistral-medium-3.1": { id: "mistralai/mistral-medium-3.1", name: "Mistral: Mistral Medium 3.1", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-13", last_updated: "2025-08-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 26215 }, cost: { input: 0.4, output: 2, cache_read: 0.04 } }, "mistralai/mistral-nemo": { id: "mistralai/mistral-nemo", name: "Mistral Nemo", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2024-07-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.019, output: 0.03 } }, "mistralai/mistral-saba": { id: "mistralai/mistral-saba", name: "Mistral: Saba", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-02-17", last_updated: "2025-02-17", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.2, output: 0.6, cache_read: 0.02 } }, "mistralai/mistral-small-2603": { id: "mistralai/mistral-small-2603", name: "Mistral Small 4", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-06", release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015 } }, "mistralai/codestral-2508": { id: "mistralai/codestral-2508", name: "Mistral: Codestral 2508", description: "Mistral coding model for code completion, generation, and developer workflows", family: "codestral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-01", last_updated: "2025-08-01", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 51200 }, cost: { input: 0.3, output: 0.9, cache_read: 0.03 } }, "mistralai/mixtral-8x22b-instruct": { id: "mistralai/mixtral-8x22b-instruct", name: "Mistral: Mixtral 8x22B Instruct", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-04-17", last_updated: "2024-04-17", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 65536, output: 13108 }, cost: { input: 2, output: 6, cache_read: 0.2 } }, "mistralai/voxtral-small-24b-2507": { id: "mistralai/voxtral-small-24b-2507", name: "Mistral: Voxtral Small 24B 2507", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-30", last_updated: "2025-10-30", modalities: { input: ["text", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 6400 }, cost: { input: 0.1, output: 0.3, cache_read: 0.01 } }, "mistralai/mistral-small-3.2-24b-instruct": { id: "mistralai/mistral-small-3.2-24b-instruct", name: "Mistral: Mistral Small 3.2 24B", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-06-20", last_updated: "2025-06-20", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 16384 }, cost: { input: 0.09375, output: 0.25 } }, "mistralai/mistral-medium-3-5": { id: "mistralai/mistral-medium-3-5", name: "Mistral: Mistral Medium 3.5", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 1.5, output: 7.5 } }, "mistralai/mistral-small-3.1-24b-instruct": { id: "mistralai/mistral-small-3.1-24b-instruct", name: "Mistral: Mistral Small 3.1 24B", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-03-17", last_updated: "2025-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.351, output: 0.555 } }, "mistralai/mistral-medium-3": { id: "mistralai/mistral-medium-3", name: "Mistral: Mistral Medium 3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-05-07", last_updated: "2025-05-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 26215 }, cost: { input: 0.4, output: 2, cache_read: 0.04 } }, "mistralai/mistral-large-2512": { id: "mistralai/mistral-large-2512", name: "Mistral Large 3", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2025-12-02", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 52429 }, cost: { input: 0.5, output: 1.5, cache_read: 0.05 } }, "bytedance/ui-tars-1.5-7b": { id: "bytedance/ui-tars-1.5-7b", name: "ByteDance: UI-TARS 7B ", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-07-22", last_updated: "2025-07-22", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 2048 }, cost: { input: 0.1, output: 0.2, cache_read: 0.1 } }, "nex-agi/nex-n2-mini": { id: "nex-agi/nex-n2-mini", name: "Nex AGI: Nex-N2-Mini", description: "Nex-N2-Mini is an open-source agentic mixture-of-experts model from Nex AGI, the smaller sibling in the Nex-N2 series. It accepts text and image input and is built for coding, tool use,...", family: "agi", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-24", last_updated: "2026-06-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.025, output: 0.1, cache_read: 0.0025 } }, "nex-agi/nex-n2-pro": { id: "nex-agi/nex-n2-pro", name: "Nex AGI: Nex-N2-Pro", description: "Nex-N2-Pro is an agentic mixture-of-experts model from Nex AGI, with 17B active parameters out of 397B total. Built on the Qwen3.5 architecture, it accepts text and image input and produces...", family: "agi", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-06-08", last_updated: "2026-06-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.25, output: 1, cache_read: 0.025 } }, "thedrummer/rocinante-12b": { id: "thedrummer/rocinante-12b", name: "TheDrummer: Rocinante 12B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-09-30", last_updated: "2024-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 65536, output: 65536 }, cost: { input: 0.25, output: 0.5 } }, "thedrummer/unslopnemo-12b": { id: "thedrummer/unslopnemo-12b", name: "TheDrummer: UnslopNemo 12B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-11-08", last_updated: "2024-11-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1024000, output: 1024000 }, cost: { input: 0.4, output: 0.4 } }, "thedrummer/cydonia-24b-v4.1": { id: "thedrummer/cydonia-24b-v4.1", name: "TheDrummer: Cydonia 24B V4.1", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-09-27", last_updated: "2025-09-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.3, output: 0.5, cache_read: 0.15 } }, "thedrummer/skyfall-36b-v2": { id: "thedrummer/skyfall-36b-v2", name: "TheDrummer: Skyfall 36B V2", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-03-10", last_updated: "2025-03-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.55, output: 0.8, cache_read: 0.25 } }, "undi95/remm-slerp-l2-13b": { id: "undi95/remm-slerp-l2-13b", name: "ReMM SLERP 13B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2023-07-22", last_updated: "2023-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 6144, output: 6144 }, cost: { input: 0.45, output: 0.65 } }, "meta/muse-spark-1.1": { id: "meta/muse-spark-1.1", name: "Muse Spark 1.1", description: "Muse Spark 1.1 is a multimodal reasoning model from Meta, built for agentic tasks. It accepts text, images, video, audio, and PDF documents and returns text, with a 1M-token context...", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-08", last_updated: "2026-07-09", modalities: { input: ["text", "image", "video", "pdf", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "meta/muse-spark-1.2": { id: "meta/muse-spark-1.2", name: "Muse Spark 1.2", description: "Muse Spark 1.2 is a reasoning model from Meta, designed for complex agentic tasks. It accepts text, images, video, audio, and PDF documents, returns text, and offers a 1M-token context...", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-05", last_updated: "2026-08-05", modalities: { input: ["text", "image", "video", "pdf", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "gryphe/mythomax-l2-13b": { id: "gryphe/mythomax-l2-13b", name: "MythoMax 13B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2023-07-02", last_updated: "2023-07-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 4096, output: 4096 }, cost: { input: 0.06, output: 0.06 } }, "inclusionai/ling-3.0-tiny:free": { id: "inclusionai/ling-3.0-tiny:free", name: "inclusionAI: Ling 3.0 Tiny (free)", description: "Ling 3.0 Tiny is a mixture-of-experts model from InclusionAI, with 1.3B active parameters out of 7.9B total. It is designed for responsive agents, instruction following, and multi-turn conversations, with switchable...", family: "ling", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-08-06", last_updated: "2026-08-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "inclusionai/ling-3.0-flash": { id: "inclusionai/ling-3.0-flash", name: "Ling-3.0-flash", description: "*Ling-3.0-flash* is a *124B-parameter Mixture-of-Experts (MoE) model*, with approximately *5.1B parameters activated per token*. The model is designed with *token efficiency and production-scale agentic inference* as key priorities, enabling developers...", family: "ling", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-23", last_updated: "2026-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.06, output: 0.18, cache_read: 0.012 } }, "inclusionai/ring-2.6-1t": { id: "inclusionai/ring-2.6-1t", name: "inclusionAI: Ring-2.6-1T", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "ring", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-05-08", last_updated: "2026-05-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.06 } }, "inclusionai/ling-2.6-1t": { id: "inclusionai/ling-2.6-1t", name: "inclusionAI: Ling-2.6-1T", description: "Tool-capable chat model for instruction following and agentic application workflows", family: "ling", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.3, output: 2.5, cache_read: 0.06 } }, "inclusionai/ling-2.6-flash": { id: "inclusionai/ling-2.6-flash", name: "inclusionAI: Ling-2.6-flash", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "ling", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.1, output: 0.3, cache_read: 0.02 } }, "cognitivecomputations/dolphin-mistral-24b-venice-edition": { id: "cognitivecomputations/dolphin-mistral-24b-venice-edition", name: "Venice: Uncensored", description: "Venice Uncensored Dolphin Mistral 24B Venice Edition is a fine-tuned variant of Mistral-Small-24B-Instruct-2501, developed by dphn.ai in collaboration with Venice.ai. This model is designed as an \u201Cuncensored\u201D instruct-tuned LLM, preserving...", family: "mistral", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.2, output: 0.9 } }, "allenai/olmo-3-32b-think": { id: "allenai/olmo-3-32b-think", name: "AllenAI: Olmo 3 32B Think", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "allenai", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: false, structured_output: true, temperature: true, release_date: "2025-11-21", last_updated: "2025-11-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 65536, output: 65536 }, cost: { input: 0.15, output: 0.5 } }, "meituan/longcat-2.0": { id: "meituan/longcat-2.0", name: "Meituan: LongCat 2.0", description: "LongCat 2.0 is a sparse mixture-of-experts language model from Meituan, with 48B active parameters out of 1.6T total. It is suited for coding, repository-level changes, long-horizon problem solving, and agentic...", family: "longcat", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-20", last_updated: "2026-07-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048756, output: 262144 }, cost: { input: 0.75, output: 3, cache_read: 0.015 } }, "ai21/jamba-large-1.7": { id: "ai21/jamba-large-1.7", name: "AI21: Jamba Large 1.7", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "jamba", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-08", last_updated: "2025-08-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 4096 }, cost: { input: 2, output: 8 } }, "mancer/weaver": { id: "mancer/weaver", name: "Mancer: Weaver (alpha)", description: "General-purpose chat model for instruction following, writing, and analysis", family: "alpha", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2023-08-02", last_updated: "2023-08-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8000, output: 6000 }, cost: { input: 0.5, output: 0.75 } }, "morph/morph-v3-large": { id: "morph/morph-v3-large", name: "Morph: Morph V3 Large", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "morph", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-07-07", last_updated: "2025-07-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 131072 }, cost: { input: 0.9, output: 1.9 } }, "morph/morph-v3-fast": { id: "morph/morph-v3-fast", name: "Morph: Morph V3 Fast", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "morph", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-07-07", last_updated: "2025-07-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 81920, output: 38000 }, cost: { input: 0.8, output: 1.2 } }, "nousresearch/hermes-3-llama-3.1-70b": { id: "nousresearch/hermes-3-llama-3.1-70b", name: "Nous: Hermes 3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "nousresearch", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-08-18", last_updated: "2024-08-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0.7, output: 0.7 } }, "nousresearch/hermes-3-llama-3.1-405b": { id: "nousresearch/hermes-3-llama-3.1-405b", name: "Nous: Hermes 3 405B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "nousresearch", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-08-16", last_updated: "2024-08-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 1, output: 1 } }, "nousresearch/hermes-4-405b": { id: "nousresearch/hermes-4-405b", name: "Nous: Hermes 4 405B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "nousresearch", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 26215 }, cost: { input: 1, output: 3 } }, "nousresearch/hermes-4-70b": { id: "nousresearch/hermes-4-70b", name: "Nous: Hermes 4 70B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "nousresearch", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.13, output: 0.4 } }, "poolside/laguna-xs-2.1": { id: "poolside/laguna-xs-2.1", name: "Poolside: Laguna XS 2.1", description: "Laguna XS 2.1 is the latest coding agent model in the 33B-A3B category from [Poolside](https://poolside.ai/) and a step forward from their Laguna XS.2 model (released in April 2026). It combines...", family: "laguna", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-02", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.1, output: 0.2, cache_read: 0.05 } }, "poolside/laguna-s-2.1": { id: "poolside/laguna-s-2.1", name: "Poolside: Laguna S 2.1", description: "Laguna S 2.1 is the latest coding agent model from [Poolside](). Laguna S 2.1 is a 118B total parameter model with 8B active parameters, scoring 70.2% on Terminal-Bench 2.1 and...", family: "laguna-s", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, cost: { input: 0.1, output: 0.2, cache_read: 0.01 } }, "poolside/laguna-s-2.1:free": { id: "poolside/laguna-s-2.1:free", name: "Poolside: Laguna S 2.1 (free)", description: "Laguna S 2.1 is the latest coding agent model from [Poolside](). Laguna S 2.1 is a 118B total parameter model with 8B active parameters, scoring 70.2% on Terminal-Bench 2.1 and...", family: "laguna-s", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "poolside/laguna-xs-2.1:free": { id: "poolside/laguna-xs-2.1:free", name: "Poolside: Laguna XS 2.1 (free)", description: "Laguna XS 2.1 is the latest coding agent model in the 33B-A3B category from [Poolside](https://poolside.ai/) and a step forward from their Laguna XS.2 model (released in April 2026). It combines...", family: "laguna", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-02", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "minimax/minimax-m2-her": { id: "minimax/minimax-m2-her", name: "MiniMax: MiniMax M2-her", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-01-23", last_updated: "2026-01-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 65536, output: 2048 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "minimax/minimax-m2.7": { id: "minimax/minimax-m2.7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "minimax/minimax-m3": { id: "minimax/minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 512000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "minimax/minimax-m1": { id: "minimax/minimax-m1", name: "MiniMax: MiniMax M1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 40000 }, cost: { input: 0.4, output: 2.2 } }, "minimax/minimax-m2.5": { id: "minimax/minimax-m2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 196608 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "minimax/minimax-m2": { id: "minimax/minimax-m2", name: "MiniMax-M2", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "minimax/minimax-01": { id: "minimax/minimax-01", name: "MiniMax: MiniMax-01", description: "MiniMax multimodal coding model for long-context reasoning and agent tasks", family: "minimax", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-01-15", last_updated: "2025-01-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1000192, output: 1000192 }, cost: { input: 0.2, output: 1.1 } }, "minimax/minimax-m2.1": { id: "minimax/minimax-m2.1", name: "MiniMax-M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "deepseek/deepseek-v3.2-exp": { id: "deepseek/deepseek-v3.2-exp", name: "DeepSeek: DeepSeek V3.2 Exp", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 65536 }, cost: { input: 0.27, output: 0.41 } }, "deepseek/deepseek-v4-pro:discounted": { id: "deepseek/deepseek-v4-pro:discounted", name: "DeepSeek: DeepSeek V4 Pro (lowest price)", description: "This DeepSeek V4 Pro endpoint provides the lowest cost for multi-turn conversations for this model. This is accomplished with an exceptionally low cache read price. By using this endpoint you agree prompts and completions may be retained by DeepSeek and used to train future models.", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 384000 }, cost: { input: 0.435, output: 0.87, reasoning: 0, cache_read: 0.003625 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek model for efficient chat, coding help, and agent loops", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 393216 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "deepseek/deepseek-chat-v3-0324": { id: "deepseek/deepseek-chat-v3-0324", name: "DeepSeek: DeepSeek V3 0324", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-03-24", last_updated: "2025-03-24", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 65536 }, cost: { input: 0.27, output: 1.12, cache_read: 0.135 } }, "deepseek/deepseek-r1-distill-llama-70b": { id: "deepseek/deepseek-r1-distill-llama-70b", name: "DeepSeek: R1 Distill Llama 70B", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: false, temperature: true, release_date: "2025-01-23", last_updated: "2025-01-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 8192 }, cost: { input: 0.8, output: 0.8 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 1.6, output: 3.2, cache_read: 0.135 } }, "deepseek/deepseek-r1-0528": { id: "deepseek/deepseek-r1-0528", name: "DeepSeek: R1 0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-05-28", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 32768 }, cost: { input: 0.7, output: 2.5, cache_read: 0.35 } }, "deepseek/deepseek-v4-flash-0731": { id: "deepseek/deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "DeepSeek V4 Flash 0731 is a sparse mixture-of-experts model from DeepSeek, with 13B active parameters out of 284B total. This re-post-trained revision is suited for coding, reasoning, and agent workflows.", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "deepseek/deepseek-v3.2": { id: "deepseek/deepseek-v3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 65536 }, cost: { input: 0.269, output: 0.4, cache_read: 0.1345 } }, "deepseek/deepseek-r1": { id: "deepseek/deepseek-r1", name: "DeepSeek-R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 64000, output: 16000 }, cost: { input: 0.7, output: 2.5 } }, "deepseek/deepseek-chat": { id: "deepseek/deepseek-chat", name: "DeepSeek Chat", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-09", release_date: "2025-12-01", last_updated: "2026-02-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16000 }, cost: { input: 0.4, output: 1.3 } }, "deepseek/deepseek-v3.1-terminus": { id: "deepseek/deepseek-v3.1-terminus", name: "DeepSeek: DeepSeek V3.1 Terminus", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-22", last_updated: "2025-09-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.27, output: 1, cache_read: 0.135 } }, "deepseek/deepseek-v4-flash:discounted": { id: "deepseek/deepseek-v4-flash:discounted", name: "DeepSeek: DeepSeek V4 Flash (lowest price)", description: "This DeepSeek V4 Flash endpoint provides the lowest cost for multi-turn conversations for this model. This is accomplished with an exceptionally low cache read price. By using this endpoint you agree prompts and completions may be retained by DeepSeek and used to train future models.", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 384000 }, cost: { input: 0.14, output: 0.28, reasoning: 0, cache_read: 0.0028 } }, "deepseek/deepseek-chat-v3.1": { id: "deepseek/deepseek-chat-v3.1", name: "DeepSeek: DeepSeek V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 32768 }, cost: { input: 0.27, output: 1, cache_read: 0.135 } }, "amazon/nova-premier-v1": { id: "amazon/nova-premier-v1", name: "Amazon: Nova Premier 1.0", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "nova", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-10-31", last_updated: "2025-10-31", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32000 }, cost: { input: 2.5, output: 12.5, cache_read: 0.625 } }, "amazon/nova-2-lite-v1": { id: "amazon/nova-2-lite-v1", name: "Amazon: Nova 2 Lite", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "nova", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65535 }, cost: { input: 0.3, output: 2.5 } }, "amazon/nova-pro-v1": { id: "amazon/nova-pro-v1", name: "Amazon: Nova Pro 1.0", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "nova-pro", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 5120 }, cost: { input: 0.8, output: 3.2 } }, "amazon/nova-micro-v1": { id: "amazon/nova-micro-v1", name: "Amazon: Nova Micro 1.0", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova-micro", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 5120 }, cost: { input: 0.035, output: 0.14 } }, "amazon/nova-lite-v1": { id: "amazon/nova-lite-v1", name: "Amazon: Nova Lite 1.0", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova-lite", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 5120 }, cost: { input: 0.06, output: 0.24 } }, "~moonshotai/kimi-latest": { id: "~moonshotai/kimi-latest", name: "MoonshotAI Kimi Latest", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 2.8, output: 14, cache_read: 0.29 } }, "ibm-granite/granite-4.0-h-micro": { id: "ibm-granite/granite-4.0-h-micro", name: "IBM: Granite 4.0 Micro", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "granite", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-10-20", last_updated: "2025-10-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.017, output: 0.112 } }, "ibm-granite/granite-4.1-8b": { id: "ibm-granite/granite-4.1-8b", name: "IBM: Granite 4.1 8B", description: "Tool-capable chat model for instruction following and agentic application workflows", family: "granite", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.05, output: 0.1, cache_read: 0.05 } }, "x-ai/grok-4.20-multi-agent": { id: "x-ai/grok-4.20-multi-agent", name: "SpaceXAI: Grok 4.20 Multi-Agent", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: false, structured_output: true, temperature: true, release_date: "2026-03-31", last_updated: "2026-03-31", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "x-ai/grok-4.3": { id: "x-ai/grok-4.3", name: "Grok 4.3", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 4096 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "x-ai/grok-4.5": { id: "x-ai/grok-4.5", name: "Grok 4.5", description: "Grok 4.5 is SpaceXAI's smartest model with frontier performance on coding, knowledge work, and STEM.", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.3 } }, "x-ai/grok-build-0.1": { id: "x-ai/grok-build-0.1", name: "Grok Build 0.1", description: "Grok coding model for agentic engineering, edits, and codebase workflows", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1, output: 2, cache_read: 0.2 } }, "x-ai/grok-4.20": { id: "x-ai/grok-4.20", name: "SpaceXAI: Grok 4.20", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-31", last_updated: "2026-03-31", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "kwaipilot/kat-coder-pro-v2": { id: "kwaipilot/kat-coder-pro-v2", name: "Kwaipilot: KAT-Coder-Pro V2", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "kat-coder", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-27", last_updated: "2026-03-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 80000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "kwaipilot/kat-coder-pro-v2.5": { id: "kwaipilot/kat-coder-pro-v2.5", name: "Kwaipilot: KAT-Coder-Pro V2.5", description: "KAT-Coder-Pro V2.5 is a flagship-level Agentic Coding model that can directly hand over an entire issue or an entire business workflow to it, allowing it to autonomously locate and make...", family: "kat-coder", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-10", last_updated: "2026-07-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 80000 }, cost: { input: 0.74, output: 2.96, cache_read: 0.15 } }, "kwaipilot/kat-coder-air-v2.5": { id: "kwaipilot/kat-coder-air-v2.5", name: "Kwaipilot: KAT-Coder-Air V2.5", description: "KAT-Coder-Air V2.5 is a flagship-level Agentic Coding model that can directly hand over an entire issue or an entire business workflow to it, allowing it to autonomously locate and make...", family: "kat-coder", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-10", last_updated: "2026-07-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 80000 }, cost: { input: 0.15, output: 0.6, cache_read: 0.03 } }, "sao10k/l3.1-euryale-70b": { id: "sao10k/l3.1-euryale-70b", name: "Sao10K: Llama 3.1 Euryale 70B v2.2", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-08-28", last_updated: "2024-08-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0.85, output: 0.85 } }, "sao10k/l3.3-euryale-70b": { id: "sao10k/l3.3-euryale-70b", name: "Sao10K: Llama 3.3 Euryale 70B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-12-18", last_updated: "2024-12-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0.65, output: 0.75 } }, "sao10k/l3-lunaris-8b": { id: "sao10k/l3-lunaris-8b", name: "Sao10K: Llama 3 8B Lunaris", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-08-13", last_updated: "2024-08-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 16384 }, cost: { input: 0.04, output: 0.05 } }, "openrouter/pareto-code": { id: "openrouter/pareto-code", name: "Pareto Code Router", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-21", last_updated: "2026-05-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 65536 }, cost: { input: 0, output: 0 } }, "openrouter/bodybuilder": { id: "openrouter/bodybuilder", name: "Body Builder (beta)", description: "Preview model for early access evaluation, prototyping, and compatibility testing", attachment: false, reasoning: false, tool_call: false, release_date: "2026-03-15", last_updated: "2026-03-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32768 }, status: "beta", cost: { input: 0, output: 0 } }, "openrouter/free": { id: "openrouter/free", name: "OpenRouter Free Models Router", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-01", last_updated: "2026-02-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32768 }, cost: { input: 0, output: 0 } }, "openrouter/auto": { id: "openrouter/auto", name: "Auto Router", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-15", last_updated: "2026-03-15", modalities: { input: ["audio", "image", "pdf", "text", "video"], output: ["image", "text"] }, open_weights: false, limit: { context: 2000000, output: 32768 }, cost: { input: 0, output: 0 } }, "aion-labs/aion-2.0": { id: "aion-labs/aion-2.0", name: "AionLabs: Aion-2.0", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.8, output: 1.6, cache_read: 0.2 } }, "aion-labs/aion-3.0-mini": { id: "aion-labs/aion-3.0-mini", name: "AionLabs: Aion-3.0-Mini", description: "Aion-3.0 Mini is a multi-model roleplaying and storytelling system from AionLabs, built on the DeepSeek family of models. It uses a collaborative generation process in which multiple specialized models each...", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-07", last_updated: "2026-07-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.7, output: 1.4, cache_read: 0.18 } }, "aion-labs/aion-rp-llama-3.1-8b": { id: "aion-labs/aion-rp-llama-3.1-8b", name: "AionLabs: Aion-RP 1.0 (8B)", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-02-04", last_updated: "2025-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.8, output: 1.6 } }, "aion-labs/aion-3.0": { id: "aion-labs/aion-3.0", name: "AionLabs: Aion-3.0", description: "Aion-3.0 is a multi-model roleplaying and storytelling system from AionLabs, built on the GLM family of models. It uses a collaborative generation process in which multiple specialized models each contribute...", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-07", last_updated: "2026-07-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 3, output: 6, cache_read: 0.75 } }, "xiaomi/mimo-v2.5": { id: "xiaomi/mimo-v2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028, tiers: [{ input: 0.8, output: 4, cache_read: 0.16, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.8, output: 4, cache_read: 0.16 } } }, "xiaomi/mimo-v2.5-pro": { id: "xiaomi/mimo-v2.5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.4, output: 1.5, cache_read: 0.08, tiers: [{ input: 2, output: 6, cache_read: 0.4, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.4 } } }, "writer/palmyra-x5": { id: "writer/palmyra-x5", name: "Writer: Palmyra X5", description: "General-purpose chat model for instruction following, writing, and analysis", family: "palmyra", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-01-21", last_updated: "2026-01-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1040000, output: 8192 }, cost: { input: 0.6, output: 6 } }, "anthropic/claude-sonnet-4.6": { id: "anthropic/claude-sonnet-4.6", name: "Claude Sonnet 4.6", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-fable-5": { id: "anthropic/claude-fable-5", name: "Claude Fable 5", description: "Claude Fable 5 is a Mythos-class model from Anthropic, built for autonomous knowledge work and coding. It supports text, image, and file inputs with text output, with reasoning support and...", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4.8-fast": { id: "anthropic/claude-opus-4.8-fast", name: "Claude Opus 4.8", description: "Fast-mode variant of [Opus 4.8](/anthropic/claude-opus-4.8) - identical capabilities with higher output speed at 2x pricing relative to regular Opus 4.8. Learn more in Anthropic's docs: https://platform.claude.com/docs/en/build-with-claude/fast-mode", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4.1": { id: "anthropic/claude-opus-4.1", name: "Claude Opus 4.1 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-opus-4.5": { id: "anthropic/claude-opus-4.5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4.7": { id: "anthropic/claude-opus-4.7", name: "Claude Opus 4.7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-4.5": { id: "anthropic/claude-sonnet-4.5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-3-haiku": { id: "anthropic/claude-3-haiku", name: "Anthropic: Claude 3 Haiku", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2024-03-13", last_updated: "2024-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, cost: { input: 0.25, output: 1.25, cache_read: 0.03, cache_write: 0.3 } }, "anthropic/claude-opus-5-fast": { id: "anthropic/claude-opus-5-fast", name: "Claude Opus 5", description: "Fast-mode variant of [Opus 5](/anthropic/claude-opus-5) - identical capabilities with higher output speed at 2x pricing relative to regular Opus 5. Learn more in Anthropic's docs: https://platform.claude.com/docs/en/build-with-claude/fast-mode", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-sonnet-4": { id: "anthropic/claude-sonnet-4", name: "Anthropic: Claude Sonnet 4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-haiku-4.5": { id: "anthropic/claude-haiku-4.5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "anthropic/claude-opus-4": { id: "anthropic/claude-opus-4", name: "Anthropic: Claude Opus 4 ($$$$)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-opus-4.8": { id: "anthropic/claude-opus-4.8", name: "Claude Opus 4.8", description: "Claude Opus 4.8 is Anthropic's most capable generally available model in the Opus family. It supports text, image, and file inputs with text output, with reasoning support and a 1M-token...", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-5": { id: "anthropic/claude-sonnet-5", name: "Claude Sonnet 5", description: "Sonnet 5 is Anthropic's most capable Sonnet-class model, with frontier performance across coding, agents, and professional work. It supports adaptive thinking with selectable reasoning effort levels (low, medium, high, max,...", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "anthropic/claude-opus-5": { id: "anthropic/claude-opus-5", name: "Claude Opus 5", description: "Claude Opus 5 is Anthropic\u2019s flagship model for demanding reasoning, coding, and long-horizon agentic work. It is particularly strong at end-to-end software tasks, code review and bug finding, visual analysis...", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4.6": { id: "anthropic/claude-opus-4.6", name: "Claude Opus 4.6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4.7-fast": { id: "anthropic/claude-opus-4.7-fast", name: "Claude Opus 4.7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 } }, "~anthropic/claude-sonnet-latest": { id: "~anthropic/claude-sonnet-latest", name: "Anthropic Claude Sonnet Latest", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "~anthropic/claude-opus-latest": { id: "~anthropic/claude-opus-latest", name: "Anthropic: Claude Opus Latest", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "~anthropic/claude-haiku-latest": { id: "~anthropic/claude-haiku-latest", name: "Anthropic Claude Haiku Latest", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "~anthropic/claude-fable-latest": { id: "~anthropic/claude-fable-latest", name: "Anthropic: Claude Fable Latest ($$$$)", description: "This model always redirects to the latest model in the Claude Fable family.", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "z-ai/glm-4.6v": { id: "z-ai/glm-4.6v", name: "GLM-4.6V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.3, output: 0.9, cache_read: 0.055 } }, "z-ai/glm-5": { id: "z-ai/glm-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.2 } }, "z-ai/glm-4.5-air": { id: "z-ai/glm-4.5-air", name: "GLM-4.5-Air", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.13, output: 0.85, cache_read: 0.025 } }, "z-ai/glm-5.1": { id: "z-ai/glm-5.1", name: "GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 1.38, output: 4.4, cache_read: 0.26 } }, "z-ai/glm-4.7-flash": { id: "z-ai/glm-4.7-flash", name: "GLM-4.7-Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 16384 }, cost: { input: 0.07, output: 0.4, cache_read: 0.01 } }, "z-ai/glm-5.2": { id: "z-ai/glm-5.2", name: "GLM-5.2", description: "GLM 5.2 is a large-scale reasoning model from Z.ai. It supports text input and output with a 1M-token context window, and is suited for long-horizon agent workflows, project-level software engineering,...", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1024000, output: 128000 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "z-ai/glm-4.6": { id: "z-ai/glm-4.6", name: "GLM-4.6", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 0.55, output: 2.2, cache_read: 0.11 } }, "z-ai/glm-4.5": { id: "z-ai/glm-4.5", name: "GLM-4.5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "z-ai/glm-4.5v": { id: "z-ai/glm-4.5v", name: "GLM-4.5V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 16384 }, cost: { input: 0.6, output: 1.8, cache_read: 0.11 } }, "z-ai/glm-4.7": { id: "z-ai/glm-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "z-ai/glm-5-turbo": { id: "z-ai/glm-5-turbo", name: "GLM-5-Turbo", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24 } }, "z-ai/glm-5v-turbo": { id: "z-ai/glm-5v-turbo", name: "GLM-5V-Turbo", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24 } }, "perplexity/sonar-pro-search": { id: "perplexity/sonar-pro-search", name: "Perplexity: Sonar Pro Search", description: "Advanced Sonar search model for deeper research and cited synthesis", family: "sonar-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: false, structured_output: true, temperature: true, release_date: "2025-10-30", last_updated: "2025-10-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8000 }, cost: { input: 3, output: 15 } }, "perplexity/sonar-deep-research": { id: "perplexity/sonar-deep-research", name: "Perplexity: Sonar Deep Research", description: "Sonar search model for current answers, retrieval, and citation-backed chat", family: "sonar-deep-research", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: false, temperature: true, release_date: "2025-03-07", last_updated: "2025-03-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 25600 }, cost: { input: 2, output: 8, reasoning: 3 } }, "perplexity/sonar": { id: "perplexity/sonar", name: "Perplexity: Sonar", description: "Sonar search model for current answers, retrieval, and citation-backed chat", family: "sonar", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-01-27", last_updated: "2025-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 127072, output: 25415 }, cost: { input: 1, output: 1 } }, "perplexity/sonar-pro": { id: "perplexity/sonar-pro", name: "Perplexity: Sonar Pro", description: "Advanced Sonar search model for deeper research and cited synthesis", family: "sonar-pro", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-03-07", last_updated: "2025-03-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8000 }, cost: { input: 3, output: 15 } }, "perplexity/sonar-reasoning-pro": { id: "perplexity/sonar-reasoning-pro", name: "Perplexity: Sonar Reasoning Pro", description: "Web-grounded reasoning model for multi-step research and cited answers", family: "sonar-reasoning", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: false, temperature: true, release_date: "2025-03-07", last_updated: "2025-03-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 25600 }, cost: { input: 2, output: 8 } }, "moonshotai/kimi-k2.5": { id: "moonshotai/kimi-k2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "moonshotai/kimi-k2.6": { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.8, output: 3.4, cache_read: 0.16 } }, "moonshotai/kimi-k2.7-code": { id: "moonshotai/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "MoonshotAI: Kimi K2.7 Code is a coding-focused model in Moonshot AI's Kimi K2 family, built to complete end-to-end programming tasks reliably over long contexts. It uses a native multimodal mixture-of-experts...", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "moonshotai/kimi-k2": { id: "moonshotai/kimi-k2", name: "MoonshotAI: Kimi K2 0711", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-07-11", last_updated: "2025-07-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 100352 }, cost: { input: 0.57, output: 2.3 } }, "moonshotai/kimi-k2-thinking": { id: "moonshotai/kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-08", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 100352 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "moonshotai/kimi-k3": { id: "moonshotai/kimi-k3", name: "Kimi K3", description: "Kimi K3 is a 2.8T parameter open-weight multimodal reasoning model from Moonshot AI. It is suited for complex coding, knowledge work, and long-horizon agentic workflows, and is particularly strong at...", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "moonshotai/kimi-k2-0905": { id: "moonshotai/kimi-k2-0905", name: "MoonshotAI: Kimi K2 0905", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-04", last_updated: "2025-09-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 100352 }, cost: { input: 0.6, output: 2.5 } }, "openai/gpt-5.1-codex-mini": { id: "openai/gpt-5.1-codex-mini", name: "GPT-5.1 Codex mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.03 } }, "openai/gpt-chat-latest": { id: "openai/gpt-chat-latest", name: "OpenAI: GPT Chat Latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2026-05-05", last_updated: "2026-05-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "openai/gpt-5.2-pro": { id: "openai/gpt-5.2-pro", name: "GPT-5.2 Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 21, output: 168 } }, "openai/gpt-5.5-pro": { id: "openai/gpt-5.5-pro", name: "GPT-5.5 Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180 } }, "openai/gpt-4.1-mini": { id: "openai/gpt-4.1-mini", name: "GPT-4.1 mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "openai/gpt-4o": { id: "openai/gpt-4o", name: "GPT-4o", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.4-pro": { id: "openai/gpt-5.4-pro", name: "GPT-5.4 Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180 } }, "openai/gpt-audio-mini": { id: "openai/gpt-audio-mini", name: "OpenAI: GPT Audio Mini", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text", "audio", "pdf"], output: ["text", "audio"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.6, output: 2.4 } }, "openai/gpt-5.6-sol": { id: "openai/gpt-5.6-sol", name: "GPT-5.6 Sol", description: "GPT-5.6 Sol is the flagship model in OpenAI's GPT-5.6 series. It is suited for complex reasoning, coding, and agentic workflows, and is particularly strong at command-line and multi-step coding tasks...", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "openai/o3-mini-high": { id: "openai/o3-mini-high", name: "OpenAI: o3 Mini High", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2025-02-12", last_updated: "2025-02-12", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-4o-mini-2024-07-18": { id: "openai/gpt-4o-mini-2024-07-18", name: "OpenAI: GPT-4o-mini (2024-07-18)", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "openai/gpt-4.1-nano": { id: "openai/gpt-4.1-nano", name: "GPT-4.1 nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.03, output: 0.13, cache_read: 0.03 } }, "openai/gpt-oss-safeguard-20b": { id: "openai/gpt-oss-safeguard-20b", name: "OpenAI: gpt-oss-safeguard-20b", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-29", last_updated: "2025-10-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 65536 }, cost: { input: 0.075, output: 0.3, cache_read: 0.0375 } }, "openai/o3-mini": { id: "openai/o3-mini", name: "o3-mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-5.6-sol-pro": { id: "openai/gpt-5.6-sol-pro", name: "GPT-5.6 Sol", description: "GPT-5.6 Sol Pro is the same underlying model as [GPT-5.6 Sol](https://openrouter.ai/openai/gpt-5.6-sol), served with `reasoning.mode` set to `pro` for higher-quality responses on complex tasks. Learn more in OpenAI's docs: https://developers.openai.com/api/docs/guides/reasoning#reasoning-mode", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "openai/gpt-3.5-turbo-0613": { id: "openai/gpt-3.5-turbo-0613", name: "OpenAI: GPT-3.5 Turbo (older v0613)", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 4095, output: 4096 }, cost: { input: 1, output: 2 } }, "openai/o3-pro": { id: "openai/o3-pro", name: "o3-pro", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-06-10", last_updated: "2025-06-10", modalities: { input: ["text", "pdf", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 20, output: 80 } }, "openai/gpt-4o-mini": { id: "openai/gpt-4o-mini", name: "GPT-4o mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT-5", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-audio": { id: "openai/gpt-audio", name: "OpenAI: GPT Audio", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text", "audio", "pdf"], output: ["text", "audio"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10 } }, "openai/o4-mini-high": { id: "openai/o4-mini-high", name: "OpenAI: o4 Mini High", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.275 } }, "openai/gpt-3.5-turbo": { id: "openai/gpt-3.5-turbo", name: "GPT-3.5-turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2021-09-01", release_date: "2023-03-01", last_updated: "2023-11-06", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 16385, output: 4096 }, cost: { input: 0.5, output: 1.5 } }, "openai/gpt-4o-2024-05-13": { id: "openai/gpt-4o-2024-05-13", name: "GPT-4o (2024-05-13)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-05-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 5, output: 15 } }, "openai/gpt-4o-2024-11-20": { id: "openai/gpt-4o-2024-11-20", name: "GPT-4o (2024-11-20)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-11-20", last_updated: "2024-11-20", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT-5.4", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25 } }, "openai/gpt-5.6-luna-pro": { id: "openai/gpt-5.6-luna-pro", name: "GPT-5.6 Luna", description: "GPT-5.6 Luna Pro is the same underlying model as [GPT-5.6 Luna](https://openrouter.ai/openai/gpt-5.6-luna), served with `reasoning.mode` set to `pro` for higher-quality responses on complex tasks. Learn more in OpenAI's docs: https://developers.openai.com/api/docs/guides/reasoning#reasoning-mode", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, cache_write: 0.25 } }, "openai/gpt-5.2-chat": { id: "openai/gpt-5.2-chat", name: "OpenAI: GPT-5.2 Chat (retires Aug 10)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2025-12-10", last_updated: "2025-12-10", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.2-codex": { id: "openai/gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT-5.4 nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "openai/gpt-5-pro": { id: "openai/gpt-5-pro", name: "GPT-5 Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 15, output: 120 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT-5.4 mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.03, output: 0.17, cache_read: 0.03 } }, "openai/gpt-3.5-turbo-16k": { id: "openai/gpt-3.5-turbo-16k", name: "OpenAI: GPT-3.5 Turbo 16k", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2023-08-28", last_updated: "2023-08-28", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 16385, output: 4096 }, cost: { input: 3, output: 4 } }, "openai/o1": { id: "openai/o1", name: "o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2023-09", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 15, output: 60, cache_read: 7.5 } }, "openai/gpt-5.6-luna": { id: "openai/gpt-5.6-luna", name: "GPT-5.6 Luna", description: "GPT-5.6 Luna is a fast, cost-efficient model in OpenAI's GPT-5.6 series. It is suited for high-volume, latency-sensitive tasks such as chat, classification, and lightweight agentic workflows, providing capable reasoning for...", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, cache_write: 0.25 } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.3-codex": { id: "openai/gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT-5 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/gpt-5.3-chat": { id: "openai/gpt-5.3-chat", name: "OpenAI: GPT-5.3 Chat (retires Aug 10)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/o1-pro": { id: "openai/o1-pro", name: "o1-pro", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: true, temperature: false, knowledge: "2023-09", release_date: "2025-03-19", last_updated: "2025-03-19", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 150, output: 600 } }, "openai/gpt-5-image": { id: "openai/gpt-5-image", name: "OpenAI: GPT-5 Image ($$$$)", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: false, structured_output: true, temperature: true, release_date: "2025-10-14", last_updated: "2025-10-14", modalities: { input: ["image", "text", "pdf"], output: ["image", "text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 10, output: 10, cache_read: 1.25 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT-5.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4-turbo-preview": { id: "openai/gpt-4-turbo-preview", name: "OpenAI: GPT-4 Turbo Preview ($$$$)", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 10, output: 30 } }, "openai/gpt-4-turbo": { id: "openai/gpt-4-turbo", name: "GPT-4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 10, output: 30 } }, "openai/gpt-4o-2024-08-06": { id: "openai/gpt-4o-2024-08-06", name: "GPT-4o (2024-08-06)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-08-06", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.4-image-2": { id: "openai/gpt-5.4-image-2", name: "OpenAI: GPT-5.4 Image 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: false, structured_output: true, temperature: false, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["image", "text", "pdf"], output: ["image", "text"] }, open_weights: false, limit: { context: 272000, output: 128000 }, cost: { input: 8, output: 15, cache_read: 2 } }, "openai/gpt-5.1-codex": { id: "openai/gpt-5.1-codex", name: "GPT-5.1 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "openai/gpt-5-nano": { id: "openai/gpt-5-nano", name: "GPT-5 Nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "openai/o3": { id: "openai/o3", name: "o3", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/gpt-3.5-turbo-instruct": { id: "openai/gpt-3.5-turbo-instruct", name: "OpenAI: GPT-3.5 Turbo Instruct", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2023-09-28", last_updated: "2023-09-28", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 4095, output: 4096 }, cost: { input: 1.5, output: 2 } }, "openai/gpt-5.6-terra": { id: "openai/gpt-5.6-terra", name: "GPT-5.6 Terra", description: "GPT-5.6 Terra is a balanced model in OpenAI's GPT-5.6 series, positioned between the flagship Sol tier and the cost-efficient Luna tier. It is suited for everyday coding, reasoning, and agentic...", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 2.5 } }, "openai/gpt-5-image-mini": { id: "openai/gpt-5-image-mini", name: "OpenAI: GPT-5 Image Mini", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: false, structured_output: true, temperature: true, release_date: "2025-10-16", last_updated: "2025-10-16", modalities: { input: ["pdf", "image", "text"], output: ["image", "text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 2.5, output: 2, cache_read: 0.25 } }, "openai/gpt-5.6-terra-pro": { id: "openai/gpt-5.6-terra-pro", name: "GPT-5.6 Terra", description: "GPT-5.6 Terra Pro is the same underlying model as [GPT-5.6 Terra](https://openrouter.ai/openai/gpt-5.6-terra), served with `reasoning.mode` set to `pro` for higher-quality responses on complex tasks. Learn more in OpenAI's docs: https://developers.openai.com/api/docs/guides/reasoning#reasoning-mode", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 2.5 } }, "openai/gpt-4.1": { id: "openai/gpt-4.1", name: "GPT-4.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/o4-mini": { id: "openai/o4-mini", name: "o4-mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.275 } }, "openai/gpt-5.1-codex-max": { id: "openai/gpt-5.1-codex-max", name: "GPT-5.1 Codex Max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4": { id: "openai/gpt-4", name: "GPT-4", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-11", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 8191, output: 4096 }, cost: { input: 30, output: 60 } }, "baidu/ernie-4.5-vl-424b-a47b": { id: "baidu/ernie-4.5-vl-424b-a47b", name: "Baidu: ERNIE 4.5 VL 424B A47B ", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "ernie", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: false, structured_output: false, temperature: true, release_date: "2025-06-30", last_updated: "2025-06-30", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: false, limit: { context: 123000, output: 16000 }, cost: { input: 0.42, output: 1.25 } }, "meta-llama/llama-3.1-70b-instruct": { id: "meta-llama/llama-3.1-70b-instruct", name: "Meta: Llama 3.1 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0.4, output: 0.4 } }, "meta-llama/llama-guard-4-12b": { id: "meta-llama/llama-guard-4-12b", name: "Meta: Llama Guard 4 12B", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "llama", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-04-30", last_updated: "2025-04-30", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 16384 }, cost: { input: 0.18, output: 0.18 } }, "meta-llama/llama-3.2-1b-instruct": { id: "meta-llama/llama-3.2-1b-instruct", name: "Meta: Llama 3.2 1B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 60000, output: 60000 }, cost: { input: 0.027, output: 0.201 } }, "meta-llama/llama-3.3-70b-instruct": { id: "meta-llama/llama-3.3-70b-instruct", name: "Llama-3.3-70B-Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.1, output: 0.32 } }, "meta-llama/llama-4-maverick": { id: "meta-llama/llama-4-maverick", name: "Meta: Llama 4 Maverick", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 16384 }, cost: { input: 0.2, output: 0.696 } }, "meta-llama/llama-4-scout": { id: "meta-llama/llama-4-scout", name: "Meta: Llama 4 Scout", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 327680, output: 16384 }, cost: { input: 0.1, output: 0.3 } }, "meta-llama/llama-3.2-3b-instruct": { id: "meta-llama/llama-3.2-3b-instruct", name: "Meta: Llama 3.2 3B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.05, output: 0.33 } }, "meta-llama/llama-3.1-8b-instruct": { id: "meta-llama/llama-3.1-8b-instruct", name: "Meta: Llama 3.1 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.02, output: 0.04 } }, "arcee-ai/virtuoso-large": { id: "arcee-ai/virtuoso-large", name: "Arcee AI: Virtuoso Large", description: "Flagship model for demanding analysis, coding, and production agent workflows", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-05-05", last_updated: "2025-05-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 64000 }, cost: { input: 0.75, output: 1.2 } }, "arcee-ai/trinity-large-thinking": { id: "arcee-ai/trinity-large-thinking", name: "Arcee AI: Trinity Large Thinking", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "trinity", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.22, output: 0.85, cache_read: 0.06 } }, "bytedance-seed/seed-1.6": { id: "bytedance-seed/seed-1.6", name: "ByteDance Seed: Seed 1.6", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.25, output: 2 } }, "bytedance-seed/seed-2.0-mini": { id: "bytedance-seed/seed-2.0-mini", name: "ByteDance Seed: Seed-2.0-Mini", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 131072 }, cost: { input: 0.1, output: 0.4 } }, "bytedance-seed/seed-1.6-flash": { id: "bytedance-seed/seed-1.6-flash", name: "ByteDance Seed: Seed 1.6 Flash", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.075, output: 0.3 } }, "bytedance-seed/seed-2.0-lite": { id: "bytedance-seed/seed-2.0-lite", name: "ByteDance Seed: Seed-2.0-Lite", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-10", last_updated: "2026-03-10", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 131072 }, cost: { input: 0.25, output: 2 } }, "kilo-auto/balanced": { id: "kilo-auto/balanced", name: "Auto Balanced", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "1970-01-01", last_updated: "1970-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.325, output: 1.95, reasoning: 0, cache_read: 0.0325, cache_write: 0.40625 } }, "kilo-auto/small": { id: "kilo-auto/small", name: "Auto Small", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "1970-01-01", last_updated: "1970-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.05, output: 0.4, reasoning: 0, cache_read: 0.005 } }, "kilo-auto/free": { id: "kilo-auto/free", name: "Auto Free", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "1970-01-01", last_updated: "1970-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 1e4 }, cost: { input: 0, output: 0, reasoning: 0, cache_read: 0, cache_write: 0 } }, "kilo-auto/frontier": { id: "kilo-auto/frontier", name: "Auto Frontier", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "1970-01-01", last_updated: "1970-01-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, reasoning: 0, cache_read: 0.5, cache_write: 6.25 } }, "kilo-auto/efficient": { id: "kilo-auto/efficient", name: "Auto Efficient", description: "Routes each request to the cheapest model that gets the job done, based on continuously benchmarked accuracy and cost.", family: "auto", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "1970-01-01", last_updated: "1970-01-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.325, output: 1.95, reasoning: 0, cache_read: 0.0325, cache_write: 0.40625 } }, "stepfun/step-3.7-flash:free": { id: "stepfun/step-3.7-flash:free", name: "StepFun: Step 3.7 Flash (free)", description: "Step 3.7 Flash is StepFun's latest high-efficiency multimodal Mixture-of-Experts model. It pairs a 196B-parameter language backbone with a vision encoder for native image and video understanding, activating roughly 11B parameters per token. The model supports a 256K context window and exposes selectable reasoning levels (high/medium/low), letting callers trade off speed, cost, and depth of reasoning. Designed for coding, agentic workflows, structured outputs, and long-context productivity tasks.", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0, reasoning: 0, cache_read: 0 } }, "stepfun/step-3.5-flash": { id: "stepfun/step-3.5-flash", name: "Step 3.5 Flash", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-01-29", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.1, output: 0.3 } }, "stepfun/step-3.7-flash": { id: "stepfun/step-3.7-flash", name: "Step 3.7 Flash", description: "Step 3.7 Flash is StepFun's latest high-efficiency multimodal Mixture-of-Experts model. It pairs a 196B-parameter language backbone with a vision encoder for native image and video understanding, activating roughly 11B parameters...", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0.2, output: 1.15, cache_read: 0.04 } }, "anthracite-org/magnum-v4-72b": { id: "anthracite-org/magnum-v4-72b", name: "Magnum v4 72B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 2048 }, cost: { input: 3, output: 5 } } } }, "merge-gateway": { id: "merge-gateway", env: ["MERGE_GATEWAY_API_KEY"], npm: "merge-gateway-ai-sdk-provider", name: "Merge Gateway", doc: "https://docs.merge.dev/merge-gateway", models: { "cohere/command-r-08-2024": { id: "cohere/command-r-08-2024", name: "Command R 08-2024", description: "Cohere retrieval model for long-context chat and enterprise RAG workflows", family: "command-r", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-08-30", last_updated: "2024-08-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 0.15, output: 0.6 } }, "cohere/command-a-03-2025": { id: "cohere/command-a-03-2025", name: "Command A 03-2025", description: "Cohere command model for multilingual enterprise agents, tools, and chat", family: "command-a", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06-01", release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8000 }, cost: { input: 2.5, output: 10 } }, "cohere/command-r-plus-08-2024": { id: "cohere/command-r-plus-08-2024", name: "Command R+ 08-2024", description: "Cohere's RAG workhorse for long-context enterprise search and tool use", family: "command-r", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-08-30", last_updated: "2024-08-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 2.5, output: 10 } }, "cohere/command-r7b-12-2024": { id: "cohere/command-r7b-12-2024", name: "Command R7B 12-2024", description: "Cohere retrieval model for long-context chat and enterprise RAG workflows", family: "command-r", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-12-02", last_updated: "2024-12-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 0.0375, output: 0.15 } }, "nvidia/nemotron-nano-9b-v2": { id: "nvidia/nemotron-nano-9b-v2", name: "Nemotron Nano 9B", description: "Compact Nemotron model for efficient reasoning and deployable AI agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-18", last_updated: "2025-08-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.06, output: 0.23 } }, "google/gemini-2.5-computer-use-preview-10-2025": { id: "google/gemini-2.5-computer-use-preview-10-2025", name: "Gemini 2.5 Computer Use Preview (10-2025)", description: "Specialized Gemini 2.5 model for browser-control agents that automate UI tasks", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2025-10-07", last_updated: "2025-10-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, cost: { input: 1.25, output: 10 } }, "google/gemini-flash-latest": { id: "google/gemini-flash-latest", name: "Gemini Flash Latest", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, input_audio: 1.5 } }, "google/gemini-3.5-flash": { id: "google/gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, cache_read: 0.15, input_audio: 1.5 } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, input_audio: 1 } }, "google/gemini-3.5-flash-lite": { id: "google/gemini-3.5-flash-lite", name: "Gemini 3.5 Flash-Lite", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "google/gemini-3.1-flash-lite-preview": { id: "google/gemini-3.1-flash-lite-preview", name: "Gemini 3.1 Flash Lite Preview", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "google/gemini-3-flash-preview": { id: "google/gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, input_audio: 1 } }, "google/gemini-3.1-pro-preview-customtools": { id: "google/gemini-3.1-pro-preview-customtools", name: "Gemini 3.1 Pro Preview Custom Tools", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "google/gemma-4-26b-a4b-it": { id: "google/gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.13, output: 0.4 } }, "google/gemini-embedding-001": { id: "google/gemini-embedding-001", name: "Gemini Embedding 001", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "gemini", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, knowledge: "2025-05", release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 2048, output: 4096 }, cost: { input: 0.15, output: 0 } }, "google/gemini-3.6-flash": { id: "google/gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15 } }, "google/gemini-3.1-flash-lite": { id: "google/gemini-3.1-flash-lite", name: "Gemini 3.1 Flash-Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "google/gemma-4-31b-it": { id: "google/gemma-4-31b-it", name: "Gemma 4 31B It", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: false, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.14, output: 0.4 } }, "google/gemini-3.1-flash-image": { id: "google/gemini-3.1-flash-image", name: "Gemini 3.1 Flash Image", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.5, output: 3 } }, "google/gemini-2.5-flash-image": { id: "google/gemini-2.5-flash-image", name: "Gemini 2.5 Flash Image", description: "Nano Banana image model for fast generation, edits, and character-consistent assets", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2024-06", release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.3, output: 2.5 } }, "google/gemini-3-pro-image": { id: "google/gemini-3-pro-image", name: "Gemini 3 Pro Image", description: "Nano Banana Pro for higher-fidelity image generation and design-heavy edits", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 65536 }, cost: { input: 2, output: 12 } }, "google/gemini-3.1-pro-preview": { id: "google/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "google/gemini-flash-lite-latest": { id: "google/gemini-flash-lite-latest", name: "Gemini Flash-Lite Latest", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "google/gemini-3-pro-preview": { id: "google/gemini-3-pro-preview", name: "Gemini 3 Pro Preview", description: "Preview Gemini flagship for complex reasoning, coding, and rich multimodal prompts", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "google/gemini-2.5-flash-lite": { id: "google/gemini-2.5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 512, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01, input_audio: 0.3 } }, "thinkingmachines/inkling": { id: "thinkingmachines/inkling", name: "Inkling", description: "Multimodal MoE reasoning model (975B total, 41B active) for text, image, and audio", family: "ling", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048000, output: 32000 }, cost: { input: 1, output: 4.05, cache_read: 0.17 } }, "sakana/fugu-ultra": { id: "sakana/fugu-ultra", name: "Fugu Ultra", description: "Quality-first multi-agent model for hard research, analysis, and competitions", family: "fugu", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: false, release_date: "2026-06-15", last_updated: "2026-06-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 250000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "qwen/qwen3-coder-480b-a35b-instruct": { id: "qwen/qwen3-coder-480b-a35b-instruct", name: "Qwen3-Coder 480B-A35B Instruct", description: "Open Qwen coding heavyweight for repository reasoning and agentic engineering", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.22, output: 1.8 } }, "qwen/qwen3.7-plus": { id: "qwen/qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.4, output: 1.6 } }, "qwen/qwen3-vl-plus": { id: "qwen/qwen3-vl-plus", name: "Qwen3-VL Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.143, output: 1.434, cache_read: 0.0286 } }, "qwen/qwen3-32b": { id: "qwen/qwen3-32b", name: "Qwen3 32B", description: "Dense open Qwen model for self-hosted chat, reasoning, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 0.6 } }, "qwen/qwen3.6-35b-a3b": { id: "qwen/qwen3.6-35b-a3b", name: "Qwen3.6 35B A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.248, output: 1.485, cache_read: 0.0496 } }, "qwen/qwen3.5-plus": { id: "qwen/qwen3.5-plus", name: "Qwen3.5 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 250000 }, cost: { input: 0.115, output: 0.688, cache_read: 0.023 } }, "qwen/qwen3.5-27b": { id: "qwen/qwen3.5-27b", name: "Qwen3.5 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.086, output: 0.688, cache_read: 0.0172 } }, "qwen/qwen3.7-max": { id: "qwen/qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 250000 }, cost: { input: 0.825, output: 2.4755, cache_read: 0.165 } }, "qwen/qwen3-next-80b-a3b-thinking": { id: "qwen/qwen3-next-80b-a3b-thinking", name: "Qwen3-Next 80B-A3B (Thinking)", description: "Efficient Qwen thinking model for local reasoning, math, and coding agents", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 1.2 } }, "qwen/qwen3.5-9b": { id: "qwen/qwen3.5-9b", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.09, output: 0.13 } }, "qwen/qwen3.6-27b": { id: "qwen/qwen3.6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.289, output: 2.4 } }, "qwen/qwen3.5-35b-a3b": { id: "qwen/qwen3.5-35b-a3b", name: "Qwen3.5 35B A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0.057, output: 0.459, cache_read: 0.020357 } }, "qwen/qwen3-235b-a22b": { id: "qwen/qwen3-235b-a22b", name: "Qwen3 235B A22B", description: "Large open Qwen MoE for multilingual reasoning, coding, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.287, output: 1.147, cache_read: 0.0574 } }, "qwen/qwen3-max": { id: "qwen/qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen3 model for coding agents, complex reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.359, output: 1.434, cache_read: 0.0718 } }, "qwen/qwen3-coder-plus": { id: "qwen/qwen3-coder-plus", name: "Qwen3 Coder Plus", description: "Hosted Qwen coder for software agents, repo edits, and long-context code", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 250000 }, cost: { input: 0.574, output: 2.294, cache_read: 0.1148 } }, "qwen/qwen3.8-max": { id: "qwen/qwen3.8-max", name: "Qwen3.8 Max", description: "2.4-trillion-parameter MoE flagship for coding, professional work, multimodal understanding, and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 2, output: 6, cache_read: 0.25 } }, "qwen/qwen3-coder-flash": { id: "qwen/qwen3-coder-flash", name: "Qwen3 Coder Flash", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 250000 }, cost: { input: 0.144, output: 0.574, cache_read: 0.0288 } }, "qwen/qwen-flash": { id: "qwen/qwen-flash", name: "Qwen Flash", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2024-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 250000 }, cost: { input: 0.022, output: 0.216, cache_read: 0.0044 } }, "qwen/qwen-plus": { id: "qwen/qwen-plus", name: "Qwen Plus", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2024-04", release_date: "2024-01-25", last_updated: "2025-09-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 250000 }, cost: { input: 0.115, output: 0.287, cache_read: 0.023 } }, "qwen/qwen3.6-flash": { id: "qwen/qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 250000 }, cost: { input: 0.165, output: 0.99, cache_read: 0.033 } }, "qwen/qwen3.5-397b-a17b": { id: "qwen/qwen3.5-397b-a17b", name: "Qwen3.5 397B A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.172, output: 1.032, cache_read: 0.0344 } }, "qwen/qwen3.6-max-preview": { id: "qwen/qwen3.6-max-preview", name: "Qwen3.6 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 65536 }, cost: { input: 1.31, output: 7.88 } }, "qwen/qwen3.6-plus": { id: "qwen/qwen3.6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 250000 }, cost: { input: 0.276, output: 1.651, cache_read: 0.0552 } }, "qwen/qwen3.5-122b-a10b": { id: "qwen/qwen3.5-122b-a10b", name: "Qwen3.5 122B A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.115, output: 0.917, cache_read: 0.023 } }, "qwen/qwen3-next-80b-a3b-instruct": { id: "qwen/qwen3-next-80b-a3b-instruct", name: "Qwen3-Next 80B-A3B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.144, output: 0.574, cache_read: 0.0288 } }, "bytedance/dola-seed-2.0-lite": { id: "bytedance/dola-seed-2.0-lite", name: "Seed 2.0 Lite", description: "Efficient Seed model for general chat, analysis, and lightweight production tasks", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-28", last_updated: "2026-02-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.25, output: 2 } }, "bytedance/dola-seed-2.0-code": { id: "bytedance/dola-seed-2.0-code", name: "Seed 2.0 Code", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "seed", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 0.4, output: 2.4 } }, "bytedance/dola-seed-2.0-pro": { id: "bytedance/dola-seed-2.0-pro", name: "Seed 2.0 Pro", description: "Higher-capability Seed model for complex chat, analysis, and production tasks", family: "seed", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2026-03-28", last_updated: "2026-03-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.5, output: 3 } }, "bytedance/dola-seed-2.0-mini": { id: "bytedance/dola-seed-2.0-mini", name: "Seed 2.0 Mini", description: "Low-cost Seed model for general chat, extraction, and lightweight production tasks", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.1, output: 0.4 } }, "bytedance/dola-seed-2.0-code-preview": { id: "bytedance/dola-seed-2.0-code-preview", name: "Dola Seed 2.0 Code (preview)", description: "Preview coding model for repository understanding, refactors, and engineering tasks", family: "seed", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-03-28", last_updated: "2026-03-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.5, output: 3 } }, "moonshot/kimi-k2.5": { id: "moonshot/kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "moonshot/kimi-k2.7-code-highspeed": { id: "moonshot/kimi-k2.7-code-highspeed", name: "Kimi K2.7 Code Highspeed", description: "Lower-latency Kimi Code variant for interactive edits and coding-agent loops", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 32768 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 1.9, output: 8, cache_read: 0.38 } }, "moonshot/kimi-k2.6": { id: "moonshot/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "moonshot/kimi-k2.7-code": { id: "moonshot/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 32768 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "moonshot/kimi-k3": { id: "moonshot/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "meta/muse-spark-1.1": { id: "meta/muse-spark-1.1", name: "Muse Spark 1.1", description: "Muse Spark is a natively multimodal reasoning model with support for tool-use, visual chain of thought, and multi-agent orchestration.", family: "muse", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-08", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 262144 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "meta/llama-3.3-70b-instruct": { id: "meta/llama-3.3-70b-instruct", name: "Llama 3.3 70B Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.22, output: 0.5, cache_read: 0.11 } }, "xai/grok-4.3": { id: "xai/grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "xai/grok-4.20-0309-non-reasoning": { id: "xai/grok-4.20-0309-non-reasoning", name: "Grok 4.20 Non-Reasoning", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "xai/grok-4.5": { id: "xai/grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.5 } }, "xai/grok-build-0.1": { id: "xai/grok-build-0.1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1, output: 2, cache_read: 0.2 } }, "xai/grok-4.20-0309-reasoning": { id: "xai/grok-4.20-0309-reasoning", name: "Grok 4.20", description: "Reasoning Grok for document-heavy analysis and long-horizon tool use", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "mistral/pixtral-large-latest": { id: "mistral/pixtral-large-latest", name: "Pixtral Large (latest)", description: "Mistral's larger vision model for document-heavy image understanding and chat", family: "pixtral", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2024-11-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 2, output: 6 } }, "mistral/magistral-medium-latest": { id: "mistral/magistral-medium-latest", name: "Magistral Medium (latest)", description: "Mistral reasoning model for transparent analysis, math, and complex decisions", family: "magistral-medium", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-03-17", last_updated: "2025-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2, output: 5 } }, "mistral/mistral-large-2411": { id: "mistral/mistral-large-2411", name: "Mistral Large 2.1", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-18", last_updated: "2024-11-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 2, output: 6 } }, "mistral/mistral-medium-latest": { id: "mistral/mistral-medium-latest", name: "Mistral Medium (latest)", description: "Balanced Mistral model for enterprise assistants, multilingual work, and tools", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.4, output: 2 } }, "mistral/devstral-small-2507": { id: "mistral/devstral-small-2507", name: "Devstral Small", description: "Mistral coding agent model for repository tasks and software engineering workflows", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-07-10", last_updated: "2025-07-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, status: "deprecated", cost: { input: 0.1, output: 0.3 } }, "mistral/mistral-medium-2505": { id: "mistral/mistral-medium-2505", name: "Mistral Medium 3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-05-07", last_updated: "2025-05-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.4, output: 2, cache_read: 0.04 } }, "mistral/mistral-small-latest": { id: "mistral/mistral-small-latest", name: "Mistral Small (latest)", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.15, output: 0.6 } }, "mistral/codestral-latest": { id: "mistral/codestral-latest", name: "Codestral (latest)", description: "Mistral code model for completions, refactors, and developer IDE workflows", family: "codestral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-05-29", last_updated: "2025-01-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 4096 }, cost: { input: 0.3, output: 0.9 } }, "mistral/devstral-medium-latest": { id: "mistral/devstral-medium-latest", name: "Devstral 2 (latest)", description: "Mistral coding agent model for repository tasks and software engineering workflows", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-12", release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0.4, output: 2 } }, "mistral/devstral-2512": { id: "mistral/devstral-2512", name: "Devstral 2", description: "Mistral's coding-agent model for repository work, terminal tasks, and software fixes", family: "devstral", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-12", release_date: "2025-12-09", last_updated: "2025-12-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.4, output: 2, cache_read: 0.04 } }, "mistral/mistral-large-latest": { id: "mistral/mistral-large-latest", name: "Mistral Large (latest)", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.5, output: 1.5 } }, "mistral/devstral-medium-2507": { id: "mistral/devstral-medium-2507", name: "Devstral Medium", description: "Mistral coding agent model for repository tasks and software engineering workflows", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-07-10", last_updated: "2025-07-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, status: "deprecated", cost: { input: 0.4, output: 2 } }, "mistral/mistral-large-2512": { id: "mistral/mistral-large-2512", name: "Mistral Large 3", description: "Mistral's largest general model for enterprise agents, coding, and multilingual reasoning", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.5, output: 1.5, cache_read: 0.05 } }, "minimax/minimax-m2.7-highspeed": { id: "minimax/minimax-m2.7-highspeed", name: "MiniMax M2.7 Highspeed", description: "Low-latency M2.7 variant for interactive coding plans and agent loops", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 8192 }, cost: { input: 0.6, output: 2.4, cache_read: 0.06, cache_write: 0.375 } }, "minimax/minimax-m2.7": { id: "minimax/minimax-m2.7", name: "MiniMax M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 8192 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06, cache_write: 0.375 } }, "minimax/minimax-m3": { id: "minimax/minimax-m3", name: "MiniMax M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 128000 }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "minimax/minimax-m2.5-highspeed": { id: "minimax/minimax-m2.5-highspeed", name: "MiniMax M2.5 Highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-13", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 8192 }, cost: { input: 0.6, output: 2.4, cache_read: 0.06, cache_write: 0.375 } }, "minimax/minimax-m2.5": { id: "minimax/minimax-m2.5", name: "MiniMax M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 8192 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "minimax/minimax-m2": { id: "minimax/minimax-m2", name: "MiniMax M2", description: "Efficient open MiniMax model built for coding agents and tool-heavy workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 8192 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "minimax/minimax-m2.1": { id: "minimax/minimax-m2.1", name: "MiniMax M2.1", description: "Earlier MiniMax agent model for practical coding and productivity tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 8192 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "deepseek/deepseek-r1": { id: "deepseek/deepseek-r1", name: "DeepSeek R1", description: "Classic open reasoning model for transparent math, coding, and deliberate problem solving", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 40960 }, cost: { input: 1.35, output: 5.4 } }, "writer/palmyra-x4": { id: "writer/palmyra-x4", name: "Palmyra X4", description: "Enterprise language model for writing, analysis, and tool-assisted workflows", family: "palmyra", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2024-10-09", last_updated: "2024-10-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 }, cost: { input: 2.5, output: 10 } }, "writer/palmyra-x5": { id: "writer/palmyra-x5", name: "Palmyra X5", description: "Enterprise multimodal model for writing, analysis, and tool-assisted workflows", family: "palmyra", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-04-28", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 250000 }, cost: { input: 0.6, output: 6 } }, "anthropic/claude-sonnet-4-6": { id: "anthropic/claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-3-7-sonnet-20250219": { id: "anthropic/claude-3-7-sonnet-20250219", name: "Claude 3.7 Sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10-31", release_date: "2025-02-19", last_updated: "2025-02-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-opus-4-6": { id: "anthropic/claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024, max: 127999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-fable-5": { id: "anthropic/claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4-8": { id: "anthropic/claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 128000 }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-4-5-20250929": { id: "anthropic/claude-sonnet-4-5-20250929", name: "Claude Sonnet 4.5 (20250929)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-opus-4-5-20251101": { id: "anthropic/claude-opus-4-5-20251101", name: "Claude Opus 4.5 (20251101)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-01", last_updated: "2025-11-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-haiku-4-5-20251001": { id: "anthropic/claude-haiku-4-5-20251001", name: "Claude Haiku 4.5 (20251001)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "anthropic/claude-opus-4-7": { id: "anthropic/claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-4-20250514": { id: "anthropic/claude-sonnet-4-20250514", name: "Claude Sonnet 4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-sonnet-5": { id: "anthropic/claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "anthropic/claude-opus-4-20250514": { id: "anthropic/claude-opus-4-20250514", name: "Claude Opus 4 (20250514)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 31999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-opus-5": { id: "anthropic/claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4-1-20250805": { id: "anthropic/claude-opus-4-1-20250805", name: "Claude Opus 4.1 (20250805)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 31999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "moonshotai/kimi-k2-thinking": { id: "moonshotai/kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Thinking Kimi model for slower research passes, planning, and hard technical questions", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 32768 }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-08", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, status: "deprecated", cost: { input: 0.6, output: 2.5 } }, "openai/gpt-4.1-mini": { id: "openai/gpt-4.1-mini", name: "GPT-4.1 Mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "openai/gpt-4o": { id: "openai/gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.6-sol": { id: "openai/gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "openai/gpt-oss-safeguard-120b": { id: "openai/gpt-oss-safeguard-120b", name: "GPT OSS Safeguard 120B", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-10-29", last_updated: "2025-10-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 4096, output: 4096 }, cost: { input: 0.15, output: 0.6 } }, "openai/gpt-4.1-nano": { id: "openai/gpt-4.1-nano", name: "GPT-4.1 Nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT-OSS 20B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.04, output: 0.2, cache_read: 0.02 } }, "openai/gpt-5.2-chat-latest": { id: "openai/gpt-5.2-chat-latest", name: "GPT-5.2 Chat Latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-codex", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/o3-mini": { id: "openai/o3-mini", name: "o3 Mini", description: "Smaller o-series reasoner for economical coding, math, and planning tasks", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 12.5, output: 75, cache_read: 1.25 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "openai/gpt-4o-mini": { id: "openai/gpt-4o-mini", name: "GPT-4o Mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-3.5-turbo": { id: "openai/gpt-3.5-turbo", name: "GPT-3.5 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2021-09-01", release_date: "2023-03-01", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16385, output: 4096 }, cost: { input: 0.5, output: 1.5 } }, "openai/gpt-4o-2024-05-13": { id: "openai/gpt-4o-2024-05-13", name: "GPT-4o (2024-05-13)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-05-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 5, output: 15 } }, "openai/gpt-5-chat-latest": { id: "openai/gpt-5-chat-latest", name: "GPT-5 Chat Latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-codex", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4o-2024-11-20": { id: "openai/gpt-4o-2024-11-20", name: "GPT-4o (2024-11-20)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-11-20", last_updated: "2024-11-20", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 5, output: 30, cache_read: 0.5 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "openai/gpt-5.3-chat-latest": { id: "openai/gpt-5.3-chat-latest", name: "GPT-5.3 Chat Latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT-5.4 Nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT-5.4 Mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 1.5, output: 9, cache_read: 0.15 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT-OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.09, output: 0.36 } }, "openai/o1": { id: "openai/o1", name: "o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2023-09", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 15, output: 60, cache_read: 7.5 } }, "openai/gpt-5.6-luna": { id: "openai/gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0.2, output: 1.2, cache_read: 0.02 } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4-turbo": { id: "openai/gpt-4-turbo", name: "GPT-4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-12", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 10, output: 30 } }, "openai/gpt-4o-2024-08-06": { id: "openai/gpt-4o-2024-08-06", name: "GPT-4o (2024-08-06)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-08-06", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5-nano": { id: "openai/gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "openai/o3": { id: "openai/o3", name: "o3", description: "Deliberate o-series reasoner for hard math, coding, and multi-step analysis", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/gpt-5.6-terra": { id: "openai/gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2, output: 12, cache_read: 0.2 } }, "openai/gpt-4.1": { id: "openai/gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/o4-mini": { id: "openai/o4-mini", name: "o4 Mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.275 } }, "openai/gpt-4": { id: "openai/gpt-4", name: "GPT-4", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-11", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 8192 }, cost: { input: 30, output: 60 } }, "openai/gpt-5.1-chat-latest": { id: "openai/gpt-5.1-chat-latest", name: "GPT-5.1 Chat Latest", description: "Chat-tuned GPT-5.1 for polished assistants, writing, and product conversations", family: "gpt-codex", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "zai/glm-5": { id: "zai/glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.2, cache_write: 0 } }, "zai/glm-4.5-air": { id: "zai/glm-4.5-air", name: "GLM-4.5 Air", description: "Lighter GLM-4.5 variant for fast coding assistance and cheaper agents", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 98304 }, cost: { input: 0.2, output: 1.1, cache_read: 0.03, cache_write: 0 } }, "zai/glm-5.1": { id: "zai/glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26, cache_write: 0 } }, "zai/glm-4.7-flash": { id: "zai/glm-4.7-flash", name: "GLM 4.7 Flash", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.07, output: 0.4 } }, "zai/glm-5.2": { id: "zai/glm-5.2", name: "GLM 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 50000 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.05, output: 3.3, cache_read: 0.195 } }, "zai/glm-4.7-flashx": { id: "zai/glm-4.7-flashx", name: "GLM-4.7 FlashX", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0.07, output: 0.4, cache_read: 0.01, cache_write: 0 } }, "zai/glm-4.6": { id: "zai/glm-4.6", name: "GLM-4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "zai/glm-4.5": { id: "zai/glm-4.5", name: "GLM-4.5", description: "Hybrid-reasoning GLM release that made the 4.5 line broadly useful", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 98304 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "zai/glm-4.5v": { id: "zai/glm-4.5v", name: "Glm 4.5V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32000 }, cost: { input: 0.6, output: 1.8, cache_read: 0.11, cache_write: 0 } }, "zai/glm-4.7": { id: "zai/glm-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "zai/glm-5-turbo": { id: "zai/glm-5-turbo", name: "GLM-5 Turbo", description: "Faster GLM-5 lane for coding agents that need lower latency", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24, cache_write: 0 } } } }, scx: { id: "scx", env: ["SCX_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.scx.ai/v1", name: "SCX.ai", doc: "https://platform.scx.ai/docs", models: { "MiniMax-M2.7": { id: "MiniMax-M2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 192000, output: 64000 }, cost: { input: 0.48, output: 1.79, cache_read: 0.05 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.17, output: 0.55 } } } }, "cloudferro-sherlock": { id: "cloudferro-sherlock", env: ["CLOUDFERRO_SHERLOCK_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api-sherlock.cloudferro.com/openai/v1/", name: "CloudFerro Sherlock", doc: "https://docs.sherlock.cloudferro.com/", models: { "MiniMaxAI/MiniMax-M2.5": { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-01", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196000, input: 180000, output: 16000 }, cost: { input: 0.3, output: 1.2 } }, "speakleash/Bielik-11B-v3.0-Instruct": { id: "speakleash/Bielik-11B-v3.0-Instruct", name: "Bielik 11B v3.0 Instruct", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03", release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 32000 }, cost: { input: 0.67, output: 0.67 } }, "speakleash/Bielik-11B-v2.6-Instruct": { id: "speakleash/Bielik-11B-v2.6-Instruct", name: "Bielik 11B v2.6 Instruct", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03", release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 32000 }, cost: { input: 0.67, output: 0.67 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "OpenAI GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-28", last_updated: "2025-08-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 131000 }, cost: { input: 2.92, output: 2.92 } }, "meta-llama/Llama-3.3-70B-Instruct": { id: "meta-llama/Llama-3.3-70B-Instruct", name: "Llama 3.3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10-09", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 70000, output: 70000 }, cost: { input: 2.92, output: 2.92 } } } }, modelis: { id: "modelis", env: ["MODELIS_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://modelishub.com/v1", name: "Modelis", doc: "https://modelishub.com/pricing", models: { "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "max"] }, { type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.0983, output: 0.1966 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }, { type: "toggle" }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.435, output: 0.87 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10 } }, "qwen/qwen3.7-plus": { id: "qwen/qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.768, output: 3.072 } }, "qwen/qwen3.7-max": { id: "qwen/qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 3, output: 9 } } } }, subconscious: { id: "subconscious", env: ["SUBCONSCIOUS_API_KEY"], npm: "@ai-sdk/anthropic", api: "https://api.subconscious.dev/v1", name: "Subconscious", doc: "https://docs.subconscious.dev", models: { "subconscious/glm-5.2": { id: "subconscious/glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "subconscious/tim-qwen3.6-27b": { id: "subconscious/tim-qwen3.6-27b", name: "TIM-Qwen3.6 27B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-11", last_updated: "2026-05-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, input: 8192, output: 5000 }, cost: { input: 0.3, output: 3, cache_read: 0.15 } } } }, "tencent-coding-plan": { id: "tencent-coding-plan", env: ["TENCENT_CODING_PLAN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.lkeap.cloud.tencent.com/coding/v3", name: "Tencent Coding Plan (China)", doc: "https://cloud.tencent.com/document/product/1772/128947", models: { "glm-5": { id: "glm-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 16384 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi-K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "hunyuan-2.0-instruct": { id: "hunyuan-2.0-instruct", name: "Tencent HY 2.0 Instruct", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "hunyuan", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-08", last_updated: "2026-03-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "hunyuan-2.0-thinking": { id: "hunyuan-2.0-thinking", name: "Tencent HY 2.0 Think", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "hunyuan", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-03-08", last_updated: "2026-03-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "hunyuan-turbos": { id: "hunyuan-turbos", name: "Hunyuan-TurboS", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "hunyuan", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-08", last_updated: "2026-03-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "minimax-m2.5": { id: "minimax-m2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "hunyuan-t1": { id: "hunyuan-t1", name: "Hunyuan-T1", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "hunyuan", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-03-08", last_updated: "2026-03-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "tc-code-latest": { id: "tc-code-latest", name: "Auto", description: "Automatic model router for matching prompts to suitable backends and budgets", family: "auto", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-08", last_updated: "2026-03-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, hyper: { id: "hyper", env: ["HYPER_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://hyper.charm.land/v1", name: "Charm Hyper", doc: "https://hyper.charm.land", models: { "qwen3.7-flash": { id: "qwen3.7-flash", name: "Qwen3.7 Flash", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-27", last_updated: "2026-07-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 991000, output: 64000 }, cost: { input: 0.2, output: 0.8, cache_read: 0.04 } }, "qwen3.7-plus": { id: "qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-15", last_updated: "2026-07-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 1.2, output: 4.8, cache_read: 0.24 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202800, output: 3276 }, cost: { input: 1.52432, output: 4.79072, cache_read: 0.283088 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-06", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.2, output: 0.4, cache_read: 0.04 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-04-13", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 26214 }, cost: { input: 0.55, output: 2.89, cache_write: 0.275 } }, "minimax-m2.7": { id: "minimax-m2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-06-05", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262100, output: 6553 }, cost: { input: 0.436, output: 1.72, cache_write: 0.218 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-30", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 32768 }, cost: { input: 1.4, output: 4.4, cache_read: 0.28 } }, "qwen3.7-max": { id: "qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-05-28", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5 } }, "qwen3.6-max": { id: "qwen3.6-max", name: "Qwen3.6 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-05-20", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 2.5 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-07-03", last_updated: "2026-07-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 26214 }, cost: { input: 0.95, output: 4, cache_write: 0.16 } }, "llama-4-maverick-17b-128e-instruct-fp8": { id: "llama-4-maverick-17b-128e-instruct-fp8", name: "Llama 4 Maverick 17B Instruct", description: "Open multimodal Llama for strong reasoning with efficient everyday serving", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2026-04-30", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 430000, output: 43000 }, cost: { input: 0.274, output: 0.8992, cache_write: 0.137 } }, "minimax-m3": { id: "minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2026-07-30", last_updated: "2026-07-31", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 512000, output: 512000 }, cost: { input: 0.32664, output: 1.30656, cache_read: 0.064239 } }, "gemma-4-26b-a4b-it": { id: "gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-30", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 25600 }, cost: { input: 0.124, output: 0.42, cache_write: 0.062 } }, "llama-3.3-70b-instruct": { id: "llama-3.3-70b-instruct", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2026-04-30", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 12800 }, cost: { input: 0.6066, output: 1.0386, cache_write: 0.3033 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-06", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 2.4, output: 4.8, cache_read: 0.2 } }, "qwen3.8-max": { id: "qwen3.8-max", name: "Qwen3.8 Max Preview", description: "Preview Qwen flagship for million-token multimodal reasoning and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-07-19", last_updated: "2026-07-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 2, output: 6, cache_read: 0.25 } }, "deepseek-v4-flash-0731": { id: "deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-08-02", last_updated: "2026-08-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 0.152432, output: 0.304864, cache_read: 0.032664 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-13", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 13107 }, cost: { input: 0.178, output: 0.71, cache_write: 0.089 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-07-03", last_updated: "2026-07-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16000 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "qwen3.6-flash": { id: "qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-20", last_updated: "2026-07-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 1, output: 4, cache_read: 0.1, cache_write: 1.25 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-27", last_updated: "2026-07-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3.2664, output: 16.332, cache_read: 0.32664 } }, "qwen3-coder-480b-a35b-instruct-int4-mixed-ar": { id: "qwen3-coder-480b-a35b-instruct-int4-mixed-ar", name: "Qwen3-Coder 480B-A35B Instruct", description: "Open Qwen coding heavyweight for repository reasoning and agentic engineering", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-30", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 106000, output: 10600 }, cost: { input: 0.569, output: 2.135, cache_write: 0.2845 } }, "qwen3.6-plus": { id: "qwen3.6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-05-20", last_updated: "2026-07-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 2, output: 6, cache_read: 0.2, cache_write: 2.5 } }, "qwen3-next-80b-a3b-instruct": { id: "qwen3-next-80b-a3b-instruct", name: "Qwen3-Next 80B-A3B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-30", last_updated: "2026-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 26214 }, cost: { input: 0.1175, output: 1.136, cache_write: 0.05875 } } } }, alibaba: { id: "alibaba", env: ["DASHSCOPE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1", name: "Alibaba", doc: "https://www.alibabacloud.com/help/en/model-studio/models", models: { "qwen3-coder-480b-a35b-instruct": { id: "qwen3-coder-480b-a35b-instruct", name: "Qwen3-Coder 480B-A35B Instruct", description: "Open Qwen coding heavyweight for repository reasoning and agentic engineering", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 1.5, output: 7.5 } }, "qwen3.7-plus": { id: "qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-04", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 0.625, tiers: [{ input: 2, output: 6, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.2, cache_write: 2.5 } } }, "qwen3-vl-plus": { id: "qwen3-vl-plus", name: "Qwen3-VL Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.2, output: 1.6, reasoning: 4.8 } }, "qwen3-32b": { id: "qwen3-32b", name: "Qwen3 32B", description: "Dense open Qwen model for self-hosted chat, reasoning, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.7, output: 2.8, reasoning: 8.4 } }, "qwen3.6-35b-a3b": { id: "qwen3.6-35b-a3b", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.248, output: 1.485 } }, "qwen-mt-plus": { id: "qwen-mt-plus", name: "Qwen-MT Plus", description: "Translation model for multilingual conversion, localization, and cross-language workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-04", release_date: "2025-01", last_updated: "2025-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 8192 }, cost: { input: 2.46, output: 7.37 } }, "qwen2-5-vl-72b-instruct": { id: "qwen2-5-vl-72b-instruct", name: "Qwen2.5-VL 72B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 2.8, output: 8.4 } }, "qwen-max": { id: "qwen-max", name: "Qwen Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-04-03", last_updated: "2025-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 8192 }, cost: { input: 1.6, output: 6.4 } }, "qwen3.5-plus": { id: "qwen3.5-plus", name: "Qwen3.5 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.4, output: 2.4, reasoning: 2.4 } }, "qwen-omni-turbo": { id: "qwen-omni-turbo", name: "Qwen-Omni Turbo", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-01-19", last_updated: "2025-03-26", modalities: { input: ["text", "image", "audio", "video"], output: ["text", "audio"] }, open_weights: false, limit: { context: 32768, output: 2048 }, cost: { input: 0.07, output: 0.27, input_audio: 4.44, output_audio: 8.89 } }, "qwen-vl-max": { id: "qwen-vl-max", name: "Qwen-VL Max", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-04-08", last_updated: "2025-08-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.8, output: 3.2 } }, "qwen3-coder-30b-a3b-instruct": { id: "qwen3-coder-30b-a3b-instruct", name: "Qwen3-Coder 30B-A3B Instruct", description: "Smaller Qwen coder for efficient local agents and repo-level fixes", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.45, output: 2.25 } }, "qwen3.5-27b": { id: "qwen3.5-27b", name: "Qwen3.5 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.3, output: 2.4 } }, "qwen3-vl-235b-a22b": { id: "qwen3-vl-235b-a22b", name: "Qwen3-VL 235B-A22B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.7, output: 2.8, reasoning: 8.4 } }, "qwen2-5-72b-instruct": { id: "qwen2-5-72b-instruct", name: "Qwen2.5 72B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 1.4, output: 5.6 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.28, cache_write: 0 } }, "qwen3.7-max": { id: "qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5, cache_write: 3.125 } }, "qwen3-next-80b-a3b-thinking": { id: "qwen3-next-80b-a3b-thinking", name: "Qwen3-Next 80B-A3B (Thinking)", description: "Efficient Qwen thinking model for local reasoning, math, and coding agents", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.5, output: 6 } }, "qwen-mt-turbo": { id: "qwen-mt-turbo", name: "Qwen-MT Turbo", description: "Translation model for multilingual conversion, localization, and cross-language workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-04", release_date: "2025-01", last_updated: "2025-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 8192 }, cost: { input: 0.16, output: 0.49 } }, "qvq-max": { id: "qvq-max", name: "QVQ Max", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qvq", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-03-25", last_updated: "2025-03-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 1.2, output: 4.8 } }, "qwen2-5-vl-7b-instruct": { id: "qwen2-5-vl-7b-instruct", name: "Qwen2.5-VL 7B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.35, output: 1.05 } }, "qwen3.6-27b": { id: "qwen3.6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.6, output: 3.6 } }, "qwen3.5-35b-a3b": { id: "qwen3.5-35b-a3b", name: "Qwen3.5 35B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.25, output: 2 } }, "qwen3-vl-30b-a3b": { id: "qwen3-vl-30b-a3b", name: "Qwen3-VL 30B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.2, output: 0.8, reasoning: 2.4 } }, "qwen3-14b": { id: "qwen3-14b", name: "Qwen3 14B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.35, output: 1.4, reasoning: 4.2 } }, "qwen2-5-32b-instruct": { id: "qwen2-5-32b-instruct", name: "Qwen2.5 32B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.7, output: 2.8 } }, "qwen3-omni-flash-realtime": { id: "qwen3-omni-flash-realtime", name: "Qwen3-Omni Flash Realtime", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image", "audio", "video"], output: ["text", "audio"] }, open_weights: false, limit: { context: 65536, output: 16384 }, cost: { input: 0.52, output: 1.99, input_audio: 4.57, output_audio: 18.13 } }, "qwen3-235b-a22b": { id: "qwen3-235b-a22b", name: "Qwen3 235B-A22B", description: "Large open Qwen MoE for multilingual reasoning, coding, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.7, output: 2.8, reasoning: 8.4 } }, "qwen3-max": { id: "qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen3 model for coding agents, complex reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 1.2, output: 6 } }, "qwen3-8b": { id: "qwen3-8b", name: "Qwen3 8B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.18, output: 0.7, reasoning: 2.1 } }, "qwen2-5-14b-instruct": { id: "qwen2-5-14b-instruct", name: "Qwen2.5 14B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.35, output: 1.4 } }, "qwen3-coder-plus": { id: "qwen3-coder-plus", name: "Qwen3 Coder Plus", description: "Hosted Qwen coder for software agents, repo edits, and long-context code", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 65536 }, cost: { input: 1, output: 5 } }, "qwen2-5-7b-instruct": { id: "qwen2-5-7b-instruct", name: "Qwen2.5 7B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.175, output: 0.7 } }, "qwen3.8-max": { id: "qwen3.8-max", name: "Qwen3.8 Max", description: "2.4-trillion-parameter MoE flagship for coding, professional work, multimodal understanding, and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "xhigh"] }, { type: "budget_tokens", min: 0, max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 2, output: 6, cache_read: 0.25, cache_write: 2.5 } }, "qwen3-coder-flash": { id: "qwen3-coder-flash", name: "Qwen3 Coder Flash", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.3, output: 1.5 } }, "deepseek-v4-flash-0731": { id: "deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.2, output: 0.4, cache_read: 0.04 } }, "qwen-flash": { id: "qwen-flash", name: "Qwen Flash", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.05, output: 0.4 } }, "qwen-plus": { id: "qwen-plus", name: "Qwen Plus", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-01-25", last_updated: "2025-09-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.4, output: 1.2, reasoning: 4 } }, "qwen-omni-turbo-realtime": { id: "qwen-omni-turbo-realtime", name: "Qwen-Omni Turbo Realtime", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-05-08", last_updated: "2025-05-08", modalities: { input: ["text", "image", "audio"], output: ["text", "audio"] }, open_weights: false, limit: { context: 32768, output: 2048 }, cost: { input: 0.27, output: 1.07, input_audio: 4.44, output_audio: 8.89 } }, "qwen-turbo": { id: "qwen-turbo", name: "Qwen Turbo", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-11-01", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 16384 }, cost: { input: 0.05, output: 0.2, reasoning: 0.5 } }, "qwen2-5-omni-7b": { id: "qwen2-5-omni-7b", name: "Qwen2.5-Omni 7B", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-12", last_updated: "2024-12", modalities: { input: ["text", "image", "audio", "video"], output: ["text", "audio"] }, open_weights: true, limit: { context: 32768, output: 2048 }, cost: { input: 0.1, output: 0.4, input_audio: 6.76 } }, "qwen3-asr-flash": { id: "qwen3-asr-flash", name: "Qwen3-ASR Flash", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2024-04", release_date: "2025-09-08", last_updated: "2025-09-08", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 53248, output: 4096 }, cost: { input: 0.035, output: 0.035 } }, "qwq-plus": { id: "qwq-plus", name: "QwQ Plus", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-03-05", last_updated: "2025-03-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.8, output: 2.4 } }, "qwen3.6-flash": { id: "qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.1875, output: 1.125, cache_write: 0.234375 } }, "qwen3.5-397b-a17b": { id: "qwen3.5-397b-a17b", name: "Qwen3.5 397B-A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.6, output: 3.6 } }, "qwen3.6-max-preview": { id: "qwen3.6-max-preview", name: "Qwen3.6 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 1.3, output: 7.8, cache_read: 0.13, cache_write: 1.625 } }, "qwen-vl-ocr": { id: "qwen-vl-ocr", name: "Qwen-VL OCR", description: "OCR model for extracting structured text from documents and screenshots", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-04", release_date: "2024-10-28", last_updated: "2025-04-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 34096, output: 4096 }, cost: { input: 0.72, output: 0.72 } }, "qwen3-livetranslate-flash-realtime": { id: "qwen3-livetranslate-flash-realtime", name: "Qwen3-LiveTranslate Flash Realtime", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-04", release_date: "2025-09-22", last_updated: "2025-09-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text", "audio"] }, open_weights: false, limit: { context: 53248, output: 4096 }, cost: { input: 10, output: 10, input_audio: 10, output_audio: 38 } }, "qwen-plus-character-ja": { id: "qwen-plus-character-ja", name: "Qwen Plus Character (Japanese)", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-01", last_updated: "2024-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 512 }, cost: { input: 0.5, output: 1.4 } }, "qwen3-omni-flash": { id: "qwen3-omni-flash", name: "Qwen3-Omni Flash", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image", "audio", "video"], output: ["text", "audio"] }, open_weights: false, limit: { context: 65536, output: 16384 }, cost: { input: 0.43, output: 1.66, input_audio: 3.81, output_audio: 15.11 } }, "qwen3.6-plus": { id: "qwen3.6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 0.625, tiers: [{ input: 2, output: 6, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.2, cache_write: 2.5 } } }, "qwen3.5-122b-a10b": { id: "qwen3.5-122b-a10b", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.4, output: 3.2 } }, "qwen3-next-80b-a3b-instruct": { id: "qwen3-next-80b-a3b-instruct", name: "Qwen3-Next 80B-A3B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.5, output: 2 } }, "qwen-vl-plus": { id: "qwen-vl-plus", name: "Qwen-VL Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-01-25", last_updated: "2025-08-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.21, output: 0.63 } } } }, vercel: { id: "vercel", env: ["AI_GATEWAY_API_KEY"], npm: "@ai-sdk/gateway", name: "Vercel AI Gateway", doc: "https://github.com/vercel/ai/tree/5eb85cc45a259553501f535b8ac79a77d0e79223/packages/gateway", models: { "prodia/flux-fast-schnell": { id: "prodia/flux-fast-schnell", name: "Flux Schnell", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-08-02", last_updated: "2026-06-08", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 512, output: 0 } }, "cohere/rerank-v4-pro": { id: "cohere/rerank-v4-pro", name: "Cohere Rerank 4 Pro", description: "Reranking model for improving retrieval quality in search and recommendation systems", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 } }, "cohere/embed-v4.0": { id: "cohere/embed-v4.0", name: "Embed v4.0", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "cohere-embed", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-15", last_updated: "2025-04-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 1536 } }, "cohere/command-a": { id: "cohere/command-a", name: "Command A", description: "Cohere command model for multilingual enterprise agents, tools, and chat", family: "command", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 8000 }, cost: { input: 2.5, output: 10 } }, "cohere/rerank-v4-fast": { id: "cohere/rerank-v4-fast", name: "Cohere Rerank 4 Fast", description: "Reranking model for improving retrieval quality in search and recommendation systems", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 } }, "cohere/rerank-v3.5": { id: "cohere/rerank-v3.5", name: "Cohere Rerank 3.5", description: "Reranking model for improving retrieval quality in search and recommendation systems", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-12-02", last_updated: "2024-12-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 4096, output: 4096 } }, "nvidia/nemotron-nano-12b-v2-vl": { id: "nvidia/nemotron-nano-12b-v2-vl", name: "Nvidia Nemotron Nano 12B V2 VL", description: "Nemotron multimodal model for visual reasoning and agentic AI workflows", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-10-28", last_updated: "2025-10-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.2, output: 0.6 } }, "nvidia/nemotron-3-nano-30b-a3b": { id: "nvidia/nemotron-3-nano-30b-a3b", name: "Nemotron 3 Nano 30B A3B", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, temperature: true, knowledge: "2024-10", release_date: "2025-12-15", last_updated: "2025-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 0.05, output: 0.24 } }, "nvidia/nemotron-3-super-120b-a12b": { id: "nvidia/nemotron-3-super-120b-a12b", name: "NVIDIA Nemotron 3 Super 120B A12B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 }, cost: { input: 0.15, output: 0.65 } }, "nvidia/nemotron-3-ultra-550b-a55b": { id: "nvidia/nemotron-3-ultra-550b-a55b", name: "Nemotron 3 Ultra", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65000 }, cost: { input: 0.6, output: 2.4, cache_read: 0.12 } }, "nvidia/nemotron-nano-9b-v2": { id: "nvidia/nemotron-nano-9b-v2", name: "Nvidia Nemotron Nano 9B V2", description: "Compact Nemotron model for efficient reasoning and deployable AI agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-08-18", last_updated: "2025-08-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.06, output: 0.23 } }, "google/imagen-4.0-ultra-generate-001": { id: "google/imagen-4.0-ultra-generate-001", name: "Imagen 4 Ultra", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "imagen", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2025-05-24", last_updated: "2025-05-24", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/gemini-embedding-2": { id: "google/gemini-embedding-2", name: "Gemini Embedding 2", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "gemini-embedding", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-11", release_date: "2026-03-10", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 } }, "google/gemini-3.5-flash": { id: "google/gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 1.5, output: 9, cache_read: 0.15 } }, "google/veo-3.1-generate-001": { id: "google/veo-3.1-generate-001", name: "Veo 3.1", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-10-15", last_updated: "2026-06-08", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "google/imagen-4.0-fast-generate-001": { id: "google/imagen-4.0-fast-generate-001", name: "Imagen 4 Fast", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "imagen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-06-01", last_updated: "2025-06", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/gemini-3.5-flash-lite": { id: "google/gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65000 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "google/veo-3.0-fast-generate-001": { id: "google/veo-3.0-fast-generate-001", name: "Veo 3.0 Fast Generate", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-07-31", last_updated: "2026-06-08", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "google/gemini-omni-flash-preview": { id: "google/gemini-omni-flash-preview", name: "Gemini Omni Flash Preview", description: "Omni-modal model for text, vision, audio, and multimodal agent tasks", family: "gemini", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 57920 }, cost: { input: 1.5, output: 9 } }, "google/gemini-3-flash": { id: "google/gemini-3-flash", name: "Gemini 3 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65000 }, cost: { input: 0.5, output: 3, cache_read: 0.05 } }, "google/text-multilingual-embedding-002": { id: "google/text-multilingual-embedding-002", name: "Text Multilingual Embedding 002", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-03-01", last_updated: "2024-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "google/text-embedding-005": { id: "google/text-embedding-005", name: "Text Embedding 005", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-08-01", last_updated: "2024-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "google/gemini-3.1-flash-lite-image": { id: "google/gemini-3.1-flash-lite-image", name: "Gemini 3.1 Flash Lite Image (Nano Banana 2 Lite)", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 4096 }, cost: { input: 0.25, output: 1.5, cache_read: 0.03 } }, "google/gemini-3.1-flash-image-preview": { id: "google/gemini-3.1-flash-image-preview", name: "Gemini 3.1 Flash Image Preview (Nano Banana 2)", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "high"] }], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.5, output: 3, cache_read: 0.05 } }, "google/gemma-4-26b-a4b-it": { id: "google/gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 131072 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015 } }, "google/veo-3.0-generate-001": { id: "google/veo-3.0-generate-001", name: "Veo 3.0", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-05-20", last_updated: "2026-06-08", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "google/gemini-embedding-001": { id: "google/gemini-embedding-001", name: "Gemini Embedding 001", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "gemini-embedding", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-05", release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "google/veo-3.1-fast-generate-001": { id: "google/veo-3.1-fast-generate-001", name: "Veo 3.1 Fast Generate", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-10-15", last_updated: "2026-06-08", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "google/gemini-3.6-flash": { id: "google/gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 1.5, output: 7.5, cache_read: 0.15 } }, "google/gemini-3.1-flash-lite": { id: "google/gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65000 }, cost: { input: 0.25, output: 1.5, cache_read: 0.03 } }, "google/gemma-4-31b-it": { id: "google/gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 131072 }, cost: { input: 0.14, output: 0.4 } }, "google/gemini-3.1-flash-image": { id: "google/gemini-3.1-flash-image", name: "Nano Banana 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "high"] }], tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.5, output: 3, cache_read: 0.05 } }, "google/gemini-2.5-flash-image": { id: "google/gemini-2.5-flash-image", name: "Nano Banana (Gemini 2.5 Flash Image)", description: "Nano Banana image model for fast generation, edits, and character-consistent assets", family: "gemini-flash", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 32768, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "google/imagen-4.0-generate-001": { id: "google/imagen-4.0-generate-001", name: "Imagen 4", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "imagen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-05-20", last_updated: "2025-05-22", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 480, output: 0 } }, "google/gemini-3-pro-image": { id: "google/gemini-3-pro-image", name: "Nano Banana Pro", description: "Nano Banana Pro for higher-fidelity image generation and design-heavy edits", family: "gemini-pro", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-01", release_date: "2025-09-01", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 32768 }, cost: { input: 2, output: 12, cache_read: 0.2 } }, "google/gemini-3.1-pro-preview": { id: "google/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 2, output: 12, cache_read: 0.2 } }, "google/veo-3.1-lite-generate-001": { id: "google/veo-3.1-lite-generate-001", name: "Veo 3.1 Lite Generate", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "veo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "google/gemini-2.5-flash-lite": { id: "google/gemini-2.5-flash-lite", name: "Gemini 2.5 Flash Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 512, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.1, output: 0.4, cache_read: 0.01 } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, input_audio: 1 } }, "thinkingmachines/inkling-small": { id: "thinkingmachines/inkling-small", name: "Inkling Small", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, release_date: "2026-07-30", last_updated: "2026-07-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 0.5, output: 1.2, cache_read: 0.1 } }, "thinkingmachines/inkling": { id: "thinkingmachines/inkling", name: "Inkling", description: "Multimodal MoE reasoning model (975B total, 41B active) for text, image, and audio", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 1, output: 4.05, cache_read: 0.17 } }, "sakana/fugu-ultra": { id: "sakana/fugu-ultra", name: "Fugu Ultra", description: "Quality-first multi-agent model for hard research, analysis, and competitions", family: "aura", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-21", last_updated: "2026-06-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "inception/mercury-coder-small": { id: "inception/mercury-coder-small", name: "Mercury Coder Small Beta", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "mercury", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-02-26", last_updated: "2025-02-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 16384 }, cost: { input: 0.25, output: 1 } }, "inception/mercury-2": { id: "inception/mercury-2", name: "Mercury 2", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "mercury", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, release_date: "2026-02-24", last_updated: "2026-03-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.25, output: 0.75, cache_read: 0.024999999999999998 } }, "interfaze/interfaze-beta": { id: "interfaze/interfaze-beta", name: "Interfaze Beta", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, temperature: true, release_date: "2025-10-07", last_updated: "2026-04-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32000 }, cost: { input: 1.5, output: 3.5 } }, "voyage/rerank-2.5-lite": { id: "voyage/rerank-2.5-lite", name: "Voyage Rerank 2.5 Lite", description: "Reranking model for improving retrieval quality in search and recommendation systems", family: "voyage", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 } }, "voyage/voyage-3.5-lite": { id: "voyage/voyage-3.5-lite", name: "voyage-3.5-lite", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "voyage", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "voyage/voyage-4": { id: "voyage/voyage-4", name: "voyage-4", description: "General-purpose chat model for instruction following, writing, and analysis", family: "voyage", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-15", last_updated: "2026-03-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 0 } }, "voyage/rerank-2.5": { id: "voyage/rerank-2.5", name: "Voyage Rerank 2.5", description: "Reranking model for improving retrieval quality in search and recommendation systems", family: "voyage", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 } }, "voyage/voyage-code-3": { id: "voyage/voyage-code-3", name: "voyage-code-3", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "voyage", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-12-04", last_updated: "2024-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "voyage/voyage-code-2": { id: "voyage/voyage-code-2", name: "voyage-code-2", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "voyage", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-01-01", last_updated: "2024-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "voyage/voyage-3.5": { id: "voyage/voyage-3.5", name: "voyage-3.5", description: "General-purpose chat model for instruction following, writing, and analysis", family: "voyage", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "voyage/voyage-4-lite": { id: "voyage/voyage-4-lite", name: "voyage-4-lite", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "voyage", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-15", last_updated: "2026-03-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 0 } }, "voyage/voyage-3-large": { id: "voyage/voyage-3-large", name: "voyage-3-large", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "voyage", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-01-07", last_updated: "2024-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "voyage/voyage-finance-2": { id: "voyage/voyage-finance-2", name: "voyage-finance-2", description: "General-purpose chat model for instruction following, writing, and analysis", family: "voyage", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-06-03", last_updated: "2024-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "voyage/voyage-law-2": { id: "voyage/voyage-law-2", name: "voyage-law-2", description: "General-purpose chat model for instruction following, writing, and analysis", family: "voyage", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-04-15", last_updated: "2024-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "voyage/voyage-4-large": { id: "voyage/voyage-4-large", name: "voyage-4-large", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "voyage", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-15", last_updated: "2026-03-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 0 } }, "fish-audio/s1": { id: "fish-audio/s1", name: "S1", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "o", attachment: false, reasoning: false, tool_call: false, release_date: "2025-10-20", last_updated: "2025-10-20", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "fish-audio/s2-pro": { id: "fish-audio/s2-pro", name: "S2 Pro", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "o", attachment: false, reasoning: false, tool_call: false, release_date: "2026-03-09", last_updated: "2026-03-09", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "fish-audio/s2.1-pro": { id: "fish-audio/s2.1-pro", name: "S2.1 Pro", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "o", attachment: false, reasoning: false, tool_call: false, release_date: "2026-07-28", last_updated: "2026-07-28", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "fish-audio/transcribe-1": { id: "fish-audio/transcribe-1", name: "Transcribe-1", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "o", attachment: false, reasoning: false, tool_call: false, release_date: "2026-03-01", last_updated: "2026-03-01", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 } }, "tencent/hy3": { id: "tencent/hy3", name: "Hy3", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "hy3", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, temperature: true, release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.14, output: 0.58, cache_read: 0.035 } }, "klingai/kling-v2.5-turbo-i2v": { id: "klingai/kling-v2.5-turbo-i2v", name: "Kling v2.5 Turbo Image-to-Video", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "ling", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "klingai/kling-v2.6-i2v": { id: "klingai/kling-v2.6-i2v", name: "Kling v2.6 Image-to-Video", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "ling", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-03", last_updated: "2025-12-21", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "klingai/kling-v2.6-t2v": { id: "klingai/kling-v2.6-t2v", name: "Kling v2.6 Text-to-Video", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "ling", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-03", last_updated: "2025-12-21", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "klingai/kling-v3.0-i2v": { id: "klingai/kling-v3.0-i2v", name: "Kling v3.0 Image-to-Video", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "ling", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "klingai/kling-v2.5-turbo-t2v": { id: "klingai/kling-v2.5-turbo-t2v", name: "Kling v2.5 Turbo Text-to-Video", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "ling", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "klingai/kling-v3.0-motion-control": { id: "klingai/kling-v3.0-motion-control", name: "Kling v3.0 Motion Control", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "ling", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-03-04", last_updated: "2026-03-04", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "klingai/kling-v3.0-t2v": { id: "klingai/kling-v3.0-t2v", name: "Kling v3.0 Text-to-Video", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "ling", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "klingai/kling-v2.6-motion-control": { id: "klingai/kling-v2.6-motion-control", name: "Kling v2.6 Motion Control", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "ling", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-18", last_updated: "2025-12-21", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bytedance/seed-1.6": { id: "bytedance/seed-1.6", name: "Seed 1.6", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-09-01", last_updated: "2025-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 }, cost: { input: 0.25, output: 2, cache_read: 0.05 } }, "bytedance/seedance-v1.5-pro": { id: "bytedance/seedance-v1.5-pro", name: "Seedance v1.5 Pro", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "seed", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bytedance/seedance-2.5": { id: "bytedance/seedance-2.5", name: "Seedance 2.5", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "seed", attachment: false, reasoning: false, tool_call: false, release_date: "2026-08-07", last_updated: "2026-08-07", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bytedance/seedream-4.0": { id: "bytedance/seedream-4.0", name: "Seedream 4.0", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "seed", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-09-09", last_updated: "2025-08-28", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bytedance/seedream-4.5": { id: "bytedance/seedream-4.5", name: "Seedream 4.5", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "seed", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-03", last_updated: "2025-11-28", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bytedance/seedream-5.0-pro": { id: "bytedance/seedream-5.0-pro", name: "Seedream 5.0 Pro", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "seed", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-07-11", last_updated: "2026-07-11", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bytedance/seedance-v1.0-pro": { id: "bytedance/seedance-v1.0-pro", name: "Seedance v1.0 Pro", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "seed", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-06-11", last_updated: "2025-06-11", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bytedance/seedream-5.0-lite": { id: "bytedance/seedream-5.0-lite", name: "Seedream 5.0 Lite", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "seed", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-02-13", last_updated: "2026-01-28", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bytedance/seedance-v1.0-pro-fast": { id: "bytedance/seedance-v1.0-pro-fast", name: "Seedance v1.0 Pro Fast", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "seed", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-10-24", last_updated: "2025-10-31", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bytedance/seed-1.8": { id: "bytedance/seed-1.8", name: "Seed 1.8", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-09-01", last_updated: "2025-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 }, cost: { input: 0.25, output: 2, cache_read: 0.05 } }, "bytedance/seedance-2.0": { id: "bytedance/seedance-2.0", name: "Seedance 2.0", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "seed", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-14", last_updated: "2026-04-14", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bytedance/seedance-2.0-fast": { id: "bytedance/seedance-2.0-fast", name: "Seedance 2.0 Fast", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "seed", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-14", last_updated: "2026-04-14", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bfl/flux-pro-1.1": { id: "bfl/flux-pro-1.1", name: "FLUX1.1 [pro]", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-10-02", last_updated: "2024-10", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 512, output: 0 } }, "bfl/flux-2-pro": { id: "bfl/flux-2-pro", name: "FLUX.2 [pro]", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-11-25", last_updated: "2026-06-08", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 67300, output: 67300 } }, "bfl/flux-pro-1.0-fill": { id: "bfl/flux-pro-1.0-fill", name: "FLUX.1 Fill [pro]", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-10-01", last_updated: "2024-10", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 512, output: 0 } }, "bfl/flux-2-max": { id: "bfl/flux-2-max", name: "FLUX.2 [max]", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-16", last_updated: "2026-06-08", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 67300, output: 67300 } }, "bfl/flux-kontext-pro": { id: "bfl/flux-kontext-pro", name: "FLUX.1 Kontext Pro", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-05-29", last_updated: "2025-06", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 512, output: 0 } }, "bfl/flux-3-video": { id: "bfl/flux-3-video", name: "Flux 3", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, release_date: "2026-08-04", last_updated: "2026-08-04", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bfl/flux-2-klein-4b": { id: "bfl/flux-2-klein-4b", name: "FLUX.2 [klein] 4B", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-15", last_updated: "2026-06-08", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bfl/flux-2-flex": { id: "bfl/flux-2-flex", name: "FLUX.2 [flex]", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-11-25", last_updated: "2026-06-08", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bfl/flux-2-klein-9b": { id: "bfl/flux-2-klein-9b", name: "FLUX.2 [klein] 9B", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-15", last_updated: "2026-06-08", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "bfl/flux-pro-1.1-ultra": { id: "bfl/flux-pro-1.1-ultra", name: "FLUX1.1 [pro] Ultra", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-11-01", last_updated: "2024-11", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 512, output: 0 } }, "bfl/flux-kontext-max": { id: "bfl/flux-kontext-max", name: "FLUX.1 Kontext Max", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "flux", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-05-29", last_updated: "2025-06", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 512, output: 0 } }, "recraft/recraft-v3": { id: "recraft/recraft-v3", name: "Recraft V3", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "recraft", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-10-30", last_updated: "2024-10", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 512, output: 0 } }, "recraft/recraft-v4.1-utility-pro": { id: "recraft/recraft-v4.1-utility-pro", name: "Recraft V4.1 Utility Pro", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "recraft", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-05-14", last_updated: "2026-05-14", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "recraft/recraft-v4-pro": { id: "recraft/recraft-v4-pro", name: "Recraft V4 Pro", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "recraft", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-02-17", last_updated: "2026-02-17", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "recraft/recraft-v4.1-utility": { id: "recraft/recraft-v4.1-utility", name: "Recraft V4.1 Utility", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "recraft", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-05-14", last_updated: "2026-05-14", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "recraft/recraft-v4": { id: "recraft/recraft-v4", name: "Recraft V4", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "recraft", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-02-17", last_updated: "2026-02-17", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "recraft/recraft-v4.1": { id: "recraft/recraft-v4.1", name: "Recraft V4.1", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "recraft", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-05-14", last_updated: "2026-05-14", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "recraft/recraft-v4.1-pro": { id: "recraft/recraft-v4.1-pro", name: "Recraft V4.1 Pro", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "recraft", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-05-14", last_updated: "2026-05-14", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "recraft/recraft-v2": { id: "recraft/recraft-v2", name: "Recraft V2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "recraft", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-03-13", last_updated: "2024-03", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 512, output: 0 } }, "meta/muse-spark-1.1": { id: "meta/muse-spark-1.1", name: "Muse Spark 1.1", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "muse", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "meta/muse-spark-1.2-contributor": { id: "meta/muse-spark-1.2-contributor", name: "Muse Spark 1.2 Contributor", description: "Open Llama multimodal model for image understanding and text reasoning", family: "muse", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, release_date: "2026-08-05", last_updated: "2026-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 0.1, output: 0.2, cache_read: 0.002 } }, "meta/muse-spark-1.2": { id: "meta/muse-spark-1.2", name: "Muse Spark 1.2", description: "Open Llama multimodal model for image understanding and text reasoning", family: "muse", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-05", last_updated: "2026-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "meta/llama-3.1-70b": { id: "meta/llama-3.1-70b", name: "Llama 3.1 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.72, output: 0.72 } }, "meta/llama-3.1-8b": { id: "meta/llama-3.1-8b", name: "Llama 3.1 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.22, output: 0.22 } }, "meta/llama-4-scout": { id: "meta/llama-4-scout", name: "Llama-4-Scout-17B-16E-Instruct-FP8", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "meta/llama-4-maverick": { id: "meta/llama-4-maverick", name: "Llama-4-Maverick-17B-128E-Instruct-FP8", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-08", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "meta/llama-3.3-70b": { id: "meta/llama-3.3-70b", name: "Llama-3.3-70B-Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0, output: 0 } }, "inclusionai/ling-3.0-flash": { id: "inclusionai/ling-3.0-flash", name: "Ling 3.0 Flash", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "ling", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, release_date: "2026-08-06", last_updated: "2026-08-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 }, cost: { input: 0.06, output: 0.18, cache_read: 0.012 } }, "inclusionai/ling-3.0-tiny-free": { id: "inclusionai/ling-3.0-tiny-free", name: "Ling 3.0 Tiny (Free)", description: "Free provider route for experiments, demos, and cost-sensitive chat workloads", family: "ling", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, release_date: "2026-08-06", last_updated: "2026-08-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 } }, "xai/grok-4.20-multi-agent-beta": { id: "xai/grok-4.20-multi-agent-beta", name: "Grok 4.20 Multi Agent Beta", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "xai/grok-4.1-fast-reasoning": { id: "xai/grok-4.1-fast-reasoning", name: "Grok 4.1 Fast Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-11-19", last_updated: "2025-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "xai/grok-4.20-multi-agent": { id: "xai/grok-4.20-multi-agent", name: "Grok 4.20 Multi-Agent", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, temperature: true, release_date: "2026-03-10", last_updated: "2026-03-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "xai/grok-imagine-video": { id: "xai/grok-imagine-video", name: "Grok Imagine", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "grok", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-28", last_updated: "2026-01-28", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "xai/grok-4.20-non-reasoning": { id: "xai/grok-4.20-non-reasoning", name: "Grok 4.20 Non-Reasoning", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-10", last_updated: "2026-03-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "xai/grok-4.3": { id: "xai/grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-30", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "xai/grok-imagine-image-2.0-preview": { id: "xai/grok-imagine-image-2.0-preview", name: "Grok Imagine Image 2.0 Preview", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "grok", attachment: false, reasoning: false, tool_call: false, release_date: "2026-08-08", last_updated: "2026-08-08", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "xai/grok-4.20-reasoning": { id: "xai/grok-4.20-reasoning", name: "Grok 4.20 Reasoning", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-10", last_updated: "2026-03-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "xai/grok-voice-think-fast-2.0": { id: "xai/grok-voice-think-fast-2.0", name: "Grok Voice Think Fast 2.0", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "grok", attachment: false, reasoning: false, tool_call: false, release_date: "2026-07-29", last_updated: "2026-07-29", modalities: { input: ["text", "audio"], output: ["text", "audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "xai/grok-imagine-video-1.5": { id: "xai/grok-imagine-video-1.5", name: "Grok Imagine Video 1.5", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "grok", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-06-22", last_updated: "2026-05-30", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "xai/grok-voice-think-fast-1.0": { id: "xai/grok-voice-think-fast-1.0", name: "Grok Voice Think Fast 1.0", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "grok", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "audio"], output: ["text", "audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "xai/grok-4.5": { id: "xai/grok-4.5", name: "Grok 4.5", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.3 } }, "xai/grok-imagine-video-1.5-preview": { id: "xai/grok-imagine-video-1.5-preview", name: "Grok Imagine Video 1.5 Preview", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "grok", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-05-30", last_updated: "2026-05-30", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "xai/grok-build-0.1": { id: "xai/grok-build-0.1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-20", last_updated: "2026-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1, output: 2, cache_read: 0.2 } }, "xai/grok-stt": { id: "xai/grok-stt", name: "Grok STT", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "grok", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 } }, "xai/grok-4.1-fast-non-reasoning": { id: "xai/grok-4.1-fast-non-reasoning", name: "Grok 4.1 Fast Non-Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-11-19", last_updated: "2025-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "xai/grok-tts": { id: "xai/grok-tts", name: "Grok TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "grok", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "xai/grok-4.20-reasoning-beta": { id: "xai/grok-4.20-reasoning-beta", name: "Grok 4.20 Beta Reasoning", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2 } }, "xai/grok-imagine-image": { id: "xai/grok-imagine-image", name: "Grok Imagine Image", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "grok", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-28", last_updated: "2026-02-19", modalities: { input: ["text"], output: ["text", "image"] }, open_weights: false, limit: { context: 0, output: 0 } }, "xai/grok-4.20-non-reasoning-beta": { id: "xai/grok-4.20-non-reasoning-beta", name: "Grok 4.20 Beta Non-Reasoning", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.4 } }, "morph/morph-v3-fast": { id: "morph/morph-v3-fast", name: "Morph v3 Fast", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "morph", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-08-15", last_updated: "2024-08-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16000, output: 16000 }, cost: { input: 0.8, output: 1.2 } }, "morph/morph-v3-large": { id: "morph/morph-v3-large", name: "Morph v3 Large", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "morph", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2024-08-15", last_updated: "2024-08-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 }, cost: { input: 0.9, output: 1.9 } }, "mistral/mistral-medium-3.5": { id: "mistral/mistral-medium-3.5", name: "Mistral Medium Latest", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, temperature: true, release_date: "2026-04-29", last_updated: "2026-05-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1.5, output: 7.5 } }, "mistral/codestral-embed": { id: "mistral/codestral-embed", name: "Codestral Embed", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "codestral-embed", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-05-28", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "mistral/mistral-large-3": { id: "mistral/mistral-large-3", name: "Mistral Large 3", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-10", release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.5, output: 1.5 } }, "mistral/mistral-nemo": { id: "mistral/mistral-nemo", name: "Mistral Nemo", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-07-18", last_updated: "2024-07-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.15, output: 0.15 } }, "mistral/mistral-small": { id: "mistral/mistral-small", name: "Mistral Small (latest)", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2024-09-17", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 4000 }, cost: { input: 0.1, output: 0.3 } }, "mistral/mistral-embed": { id: "mistral/mistral-embed", name: "Mistral Embed", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "mistral-embed", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2023-12-11", last_updated: "2023-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "mistral/mistral-medium": { id: "mistral/mistral-medium", name: "Mistral Medium 3.1", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-05-07", last_updated: "2025-05-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 64000 }, cost: { input: 0.4, output: 2 } }, "mistral/ministral-14b": { id: "mistral/ministral-14b", name: "Ministral 14B", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-10", release_date: "2025-12-02", last_updated: "2025-12-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.2, output: 0.2 } }, "mistral/devstral-2": { id: "mistral/devstral-2", name: "Devstral 2", description: "Mistral coding agent model for repository tasks and software engineering workflows", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-12-09", last_updated: "2025-12-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.4, output: 2 } }, "mistral/devstral-small-2": { id: "mistral/devstral-small-2", name: "Devstral Small 2", description: "Mistral coding agent model for repository tasks and software engineering workflows", family: "devstral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-12-09", last_updated: "2025-05-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.1, output: 0.3 } }, "mistral/magistral-small": { id: "mistral/magistral-small", name: "Magistral Small", description: "Mistral reasoning model for transparent analysis, math, and complex decisions", family: "magistral-small", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-03-17", last_updated: "2025-03-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.5, output: 1.5 } }, "mistral/magistral-medium": { id: "mistral/magistral-medium", name: "Magistral Medium (latest)", description: "Mistral reasoning model for transparent analysis, math, and complex decisions", family: "magistral-medium", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-06", release_date: "2025-03-17", last_updated: "2025-03-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 16384 }, cost: { input: 2, output: 5 } }, "mistral/ministral-8b": { id: "mistral/ministral-8b", name: "Ministral 8B (latest)", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-10-01", last_updated: "2024-10-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.1, output: 0.1 } }, "mistral/codestral": { id: "mistral/codestral", name: "Codestral (latest)", description: "Mistral code model for completions, refactors, and developer IDE workflows", family: "codestral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-05-29", last_updated: "2025-01-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 4096 }, cost: { input: 0.3, output: 0.9 } }, "mistral/ministral-3b": { id: "mistral/ministral-3b", name: "Ministral 3B (latest)", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-10-01", last_updated: "2024-10-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.04, output: 0.04 } }, "mistral/pixtral-12b": { id: "mistral/pixtral-12b", name: "Pixtral 12B", description: "Mistral vision-language model for image understanding and multimodal chat", family: "pixtral", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-09", release_date: "2024-09-01", last_updated: "2024-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.15, output: 0.15 } }, "poolside/laguna-s-2.1-free": { id: "poolside/laguna-s-2.1-free", name: "Laguna S 2.1 Free", description: "Free provider route for experiments, demos, and cost-sensitive chat workloads", family: "laguna-s", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 32768 }, cost: { input: 0, output: 0 } }, "poolside/laguna-s-2.1": { id: "poolside/laguna-s-2.1", name: "Laguna S 2.1", description: "Agentic coding model from Poolside in the XS size class for local deployment", family: "laguna-s", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-20", last_updated: "2026-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0.1, output: 0.2, cache_read: 0.01 } }, "minimax/minimax-m2.7-highspeed": { id: "minimax/minimax-m2.7-highspeed", name: "MiniMax M2.7 High Speed", description: "Low-latency M2.7 variant for interactive coding plans and agent loops", family: "minimax", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131100 }, cost: { input: 0.6, output: 2.4, cache_read: 0.06, cache_write: 0.375 } }, "minimax/minimax-m2.7": { id: "minimax/minimax-m2.7", name: "Minimax M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06, cache_write: 0.375 } }, "minimax/minimax-m2.1-lightning": { id: "minimax/minimax-m2.1-lightning", name: "MiniMax M2.1 Lightning", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-12-23", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 2.4, cache_read: 0.03, cache_write: 0.375 } }, "minimax/minimax-h3": { id: "minimax/minimax-h3", name: "MiniMax H3", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "minimax", attachment: true, reasoning: false, tool_call: false, release_date: "2026-07-30", last_updated: "2026-07-30", modalities: { input: ["text", "image"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "minimax/minimax-m3": { id: "minimax/minimax-m3", name: "MiniMax M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax-m3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-05-31", last_updated: "2026-06-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 1e6 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "minimax/minimax-m2.5-highspeed": { id: "minimax/minimax-m2.5-highspeed", name: "MiniMax M2.5 High Speed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131000 }, cost: { input: 0.6, output: 2.4, cache_read: 0.03, cache_write: 0.375 } }, "minimax/minimax-m2.5": { id: "minimax/minimax-m2.5", name: "MiniMax M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "minimax/minimax-m2": { id: "minimax/minimax-m2", name: "MiniMax M2", description: "Efficient open MiniMax model built for coding agents and tool-heavy workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: true, temperature: true, knowledge: "2024-10", release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 205000, output: 205000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "minimax/minimax-m2.1": { id: "minimax/minimax-m2.1", name: "MiniMax M2.1", description: "Earlier MiniMax agent model for practical coding and productivity tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: true, temperature: true, knowledge: "2024-10", release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "deepseek/deepseek-v3.1": { id: "deepseek/deepseek-v3.1", name: "DeepSeek-V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 128000 }, cost: { input: 0.25, output: 0.95, cache_read: 0.13 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-23", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.2, output: 0.4, cache_read: 0.04 } }, "deepseek/deepseek-v3.2-thinking": { id: "deepseek/deepseek-v3.2-thinking", name: "DeepSeek V3.2 Thinking", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8000 }, cost: { input: 0.62, output: 1.85 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-23", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048600, output: 1048600 }, cost: { input: 1.74, output: 3.48, cache_read: 0.14 } }, "deepseek/deepseek-v4-flash-0731": { id: "deepseek/deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-23", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.2, output: 0.4, cache_read: 0.04 } }, "deepseek/deepseek-v3": { id: "deepseek/deepseek-v3", name: "DeepSeek V3 0324", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2024-12-26", last_updated: "2024-12-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 163840 }, cost: { input: 0.27, output: 1.12, cache_read: 0.135 } }, "deepseek/deepseek-v3.2": { id: "deepseek/deepseek-v3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8000 }, cost: { input: 0.28, output: 0.42, cache_read: 0.028 } }, "deepseek/deepseek-v3.1-terminus": { id: "deepseek/deepseek-v3.1-terminus", name: "DeepSeek V3.1 Terminus", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-07", release_date: "2025-09-22", last_updated: "2025-09-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0.27, output: 1, cache_read: 0.135 } }, "deepseek/deepseek-r1": { id: "deepseek/deepseek-r1", name: "DeepSeek-R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32768 }, cost: { input: 1.35, output: 5.4 } }, "amazon/nova-2-lite": { id: "amazon/nova-2-lite", name: "Nova 2 Lite", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "nova", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: false, temperature: true, knowledge: "2024-10", release_date: "2025-12-02", last_updated: "2024-12-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 0.3, output: 2.5, cache_read: 0.075 } }, "amazon/titan-embed-text-v2": { id: "amazon/titan-embed-text-v2", name: "Titan Text Embeddings V2", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "titan-embed", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-04-30", last_updated: "2024-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 } }, "amazon/nova-micro": { id: "amazon/nova-micro", name: "Nova Micro", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova-micro", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-03", last_updated: "2024-12-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.035, output: 0.14, cache_read: 0.00875 } }, "amazon/nova-pro": { id: "amazon/nova-pro", name: "Nova Pro", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "nova-pro", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-03", last_updated: "2024-12-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 8192 }, cost: { input: 0.8, output: 3.2, cache_read: 0.2 } }, "amazon/nova-lite": { id: "amazon/nova-lite", name: "Nova Lite", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova-lite", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2024-12-03", last_updated: "2024-12-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 8192 }, cost: { input: 0.06, output: 0.24, cache_read: 0.015 } }, "alibaba/qwen3.7-flash": { id: "alibaba/qwen3.7-flash", name: "Qwen 3.7 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-28", last_updated: "2026-07-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 991000, output: 64000 }, cost: { input: 0.03, output: 0.13, cache_read: 0.006, cache_write: 0.038 } }, "alibaba/qwen3.7-plus": { id: "alibaba/qwen3.7-plus", name: "Qwen 3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen3.7-plus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 262144 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.4, output: 1.6, cache_read: 0.08, cache_write: 0.5 } }, "alibaba/wan-v2.6-t2v": { id: "alibaba/wan-v2.6-t2v", name: "Wan v2.6 Text-to-Video", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "alibaba/qwen3.5-plus": { id: "alibaba/qwen3.5-plus", name: "Qwen 3.5 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.4, output: 2.4, cache_read: 0.04, cache_write: 0.5 } }, "alibaba/qwen-3-14b": { id: "alibaba/qwen-3-14b", name: "Qwen3-14B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04-28", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 40960, output: 16384 }, cost: { input: 0.12, output: 0.24 } }, "alibaba/qwen3.7-max": { id: "alibaba/qwen3.7-max", name: "Qwen 3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 262144 }], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 991000, output: 64000 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5, cache_write: 3.125 } }, "alibaba/qwen3-next-80b-a3b-thinking": { id: "alibaba/qwen3-next-80b-a3b-thinking", name: "Qwen3 Next 80B A3B Thinking", description: "Efficient Qwen thinking model for local reasoning, math, and coding agents", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1 }], tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-09-11", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 1.2 } }, "alibaba/qwen3.6-27b": { id: "alibaba/qwen3.6-27b", name: "Qwen 3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 131072 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.6, output: 3.6 } }, "alibaba/qwen-3-30b": { id: "alibaba/qwen-3-30b", name: "Qwen3-30B-A3B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04-28", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 40960, output: 16384 }, cost: { input: 0.12, output: 0.5 } }, "alibaba/wan-v2.6-r2v-flash": { id: "alibaba/wan-v2.6-r2v-flash", name: "Wan v2.6 Reference-to-Video Flash", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "alibaba/qwen3-max-preview": { id: "alibaba/qwen3-max-preview", name: "Qwen3 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-05", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 1.2, output: 6, cache_read: 0.24 } }, "alibaba/qwen-3-235b": { id: "alibaba/qwen-3-235b", name: "Qwen3 235B A22B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04-28", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 16384 }, cost: { input: 0.22, output: 0.88 } }, "alibaba/qwen3.5-flash": { id: "alibaba/qwen3.5-flash", name: "Qwen 3.5 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-24", last_updated: "2026-02-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.1, output: 0.4, cache_read: 0.001, cache_write: 0.125 } }, "alibaba/qwen3-max": { id: "alibaba/qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen3 model for coding agents, complex reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 1.2, output: 6, cache_read: 0.24 } }, "alibaba/qwen3-coder-plus": { id: "alibaba/qwen3-coder-plus", name: "Qwen3 Coder Plus", description: "Hosted Qwen coder for software agents, repo edits, and long-context code", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 65536 }, cost: { input: 1, output: 5, cache_read: 0.2 } }, "alibaba/wan-v2.7-r2v": { id: "alibaba/wan-v2.7-r2v", name: "Wan v2.7 Reference-to-Video", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "alibaba/qwen3.8-max": { id: "alibaba/qwen3.8-max", name: "Qwen 3.8 Max", description: "Preview Qwen flagship for million-token multimodal reasoning and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "xhigh"] }, { type: "budget_tokens", min: 0, max: 262144 }], tool_call: true, temperature: true, release_date: "2026-08-02", last_updated: "2026-07-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 6, cache_read: 0.25, cache_write: 2.5 } }, "alibaba/qwen3-vl-235b-a22b-instruct": { id: "alibaba/qwen3-vl-235b-a22b-instruct", name: "Qwen3 VL 235B A22B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-09-23", last_updated: "2026-05-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 129024 }, cost: { input: 0.4, output: 1.6 } }, "alibaba/qwen3-vl-thinking": { id: "alibaba/qwen3-vl-thinking", name: "Qwen3 VL Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-09-23", last_updated: "2025-09-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.4, output: 4 } }, "alibaba/wan-v2.5-t2v-preview": { id: "alibaba/wan-v2.5-t2v-preview", name: "Wan v2.5 Text-to-Video Preview", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-09-24", last_updated: "2025-09-24", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "alibaba/wan-v2.7-t2v": { id: "alibaba/wan-v2.7-t2v", name: "Wan v2.7 Text-to-Video", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "alibaba/wan-v2.6-i2v-flash": { id: "alibaba/wan-v2.6-i2v-flash", name: "Wan v2.6 Image-to-Video Flash", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "alibaba/wan-v2.6-i2v": { id: "alibaba/wan-v2.6-i2v", name: "Wan v2.6 Image-to-Video", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "alibaba/qwen3-coder-30b-a3b": { id: "alibaba/qwen3-coder-30b-a3b", name: "Qwen 3 Coder 30B A3B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-31", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 8192 }, cost: { input: 0.15, output: 0.6 } }, "alibaba/qwen-3.6-max-preview": { id: "alibaba/qwen-3.6-max-preview", name: "Qwen 3.6 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 131072 }], tool_call: true, temperature: true, release_date: "2026-04-20", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 240000, output: 64000 }, cost: { input: 1.3, output: 7.8, cache_read: 0.26, cache_write: 1.625 } }, "alibaba/qwen3-embedding-4b": { id: "alibaba/qwen3-embedding-4b", name: "Qwen3 Embedding 4B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-06-05", last_updated: "2025-06-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 } }, "alibaba/qwen3-embedding-0.6b": { id: "alibaba/qwen3-embedding-0.6b", name: "Qwen3 Embedding 0.6B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 } }, "alibaba/wan-v2.6-r2v": { id: "alibaba/wan-v2.6-r2v", name: "Wan v2.6 Reference-to-Video", description: "Video model for prompt-guided generation, editing, and motion workflows", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 } }, "alibaba/qwen-3-32b": { id: "alibaba/qwen-3-32b", name: "Qwen 3.32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 38912 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04-28", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.16, output: 0.64 } }, "alibaba/qwen3-max-thinking": { id: "alibaba/qwen3-max-thinking", name: "Qwen 3 Max Thinking", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-01-23", last_updated: "2025-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 65536 }, cost: { input: 1.2, output: 6, cache_read: 0.24 } }, "alibaba/qwen3-vl-instruct": { id: "alibaba/qwen3-vl-instruct", name: "Qwen3 VL Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 129024 }, cost: { input: 0.4, output: 1.6 } }, "alibaba/qwen3-coder": { id: "alibaba/qwen3-coder", name: "Qwen3 Coder 480B A35B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-22", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 1.5, output: 7.5, cache_read: 0.3 } }, "alibaba/qwen3-coder-next": { id: "alibaba/qwen3-coder-next", name: "Qwen3 Coder Next", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-09", release_date: "2025-07-22", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.5, output: 1.2 } }, "alibaba/qwen3.6-plus": { id: "alibaba/qwen3.6-plus", name: "Qwen 3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 131072 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.5, output: 3, cache_read: 0.1, cache_write: 0.625 } }, "alibaba/qwen3-embedding-8b": { id: "alibaba/qwen3-embedding-8b", name: "Qwen3 Embedding 8B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-06-05", last_updated: "2025-06-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 } }, "alibaba/qwen3-next-80b-a3b-instruct": { id: "alibaba/qwen3-next-80b-a3b-instruct", name: "Qwen3 Next 80B A3B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-11", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 1.2 } }, "alibaba/qwen3-235b-a22b-thinking": { id: "alibaba/qwen3-235b-a22b-thinking", name: "Qwen3 235B A22B Thinking 2507", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-04", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.4, output: 4 } }, "kwaipilot/kat-coder-pro-v1": { id: "kwaipilot/kat-coder-pro-v1", name: "KAT-Coder-Pro V1", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "kat-coder", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2024-10", release_date: "2025-11-09", last_updated: "2025-10-24", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "kwaipilot/kat-coder-pro-v2": { id: "kwaipilot/kat-coder-pro-v2", name: "Kat Coder Pro V2", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "kat-coder", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-27", last_updated: "2026-03-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "kwaipilot/kat-coder-pro-v2.5": { id: "kwaipilot/kat-coder-pro-v2.5", name: "Kat Coder Pro V2.5", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "kat-coder", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-07-10", last_updated: "2026-07-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 80000 }, cost: { input: 0.74, output: 2.96, cache_read: 0.15 } }, "kwaipilot/kat-coder-air-v2.5": { id: "kwaipilot/kat-coder-air-v2.5", name: "Kat Coder Air V2.5", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "kat-coder", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-07-10", last_updated: "2026-07-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 80000 }, cost: { input: 0.15, output: 0.6, cache_read: 0.03 } }, "xiaomi/mimo-v2.5": { id: "xiaomi/mimo-v2.5", name: "MiMo M2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo-v2.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 131100 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "xiaomi/mimo-v2.5-pro": { id: "xiaomi/mimo-v2.5-pro", name: "MiMo V2.5 Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo-v2.5-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 131000 }, cost: { input: 0.435, output: 0.87, cache_read: 0.0036 } }, "anthropic/claude-sonnet-4.6": { id: "anthropic/claude-sonnet-4.6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, interleaved: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "anthropic/claude-fable-5": { id: "anthropic/claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-07-01", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4.8-fast": { id: "anthropic/claude-opus-4.8-fast", name: "Claude Opus 4.8 (Fast)", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, temperature: true, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4.5": { id: "anthropic/claude-opus-4.5", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024 }], tool_call: true, interleaved: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4.7": { id: "anthropic/claude-opus-4.7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, temperature: true, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-3-haiku": { id: "anthropic/claude-3-haiku", name: "Claude Haiku 3", description: "Legacy model retained for compatibility with older integrations", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-08-31", release_date: "2024-03-13", last_updated: "2024-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, cost: { input: 0.25, output: 1.25, cache_read: 0.03, cache_write: 0.3 } }, "anthropic/claude-sonnet-4": { id: "anthropic/claude-sonnet-4", name: "Claude Sonnet 4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 8192 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-haiku-4.5": { id: "anthropic/claude-haiku-4.5", name: "Claude Haiku 4.5", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024 }], tool_call: true, interleaved: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "anthropic/claude-opus-4": { id: "anthropic/claude-opus-4", name: "Claude Opus 4", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-opus-4.8": { id: "anthropic/claude-opus-4.8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, temperature: true, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-5": { id: "anthropic/claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-29", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "anthropic/claude-opus-5": { id: "anthropic/claude-opus-5", name: "Claude Opus 5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4.6": { id: "anthropic/claude-opus-4.6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, interleaved: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-4.5": { id: "anthropic/claude-sonnet-4.5", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "perplexity/pplx-embed-v1-0.6b": { id: "perplexity/pplx-embed-v1-0.6b", name: "Embed v1 0.6b", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "v0", attachment: false, reasoning: false, tool_call: false, release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 0 } }, "perplexity/sonar": { id: "perplexity/sonar", name: "Sonar", description: "Sonar search model for current answers, retrieval, and citation-backed chat", family: "sonar", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-02", release_date: "2025-02-19", last_updated: "2025-02-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 127000, output: 8000 } }, "perplexity/sonar-pro": { id: "perplexity/sonar-pro", name: "Sonar Pro", description: "Advanced Sonar search model for deeper research and cited synthesis", family: "sonar-pro", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-09", release_date: "2025-02-19", last_updated: "2025-02-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8000 } }, "perplexity/pplx-embed-v1-4b": { id: "perplexity/pplx-embed-v1-4b", name: "Embed v1 4b", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", attachment: false, reasoning: false, tool_call: false, release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 0 } }, "perplexity/sonar-reasoning-pro": { id: "perplexity/sonar-reasoning-pro", name: "Sonar Reasoning Pro", description: "Web-grounded reasoning model for multi-step research and cited answers", family: "sonar-reasoning", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: false, temperature: true, knowledge: "2025-09", release_date: "2025-02-19", last_updated: "2025-02-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 127000, output: 8000 } }, "moonshotai/kimi-k2.5": { id: "moonshotai/kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01-26", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262114, output: 262114 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "moonshotai/kimi-k2.7-code-highspeed": { id: "moonshotai/kimi-k2.7-code-highspeed", name: "Kimi K2.7 Code High Speed", description: "Lower-latency Kimi Code variant for interactive edits and coding-agent loops", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-06-15", last_updated: "2026-06-12", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 1.9, output: 8, cache_read: 0.38 } }, "moonshotai/kimi-k2.6": { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-20", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "moonshotai/kimi-k2.7-code": { id: "moonshotai/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32768 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "moonshotai/kimi-k2": { id: "moonshotai/kimi-k2", name: "Kimi K2 Instruct", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-07-11", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.57, output: 2.3 } }, "moonshotai/kimi-k2-thinking": { id: "moonshotai/kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Thinking Kimi model for slower research passes, planning, and hard technical questions", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: true, temperature: true, knowledge: "2024-08", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 216144, output: 216144 }, cost: { input: 0.47, output: 2, cache_read: 0.141 } }, "moonshotai/kimi-k3": { id: "moonshotai/kimi-k3", name: "Kimi K3", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "moonshotai/kimi-k3-fast": { id: "moonshotai/kimi-k3-fast", name: "Kimi K3 Fast", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-27", last_updated: "2026-07-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 4.5, output: 22.5, cache_read: 0.45 } }, "openai/gpt-5.1-codex-mini": { id: "openai/gpt-5.1-codex-mini", name: "GPT-5.1 Codex mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10", release_date: "2025-11-12", last_updated: "2025-11-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.03 } }, "openai/gpt-image-2": { id: "openai/gpt-image-2", name: "GPT Image 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 5, output: 30, cache_read: 1.25 } }, "openai/whisper-1": { id: "openai/whisper-1", name: "Whisper", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "whisper", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2022-09-21", last_updated: "2022-09-21", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 } }, "openai/gpt-5.2-pro": { id: "openai/gpt-5.2-pro", name: "GPT 5.2 ", description: "Higher-accuracy GPT-5.2 variant for tougher reasoning and review workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: true, knowledge: "2024-10", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 21, output: 168 } }, "openai/gpt-5.5-pro": { id: "openai/gpt-5.5-pro", name: "GPT 5.5 Pro", description: "Highest-accuracy GPT-5.5 tier for slower, precision-heavy reasoning and coding", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-12-01", release_date: "2026-04-24", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 872000, output: 128000 }, cost: { input: 30, output: 180 } }, "openai/gpt-5.4-pro": { id: "openai/gpt-5.4-pro", name: "GPT 5.4 Pro", description: "More exact GPT-5.4 tier for demanding professional reasoning and agent tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180 } }, "openai/gpt-5.6-sol": { id: "openai/gpt-5.6-sol", name: "GPT 5.6 Sol", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25 } }, "openai/gpt-4o-mini-transcribe": { id: "openai/gpt-4o-mini-transcribe", name: "GPT-4o mini Transcribe", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "o-mini", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-03-13", last_updated: "2024-03-13", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 1.25, output: 5 } }, "openai/gpt-realtime-1.5": { id: "openai/gpt-realtime-1.5", name: "GPT-Realtime-1.5", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gpt", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "audio"], output: ["text", "audio"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 4, output: 16, cache_read: 0.4 } }, "openai/text-embedding-ada-002": { id: "openai/text-embedding-ada-002", name: "text-embedding-ada-002", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2022-12-15", last_updated: "2022-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, input: 6656, output: 1536 } }, "openai/gpt-realtime-mini": { id: "openai/gpt-realtime-mini", name: "GPT-Realtime mini", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gpt", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-10-10", last_updated: "2025-10-10", modalities: { input: ["text", "audio"], output: ["text", "audio"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 0.6, output: 2.4, cache_read: 0.06 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, input: 122880, output: 8192 }, cost: { input: 0.05, output: 0.2 } }, "openai/gpt-oss-safeguard-20b": { id: "openai/gpt-oss-safeguard-20b", name: "gpt-oss-safeguard-20b", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-10-29", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, input: 65536, output: 65536 }, cost: { input: 0.075, output: 0.3, cache_read: 0.037 } }, "openai/gpt-image-1-mini": { id: "openai/gpt-image-1-mini", name: "GPT Image 1 Mini", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 2, output: 8, cache_read: 0.2 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT 5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-12-01", release_date: "2026-04-24", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 872000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "openai/o3-pro": { id: "openai/o3-pro", name: "o3 Pro", description: "High-effort o3 tier for difficult technical reasoning and careful answers", family: "o-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10", release_date: "2025-06-10", last_updated: "2025-06-10", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 1e5, output: 1e5 }, cost: { input: 20, output: 80 } }, "openai/gpt-realtime-2.1": { id: "openai/gpt-realtime-2.1", name: "gpt-realtime-2.1", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gpt", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2024-09-30", release_date: "2026-07-09", last_updated: "2026-07-06", modalities: { input: ["text", "audio"], output: ["text", "audio"] }, open_weights: false, limit: { context: 128000, input: 96000, output: 32000 }, cost: { input: 4, output: 24, cache_read: 0.4 } }, "openai/o3-deep-research": { id: "openai/o3-deep-research", name: "o3-deep-research", description: "Research model for long-horizon investigation, synthesis, and analytical reports", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium"] }], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-06-26", last_updated: "2024-06-26", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 1e5, output: 1e5 }, cost: { input: 10, output: 40, cache_read: 2.5 } }, "openai/gpt-5-codex": { id: "openai/gpt-5-codex", name: "GPT-5-Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "openai/tts-1-hd": { id: "openai/tts-1-hd", name: "TTS-1 HD", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2023-11-06", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "openai/gpt-3.5-turbo": { id: "openai/gpt-3.5-turbo", name: "GPT-3.5 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2021-09", release_date: "2023-03-01", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16385, input: 12289, output: 4096 }, cost: { input: 0.5, output: 1.5 } }, "openai/gpt-5.1-thinking": { id: "openai/gpt-5.1-thinking", name: "GPT 5.1 Thinking", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-11-12", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text", "image"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT 5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25 } }, "openai/gpt-realtime-whisper": { id: "openai/gpt-realtime-whisper", name: "gpt-realtime-whisper", description: "Streaming speech-to-text model for low-latency transcript deltas from live audio", family: "whisper", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 } }, "openai/gpt-image-1.5": { id: "openai/gpt-image-1.5", name: "GPT Image 1.5", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-16", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 5, output: 32, cache_read: 1.25 } }, "openai/gpt-5.2-codex": { id: "openai/gpt-5.2-codex", name: "GPT-5.2-Codex", description: "Code-specialist GPT for repository edits, reviews, and long-running software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10", release_date: "2025-12-18", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT 5.4 Nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "openai/gpt-5-pro": { id: "openai/gpt-5-pro", name: "GPT-5 pro", description: "Higher-accuracy GPT-5 tier for tough analysis, coding reviews, and planning", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10", release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 128000, output: 272000 }, cost: { input: 15, output: 120 } }, "openai/tts-1": { id: "openai/tts-1", name: "TTS-1", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2023-11-06", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT 5.4 Mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "openai/gpt-realtime-2": { id: "openai/gpt-realtime-2", name: "gpt-realtime-2", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gpt", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "audio"], output: ["text", "audio"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 4, output: 24, cache_read: 0.4 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.1, output: 0.5 } }, "openai/gpt-5.6-luna": { id: "openai/gpt-5.6-luna", name: "GPT 5.6 Luna", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, cache_write: 0.25 } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.3-codex": { id: "openai/gpt-5.3-codex", name: "GPT 5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.3-chat": { id: "openai/gpt-5.3-chat", name: "GPT-5.3 Chat", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, temperature: true, release_date: "2026-03-03", last_updated: "2026-03-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 111616, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.1-codex": { id: "openai/gpt-5.1-codex", name: "GPT-5.1-Codex", description: "Codex GPT for repository edits, code review, and practical software agents", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10", release_date: "2025-11-12", last_updated: "2025-11-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "openai/gpt-4o-mini-search-preview": { id: "openai/gpt-4o-mini-search-preview", name: "GPT 4o Mini Search Preview", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-09", release_date: "2025-03-12", last_updated: "2025-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 111616, output: 16384 }, cost: { input: 0.15, output: 0.6 } }, "openai/gpt-5.6-terra": { id: "openai/gpt-5.6-terra", name: "GPT 5.6 Terra", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 2.5 } }, "openai/gpt-image-1": { id: "openai/gpt-image-1", name: "GPT Image 1", description: "OpenAI image model for production generation, edits, and brand-safe visual workflows", family: "gpt-image", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-03-25", last_updated: "2025-04-24", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 5, output: 40, cache_read: 1.25 } }, "openai/gpt-5.1-codex-max": { id: "openai/gpt-5.1-codex-max", name: "GPT 5.1 Codex Max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10", release_date: "2025-11-19", last_updated: "2025-11-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/text-embedding-3-large": { id: "openai/text-embedding-3-large", name: "text-embedding-3-large", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, input: 6656, output: 1536 } }, "openai/gpt-4o-transcribe": { id: "openai/gpt-4o-transcribe", name: "GPT-4o Transcribe", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "gpt", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-03-13", last_updated: "2024-03-13", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 2.5, output: 10 } }, "openai/text-embedding-3-small": { id: "openai/text-embedding-3-small", name: "text-embedding-3-small", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, input: 6656, output: 1536 } }, "openai/o4-mini": { id: "openai/o4-mini", name: "o4-mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 1.1, output: 4.4, cache_read: 0.275 } }, "openai/gpt-4.1": { id: "openai/gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/o3": { id: "openai/o3", name: "o3", description: "Deliberate o-series reasoner for hard math, coding, and multi-step analysis", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/gpt-5-nano": { id: "openai/gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "openai/gpt-4-turbo": { id: "openai/gpt-4-turbo", name: "GPT-4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-12", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, status: "deprecated", cost: { input: 10, output: 30 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/o1": { id: "openai/o1", name: "o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2023-09", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 15, output: 60, cache_read: 7.5 } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4o-mini": { id: "openai/gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "openai/o3-mini": { id: "openai/o3-mini", name: "o3-mini", description: "Smaller o-series reasoner for economical coding, math, and planning tasks", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-4.1-nano": { id: "openai/gpt-4.1-nano", name: "GPT-4.1 nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, status: "deprecated", cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "openai/gpt-4o": { id: "openai/gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-4.1-mini": { id: "openai/gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "arcee-ai/trinity-mini": { id: "arcee-ai/trinity-mini", name: "Trinity Mini", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "trinity", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-10", release_date: "2025-12-01", last_updated: "2025-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.045, output: 0.15 } }, "arcee-ai/trinity-large-thinking": { id: "arcee-ai/trinity-large-thinking", name: "Trinity Large Thinking", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "trinity", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262100, output: 80000 }, cost: { input: 0.25, output: 0.8999999999999999 } }, "zai/glm-4.6v": { id: "zai/glm-4.6v", name: "GLM-4.6V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-09-30", last_updated: "2025-12-08", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 24000 }, cost: { input: 0.3, output: 0.9, cache_read: 0.05 } }, "zai/glm-5": { id: "zai/glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202800, output: 131100 }, cost: { input: 1, output: 3.2 } }, "zai/glm-4.5-air": { id: "zai/glm-4.5-air", name: "GLM 4.5 Air", description: "Lighter GLM-4.5 variant for fast coding assistance and cheaper agents", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 96000 }, cost: { input: 0.2, output: 1.1, cache_read: 0.03 } }, "zai/glm-5.1": { id: "zai/glm-5.1", name: "GLM 5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202800, output: 64000 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "zai/glm-4.7-flash": { id: "zai/glm-4.7-flash", name: "GLM 4.7 Flash", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131000 }, cost: { input: 0.07, output: 0.4 } }, "zai/glm-5.2": { id: "zai/glm-5.2", name: "GLM 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-16", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 1.1, output: 3.851, cache_read: 0.275 } }, "zai/glm-4.7-flashx": { id: "zai/glm-4.7-flashx", name: "GLM 4.7 FlashX", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, temperature: true, knowledge: "2025-01", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.06, output: 0.4, cache_read: 0.01 } }, "zai/glm-5.2-fast": { id: "zai/glm-5.2-fast", name: "GLM 5.2 Fast", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-23", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2.1, output: 6.6, cache_read: 0.21 } }, "zai/glm-4.6": { id: "zai/glm-4.6", name: "GLM 4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 96000 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "zai/glm-4.6v-flash": { id: "zai/glm-4.6v-flash", name: "GLM-4.6V-Flash", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 24000 } }, "zai/glm-4.5": { id: "zai/glm-4.5", name: "GLM 4.5", description: "Hybrid-reasoning GLM release that made the 4.5 line broadly useful", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, temperature: true, knowledge: "2025-07", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 96000 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "zai/glm-4.5v": { id: "zai/glm-4.5v", name: "GLM 4.5V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-08", release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 66000, output: 16000 }, cost: { input: 0.6, output: 1.8, cache_read: 0.11 } }, "zai/glm-4.7": { id: "zai/glm-4.7", name: "GLM 4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: true, temperature: true, knowledge: "2024-10", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 120000 }, cost: { input: 0.6, output: 2.2, cache_read: 0.12 } }, "zai/glm-5-turbo": { id: "zai/glm-5-turbo", name: "GLM 5 Turbo", description: "Faster GLM-5 lane for coding agents that need lower latency", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-15", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202800, output: 131100 }, cost: { input: 1.2, output: 4, cache_read: 0.24 } }, "zai/glm-5v-turbo": { id: "zai/glm-5v-turbo", name: "GLM 5V Turbo", description: "Fast GLM vision model for screenshots, documents, and multimodal agent tasks", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 1.2, output: 4, cache_read: 0.24 } }, "stepfun/step-3.5-flash": { id: "stepfun/step-3.5-flash", name: "StepFun 3.5 Flash", description: "StepFun flash lane for quick multimodal reasoning and coding assistance", family: "step", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-01-29", last_updated: "2026-02-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262114, output: 262114 }, cost: { input: 0.09, output: 0.3, cache_read: 0.02 } }, "stepfun/step-3.7-flash": { id: "stepfun/step-3.7-flash", name: "Step 3.7 Flash", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", family: "step", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-28", last_updated: "2026-05-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0.2, output: 1.15, cache_read: 0.04 } }, "quiverai/arrow-1.1": { id: "quiverai/arrow-1.1", name: "Arrow 1.1", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "o", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 131072, output: 131072 } } } }, "alibaba-cn": { id: "alibaba-cn", env: ["DASHSCOPE_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://dashscope.aliyuncs.com/compatible-mode/v1", name: "Alibaba (China)", doc: "https://www.alibabacloud.com/help/en/model-studio/models", models: { "qwen3-coder-480b-a35b-instruct": { id: "qwen3-coder-480b-a35b-instruct", name: "Qwen3-Coder 480B-A35B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.861, output: 3.441 } }, "qwen3.7-flash": { id: "qwen3.7-flash", name: "Qwen3.7 Flash", description: "Lightweight multimodal Qwen model for high-throughput text, image, and video tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 262144 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 991000, output: 65536 }, cost: { input: 0.02962, output: 0.1185, cache_read: 0.002962, cache_write: 0.03703, tiers: [{ input: 0.08887, output: 0.35549, cache_read: 0.008887, cache_write: 0.11109, tier: { type: "context", size: 32000 } }, { input: 0.17774, output: 0.71098, cache_read: 0.017774, cache_write: 0.22218, tier: { type: "context", size: 256000 } }] } }, "qwen3.7-plus": { id: "qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 262144 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 0.625, tiers: [{ input: 2, output: 6, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 128000 } }] } }, "qwen3-vl-plus": { id: "qwen3-vl-plus", name: "Qwen3-VL Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.143353, output: 1.433525, reasoning: 4.300576 } }, "qwen3-32b": { id: "qwen3-32b", name: "Qwen3 32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 38912 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.287, output: 1.147, reasoning: 2.868 } }, "glm-5": { id: "glm-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 32768 }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 16384 }, cost: { input: 0.86, output: 3.15 } }, "qwen-mt-plus": { id: "qwen-mt-plus", name: "Qwen-MT Plus", description: "Translation model for multilingual conversion, localization, and cross-language workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-04", release_date: "2025-01", last_updated: "2025-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 8192 }, cost: { input: 0.259, output: 0.775 } }, "qwen2-5-vl-72b-instruct": { id: "qwen2-5-vl-72b-instruct", name: "Qwen2.5-VL 72B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 2.294, output: 6.881 } }, "qwen-max": { id: "qwen-max", name: "Qwen Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-04-03", last_updated: "2025-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.345, output: 1.377 } }, "qwen3.5-plus": { id: "qwen3.5-plus", name: "Qwen3.5 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.573, output: 3.44, reasoning: 3.44 } }, "tongyi-intent-detect-v3": { id: "tongyi-intent-detect-v3", name: "Tongyi Intent Detect V3", description: "General-purpose chat model for instruction following, writing, and analysis", family: "yi", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-04", release_date: "2024-01", last_updated: "2024-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1024 }, cost: { input: 0.058, output: 0.144 } }, "qwen-omni-turbo": { id: "qwen-omni-turbo", name: "Qwen-Omni Turbo", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-01-19", last_updated: "2025-03-26", modalities: { input: ["text", "image", "audio", "video"], output: ["text", "audio"] }, open_weights: false, limit: { context: 32768, output: 2048 }, cost: { input: 0.058, output: 0.23, input_audio: 3.584, output_audio: 7.168 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 131072 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-14", last_updated: "2026-04-14", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 128000 }, cost: { input: 0.87, output: 3.48, cache_read: 0.17 } }, "qwen-vl-max": { id: "qwen-vl-max", name: "Qwen-VL Max", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-04-08", last_updated: "2025-08-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.23, output: 0.574 } }, "qwen-deep-research": { id: "qwen-deep-research", name: "Qwen Deep Research", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-01", last_updated: "2024-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 7.742, output: 23.367 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Moonshot Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.574, output: 2.411 } }, "qwen3-coder-30b-a3b-instruct": { id: "qwen3-coder-30b-a3b-instruct", name: "Qwen3-Coder 30B-A3B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.216, output: 0.861 } }, "qwen2-5-math-72b-instruct": { id: "qwen2-5-math-72b-instruct", name: "Qwen2.5-Math 72B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 4096, output: 3072 }, cost: { input: 0.574, output: 1.721 } }, "qwen3-vl-235b-a22b": { id: "qwen3-vl-235b-a22b", name: "Qwen3-VL 235B-A22B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.286705, output: 1.14682, reasoning: 2.867051 } }, "qwen2-5-72b-instruct": { id: "qwen2-5-72b-instruct", name: "Qwen2.5 72B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.574, output: 1.721 } }, "qwen2-5-math-7b-instruct": { id: "qwen2-5-math-7b-instruct", name: "Qwen2.5-Math 7B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 4096, output: 3072 }, cost: { input: 0.144, output: 0.287 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 1.1, output: 3.851, cache_read: 0.275, cache_write: 0 } }, "deepseek-r1-distill-qwen-14b": { id: "deepseek-r1-distill-qwen-14b", name: "DeepSeek R1 Distill Qwen 14B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 16384 }, cost: { input: 0.144, output: 0.431 } }, "qwen3.7-max": { id: "qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 262144 }], tool_call: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5, cache_write: 3.125 } }, "qwen3-next-80b-a3b-thinking": { id: "qwen3-next-80b-a3b-thinking", name: "Qwen3-Next 80B-A3B (Thinking)", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.144, output: 1.434 } }, "qwen-mt-turbo": { id: "qwen-mt-turbo", name: "Qwen-MT Turbo", description: "Translation model for multilingual conversion, localization, and cross-language workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-04", release_date: "2025-01", last_updated: "2025-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, output: 8192 }, cost: { input: 0.101, output: 0.28 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Moonshot Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.929, output: 3.858 } }, "qvq-max": { id: "qvq-max", name: "QVQ Max", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "qvq", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-03-25", last_updated: "2025-03-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 1.147, output: 4.588 } }, "qwen2-5-vl-7b-instruct": { id: "qwen2-5-vl-7b-instruct", name: "Qwen2.5-VL 7B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.287, output: 0.717 } }, "qwen-plus-character": { id: "qwen-plus-character", name: "Qwen Plus Character", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-01", last_updated: "2024-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 4096 }, cost: { input: 0.115, output: 0.287 } }, "qwen-math-turbo": { id: "qwen-math-turbo", name: "Qwen Math Turbo", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09-19", last_updated: "2024-09-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 4096, output: 3072 }, cost: { input: 0.287, output: 0.861 } }, "deepseek-r1-distill-llama-70b": { id: "deepseek-r1-distill-llama-70b", name: "DeepSeek R1 Distill Llama 70B", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 16384 }, cost: { input: 0.287, output: 0.861 } }, "qwen3-vl-30b-a3b": { id: "qwen3-vl-30b-a3b", name: "Qwen3-VL 30B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.108, output: 0.431, reasoning: 1.076 } }, "deepseek-r1-distill-qwen-1-5b": { id: "deepseek-r1-distill-qwen-1-5b", name: "DeepSeek R1 Distill Qwen 1.5B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 16384 }, cost: { input: 0, output: 0 } }, "qwen3-14b": { id: "qwen3-14b", name: "Qwen3 14B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 38912 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.144, output: 0.574, reasoning: 1.434 } }, "qwen2-5-32b-instruct": { id: "qwen2-5-32b-instruct", name: "Qwen2.5 32B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.287, output: 0.861 } }, "qwen3-omni-flash-realtime": { id: "qwen3-omni-flash-realtime", name: "Qwen3-Omni Flash Realtime", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image", "audio"], output: ["text", "audio"] }, open_weights: false, limit: { context: 65536, output: 16384 }, cost: { input: 0.23, output: 0.918, input_audio: 3.584, output_audio: 7.168 } }, "qwen3-235b-a22b": { id: "qwen3-235b-a22b", name: "Qwen3 235B-A22B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 38912 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.287, output: 1.147, reasoning: 2.868 } }, "qwen3.5-flash": { id: "qwen3.5-flash", name: "Qwen3.5 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.172, output: 1.72, reasoning: 1.72 } }, "qwen3-max": { id: "qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.861, output: 3.441 } }, "qwen3-8b": { id: "qwen3-8b", name: "Qwen3 8B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 38912 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.072, output: 0.287, reasoning: 0.717 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "deepseek-r1-0528": { id: "deepseek-r1-0528", name: "DeepSeek R1 0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-05-28", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0.574, output: 2.294 } }, "qwen2-5-14b-instruct": { id: "qwen2-5-14b-instruct", name: "Qwen2.5 14B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.144, output: 0.431 } }, "moonshot-kimi-k2-instruct": { id: "moonshot-kimi-k2-instruct", name: "Moonshot Kimi K2 Instruct", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.574, output: 2.294 } }, "qwen2-5-7b-instruct": { id: "qwen2-5-7b-instruct", name: "Qwen2.5 7B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-09", last_updated: "2024-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.072, output: 0.144 } }, "qwen-doc-turbo": { id: "qwen-doc-turbo", name: "Qwen Doc Turbo", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-01", last_updated: "2024-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.087, output: 0.144 } }, "qwen3.8-max": { id: "qwen3.8-max", name: "Qwen3.8 Max", description: "2.4-trillion-parameter MoE flagship for coding, professional work, multimodal understanding, and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "xhigh"] }, { type: "budget_tokens", min: 0, max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 1.77744, output: 5.33231, cache_read: 0.22218, cache_write: 2.22179 } }, "deepseek-v3-2-exp": { id: "deepseek-v3-2-exp", name: "DeepSeek V3.2 Exp", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 65536 }, cost: { input: 0.287, output: 0.431 } }, "qwen3-coder-flash": { id: "qwen3-coder-flash", name: "Qwen3 Coder Flash", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.144, output: 0.574 } }, "deepseek-v3": { id: "deepseek-v3", name: "DeepSeek V3", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-12-01", last_updated: "2024-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 65536, output: 8192 }, cost: { input: 0.287, output: 1.147 } }, "qwq-32b": { id: "qwq-32b", name: "QwQ 32B", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-12", last_updated: "2024-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.287, output: 0.861 } }, "qwen2-5-coder-32b-instruct": { id: "qwen2-5-coder-32b-instruct", name: "Qwen2.5-Coder 32B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-11", last_updated: "2024-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.287, output: 0.861 } }, "qwen-flash": { id: "qwen-flash", name: "Qwen Flash", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.022, output: 0.216 } }, "qwen-long": { id: "qwen-long", name: "Qwen Long", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-01-25", last_updated: "2025-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e7, output: 8192 }, cost: { input: 0.072, output: 0.287 } }, "qwen-plus": { id: "qwen-plus", name: "Qwen Plus", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-01-25", last_updated: "2025-09-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.115, output: 0.287, reasoning: 1.147 } }, "deepseek-r1-distill-llama-8b": { id: "deepseek-r1-distill-llama-8b", name: "DeepSeek R1 Distill Llama 8B", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 16384 }, cost: { input: 0, output: 0 } }, "deepseek-r1": { id: "deepseek-r1", name: "DeepSeek R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 16384 }, cost: { input: 0.574, output: 2.294 } }, "MiniMax-M2.5": { id: "MiniMax-M2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "qwen-omni-turbo-realtime": { id: "qwen-omni-turbo-realtime", name: "Qwen-Omni Turbo Realtime", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-05-08", last_updated: "2025-05-08", modalities: { input: ["text", "image", "audio"], output: ["text", "audio"] }, open_weights: false, limit: { context: 32768, output: 2048 }, cost: { input: 0.23, output: 0.918, input_audio: 3.584, output_audio: 7.168 } }, "qwen-turbo": { id: "qwen-turbo", name: "Qwen Turbo", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 38912 }], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-11-01", last_updated: "2025-07-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 16384 }, cost: { input: 0.044, output: 0.087, reasoning: 0.431 } }, "qwen2-5-omni-7b": { id: "qwen2-5-omni-7b", name: "Qwen2.5-Omni 7B", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-12", last_updated: "2024-12", modalities: { input: ["text", "image", "audio", "video"], output: ["text", "audio"] }, open_weights: true, limit: { context: 32768, output: 2048 }, cost: { input: 0.087, output: 0.345, input_audio: 5.448 } }, "qwen3-asr-flash": { id: "qwen3-asr-flash", name: "Qwen3-ASR Flash", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2024-04", release_date: "2025-09-08", last_updated: "2025-09-08", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 53248, output: 4096 }, cost: { input: 0.032, output: 0.032 } }, "qwq-plus": { id: "qwq-plus", name: "QwQ Plus", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-03-05", last_updated: "2025-03-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.23, output: 0.574 } }, "qwen3.6-flash": { id: "qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 131072 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.1875, output: 1.125, cache_write: 0.234375 } }, "kimi-k2-thinking": { id: "kimi-k2-thinking", name: "Moonshot Kimi K2 Thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.574, output: 2.294 } }, "qwen3.5-397b-a17b": { id: "qwen3.5-397b-a17b", name: "Qwen3.5 397B-A17B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.43, output: 2.58, reasoning: 2.58 } }, "deepseek-v3-1": { id: "deepseek-v3-1", name: "DeepSeek V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 65536 }, cost: { input: 0.574, output: 1.721 } }, "deepseek-r1-distill-qwen-7b": { id: "deepseek-r1-distill-qwen-7b", name: "DeepSeek R1 Distill Qwen 7B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 16384 }, cost: { input: 0.072, output: 0.144 } }, "qwen3.6-max-preview": { id: "qwen3.6-max-preview", name: "Qwen3.6 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 131072 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-20", last_updated: "2026-04-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 245800, output: 65536 }, cost: { input: 1.32, output: 7.9, cache_read: 0.132 } }, "qwen-vl-ocr": { id: "qwen-vl-ocr", name: "Qwen-VL OCR", description: "OCR model for extracting structured text from documents and screenshots", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-04", release_date: "2024-10-28", last_updated: "2025-04-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 34096, output: 4096 }, cost: { input: 0.717, output: 0.717 } }, "deepseek-r1-distill-qwen-32b": { id: "deepseek-r1-distill-qwen-32b", name: "DeepSeek R1 Distill Qwen 32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 16384 }, cost: { input: 0.287, output: 0.861 } }, "qwen2-5-coder-7b-instruct": { id: "qwen2-5-coder-7b-instruct", name: "Qwen2.5-Coder 7B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-11", last_updated: "2024-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.144, output: 0.287 } }, "qwen-math-plus": { id: "qwen-math-plus", name: "Qwen Math Plus", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-08-16", last_updated: "2024-09-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 4096, output: 3072 }, cost: { input: 0.574, output: 1.721 } }, "qwen3-omni-flash": { id: "qwen3-omni-flash", name: "Qwen3-Omni Flash", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2025-09-15", last_updated: "2025-09-15", modalities: { input: ["text", "image", "audio", "video"], output: ["text", "audio"] }, open_weights: false, limit: { context: 65536, output: 16384 }, cost: { input: 0.058, output: 0.23, input_audio: 3.584, output_audio: 7.168 } }, "qwen3.6-plus": { id: "qwen3.6-plus", name: "Qwen3.6 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 81920 }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, cache_write: 0.625, tiers: [{ input: 2, output: 6, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.2, cache_write: 2.5 } } }, "qwen3-next-80b-a3b-instruct": { id: "qwen3-next-80b-a3b-instruct", name: "Qwen3-Next 80B-A3B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.144, output: 0.574 } }, "qwen-vl-plus": { id: "qwen-vl-plus", name: "Qwen-VL Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04", release_date: "2024-01-25", last_updated: "2025-08-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 8192 }, cost: { input: 0.115, output: 0.287 } }, "siliconflow/deepseek-r1-0528": { id: "siliconflow/deepseek-r1-0528", name: "siliconflow/deepseek-r1-0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-05-28", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 32768 }, cost: { input: 0.5, output: 2.18 } }, "siliconflow/deepseek-v3-0324": { id: "siliconflow/deepseek-v3-0324", name: "siliconflow/deepseek-v3-0324", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-12-26", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 163840 }, cost: { input: 0.25, output: 1 } }, "siliconflow/deepseek-v3.2": { id: "siliconflow/deepseek-v3.2", name: "siliconflow/deepseek-v3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-03", last_updated: "2025-12-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 65536 }, cost: { input: 0.27, output: 0.42 } }, "siliconflow/deepseek-v3.1-terminus": { id: "siliconflow/deepseek-v3.1-terminus", name: "siliconflow/deepseek-v3.1-terminus", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-29", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 65536 }, cost: { input: 0.27, output: 1 } }, "MiniMax/MiniMax-M2.7": { id: "MiniMax/MiniMax-M2.7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06, cache_write: 0.375 } }, "qwen3-coder-plus": { id: "qwen3-coder-plus", name: "Qwen3 Coder Plus", description: "Hosted Qwen coder for software agents, repo edits, and long-context code", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 65536 }, cost: { input: 1, output: 5 } }, "kimi/kimi-k2.5": { id: "kimi/kimi-k2.5", name: "kimi/kimi-k2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } } } }, "novita-ai": { id: "novita-ai", env: ["NOVITA_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.novita.ai/openai", name: "NovitaAI", doc: "https://novita.ai/docs/guides/introduction", models: { "microsoft/wizardlm-2-8x22b": { id: "microsoft/wizardlm-2-8x22b", name: "Wizardlm 2 8x22B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-04-24", last_updated: "2024-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65535, output: 8000 }, cost: { input: 0.62, output: 0.62 } }, "google/gemma-4-26b-a4b-it": { id: "google/gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.13, output: 0.4 } }, "google/gemma-3-27b-it": { id: "google/gemma-3-27b-it", name: "Gemma 3 27B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-03-25", last_updated: "2025-03-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 98304, output: 16384 }, cost: { input: 0.119, output: 0.2 } }, "google/gemma-3-12b-it": { id: "google/gemma-3-12b-it", name: "Gemma 3 12B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.05, output: 0.1 } }, "google/gemma-4-31b-it": { id: "google/gemma-4-31b-it", name: "Gemma 4 31B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.14, output: 0.4 } }, "zai-org/glm-4.6v": { id: "zai-org/glm-4.6v", name: "GLM 4.6V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glmv", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "video", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.3, output: 0.9, cache_read: 0.055 } }, "zai-org/glm-5": { id: "zai-org/glm-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202800, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.2 } }, "zai-org/glm-4.5-air": { id: "zai-org/glm-4.5-air", name: "GLM 4.5 Air", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-10-13", last_updated: "2025-10-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.13, output: 0.85, cache_read: 0.025 } }, "zai-org/glm-5.1": { id: "zai-org/glm-5.1", name: "GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-27", last_updated: "2026-03-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 1.38, output: 4.4, cache_read: 0.26 } }, "zai-org/glm-4.7-flash": { id: "zai-org/glm-4.7-flash", name: "GLM-4.7-Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.07, output: 0.4, cache_read: 0.01 } }, "zai-org/glm-5.2": { id: "zai-org/glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "zai-org/autoglm-phone-9b-multilingual": { id: "zai-org/autoglm-phone-9b-multilingual", name: "AutoGLM-Phone-9B-Multilingual", description: "GLM vision model for visual reasoning, documents, and multimodal agents", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-12-10", last_updated: "2025-12-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 0.035, output: 0.138 } }, "zai-org/glm-4.6": { id: "zai-org/glm-4.6", name: "GLM 4.6", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.55, output: 2.2, cache_read: 0.11 } }, "zai-org/glm-4.5": { id: "zai-org/glm-4.5", name: "GLM-4.5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "zai-org/glm-4.5v": { id: "zai-org/glm-4.5v", name: "GLM 4.5V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glmv", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text", "video", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 16384 }, cost: { input: 0.6, output: 1.8, cache_read: 0.11 } }, "zai-org/glm-4.7": { id: "zai-org/glm-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "qwen/qwen3-coder-480b-a35b-instruct": { id: "qwen/qwen3-coder-480b-a35b-instruct", name: "Qwen3 Coder 480B A35B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.38, output: 1.55 } }, "qwen/qwen-mt-plus": { id: "qwen/qwen-mt-plus", name: "Qwen MT Plus", description: "Translation model for multilingual conversion, localization, and cross-language workflows", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-09-03", last_updated: "2025-09-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, output: 8192 }, cost: { input: 0.25, output: 0.75 } }, "qwen/qwen3-235b-a22b-thinking-2507": { id: "qwen/qwen3-235b-a22b-thinking-2507", name: "Qwen3 235B A22b Thinking 2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.3, output: 3 } }, "qwen/qwen3-vl-30b-a3b-thinking": { id: "qwen/qwen3-vl-30b-a3b-thinking", name: "qwen/qwen3-vl-30b-a3b-thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-11", last_updated: "2025-10-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.2, output: 1 } }, "qwen/qwen3-coder-30b-a3b-instruct": { id: "qwen/qwen3-coder-30b-a3b-instruct", name: "Qwen3 Coder 30b A3B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-09", last_updated: "2025-10-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 160000, output: 32768 }, cost: { input: 0.07, output: 0.27 } }, "qwen/qwen3.5-27b": { id: "qwen/qwen3.5-27b", name: "Qwen3.5-27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.3, output: 2.4 } }, "qwen/qwen3-8b-fp8": { id: "qwen/qwen3-8b-fp8", name: "Qwen3 8B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, release_date: "2025-04-29", last_updated: "2025-04-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 20000 }, cost: { input: 0.035, output: 0.138 } }, "qwen/qwen3.7-max": { id: "qwen/qwen3.7-max", name: "Qwen3.7-Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 1.25, output: 3.75, cache_read: 0.25, cache_write: 1.5625 } }, "qwen/qwen3-next-80b-a3b-thinking": { id: "qwen/qwen3-next-80b-a3b-thinking", name: "Qwen3 Next 80B A3B Thinking", description: "Qwen reasoning model for deliberate problem solving, math, and coding", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-10", last_updated: "2025-09-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 1.5 } }, "qwen/qwen3.5-35b-a3b": { id: "qwen/qwen3.5-35b-a3b", name: "Qwen3.5-35B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.25, output: 2 } }, "qwen/qwen3-32b-fp8": { id: "qwen/qwen3-32b-fp8", name: "Qwen3 32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, release_date: "2025-04-29", last_updated: "2025-04-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 20000 }, cost: { input: 0.1, output: 0.45 } }, "qwen/qwen3-30b-a3b-fp8": { id: "qwen/qwen3-30b-a3b-fp8", name: "Qwen3 30B A3B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, release_date: "2025-04-29", last_updated: "2025-04-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 20000 }, cost: { input: 0.09, output: 0.45 } }, "qwen/qwen3-max": { id: "qwen/qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-24", last_updated: "2025-09-24", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 2.11, output: 8.45 } }, "qwen/qwen3-vl-8b-instruct": { id: "qwen/qwen3-vl-8b-instruct", name: "qwen/qwen3-vl-8b-instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-17", last_updated: "2025-10-17", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.08, output: 0.5 } }, "qwen/qwen3-235b-a22b-fp8": { id: "qwen/qwen3-235b-a22b-fp8", name: "Qwen3 235B A22B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, release_date: "2025-04-29", last_updated: "2025-04-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 20000 }, cost: { input: 0.2, output: 0.8 } }, "qwen/qwen3-235b-a22b-instruct-2507": { id: "qwen/qwen3-235b-a22b-instruct-2507", name: "Qwen3 235B A22B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-22", last_updated: "2025-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.09, output: 0.58 } }, "qwen/qwen3-vl-235b-a22b-instruct": { id: "qwen/qwen3-vl-235b-a22b-instruct", name: "Qwen3 VL 235B A22B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-24", last_updated: "2025-09-24", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.3, output: 1.5 } }, "qwen/qwen-2.5-72b-instruct": { id: "qwen/qwen-2.5-72b-instruct", name: "Qwen 2.5 72B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2024-10-15", last_updated: "2024-10-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 8192 }, cost: { input: 0.38, output: 0.4 } }, "qwen/qwen3-omni-30b-a3b-instruct": { id: "qwen/qwen3-omni-30b-a3b-instruct", name: "Qwen3 Omni 30B A3B Instruct", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-09-24", last_updated: "2025-09-24", modalities: { input: ["text", "video", "audio", "image"], output: ["text", "audio"] }, open_weights: true, limit: { context: 65536, output: 16384 }, cost: { input: 0.25, output: 0.97, input_audio: 2.2, output_audio: 1.788 } }, "qwen/qwen3-4b-fp8": { id: "qwen/qwen3-4b-fp8", name: "Qwen3 4B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, release_date: "2025-04-29", last_updated: "2025-04-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 20000 }, cost: { input: 0.03, output: 0.03 } }, "qwen/qwen2.5-7b-instruct": { id: "qwen/qwen2.5-7b-instruct", name: "Qwen2.5 7B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 32000 }, cost: { input: 0.07, output: 0.07 } }, "qwen/qwen3-vl-30b-a3b-instruct": { id: "qwen/qwen3-vl-30b-a3b-instruct", name: "qwen/qwen3-vl-30b-a3b-instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-11", last_updated: "2025-10-11", modalities: { input: ["text", "video", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.2, output: 0.7 } }, "qwen/qwen3.5-397b-a17b": { id: "qwen/qwen3.5-397b-a17b", name: "Qwen3.5-397B-A17B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-17", last_updated: "2026-02-17", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 64000 }, cost: { input: 0.6, output: 3.6 } }, "qwen/qwen3-vl-235b-a22b-thinking": { id: "qwen/qwen3-vl-235b-a22b-thinking", name: "Qwen3 VL 235B A22B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, release_date: "2025-09-24", last_updated: "2025-09-24", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.98, output: 3.95 } }, "qwen/qwen3-coder-next": { id: "qwen/qwen3-coder-next", name: "Qwen3 Coder Next", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-03", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.2, output: 1.5 } }, "qwen/qwen3.5-122b-a10b": { id: "qwen/qwen3.5-122b-a10b", name: "Qwen3.5-122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.4, output: 3.2 } }, "qwen/qwen3-omni-30b-a3b-thinking": { id: "qwen/qwen3-omni-30b-a3b-thinking", name: "Qwen3 Omni 30B A3B Thinking", description: "Qwen omni model for text, vision, audio, and multimodal agent tasks", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-24", last_updated: "2025-09-24", modalities: { input: ["text", "audio", "video", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 16384 }, cost: { input: 0.25, output: 0.97, input_audio: 2.2, output_audio: 1.788 } }, "qwen/qwen3-next-80b-a3b-instruct": { id: "qwen/qwen3-next-80b-a3b-instruct", name: "Qwen3 Next 80B A3B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-10", last_updated: "2025-09-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.15, output: 1.5 } }, "qwen/qwen2.5-vl-72b-instruct": { id: "qwen/qwen2.5-vl-72b-instruct", name: "Qwen2.5 VL 72B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-03-25", last_updated: "2025-03-25", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.8, output: 0.8 } }, "mistralai/mistral-nemo": { id: "mistralai/mistral-nemo", name: "Mistral Nemo", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-07-30", last_updated: "2024-07-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 60288, output: 16000 }, cost: { input: 0.04, output: 0.17 } }, "xiaomimimo/mimo-v2-flash": { id: "xiaomimimo/mimo-v2-flash", name: "XiaomiMiMo/MiMo-V2-Flash", description: "MiMo flash model for fast multimodal assistance and agent workflows", family: "mimo", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2025-12-19", last_updated: "2025-12-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32000 }, cost: { input: 0.1, output: 0.3, cache_read: 0.3 } }, "xiaomimimo/mimo-v2-pro": { id: "xiaomimimo/mimo-v2-pro", name: "MiMo-V2-Pro", description: "Earlier MiMo Pro model for multimodal agents, reasoning, and code tasks", family: "mimo", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-05-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, cost: { input: 2, output: 6, cache_read: 0.4, tiers: [{ input: 2, output: 6, cache_read: 0.4, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 2, output: 6, cache_read: 0.4 } } }, "xiaomimimo/mimo-v2.5-pro": { id: "xiaomimimo/mimo-v2.5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-05-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.522, output: 1.044, cache_read: 0.0043, tiers: [{ input: 0.522, output: 1.044, cache_read: 0.0043, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.522, output: 1.044, cache_read: 0.0043 } } }, "gryphe/mythomax-l2-13b": { id: "gryphe/mythomax-l2-13b", name: "Mythomax L2 13B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-04-25", last_updated: "2024-04-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 4096, output: 3200 }, cost: { input: 0.09, output: 0.09 } }, "inclusionai/ring-2.6-1t": { id: "inclusionai/ring-2.6-1t", name: "Ring-2.6-1T", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "ring", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-08", last_updated: "2026-05-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.06 } }, "inclusionai/ling-2.6-1t": { id: "inclusionai/ling-2.6-1t", name: "Ling-2.6-1T", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "ling", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-23", last_updated: "2026-06-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.3, output: 2.5, cache_read: 0.06 } }, "inclusionai/ling-2.6-flash": { id: "inclusionai/ling-2.6-flash", name: "Ling-2.6-flash", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "ling", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.1, output: 0.3, cache_read: 0.02 } }, "paddlepaddle/paddleocr-vl": { id: "paddlepaddle/paddleocr-vl", name: "PaddleOCR-VL", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-10-22", last_updated: "2025-10-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 16384, output: 16384 }, cost: { input: 0.02, output: 0.02 } }, "nousresearch/hermes-2-pro-llama-3-8b": { id: "nousresearch/hermes-2-pro-llama-3-8b", name: "Hermes 2 Pro Llama 3 8B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-06-27", last_updated: "2024-06-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0.14, output: 0.14 } }, "sao10K/l3-70b-euryale-v2.1": { id: "sao10K/l3-70b-euryale-v2.1", name: "L3 70B Euryale V2.1\t", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-06-18", last_updated: "2024-06-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 1.48, output: 1.48 } }, "sao10K/l31-70b-euryale-v2.2": { id: "sao10K/l31-70b-euryale-v2.2", name: "L31 70B Euryale V2.2", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-09-19", last_updated: "2024-09-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 1.48, output: 1.48 } }, "sao10K/L3-8B-stheno-v3.2": { id: "sao10K/L3-8B-stheno-v3.2", name: "L3 8B Stheno V3.2", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-11-29", last_updated: "2024-11-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 32000 }, cost: { input: 0.05, output: 0.05 } }, "sao10K/l3-8b-lunaris": { id: "sao10K/l3-8b-lunaris", name: "Sao10k L3 8B Lunaris\t", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-11-28", last_updated: "2024-11-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0.05, output: 0.05 } }, "minimax/minimax-m2.7-highspeed": { id: "minimax/minimax-m2.7-highspeed", name: "MiniMax-M2.7-highspeed", description: "Low-latency M2.7 variant for interactive coding plans and agent loops", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-05-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.4, cache_read: 0.06, cache_write: 0.375 } }, "minimax/minimax-m2.7": { id: "minimax/minimax-m2.7", name: "MiniMax M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax-m2.7", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "minimax/minimax-m2.5-highspeed": { id: "minimax/minimax-m2.5-highspeed", name: "MiniMax M2.5 Highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax-m2.5", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131100 }, cost: { input: 0.6, output: 2.4, cache_read: 0.03 } }, "minimax/minimax-m2.5": { id: "minimax/minimax-m2.5", name: "MiniMax M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 131100 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "minimax/minimax-m2": { id: "minimax/minimax-m2", name: "MiniMax-M2", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "minimax/minimax-m2.1": { id: "minimax/minimax-m2.1", name: "Minimax M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: false, tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "deepseek/deepseek-v3.1": { id: "deepseek/deepseek-v3.1", name: "DeepSeek V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.27, output: 1, cache_read: 0.135 } }, "deepseek/deepseek-v3.2-exp": { id: "deepseek/deepseek-v3.2-exp", name: "Deepseek V3.2 Exp", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 65536 }, cost: { input: 0.27, output: 0.41 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 393216 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "deepseek/deepseek-r1-distill-qwen-14b": { id: "deepseek/deepseek-r1-distill-qwen-14b", name: "DeepSeek R1 Distill Qwen 14B", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "deepseek-thinking", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-01-20", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 16384 }, cost: { input: 0.15, output: 0.15 } }, "deepseek/deepseek-r1-distill-llama-70b": { id: "deepseek/deepseek-r1-distill-llama-70b", name: "DeepSeek R1 Distill LLama 70B", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, release_date: "2025-01-27", last_updated: "2025-01-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0.8, output: 0.8 } }, "deepseek/deepseek-r1-turbo": { id: "deepseek/deepseek-r1-turbo", name: "DeepSeek R1 (Turbo)\t", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-03-05", last_updated: "2025-03-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 64000, output: 16000 }, cost: { input: 0.7, output: 2.5 } }, "deepseek/deepseek-ocr": { id: "deepseek/deepseek-ocr", name: "DeepSeek-OCR", description: "OCR model for extracting structured text from documents and screenshots", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-10-24", last_updated: "2025-10-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0.03, output: 0.03 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 393216 }, cost: { input: 1.6, output: 3.2, cache_read: 0.135 } }, "deepseek/deepseek-r1-0528": { id: "deepseek/deepseek-r1-0528", name: "DeepSeek R1 0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-05-28", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 32768 }, cost: { input: 0.7, output: 2.5, cache_read: 0.35 } }, "deepseek/deepseek-v3-0324": { id: "deepseek/deepseek-v3-0324", name: "DeepSeek V3 0324", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-03-25", last_updated: "2025-03-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 163840 }, cost: { input: 0.27, output: 1.12, cache_read: 0.135 } }, "deepseek/deepseek-r1-0528-qwen3-8b": { id: "deepseek/deepseek-r1-0528-qwen3-8b", name: "DeepSeek R1 0528 Qwen3 8B", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, release_date: "2025-05-29", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32000 }, cost: { input: 0.06, output: 0.09 } }, "deepseek/deepseek-v3.2": { id: "deepseek/deepseek-v3.2", name: "Deepseek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 65536 }, cost: { input: 0.269, output: 0.4, cache_read: 0.1345 } }, "deepseek/deepseek-ocr-2": { id: "deepseek/deepseek-ocr-2", name: "deepseek/deepseek-ocr-2", description: "OCR model for extracting structured text from documents and screenshots", attachment: true, reasoning: false, tool_call: false, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0.03, output: 0.03 } }, "deepseek/deepseek-v3-turbo": { id: "deepseek/deepseek-v3-turbo", name: "DeepSeek V3 (Turbo)\t", description: "Fast DeepSeek model for efficient chat, coding help, and agent loops", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-03-05", last_updated: "2025-03-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 64000, output: 16000 }, cost: { input: 0.4, output: 1.3 } }, "deepseek/deepseek-v3.1-terminus": { id: "deepseek/deepseek-v3.1-terminus", name: "Deepseek V3.1 Terminus", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-22", last_updated: "2025-09-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.27, output: 1, cache_read: 0.135 } }, "deepseek/deepseek-prover-v2-671b": { id: "deepseek/deepseek-prover-v2-671b", name: "Deepseek Prover V2 671B", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-30", last_updated: "2025-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 160000, output: 160000 }, cost: { input: 0.7, output: 2.5 } }, "deepseek/deepseek-r1-distill-qwen-32b": { id: "deepseek/deepseek-r1-distill-qwen-32b", name: "DeepSeek R1 Distill Qwen 32B", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "deepseek-thinking", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-01-20", last_updated: "2025-01-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 64000, output: 32000 }, cost: { input: 0.3, output: 0.3 } }, "kwaipilot/kat-coder-pro": { id: "kwaipilot/kat-coder-pro", name: "Kat Coder Pro", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01-05", last_updated: "2026-01-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 128000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "moonshotai/kimi-k2.5": { id: "moonshotai/kimi-k2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "moonshotai/kimi-k2.6": { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.8, output: 3.4, cache_read: 0.16 } }, "moonshotai/kimi-k2.7-code": { id: "moonshotai/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "moonshotai/kimi-k2-thinking": { id: "moonshotai/kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2025-11-07", last_updated: "2026-06-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "moonshotai/kimi-k3": { id: "moonshotai/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "moonshotai/kimi-k2-instruct": { id: "moonshotai/kimi-k2-instruct", name: "Kimi K2 Instruct", description: "Kimi model for long-context chat, coding, and agentic reasoning", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-07-11", last_updated: "2025-07-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.57, output: 2.3 } }, "moonshotai/kimi-k2-0905": { id: "moonshotai/kimi-k2-0905", name: "Kimi K2 0905", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 2.5 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "OpenAI: GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: false, structured_output: true, temperature: true, release_date: "2025-08-06", last_updated: "2025-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.04, output: 0.15 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "OpenAI GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-06", last_updated: "2025-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.05, output: 0.25 } }, "baidu/ernie-4.5-vl-424b-a47b": { id: "baidu/ernie-4.5-vl-424b-a47b", name: "ERNIE 4.5 VL 424B A47B", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, release_date: "2025-06-30", last_updated: "2025-06-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 123000, output: 16000 }, cost: { input: 0.42, output: 1.25 } }, "baidu/ernie-4.5-300b-a47b-paddle": { id: "baidu/ernie-4.5-300b-a47b-paddle", name: "ERNIE 4.5 300B A47B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-06-30", last_updated: "2025-06-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 123000, output: 12000 }, cost: { input: 0.28, output: 1.1 } }, "baidu/ernie-4.5-21B-a3b-thinking": { id: "baidu/ernie-4.5-21B-a3b-thinking", name: "ERNIE-4.5-21B-A3B-Thinking", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "ernie", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, temperature: true, knowledge: "2025-03", release_date: "2025-09-19", last_updated: "2025-09-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0.07, output: 0.28 } }, "baidu/ernie-4.5-21B-a3b": { id: "baidu/ernie-4.5-21B-a3b", name: "ERNIE 4.5 21B A3B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "ernie", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-03", release_date: "2025-06-30", last_updated: "2025-06-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 120000, output: 8000 }, cost: { input: 0.07, output: 0.28 } }, "baidu/ernie-4.5-vl-28b-a3b-thinking": { id: "baidu/ernie-4.5-vl-28b-a3b-thinking", name: "ERNIE-4.5-VL-28B-A3B-Thinking", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-11-26", last_updated: "2025-11-26", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0.39, output: 0.39 } }, "baidu/ernie-4.5-vl-28b-a3b": { id: "baidu/ernie-4.5-vl-28b-a3b", name: "ERNIE 4.5 VL 28B A3B", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-06-30", last_updated: "2026-06-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 30000, output: 8000 }, cost: { input: 0.14, output: 0.56 } }, "meta-llama/llama-3-70b-instruct": { id: "meta-llama/llama-3-70b-instruct", name: "Llama3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2024-04-25", last_updated: "2024-04-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8000 }, cost: { input: 0.51, output: 0.74 } }, "meta-llama/llama-4-maverick-17b-128e-instruct-fp8": { id: "meta-llama/llama-4-maverick-17b-128e-instruct-fp8", name: "Llama 4 Maverick Instruct", description: "Open multimodal Llama model for strong reasoning and fast responses", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-06", last_updated: "2025-04-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 8192 }, cost: { input: 0.27, output: 0.85 } }, "meta-llama/llama-3-8b-instruct": { id: "meta-llama/llama-3-8b-instruct", name: "Llama 3 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-04-25", last_updated: "2024-04-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0.04, output: 0.04 } }, "meta-llama/llama-3.3-70b-instruct": { id: "meta-llama/llama-3.3-70b-instruct", name: "Llama 3.3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-07", last_updated: "2024-12-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 120000 }, cost: { input: 0.135, output: 0.4 } }, "meta-llama/llama-3.2-3b-instruct": { id: "meta-llama/llama-3.2-3b-instruct", name: "Llama 3.2 3B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-09-18", last_updated: "2024-09-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32000 }, cost: { input: 0.03, output: 0.05 } }, "meta-llama/llama-3.1-8b-instruct": { id: "meta-llama/llama-3.1-8b-instruct", name: "Llama 3.1 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2024-07-24", last_updated: "2024-07-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, output: 16384 }, cost: { input: 0.02, output: 0.05 } }, "meta-llama/llama-4-scout-17b-16e-instruct": { id: "meta-llama/llama-4-scout-17b-16e-instruct", name: "Llama 4 Scout Instruct", description: "Open multimodal Llama model for long-context analysis and efficient agents", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-06", last_updated: "2025-04-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.18, output: 0.59 } }, "minimaxai/minimax-m1-80k": { id: "minimaxai/minimax-m1-80k", name: "MiniMax M1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 40000 }, cost: { input: 0.55, output: 2.2 } }, "baichuan/baichuan-m2-32b": { id: "baichuan/baichuan-m2-32b", name: "baichuan-m2-32b", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "baichuan", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-12", release_date: "2025-08-13", last_updated: "2025-08-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.07, output: 0.07 } } } }, openrouter: { id: "openrouter", env: ["OPENROUTER_API_KEY"], npm: "@openrouter/ai-sdk-provider", api: "https://openrouter.ai/api/v1", name: "OpenRouter", doc: "https://openrouter.ai/models", models: { "~openai/gpt-latest": { id: "~openai/gpt-latest", name: "OpenAI GPT Latest", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 45, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1, cache_write: 12.5 } } }, "~openai/gpt-mini-latest": { id: "~openai/gpt-mini-latest", name: "OpenAI GPT Mini Latest", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "microsoft/phi-4": { id: "microsoft/phi-4", name: "Phi 4", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "phi", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-06-30", release_date: "2025-01-10", last_updated: "2025-01-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, output: 16384 }, cost: { input: 0.07, output: 0.14 } }, "microsoft/wizardlm-2-8x22b": { id: "microsoft/wizardlm-2-8x22b", name: "WizardLM-2 8x22B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-04-30", release_date: "2024-04-16", last_updated: "2024-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65535, output: 8000 }, cost: { input: 0.62, output: 0.62 } }, "cohere/command-r-08-2024": { id: "cohere/command-r-08-2024", name: "Command R", description: "Cohere retrieval model for long-context chat and enterprise RAG workflows", family: "command-r", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-08-30", last_updated: "2024-08-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 0.15, output: 0.6 } }, "cohere/command-a": { id: "cohere/command-a", name: "Command A", description: "Cohere command model for multilingual enterprise agents, tools, and chat", family: "command-a", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-08-31", release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 8192 }, cost: { input: 2.5, output: 10 } }, "cohere/command-r-plus-08-2024": { id: "cohere/command-r-plus-08-2024", name: "Command R+", description: "Cohere's RAG workhorse for long-context enterprise search and tool use", family: "command-r", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-08-30", last_updated: "2024-08-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 2.5, output: 10 } }, "cohere/command-r7b-12-2024": { id: "cohere/command-r7b-12-2024", name: "Command R7B", description: "Cohere retrieval model for long-context chat and enterprise RAG workflows", family: "command-r", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-06-01", release_date: "2024-12-02", last_updated: "2024-12-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4000 }, cost: { input: 0.0375, output: 0.15 } }, "cohere/north-mini-code:free": { id: "cohere/north-mini-code:free", name: "North Mini Code (free)", description: "Cohere coding model for practical software engineering and agentic edits", family: "north", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-06-17", last_updated: "2026-06-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 64000 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-ultra-550b-a55b:free": { id: "nvidia/nemotron-3-ultra-550b-a55b:free", name: "Nemotron 3 Ultra (free)", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high"] }, { type: "budget_tokens" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-nano-30b-a3b": { id: "nvidia/nemotron-3-nano-30b-a3b", name: "Nemotron 3 Nano 30B A3B", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-15", last_updated: "2025-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.05, output: 0.2, cache_read: 0.03 } }, "nvidia/nemotron-nano-9b-v2:free": { id: "nvidia/nemotron-nano-9b-v2:free", name: "Nemotron Nano 9B V2 (free)", description: "Compact Nemotron model for efficient reasoning and deployable AI agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-18", last_updated: "2025-08-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-super-120b-a12b": { id: "nvidia/nemotron-3-super-120b-a12b", name: "Nemotron 3 Super 120B A12B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 16384 }, cost: { input: 0.3, output: 0.9 } }, "nvidia/nemotron-3-nano-30b-a3b:free": { id: "nvidia/nemotron-3-nano-30b-a3b:free", name: "Nemotron 3 Nano 30B A3B (free)", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-15", last_updated: "2025-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free": { id: "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free", name: "Nemotron 3 Nano Omni (free)", description: "Open Nemotron omni model combining reasoning with text, vision, and audio", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-28", last_updated: "2026-04-28", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 65536 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3.5-content-safety:free": { id: "nvidia/nemotron-3.5-content-safety:free", name: "Nemotron 3.5 Content Safety (free)", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-ultra-550b-a55b": { id: "nvidia/nemotron-3-ultra-550b-a55b", name: "Nemotron 3 Ultra 550B A55B", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 512288, output: 16384 }, cost: { input: 0.6, output: 3.6, cache_read: 0.2 } }, "nvidia/nemotron-nano-12b-v2-vl:free": { id: "nvidia/nemotron-nano-12b-v2-vl:free", name: "Nemotron Nano 12B 2 VL (free)", description: "Nemotron multimodal model for visual reasoning and agentic AI workflows", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-10-28", last_updated: "2025-10-28", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0, output: 0 } }, "nvidia/nemotron-3-super-120b-a12b:free": { id: "nvidia/nemotron-3-super-120b-a12b:free", name: "Nemotron 3 Super (free)", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0 } }, "deepcogito/cogito-v2.1-671b": { id: "deepcogito/cogito-v2.1-671b", name: "Cogito v2.1 671B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "cogito", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 1.25, output: 1.25 } }, "google/lyria-3-pro-preview": { id: "google/lyria-3-pro-preview", name: "Lyria 3 Pro Preview", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "lyria", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-03-25", last_updated: "2026-03-25", modalities: { input: ["text", "image"], output: ["text", "audio"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0, output: 0 } }, "google/gemini-3.5-flash": { id: "google/gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 9, reasoning: 9, cache_read: 0.15, cache_write: 0.083333 } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.3, output: 2.5, reasoning: 2.5, cache_read: 0.03, cache_write: 0.083333 } }, "google/gemma-3-4b-it": { id: "google/gemma-3-4b-it", name: "Gemma 3 4B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-08-31", release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.05, output: 0.1 } }, "google/gemini-3.5-flash-lite": { id: "google/gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, reasoning: 2.5, cache_read: 0.03, cache_write: 0.083333 } }, "google/gemini-2.5-pro-preview": { id: "google/gemini-2.5-pro-preview", name: "Gemini 2.5 Pro Preview 06-05", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01-31", release_date: "2025-06-05", last_updated: "2025-06-05", modalities: { input: ["pdf", "image", "text", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, reasoning: 10, cache_read: 0.125, cache_write: 0.375, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "google/lyria-3-clip-preview": { id: "google/lyria-3-clip-preview", name: "Lyria 3 Clip Preview", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "lyria", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-03-25", last_updated: "2026-03-25", modalities: { input: ["text", "image"], output: ["text", "audio"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0, output: 0 } }, "google/gemini-3-pro-image-preview": { id: "google/gemini-3-pro-image-preview", name: "Nano Banana Pro", description: "Nano Banana Pro for higher-fidelity image generation and design-heavy edits", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 32768 }, cost: { input: 2, output: 12, reasoning: 12, cache_read: 0.2, cache_write: 0.375 } }, "google/gemini-3.1-flash-lite-preview": { id: "google/gemini-3.1-flash-lite-preview", name: "Gemini 3.1 Flash Lite Preview", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, reasoning: 1.5, cache_read: 0.025, cache_write: 0.083333 } }, "google/gemini-3-flash-preview": { id: "google/gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_details" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, reasoning: 3, cache_read: 0.05, cache_write: 0.083333 } }, "google/gemini-3.1-pro-preview-customtools": { id: "google/gemini-3.1-pro-preview-customtools", name: "Gemini 3.1 Pro Preview Custom Tools", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_details" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, reasoning: 12, cache_read: 0.2, cache_write: 0.375, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "google/gemini-3.1-flash-lite-image": { id: "google/gemini-3.1-flash-lite-image", name: "Nano Banana 2 Lite", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "high"] }], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 65536 }, cost: { input: 0.25, output: 1.5 } }, "google/gemini-3.1-flash-image-preview": { id: "google/gemini-3.1-flash-image-preview", name: "Nano Banana 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "high"] }], tool_call: false, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["image", "text"], output: ["text", "image"] }, open_weights: false, limit: { context: 65536, output: 65536 }, cost: { input: 0.5, output: 3 } }, "google/gemma-4-26b-a4b-it": { id: "google/gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.07, output: 0.34 } }, "google/gemma-2-27b-it": { id: "google/gemma-2-27b-it", name: "Gemma 2 27B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-06-30", release_date: "2024-07-13", last_updated: "2024-07-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 2048 }, cost: { input: 0.65, output: 0.65 } }, "google/gemma-3-27b-it": { id: "google/gemma-3-27b-it", name: "Gemma 3 27B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-08-31", release_date: "2025-03-12", last_updated: "2025-03-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.08, output: 0.45, cache_read: 0.04 } }, "google/gemma-4-26b-a4b-it:free": { id: "google/gemma-4-26b-a4b-it:free", name: "Gemma 4 26B A4B (free)", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "google/gemini-3.6-flash": { id: "google/gemini-3.6-flash", name: "Gemini 3.6 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, reasoning: 7.5, cache_read: 0.15, cache_write: 0.083333 } }, "google/gemini-3.1-flash-lite": { id: "google/gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, reasoning: 1.5, cache_read: 0.025, cache_write: 0.083333 } }, "google/gemini-2.5-pro-preview-05-06": { id: "google/gemini-2.5-pro-preview-05-06", name: "Gemini 2.5 Pro Preview 05-06", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01-31", release_date: "2025-05-07", last_updated: "2025-05-07", modalities: { input: ["text", "image", "pdf", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 1.25, output: 10, reasoning: 10, cache_read: 0.125, cache_write: 0.375, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "google/gemma-3-12b-it": { id: "google/gemma-3-12b-it", name: "Gemma 3 12B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-08-31", release_date: "2025-03-13", last_updated: "2025-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.05, output: 0.15 } }, "google/gemma-4-31b-it": { id: "google/gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.1, output: 0.34, cache_read: 0.1 } }, "google/gemini-3.1-flash-image": { id: "google/gemini-3.1-flash-image", name: "Nano Banana 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "high"] }], tool_call: false, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.5, output: 3 } }, "google/gemini-2.5-flash-image": { id: "google/gemini-2.5-flash-image", name: "Nano Banana", description: "Nano Banana image model for fast generation, edits, and character-consistent assets", family: "gemini-flash", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-06", release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 32768, output: 8192 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, cache_write: 0.083333 } }, "google/gemma-3n-e4b-it": { id: "google/gemma-3n-e4b-it", name: "Gemma 3n 4B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-08-31", release_date: "2025-05-20", last_updated: "2025-05-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.06, output: 0.12 } }, "google/gemini-3-pro-image": { id: "google/gemini-3-pro-image", name: "Nano Banana Pro", description: "Nano Banana Pro for higher-fidelity image generation and design-heavy edits", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 2, output: 12, reasoning: 12, cache_read: 0.2, cache_write: 0.375 } }, "google/gemini-3.1-pro-preview": { id: "google/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Reasoning-first Gemini preview for agentic coding and complex problem solving", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_details" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, reasoning: 12, cache_read: 0.2, cache_write: 0.375, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, reasoning: 10, cache_read: 0.125, cache_write: 0.375, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "google/gemini-2.5-flash-lite": { id: "google/gemini-2.5-flash-lite", name: "Gemini 2.5 Flash-Lite", description: "Lean Gemini 2.5 lane for cheap multimodal traffic and quick agents", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 512, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.1, output: 0.4, reasoning: 0.4, cache_read: 0.01, cache_write: 0.083333 } }, "google/gemma-4-31b-it:free": { id: "google/gemma-4-31b-it:free", name: "Gemma 4 31B (free)", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "thinkingmachines/inkling-small": { id: "thinkingmachines/inkling-small", name: "Inkling Small", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-30", last_updated: "2026-07-30", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 262144 }, cost: { input: 0.45, output: 1.2, cache_read: 0.1 } }, "thinkingmachines/inkling": { id: "thinkingmachines/inkling", name: "Inkling", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "max"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 262144 }, cost: { input: 0.95, output: 4.05, cache_read: 0.16 } }, "relace/relace-apply-3": { id: "relace/relace-apply-3", name: "Relace Apply 3", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, release_date: "2025-09-26", last_updated: "2025-09-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 0.85, output: 1.25 } }, "relace/relace-search": { id: "relace/relace-search", name: "Relace Search", description: "Tool-capable chat model for instruction following and agentic application workflows", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 }, cost: { input: 1, output: 3 } }, "~deepseek/deepseek-v4-flash-latest": { id: "~deepseek/deepseek-v4-flash-latest", name: "DeepSeek V4 Flash Latest", description: "Fast DeepSeek model for efficient chat, coding help, and agent loops", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-01", last_updated: "2026-08-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, cost: { input: 0.079996, output: 0.252, cache_read: 0.0252 } }, "perceptron/perceptron-mk1": { id: "perceptron/perceptron-mk1", name: "Perceptron Mk1", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, release_date: "2026-05-12", last_updated: "2026-05-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 8192 }, cost: { input: 0.15, output: 1.5 } }, "sakana/fugu-ultra": { id: "sakana/fugu-ultra", name: "Fugu Ultra", description: "Quality-first multi-agent model for hard research, analysis, and competitions", family: "fugu", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-06-15", last_updated: "2026-06-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "~google/gemini-flash-latest": { id: "~google/gemini-flash-latest", name: "Google Gemini Flash Latest", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01-01", release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video", "pdf", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.5, output: 7.5, reasoning: 7.5, cache_read: 0.15, cache_write: 0.083333 } }, "~google/gemini-pro-latest": { id: "~google/gemini-pro-latest", name: "Google Gemini Pro Latest", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["audio", "pdf", "image", "text", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, reasoning: 12, cache_read: 0.2, cache_write: 0.375, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "qwen/qwen3.5-flash-02-23": { id: "qwen/qwen3.5-flash-02-23", name: "Qwen3.5-Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-25", last_updated: "2026-02-25", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.065, output: 0.26 } }, "qwen/qwen3.7-flash": { id: "qwen/qwen3.7-flash", name: "Qwen3.7 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, input: 991000, output: 65536 }, cost: { input: 0.03, output: 0.13, cache_read: 0.006, cache_write: 0.038, tiers: [{ input: 0.1, output: 0.4, cache_read: 0.02, cache_write: 0.125, tier: { type: "context", size: 32000 } }, { input: 0.2, output: 0.8, cache_read: 0.04, cache_write: 0.25, tier: { type: "context", size: 256000 } }] } }, "qwen/qwen3.7-plus": { id: "qwen/qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 262144 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 0.32, output: 1.28, cache_read: 0.064, cache_write: 0.4, tiers: [{ input: 0.96, output: 3.84, cache_read: 0.192, cache_write: 1.2, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.96, output: 3.84, cache_read: 0.192, cache_write: 1.2 } } }, "qwen/qwen3-32b": { id: "qwen/qwen3-32b", name: "Qwen3 32B", description: "Dense open Qwen model for self-hosted chat, reasoning, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.08, output: 0.28 } }, "qwen/qwen3.6-35b-a3b": { id: "qwen/qwen3.6-35b-a3b", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.15, output: 1, cache_read: 0.05 } }, "qwen/qwen3-30b-a3b": { id: "qwen/qwen3-30b-a3b", name: "Qwen3 30B A3B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-03-31", release_date: "2025-04-28", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.12, output: 0.5 } }, "qwen/qwen3-235b-a22b-thinking-2507": { id: "qwen/qwen3-235b-a22b-thinking-2507", name: "Qwen3 235B A22B Thinking 2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-06-30", release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.23, output: 2.3 } }, "qwen/qwen3-vl-30b-a3b-thinking": { id: "qwen/qwen3-vl-30b-a3b-thinking", name: "Qwen3 VL 30B A3B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.2, output: 2.4 } }, "qwen/qwen3-coder-30b-a3b-instruct": { id: "qwen/qwen3-coder-30b-a3b-instruct", name: "Qwen3-Coder 30B-A3B Instruct", description: "Smaller Qwen coder for efficient local agents and repo-level fixes", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.07, output: 0.27 } }, "qwen/qwen3.5-plus-02-15": { id: "qwen/qwen3.5-plus-02-15", name: "Qwen3.5 Plus 2026-02-15", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.26, output: 1.56, tiers: [{ input: 0.325, output: 1.95, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.325, output: 1.95 } } }, "qwen/qwen3.5-27b": { id: "qwen/qwen3.5-27b", name: "Qwen3.5 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.195, output: 1.56 } }, "qwen/qwen3.7-max": { id: "qwen/qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 262144 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 1.475, output: 4.425, cache_read: 0.295, cache_write: 1.84375 } }, "qwen/qwen3-next-80b-a3b-thinking": { id: "qwen/qwen3-next-80b-a3b-thinking", name: "Qwen3-Next 80B-A3B (Thinking)", description: "Efficient Qwen thinking model for local reasoning, math, and coding agents", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.15, output: 1.2 } }, "qwen/qwen3.5-9b": { id: "qwen/qwen3.5-9b", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.1, output: 0.15 } }, "qwen/qwen3.6-27b": { id: "qwen/qwen3.6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3.6, cache_read: 0.12 } }, "qwen/qwen3.5-35b-a3b": { id: "qwen/qwen3.5-35b-a3b", name: "Qwen3.5 35B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.14, output: 1 } }, "qwen/qwen-2.5-7b-instruct": { id: "qwen/qwen-2.5-7b-instruct", name: "Qwen2.5 7B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06-30", release_date: "2024-10-16", last_updated: "2024-10-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.1, output: 0.2 } }, "qwen/qwen3-14b": { id: "qwen/qwen3-14b", name: "Qwen3 14B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-04-28", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.2275, output: 0.91 } }, "qwen/qwen3-235b-a22b": { id: "qwen/qwen3-235b-a22b", name: "Qwen3 235B-A22B", description: "Large open Qwen MoE for multilingual reasoning, coding, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 38912 }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.455, output: 1.82 } }, "qwen/qwen3-max": { id: "qwen/qwen3-max", name: "Qwen3 Max", description: "Flagship Qwen3 model for coding agents, complex reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.78, output: 3.9, cache_read: 0.156, cache_write: 0.975, tiers: [{ input: 1.56, output: 7.8, cache_read: 0.312, cache_write: 1.95, tier: { type: "context", size: 32000 } }, { input: 1.95, output: 9.75, cache_read: 0.39, cache_write: 2.4375, tier: { type: "context", size: 128000 } }] } }, "qwen/qwen3-vl-8b-instruct": { id: "qwen/qwen3-vl-8b-instruct", name: "Qwen3 VL 8B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-14", last_updated: "2025-10-14", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.117, output: 0.455 } }, "qwen/qwen3-8b": { id: "qwen/qwen3-8b", name: "Qwen3 8B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-03-31", release_date: "2025-04-28", last_updated: "2025-04-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.117, output: 0.455 } }, "qwen/qwen3-coder-plus": { id: "qwen/qwen3-coder-plus", name: "Qwen3 Coder Plus", description: "Hosted Qwen coder for software agents, repo edits, and long-context code", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.65, output: 3.25, cache_read: 0.13, cache_write: 0.8125, tiers: [{ input: 1.17, output: 5.85, cache_read: 0.234, cache_write: 1.4625, tier: { type: "context", size: 32000 } }, { input: 1.95, output: 9.75, cache_read: 0.39, cache_write: 2.4375, tier: { type: "context", size: 128000 } }] } }, "qwen/qwen3.8-max": { id: "qwen/qwen3.8-max", name: "Qwen3.8 Max", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 2, output: 6, cache_read: 0.25, cache_write: 2.5 } }, "qwen/qwen3-coder-flash": { id: "qwen/qwen3-coder-flash", name: "Qwen3 Coder Flash", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.195, output: 0.975, cache_read: 0.039, cache_write: 0.24375, tiers: [{ input: 0.325, output: 1.625, cache_read: 0.065, cache_write: 0.40625, tier: { type: "context", size: 32000 } }, { input: 0.52, output: 2.6, cache_read: 0.104, cache_write: 0.65, tier: { type: "context", size: 128000 } }] } }, "qwen/qwen3-vl-235b-a22b-instruct": { id: "qwen/qwen3-vl-235b-a22b-instruct", name: "Qwen3 VL 235B A22B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.21, output: 1.9, cache_read: 0.1 } }, "qwen/qwen3-vl-32b-instruct": { id: "qwen/qwen3-vl-32b-instruct", name: "Qwen3 VL 32B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-23", last_updated: "2025-10-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.104, output: 0.416 } }, "qwen/qwen-2.5-72b-instruct": { id: "qwen/qwen-2.5-72b-instruct", name: "Qwen2.5 72B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06-30", release_date: "2024-09-19", last_updated: "2024-09-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 16384 }, cost: { input: 0.36, output: 0.4 } }, "qwen/qwen-plus-2025-07-28:thinking": { id: "qwen/qwen-plus-2025-07-28:thinking", name: "Qwen Plus 0728 (thinking)", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-09-08", last_updated: "2025-09-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.4, output: 1.2, cache_write: 0.5, tiers: [{ input: 1.2, output: 3.6, cache_write: 1.5, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 1.2, output: 3.6, cache_write: 1.5 } } }, "qwen/qwen-plus": { id: "qwen/qwen-plus", name: "Qwen Plus", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2024-01-25", last_updated: "2025-09-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.26, output: 0.78, cache_read: 0.052, cache_write: 0.325, tiers: [{ input: 0.78, output: 2.34, cache_read: 0.156, cache_write: 0.975, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.78, output: 2.34, cache_read: 0.156, cache_write: 0.975 } } }, "qwen/qwen3-30b-a3b-thinking-2507": { id: "qwen/qwen3-30b-a3b-thinking-2507", name: "Qwen3 30B A3B Thinking 2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-06-30", release_date: "2025-08-28", last_updated: "2025-08-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 81920, output: 32768 }, cost: { input: 0.2, output: 2.4 } }, "qwen/qwen3-vl-8b-thinking": { id: "qwen/qwen3-vl-8b-thinking", name: "Qwen3 VL 8B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-14", last_updated: "2025-10-14", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.18, output: 2.1 } }, "qwen/qwen3-235b-a22b-2507": { id: "qwen/qwen3-235b-a22b-2507", name: "Qwen3 235B A22B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-06-30", release_date: "2025-07-21", last_updated: "2025-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.09, output: 0.55 } }, "qwen/qwen3.6-flash": { id: "qwen/qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.1875, output: 1.125, cache_write: 0.234375, tiers: [{ input: 0.75, output: 3, cache_write: 0.9375, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.75, output: 3, cache_write: 0.9375 } } }, "qwen/qwen3-30b-a3b-instruct-2507": { id: "qwen/qwen3-30b-a3b-instruct-2507", name: "Qwen3 30B A3B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-06-30", release_date: "2025-07-29", last_updated: "2025-07-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32000 }, cost: { input: 0.04815, output: 0.19305 } }, "qwen/qwen3-vl-30b-a3b-instruct": { id: "qwen/qwen3-vl-30b-a3b-instruct", name: "Qwen3 VL 30B A3B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.15, output: 0.6 } }, "qwen/qwen3.5-397b-a17b": { id: "qwen/qwen3.5-397b-a17b", name: "Qwen3.5 397B-A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.39, output: 2.34 } }, "qwen/qwen-2.5-coder-32b-instruct": { id: "qwen/qwen-2.5-coder-32b-instruct", name: "Qwen2.5 Coder 32B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-06-30", release_date: "2024-11-11", last_updated: "2024-11-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.66, output: 1 } }, "qwen/qwen3-vl-235b-a22b-thinking": { id: "qwen/qwen3-vl-235b-a22b-thinking", name: "Qwen3 VL 235B A22B Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.4, output: 4 } }, "qwen/qwen3.6-max-preview": { id: "qwen/qwen3.6-max-preview", name: "Qwen3.6 Max Preview", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 131072 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 1.027, output: 6.162, cache_write: 1.28375, tiers: [{ input: 1.58, output: 9.48, cache_write: 1.975, tier: { type: "context", size: 128000 } }] } }, "qwen/qwen3-max-thinking": { id: "qwen/qwen3-max-thinking", name: "Qwen3 Max Thinking", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-09", last_updated: "2026-02-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.78, output: 3.9, tiers: [{ input: 1.56, output: 7.8, tier: { type: "context", size: 32000 } }, { input: 1.95, output: 9.75, tier: { type: "context", size: 128000 } }] } }, "qwen/qwen3-coder": { id: "qwen/qwen3-coder", name: "Qwen3 Coder 480B A35B", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-06-30", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.3, output: 1, cache_read: 0.1 } }, "qwen/qwen3-coder-next": { id: "qwen/qwen3-coder-next", name: "Qwen3 Coder Next", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-09", release_date: "2026-02-03", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.12, output: 0.8, cache_read: 0.07 } }, "qwen/qwen3.6-plus": { id: "qwen/qwen3.6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.325, output: 1.95, cache_write: 0.40625, tiers: [{ input: 1.3, output: 3.9, cache_write: 1.625, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 1.3, output: 3.9, cache_write: 1.625 } } }, "qwen/qwen3.5-122b-a10b": { id: "qwen/qwen3.5-122b-a10b", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 81920 }, cost: { input: 0.29, output: 2.4 } }, "qwen/qwen3.5-plus-20260420": { id: "qwen/qwen3.5-plus-20260420", name: "Qwen3.5 Plus 2026-04-20", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.5", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1, max: 81920 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.3, output: 1.8, cache_write: 0.375, tiers: [{ input: 0.375, output: 2.25, cache_write: 0.46875, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.375, output: 2.25, cache_write: 0.46875 } } }, "qwen/qwen-plus-2025-07-28": { id: "qwen/qwen-plus-2025-07-28", name: "Qwen Plus 0728", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-09-08", last_updated: "2025-09-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32768 }, cost: { input: 0.26, output: 0.78, tiers: [{ input: 0.78, output: 2.34, tier: { type: "context", size: 256000 } }], context_over_200k: { input: 0.78, output: 2.34 } } }, "qwen/qwen3-next-80b-a3b-instruct": { id: "qwen/qwen3-next-80b-a3b-instruct", name: "Qwen3-Next 80B-A3B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.09, output: 1.1 } }, "qwen/qwen2.5-vl-72b-instruct": { id: "qwen/qwen2.5-vl-72b-instruct", name: "Qwen2.5 VL 72B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-06-30", release_date: "2025-02-01", last_updated: "2025-02-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.25, output: 0.75 } }, "inception/mercury-2": { id: "inception/mercury-2", name: "Mercury 2", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "mercury", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-04", last_updated: "2026-03-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 50000 }, cost: { input: 0.25, output: 0.75, cache_read: 0.025 } }, "rekaai/reka-edge": { id: "rekaai/reka-edge", name: "Reka Edge", description: "Multimodal model for analyzing text, images, documents, and rich media", family: "reka", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-20", last_updated: "2026-03-20", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: true, limit: { context: 16384, output: 16384 }, cost: { input: 0.1, output: 0.1 } }, "rekaai/reka-flash-3": { id: "rekaai/reka-flash-3", name: "Reka Flash 3", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "reka", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, knowledge: "2025-01-31", release_date: "2025-03-12", last_updated: "2025-03-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 0.1, output: 0.2 } }, "tencent/hunyuan-a13b-instruct": { id: "tencent/hunyuan-a13b-instruct", name: "Hunyuan A13B Instruct", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "hunyuan", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-07-08", last_updated: "2025-07-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.14, output: 0.57 } }, "tencent/hy3": { id: "tencent/hy3", name: "Hy3", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 128000 }, cost: { input: 0.132, output: 0.528, cache_read: 0.033 } }, "tencent/hy3-preview": { id: "tencent/hy3-preview", name: "Hy3 preview", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.063, output: 0.21, cache_read: 0.021 } }, "upstage/solar-pro-3": { id: "upstage/solar-pro-3", name: "Solar Pro 3", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "solar-pro", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015 } }, "~x-ai/grok-latest": { id: "~x-ai/grok-latest", name: "Grok Latest", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 1e6 }, cost: { input: 2, output: 6, cache_read: 0.3, tiers: [{ input: 4, output: 12, cache_read: 0.6, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 12, cache_read: 0.6 } } }, "mistralai/mistral-large": { id: "mistralai/mistral-large", name: "Mistral Large", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-11-30", release_date: "2024-02-26", last_updated: "2024-02-26", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 2, output: 6, cache_read: 0.2 } }, "mistralai/ministral-8b-2512": { id: "mistralai/ministral-8b-2512", name: "Ministral 3 8B 2512", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.15, output: 0.15, cache_read: 0.015 } }, "mistralai/ministral-14b-2512": { id: "mistralai/ministral-14b-2512", name: "Ministral 3 14B 2512", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.2, output: 0.2, cache_read: 0.02 } }, "mistralai/ministral-3b-2512": { id: "mistralai/ministral-3b-2512", name: "Ministral 3 3B 2512", description: "Compact Mistral model for edge, latency-sensitive, and cost-efficient workloads", family: "ministral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.1, output: 0.1, cache_read: 0.01 } }, "mistralai/mistral-small-24b-instruct-2501": { id: "mistralai/mistral-small-24b-instruct-2501", name: "Mistral Small 3", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2023-10-31", release_date: "2025-01-30", last_updated: "2025-01-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 16384 }, cost: { input: 0.05, output: 0.08 } }, "mistralai/mistral-large-2407": { id: "mistralai/mistral-large-2407", name: "Mistral Large 2407", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-03-31", release_date: "2024-11-19", last_updated: "2024-11-19", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 2, output: 6, cache_read: 0.2 } }, "mistralai/mistral-medium-3.1": { id: "mistralai/mistral-medium-3.1", name: "Mistral Medium 3.1", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-06-30", release_date: "2025-08-13", last_updated: "2025-08-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 262144 }, cost: { input: 0.4, output: 2, cache_read: 0.04 } }, "mistralai/mistral-nemo": { id: "mistralai/mistral-nemo", name: "Mistral Nemo", description: "Efficient Mistral-NVIDIA open model for multilingual chat and local deployment", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2024-07-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.019, output: 0.03 } }, "mistralai/mistral-saba": { id: "mistralai/mistral-saba", name: "Saba", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-09-30", release_date: "2025-02-17", last_updated: "2025-02-17", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.2, output: 0.6, cache_read: 0.02 } }, "mistralai/mistral-small-2603": { id: "mistralai/mistral-small-2603", name: "Mistral Small 4", description: "Fast Mistral production model for chat, extraction, and cost-sensitive agents", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-06", release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.15, output: 0.6, cache_read: 0.015 } }, "mistralai/codestral-2508": { id: "mistralai/codestral-2508", name: "Codestral 2508", description: "Mistral coding model for code completion, generation, and developer workflows", family: "codestral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-01", last_updated: "2025-08-01", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.3, output: 0.9, cache_read: 0.03 } }, "mistralai/mixtral-8x22b-instruct": { id: "mistralai/mixtral-8x22b-instruct", name: "Mixtral 8x22B Instruct", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-01-31", release_date: "2024-04-17", last_updated: "2024-04-17", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 2, output: 6, cache_read: 0.2 } }, "mistralai/voxtral-small-24b-2507": { id: "mistralai/voxtral-small-24b-2507", name: "Voxtral Small 24B 2507", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-30", last_updated: "2025-10-30", modalities: { input: ["text", "audio", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 32000 }, cost: { input: 0.1, output: 0.3, cache_read: 0.01 } }, "mistralai/mistral-small-3.2-24b-instruct": { id: "mistralai/mistral-small-3.2-24b-instruct", name: "Mistral Small 3.2 24B", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-10-31", release_date: "2025-06-20", last_updated: "2025-06-20", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 16384 }, cost: { input: 0.09375, output: 0.25 } }, "mistralai/mistral-medium-3-5": { id: "mistralai/mistral-medium-3-5", name: "Mistral Medium 3.5", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 262144 }, cost: { input: 1.5, output: 7.5 } }, "mistralai/mistral-small-3.1-24b-instruct": { id: "mistralai/mistral-small-3.1-24b-instruct", name: "Mistral Small 3.1 24B", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-10-31", release_date: "2025-03-17", last_updated: "2025-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.351, output: 0.555 } }, "mistralai/mistral-medium-3": { id: "mistralai/mistral-medium-3", name: "Mistral Medium 3", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral-medium", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-07", last_updated: "2025-05-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 0.4, output: 2, cache_read: 0.04 } }, "mistralai/mistral-large-2512": { id: "mistralai/mistral-large-2512", name: "Mistral Large 3", description: "Mistral's largest general model for enterprise agents, coding, and multilingual reasoning", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2025-12-02", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.5, output: 1.5, cache_read: 0.05 } }, "bytedance/ui-tars-1.5-7b": { id: "bytedance/ui-tars-1.5-7b", name: "UI-TARS 7B ", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2025-01-31", release_date: "2025-07-22", last_updated: "2025-07-22", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 2048 }, cost: { input: 0.1, output: 0.2, cache_read: 0.1 } }, "nex-agi/nex-n2-mini": { id: "nex-agi/nex-n2-mini", name: "Nex-N2-Mini", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "agi", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-24", last_updated: "2026-06-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.025, output: 0.1, cache_read: 0.0025 } }, "nex-agi/nex-n2-pro": { id: "nex-agi/nex-n2-pro", name: "Nex-N2-Pro", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "agi", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-06-08", last_updated: "2026-06-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.25, output: 1, cache_read: 0.025 } }, "thedrummer/rocinante-12b": { id: "thedrummer/rocinante-12b", name: "Rocinante 12B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-04-30", release_date: "2024-09-30", last_updated: "2024-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 0.25, output: 0.5 } }, "thedrummer/unslopnemo-12b": { id: "thedrummer/unslopnemo-12b", name: "UnslopNemo 12B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04-30", release_date: "2024-11-08", last_updated: "2024-11-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1024000, output: 1024000 }, cost: { input: 0.4, output: 0.4 } }, "thedrummer/cydonia-24b-v4.1": { id: "thedrummer/cydonia-24b-v4.1", name: "Cydonia 24B V4.1", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-04-30", release_date: "2025-09-27", last_updated: "2025-09-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.3, output: 0.5, cache_read: 0.15 } }, "thedrummer/skyfall-36b-v2": { id: "thedrummer/skyfall-36b-v2", name: "Skyfall 36B V2", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-06-30", release_date: "2025-03-10", last_updated: "2025-03-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 32768 }, cost: { input: 0.55, output: 0.8, cache_read: 0.25 } }, "undi95/remm-slerp-l2-13b": { id: "undi95/remm-slerp-l2-13b", name: "ReMM SLERP 13B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2023-06-30", release_date: "2023-07-22", last_updated: "2023-07-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 6144, output: 6144 }, cost: { input: 0.45, output: 0.65 } }, "meta/muse-spark-1.1": { id: "meta/muse-spark-1.1", name: "Muse Spark 1.1", description: "Open Llama multimodal model for image understanding and text reasoning", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-08", last_updated: "2026-07-09", modalities: { input: ["text", "image", "video", "pdf", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "meta/muse-spark-1.2": { id: "meta/muse-spark-1.2", name: "Muse Spark 1.2", description: "Muse Spark 1.2 is a coding-focused update to Muse Spark 1.1 with improvements in code generation, complex debugging, codebase understanding, and end-to-end developer workflows.", family: "muse", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-05", last_updated: "2026-08-05", modalities: { input: ["text", "image", "video", "pdf", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 1.25, output: 4.25, cache_read: 0.15 } }, "gryphe/mythomax-l2-13b": { id: "gryphe/mythomax-l2-13b", name: "MythoMax 13B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2023-06-30", release_date: "2023-07-02", last_updated: "2023-07-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 4096 }, cost: { input: 0.08, output: 0.11 } }, "inclusionai/ling-3.0-tiny:free": { id: "inclusionai/ling-3.0-tiny:free", name: "Ling 3.0 Tiny (free)", description: "Free provider route for experiments, demos, and cost-sensitive chat workloads", family: "ling", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-08-06", last_updated: "2026-08-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "inclusionai/ling-3.0-flash": { id: "inclusionai/ling-3.0-flash", name: "Ling-3.0-flash", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "ling", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-23", last_updated: "2026-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.021, output: 0.063, cache_read: 0.0042 } }, "inclusionai/ring-2.6-1t": { id: "inclusionai/ring-2.6-1t", name: "Ring-2.6-1T", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "ring", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-05-08", last_updated: "2026-05-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 }, cost: { input: 0.075, output: 0.625, cache_read: 0.015 } }, "inclusionai/ling-2.6-1t": { id: "inclusionai/ling-2.6-1t", name: "Ling-2.6-1T", description: "Tool-capable chat model for instruction following and agentic application workflows", family: "ling", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.075, output: 0.625, cache_read: 0.015 } }, "inclusionai/ling-2.6-flash": { id: "inclusionai/ling-2.6-flash", name: "Ling-2.6-flash", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "ling", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.01, output: 0.03, cache_read: 0.002 } }, "cognitivecomputations/dolphin-mistral-24b-venice-edition": { id: "cognitivecomputations/dolphin-mistral-24b-venice-edition", name: "Uncensored", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-04-30", release_date: "2025-07-09", last_updated: "2025-07-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 8192 }, cost: { input: 0.2, output: 0.9 } }, "allenai/olmo-3-32b-think": { id: "allenai/olmo-3-32b-think", name: "Olmo 3 32B Think", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "allenai", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, release_date: "2025-11-21", last_updated: "2025-11-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 0.15, output: 0.5 } }, "meituan/longcat-2.0": { id: "meituan/longcat-2.0", name: "LongCat 2.0", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "longcat", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-20", last_updated: "2026-07-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048756, output: 262144 }, cost: { input: 0.3, output: 1.2, cache_read: 0.006 } }, "ai21/jamba-large-1.7": { id: "ai21/jamba-large-1.7", name: "Jamba Large 1.7", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "jamba", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2024-08-31", release_date: "2025-08-08", last_updated: "2025-08-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 4096 }, cost: { input: 2, output: 8 } }, "mancer/weaver": { id: "mancer/weaver", name: "Weaver (alpha)", description: "General-purpose chat model for instruction following, writing, and analysis", family: "alpha", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2023-06-30", release_date: "2023-08-02", last_updated: "2023-08-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8000, output: 6000 }, cost: { input: 0.5, output: 0.75 } }, "morph/morph-v3-large": { id: "morph/morph-v3-large", name: "Morph V3 Large", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "morph", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, release_date: "2025-07-07", last_updated: "2025-07-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 131072 }, cost: { input: 0.9, output: 1.9 } }, "morph/morph-v3-fast": { id: "morph/morph-v3-fast", name: "Morph V3 Fast", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "morph", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-07-07", last_updated: "2025-07-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 81920, output: 38000 }, cost: { input: 0.8, output: 1.2 } }, "nousresearch/hermes-3-llama-3.1-70b": { id: "nousresearch/hermes-3-llama-3.1-70b", name: "Hermes 3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "nousresearch", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2023-12-31", release_date: "2024-08-18", last_updated: "2024-08-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.7, output: 0.7 } }, "nousresearch/hermes-3-llama-3.1-405b": { id: "nousresearch/hermes-3-llama-3.1-405b", name: "Hermes 3 405B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "nousresearch", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2023-12-31", release_date: "2024-08-16", last_updated: "2024-08-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 1, output: 1 } }, "nousresearch/hermes-4-405b": { id: "nousresearch/hermes-4-405b", name: "Hermes 4 405B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "hermes", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: false, temperature: true, knowledge: "2024-08-31", release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 1, output: 3 } }, "nousresearch/hermes-4-70b": { id: "nousresearch/hermes-4-70b", name: "Hermes 4 70B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "hermes", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: false, structured_output: false, temperature: true, knowledge: "2024-08-31", release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.13, output: 0.4 } }, "poolside/laguna-xs-2.1": { id: "poolside/laguna-xs-2.1", name: "Laguna XS 2.1", description: "Agentic coding model from Poolside in the XS size class for local deployment", family: "laguna", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-02", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.06, output: 0.12, cache_read: 0.03 } }, "poolside/laguna-s-2.1": { id: "poolside/laguna-s-2.1", name: "Laguna S 2.1", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "laguna-s", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.09, output: 0.18, cache_read: 0.009 } }, "poolside/laguna-s-2.1:free": { id: "poolside/laguna-s-2.1:free", name: "Laguna S 2.1 (free)", description: "Free provider route for experiments, demos, and cost-sensitive chat workloads", family: "laguna-s", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "poolside/laguna-xs-2.1:free": { id: "poolside/laguna-xs-2.1:free", name: "Laguna XS 2.1 (free)", description: "Free provider route for experiments, demos, and cost-sensitive chat workloads", family: "laguna", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-02", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "minimax/minimax-m2-her": { id: "minimax/minimax-m2-her", name: "MiniMax M2-her", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-01-23", last_updated: "2026-01-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 65536, output: 2048 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "minimax/minimax-m2.7": { id: "minimax/minimax-m2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "minimax/minimax-m3": { id: "minimax/minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 512000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "minimax/minimax-m1": { id: "minimax/minimax-m1", name: "MiniMax M1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2024-06-30", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 40000 }, cost: { input: 0.55, output: 2.2 } }, "minimax/minimax-m2.5": { id: "minimax/minimax-m2.5", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_details" }, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 196608 }, cost: { input: 0.22, output: 0.9, cache_read: 0.05 } }, "minimax/minimax-m2": { id: "minimax/minimax-m2", name: "MiniMax-M2", description: "Efficient open MiniMax model built for coding agents and tool-heavy workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_details" }, structured_output: true, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.255, output: 1.02 } }, "minimax/minimax-01": { id: "minimax/minimax-01", name: "MiniMax-01", description: "MiniMax multimodal coding model for long-context reasoning and agent tasks", family: "minimax", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-03-31", release_date: "2025-01-15", last_updated: "2025-01-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1000192, output: 1000192 }, cost: { input: 0.2, output: 1.1 } }, "minimax/minimax-m2.1": { id: "minimax/minimax-m2.1", name: "MiniMax-M2.1", description: "Earlier MiniMax agent model for practical coding and productivity tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_details" }, structured_output: false, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "deepseek/deepseek-v3.2-exp": { id: "deepseek/deepseek-v3.2-exp", name: "DeepSeek V3.2 Exp", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 65536 }, cost: { input: 0.27, output: 0.41 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 393216 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "deepseek/deepseek-chat-v3-0324": { id: "deepseek/deepseek-chat-v3-0324", name: "DeepSeek V3 0324", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07-31", release_date: "2025-03-24", last_updated: "2025-03-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 65536 }, cost: { input: 0.27, output: 1.12, cache_read: 0.135 } }, "deepseek/deepseek-r1-distill-llama-70b": { id: "deepseek/deepseek-r1-distill-llama-70b", name: "R1 Distill Llama 70B", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2024-07-31", release_date: "2025-01-23", last_updated: "2025-01-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0.8, output: 0.8 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "deepseek/deepseek-r1-0528": { id: "deepseek/deepseek-r1-0528", name: "R1 0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-28", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 32768 }, cost: { input: 0.5, output: 2.15, cache_read: 0.35 } }, "deepseek/deepseek-v4-flash-0731": { id: "deepseek/deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 0.09, output: 0.18, cache_read: 0.018 } }, "deepseek/deepseek-v3.2": { id: "deepseek/deepseek-v3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 65536 }, cost: { input: 0.269, output: 0.4, cache_read: 0.1345 } }, "deepseek/deepseek-r1": { id: "deepseek/deepseek-r1", name: "DeepSeek-R1", description: "Classic open reasoning model for transparent math, coding, and deliberate problem solving", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 16000 }, cost: { input: 0.7, output: 2.5 } }, "deepseek/deepseek-chat": { id: "deepseek/deepseek-chat", name: "DeepSeek Chat", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-09", release_date: "2025-12-01", last_updated: "2026-02-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 16000 }, cost: { input: 0.2574, output: 1.0287 } }, "deepseek/deepseek-v3.1-terminus": { id: "deepseek/deepseek-v3.1-terminus", name: "DeepSeek V3.1 Terminus", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-09-22", last_updated: "2025-09-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 32768 }, cost: { input: 0.27, output: 1, cache_read: 0.135 } }, "deepseek/deepseek-chat-v3.1": { id: "deepseek/deepseek-chat-v3.1", name: "DeepSeek V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 32768 }, cost: { input: 0.25, output: 0.95, cache_read: 0.13 } }, "amazon/nova-premier-v1": { id: "amazon/nova-premier-v1", name: "Nova Premier 1.0", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "nova", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-10-31", last_updated: "2025-10-31", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 32000 }, cost: { input: 2.5, output: 12.5, cache_read: 0.625 } }, "amazon/nova-2-lite-v1": { id: "amazon/nova-2-lite-v1", name: "Nova 2 Lite", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "nova", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65535 }, cost: { input: 0.3, output: 2.5 } }, "amazon/nova-pro-v1": { id: "amazon/nova-pro-v1", name: "Nova Pro 1.0", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "nova-pro", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2024-10-31", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 5120 }, cost: { input: 0.8, output: 3.2 } }, "amazon/nova-micro-v1": { id: "amazon/nova-micro-v1", name: "Nova Micro 1.0", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova-micro", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2024-10-31", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 5120 }, cost: { input: 0.035, output: 0.14 } }, "amazon/nova-lite-v1": { id: "amazon/nova-lite-v1", name: "Nova Lite 1.0", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "nova-lite", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2024-10-31", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 5120 }, cost: { input: 0.06, output: 0.24 } }, "~moonshotai/kimi-latest": { id: "~moonshotai/kimi-latest", name: "MoonshotAI Kimi Latest", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 2.8, output: 14, cache_read: 0.29 } }, "ibm-granite/granite-4.0-h-micro": { id: "ibm-granite/granite-4.0-h-micro", name: "Granite 4.0 Micro", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "granite", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-10-20", last_updated: "2025-10-20", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 131000 }, cost: { input: 0.017, output: 0.112 } }, "ibm-granite/granite-4.1-8b": { id: "ibm-granite/granite-4.1-8b", name: "Granite 4.1 8B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "granite", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.05, output: 0.1, cache_read: 0.05 } }, "x-ai/grok-4.20-multi-agent": { id: "x-ai/grok-4.20-multi-agent", name: "Grok 4.20 Multi-Agent", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: false, structured_output: true, temperature: true, knowledge: "2025-09-01", release_date: "2026-03-31", last_updated: "2026-03-31", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "x-ai/grok-4.3": { id: "x-ai/grok-4.3", name: "Grok 4.3", description: "xAI's default Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "x-ai/grok-4.5": { id: "x-ai/grok-4.5", name: "Grok 4.5", description: "xAI's latest Grok for chat, coding, agentic tools, and lower hallucination risk", family: "grok", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-08", last_updated: "2026-07-08", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 500000, output: 500000 }, cost: { input: 2, output: 6, cache_read: 0.3, tiers: [{ input: 4, output: 12, cache_read: 0.6, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 12, cache_read: 0.6 } } }, "x-ai/grok-build-0.1": { id: "x-ai/grok-build-0.1", name: "Grok Build 0.1", description: "Fast Grok coding model tuned for agentic engineering and iterative edits", family: "grok-build", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1, output: 2, cache_read: 0.2, tiers: [{ input: 2, output: 4, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2, output: 4, cache_read: 0.4 } } }, "x-ai/grok-4.20": { id: "x-ai/grok-4.20", name: "Grok 4.20", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-09-01", release_date: "2026-03-31", last_updated: "2026-03-31", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 1.25, output: 2.5, cache_read: 0.2, tiers: [{ input: 2.5, output: 5, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 5, cache_read: 0.4 } } }, "kwaipilot/kat-coder-pro-v2": { id: "kwaipilot/kat-coder-pro-v2", name: "KAT-Coder-Pro V2", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "kat-coder", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-27", last_updated: "2026-03-27", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 80000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "kwaipilot/kat-coder-pro-v2.5": { id: "kwaipilot/kat-coder-pro-v2.5", name: "KAT-Coder-Pro V2.5", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "kat-coder", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-10", last_updated: "2026-07-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 80000 }, cost: { input: 0.74, output: 2.96, cache_read: 0.15 } }, "kwaipilot/kat-coder-air-v2.5": { id: "kwaipilot/kat-coder-air-v2.5", name: "KAT-Coder-Air V2.5", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", family: "kat-coder", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-10", last_updated: "2026-07-10", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 80000 }, cost: { input: 0.15, output: 0.6, cache_read: 0.03 } }, "sao10k/l3.1-euryale-70b": { id: "sao10k/l3.1-euryale-70b", name: "Llama 3.1 Euryale 70B v2.2", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12-31", release_date: "2024-08-28", last_updated: "2024-08-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.85, output: 0.85 } }, "sao10k/l3.3-euryale-70b": { id: "sao10k/l3.3-euryale-70b", name: "Llama 3.3 Euryale 70B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2023-12-31", release_date: "2024-12-18", last_updated: "2024-12-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.65, output: 0.75 } }, "sao10k/l3-lunaris-8b": { id: "sao10k/l3-lunaris-8b", name: "Llama 3 8B Lunaris", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2023-12-31", release_date: "2024-08-13", last_updated: "2024-08-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 16384 }, cost: { input: 0.04, output: 0.05 } }, "openrouter/pareto-code": { id: "openrouter/pareto-code", name: "Pareto Code Router", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 200000 } }, "openrouter/bodybuilder": { id: "openrouter/bodybuilder", name: "Body Builder (beta)", description: "Preview model for early access evaluation, prototyping, and compatibility testing", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, release_date: "2025-12-05", last_updated: "2025-12-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 } }, "openrouter/free": { id: "openrouter/free", name: "Free Models Router", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-01", last_updated: "2026-02-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, input: 200000, output: 8000 }, cost: { input: 0, output: 0 } }, "openrouter/auto": { id: "openrouter/auto", name: "Auto Router", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "auto", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2023-11-08", last_updated: "2023-11-08", modalities: { input: ["text", "image", "audio", "pdf", "video"], output: ["text", "image"] }, open_weights: false, limit: { context: 2000000, output: 2000000 } }, "openrouter/fusion": { id: "openrouter/fusion", name: "Fusion", description: "General-purpose chat model for instruction following, writing, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 } }, "aion-labs/aion-2.0": { id: "aion-labs/aion-2.0", name: "Aion-2.0", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.8, output: 1.6, cache_read: 0.2 } }, "aion-labs/aion-3.0-mini": { id: "aion-labs/aion-3.0-mini", name: "Aion-3.0-Mini", description: "Efficient model for low-latency assistance, extraction, and routine automation", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-07", last_updated: "2026-07-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 0.7, output: 1.4, cache_read: 0.18 } }, "aion-labs/aion-rp-llama-3.1-8b": { id: "aion-labs/aion-rp-llama-3.1-8b", name: "Aion-RP 1.0 (8B)", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-12-31", release_date: "2025-02-04", last_updated: "2025-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, output: 32768 }, cost: { input: 0.8, output: 1.6 } }, "aion-labs/aion-3.0": { id: "aion-labs/aion-3.0", name: "Aion-3.0", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-07-07", last_updated: "2026-07-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 }, cost: { input: 3, output: 6, cache_read: 0.75 } }, "xiaomi/mimo-v2.5": { id: "xiaomi/mimo-v2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_details" }, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1050000, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "xiaomi/mimo-v2.5-pro": { id: "xiaomi/mimo-v2.5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1050000, output: 131072 }, cost: { input: 0.435, output: 0.87, cache_read: 0.0036 } }, "writer/palmyra-x5": { id: "writer/palmyra-x5", name: "Palmyra X5", description: "General-purpose chat model for instruction following, writing, and analysis", family: "palmyra", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-01-21", last_updated: "2026-01-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1040000, output: 8192 }, cost: { input: 0.6, output: 6 } }, "anthropic/claude-sonnet-4.6": { id: "anthropic/claude-sonnet-4.6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "anthropic/claude-fable-5": { id: "anthropic/claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4.8-fast": { id: "anthropic/claude-opus-4.8-fast", name: "Claude Opus 4.8 (Fast)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4.1": { id: "anthropic/claude-opus-4.1", name: "Claude Opus 4.1 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 31999 }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-opus-4.5": { id: "anthropic/claude-opus-4.5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4.7": { id: "anthropic/claude-opus-4.7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "anthropic/claude-sonnet-4.5": { id: "anthropic/claude-sonnet-4.5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "anthropic/claude-3-haiku": { id: "anthropic/claude-3-haiku", name: "Claude 3 Haiku", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-08-31", release_date: "2024-03-13", last_updated: "2024-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, cost: { input: 0.25, output: 1.25, cache_read: 0.03, cache_write: 0.3 } }, "anthropic/claude-opus-5-fast": { id: "anthropic/claude-opus-5-fast", name: "Claude Opus 5 (Fast)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-sonnet-4": { id: "anthropic/claude-sonnet-4", name: "Claude Sonnet 4", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-01-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "anthropic/claude-haiku-4.5": { id: "anthropic/claude-haiku-4.5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "anthropic/claude-opus-4": { id: "anthropic/claude-opus-4", name: "Claude Opus 4", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 31999 }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-01-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-opus-4.8": { id: "anthropic/claude-opus-4.8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-5": { id: "anthropic/claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "anthropic/claude-opus-5": { id: "anthropic/claude-opus-5", name: "Claude Opus 5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4.6": { id: "anthropic/claude-opus-4.6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "anthropic/claude-opus-4.7-fast": { id: "anthropic/claude-opus-4.7-fast", name: "Claude Opus 4.7 (Fast)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 } }, "~anthropic/claude-sonnet-latest": { id: "~anthropic/claude-sonnet-latest", name: "Anthropic Claude Sonnet Latest", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "~anthropic/claude-opus-latest": { id: "~anthropic/claude-opus-latest", name: "Claude Opus Latest", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "~anthropic/claude-haiku-latest": { id: "~anthropic/claude-haiku-latest", name: "Anthropic Claude Haiku Latest", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 1024, max: 63999 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "~anthropic/claude-fable-latest": { id: "~anthropic/claude-fable-latest", name: "Claude Fable Latest", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "z-ai/glm-4.6v": { id: "z-ai/glm-4.6v", name: "GLM-4.6V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.3, output: 0.9, cache_read: 0.055 } }, "z-ai/glm-5": { id: "z-ai/glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.95, output: 2.55, cache_read: 0.2 } }, "z-ai/glm-4.5-air": { id: "z-ai/glm-4.5-air", name: "GLM-4.5-Air", description: "Lighter GLM-4.5 variant for fast coding assistance and cheaper agents", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.13, output: 0.85, cache_read: 0.025 } }, "z-ai/glm-5.1": { id: "z-ai/glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.952, output: 2.992, cache_read: 0.1768 } }, "z-ai/glm-4.7-flash": { id: "z-ai/glm-4.7-flash", name: "GLM-4.7-Flash", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_details" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 16384 }, cost: { input: 0.06, output: 0.4, cache_read: 0.01 } }, "z-ai/glm-5.2": { id: "z-ai/glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 128000 }, cost: { input: 0.07, output: 0.22, cache_read: 0.013 } }, "z-ai/glm-4.6": { id: "z-ai/glm-4.6", name: "GLM-4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.5, output: 2, cache_read: 0.1 } }, "z-ai/glm-4.5": { id: "z-ai/glm-4.5", name: "GLM-4.5", description: "Hybrid-reasoning GLM release that made the 4.5 line broadly useful", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "z-ai/glm-4.5v": { id: "z-ai/glm-4.5v", name: "GLM-4.5V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-04", release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 16384 }, cost: { input: 0.6, output: 1.8, cache_read: 0.11 } }, "z-ai/glm-4.7": { id: "z-ai/glm-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_details" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.4, output: 1.75, cache_read: 0.08 } }, "z-ai/glm-5-turbo": { id: "z-ai/glm-5-turbo", name: "GLM-5-Turbo", description: "Faster GLM-5 lane for coding agents that need lower latency", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: false, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24 } }, "z-ai/glm-5v-turbo": { id: "z-ai/glm-5v-turbo", name: "GLM-5V-Turbo", description: "Fast GLM vision model for screenshots, documents, and multimodal agent tasks", family: "glm", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24 } }, "perplexity/sonar-pro-search": { id: "perplexity/sonar-pro-search", name: "Sonar Pro Search", description: "Advanced Sonar search model for deeper research and cited synthesis", family: "sonar-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, release_date: "2025-10-30", last_updated: "2025-10-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8000 }, cost: { input: 3, output: 15 } }, "perplexity/sonar-deep-research": { id: "perplexity/sonar-deep-research", name: "Sonar Deep Research", description: "Sonar search model for current answers, retrieval, and citation-backed chat", family: "sonar-deep-research", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-03-07", last_updated: "2025-03-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 2, output: 8, reasoning: 3 } }, "perplexity/sonar": { id: "perplexity/sonar", name: "Sonar", description: "Sonar search model for current answers, retrieval, and citation-backed chat", family: "sonar", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-01-27", last_updated: "2025-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 127072, output: 127072 }, cost: { input: 1, output: 1 } }, "perplexity/sonar-pro": { id: "perplexity/sonar-pro", name: "Sonar Pro", description: "Advanced Sonar search model for deeper research and cited synthesis", family: "sonar-pro", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-03-07", last_updated: "2025-03-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8000 }, cost: { input: 3, output: 15 } }, "perplexity/sonar-reasoning-pro": { id: "perplexity/sonar-reasoning-pro", name: "Sonar Reasoning Pro", description: "Web-grounded reasoning model for multi-step research and cited answers", family: "sonar-reasoning", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-03-07", last_updated: "2025-03-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 2, output: 8 } }, "moonshotai/kimi-k2.5": { id: "moonshotai/kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_details" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.57, output: 2.85, cache_read: 0.095 } }, "moonshotai/kimi-k2.6": { id: "moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_details" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.5795, output: 2.44, cache_read: 0.0976 } }, "moonshotai/kimi-k2.7-code": { id: "moonshotai/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.7, output: 3.5, cache_read: 0.15 } }, "moonshotai/kimi-k2": { id: "moonshotai/kimi-k2", name: "Kimi K2 0711", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2024-12-31", release_date: "2025-07-11", last_updated: "2025-07-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 100352 }, cost: { input: 0.57, output: 2.3 } }, "moonshotai/kimi-k2-thinking": { id: "moonshotai/kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Thinking Kimi model for slower research passes, planning, and hard technical questions", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_details" }, structured_output: true, temperature: true, knowledge: "2024-08", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 100352 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "moonshotai/kimi-k3": { id: "moonshotai/kimi-k3", name: "Kimi K3", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "moonshotai/kimi-k2-0905": { id: "moonshotai/kimi-k2-0905", name: "Kimi K2 0905", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12-31", release_date: "2025-09-04", last_updated: "2025-09-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 100352 }, cost: { input: 0.6, output: 2.5 } }, "openai/gpt-5.1-codex-mini": { id: "openai/gpt-5.1-codex-mini", name: "GPT-5.1 Codex mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.03 } }, "openai/gpt-chat-latest": { id: "openai/gpt-chat-latest", name: "GPT Chat Latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2026-05-05", last_updated: "2026-05-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "openai/gpt-5.2-pro": { id: "openai/gpt-5.2-pro", name: "GPT-5.2 Pro", description: "Higher-accuracy GPT-5.2 variant for tougher reasoning and review workflows", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 21, output: 168 } }, "openai/gpt-5.5-pro": { id: "openai/gpt-5.5-pro", name: "GPT-5.5 Pro", description: "Highest-accuracy GPT-5.5 tier for slower, precision-heavy reasoning and coding", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "openai/gpt-4.1-mini": { id: "openai/gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "openai/gpt-4o": { id: "openai/gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.4-pro": { id: "openai/gpt-5.4-pro", name: "GPT-5.4 Pro", description: "More exact GPT-5.4 tier for demanding professional reasoning and agent tasks", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "openai/gpt-audio-mini": { id: "openai/gpt-audio-mini", name: "GPT Audio Mini", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "o-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text", "audio"], output: ["text", "audio"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.6, output: 2.4 } }, "openai/gpt-5.6-sol": { id: "openai/gpt-5.6-sol", name: "GPT-5.6 Sol", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 45, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1, cache_write: 12.5 } } }, "openai/o3-mini-high": { id: "openai/o3-mini-high", name: "o3 Mini High", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2023-10-31", release_date: "2025-02-12", last_updated: "2025-02-12", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-4o-mini-2024-07-18": { id: "openai/gpt-4o-mini-2024-07-18", name: "GPT-4o-mini (2024-07-18)", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "o-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-10-31", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "openai/gpt-4.1-nano": { id: "openai/gpt-4.1-nano", name: "GPT-4.1 nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.03, output: 0.13, cache_read: 0.03 } }, "openai/gpt-oss-safeguard-20b": { id: "openai/gpt-oss-safeguard-20b", name: "gpt-oss-safeguard-20b", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-29", last_updated: "2025-10-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0.075, output: 0.3, cache_read: 0.0375 } }, "openai/o3-mini": { id: "openai/o3-mini", name: "o3-mini", description: "Smaller o-series reasoner for economical coding, math, and planning tasks", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-5.6-sol-pro": { id: "openai/gpt-5.6-sol-pro", name: "GPT-5.6 Sol Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 45, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1, cache_write: 12.5 } } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "openai/gpt-3.5-turbo-0613": { id: "openai/gpt-3.5-turbo-0613", name: "GPT-3.5 Turbo (older v0613)", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2021-09-30", release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 4095, output: 4096 }, cost: { input: 1, output: 2 } }, "openai/o3-pro": { id: "openai/o3-pro", name: "o3-pro", description: "High-effort o3 tier for difficult technical reasoning and careful answers", family: "o-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-06-10", last_updated: "2025-06-10", modalities: { input: ["text", "pdf", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 20, output: 80 } }, "openai/gpt-4o-mini": { id: "openai/gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "openai/gpt-5": { id: "openai/gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-audio": { id: "openai/gpt-audio", name: "GPT Audio", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text", "audio"], output: ["text", "audio"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10 } }, "openai/o4-mini-high": { id: "openai/o4-mini-high", name: "o4 Mini High", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-06-30", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.275 } }, "openai/gpt-3.5-turbo": { id: "openai/gpt-3.5-turbo", name: "GPT-3.5-turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2021-09-01", release_date: "2023-03-01", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16385, output: 4096 }, cost: { input: 0.5, output: 1.5 } }, "openai/gpt-4o-2024-05-13": { id: "openai/gpt-4o-2024-05-13", name: "GPT-4o (2024-05-13)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-05-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 5, output: 15 } }, "openai/gpt-4o-2024-11-20": { id: "openai/gpt-4o-2024-11-20", name: "GPT-4o (2024-11-20)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-11-20", last_updated: "2024-11-20", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "openai/gpt-5.6-luna-pro": { id: "openai/gpt-5.6-luna-pro", name: "GPT-5.6 Luna Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0.1, output: 0.6, cache_read: 0.01, cache_write: 0.125, tiers: [{ input: 0.2, output: 0.9, cache_read: 0.02, cache_write: 0.25, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 0.2, output: 0.9, cache_read: 0.02, cache_write: 0.25 } } }, "openai/gpt-5.2-chat": { id: "openai/gpt-5.2-chat", name: "GPT-5.2 Chat", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-codex", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-10", last_updated: "2025-12-10", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.2-codex": { id: "openai/gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Code-specialist GPT for repository edits, reviews, and long-running software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.4-nano": { id: "openai/gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "openai/gpt-5-pro": { id: "openai/gpt-5-pro", name: "GPT-5 Pro", description: "Higher-accuracy GPT-5 tier for tough analysis, coding reviews, and planning", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 15, output: 120 } }, "openai/gpt-5.4-mini": { id: "openai/gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.037, output: 0.17 } }, "openai/gpt-3.5-turbo-16k": { id: "openai/gpt-3.5-turbo-16k", name: "GPT-3.5 Turbo 16k", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2021-09-30", release_date: "2023-08-28", last_updated: "2023-08-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16385, output: 4096 }, cost: { input: 3, output: 4 } }, "openai/o1": { id: "openai/o1", name: "o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2023-09", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 15, output: 60, cache_read: 7.5 } }, "openai/gpt-5.6-luna": { id: "openai/gpt-5.6-luna", name: "GPT-5.6 Luna", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 0.1, output: 0.6, cache_read: 0.01, cache_write: 0.125, tiers: [{ input: 0.2, output: 0.9, cache_read: 0.02, cache_write: 0.25, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 0.2, output: 0.9, cache_read: 0.02, cache_write: 0.25 } } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["pdf", "image", "text"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.3-codex": { id: "openai/gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/gpt-5.3-chat": { id: "openai/gpt-5.3-chat", name: "GPT-5.3 Chat", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/o1-pro": { id: "openai/o1-pro", name: "o1-pro", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: false, knowledge: "2023-09", release_date: "2025-03-19", last_updated: "2025-03-19", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 150, output: 600 } }, "openai/gpt-5-image": { id: "openai/gpt-5-image", name: "GPT-5 Image", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, knowledge: "2024-10-01", release_date: "2025-10-14", last_updated: "2025-10-14", modalities: { input: ["image", "text", "pdf"], output: ["image", "text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 10, output: 10, cache_read: 1.25 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4-turbo-preview": { id: "openai/gpt-4-turbo-preview", name: "GPT-4 Turbo Preview", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12-31", release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 10, output: 30 } }, "openai/gpt-4-turbo": { id: "openai/gpt-4-turbo", name: "GPT-4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 10, output: 30 } }, "openai/gpt-4o-2024-08-06": { id: "openai/gpt-4o-2024-08-06", name: "GPT-4o (2024-08-06)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-08-06", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.4-image-2": { id: "openai/gpt-5.4-image-2", name: "GPT-5.4 Image 2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: false, structured_output: true, temperature: false, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["image", "text", "pdf"], output: ["image", "text"] }, open_weights: false, limit: { context: 272000, output: 128000 }, cost: { input: 8, output: 15, cache_read: 2 } }, "openai/gpt-5.1-codex": { id: "openai/gpt-5.1-codex", name: "GPT-5.1 Codex", description: "Codex GPT for repository edits, code review, and practical software agents", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "openai/gpt-5-nano": { id: "openai/gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "openai/o3": { id: "openai/o3", name: "o3", description: "Deliberate o-series reasoner for hard math, coding, and multi-step analysis", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/gpt-3.5-turbo-instruct": { id: "openai/gpt-3.5-turbo-instruct", name: "GPT-3.5 Turbo Instruct", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2021-09-30", release_date: "2023-09-28", last_updated: "2023-09-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 4095, output: 4096 }, cost: { input: 1.5, output: 2 } }, "openai/gpt-5.6-terra": { id: "openai/gpt-5.6-terra", name: "GPT-5.6 Terra", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 1, output: 6, cache_read: 0.1, cache_write: 1.25, tiers: [{ input: 2, output: 9, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 2, output: 9, cache_read: 0.2, cache_write: 2.5 } } }, "openai/gpt-5-image-mini": { id: "openai/gpt-5-image-mini", name: "GPT-5 Image Mini", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, release_date: "2025-10-16", last_updated: "2025-10-16", modalities: { input: ["pdf", "image", "text"], output: ["image", "text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 2.5, output: 2, cache_read: 0.25 } }, "openai/gpt-5.6-terra-pro": { id: "openai/gpt-5.6-terra-pro", name: "GPT-5.6 Terra Pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 1, output: 6, cache_read: 0.1, cache_write: 1.25, tiers: [{ input: 2, output: 9, cache_read: 0.2, cache_write: 2.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 2, output: 9, cache_read: 0.2, cache_write: 2.5 } } }, "openai/gpt-4.1": { id: "openai/gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/o4-mini": { id: "openai/o4-mini", name: "o4-mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["image", "text", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.275 } }, "openai/gpt-oss-20b:free": { id: "openai/gpt-oss-20b:free", name: "gpt-oss-20b (free)", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0, output: 0 } }, "openai/gpt-5.1-codex-max": { id: "openai/gpt-5.1-codex-max", name: "GPT-5.1 Codex Max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/gpt-4": { id: "openai/gpt-4", name: "GPT-4", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-11", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8191, output: 4096 }, cost: { input: 30, output: 60 } }, "baidu/ernie-4.5-vl-424b-a47b": { id: "baidu/ernie-4.5-vl-424b-a47b", name: "ERNIE 4.5 VL 424B A47B ", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "ernie", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, knowledge: "2025-03-31", release_date: "2025-06-30", last_updated: "2025-06-30", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: true, limit: { context: 123000, output: 16000 }, cost: { input: 0.42, output: 1.25 } }, "meta-llama/llama-3.1-70b-instruct": { id: "meta-llama/llama-3.1-70b-instruct", name: "Llama 3.1 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12-31", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.4, output: 0.4 } }, "meta-llama/llama-guard-4-12b": { id: "meta-llama/llama-guard-4-12b", name: "Llama Guard 4 12B", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "llama", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2024-08-31", release_date: "2025-04-30", last_updated: "2025-04-30", modalities: { input: ["image", "text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 16384 }, cost: { input: 0.18, output: 0.18 } }, "meta-llama/llama-3.2-1b-instruct": { id: "meta-llama/llama-3.2-1b-instruct", name: "Llama 3.2 1B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2023-12-31", release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 60000, output: 60000 }, cost: { input: 0.027, output: 0.201 } }, "meta-llama/llama-3.3-70b-instruct": { id: "meta-llama/llama-3.3-70b-instruct", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.1, output: 0.32 } }, "meta-llama/llama-4-maverick": { id: "meta-llama/llama-4-maverick", name: "Llama 4 Maverick", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-08-31", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 16384 }, cost: { input: 0.2, output: 0.8 } }, "meta-llama/llama-4-scout": { id: "meta-llama/llama-4-scout", name: "Llama 4 Scout", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-08-31", release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1310720, output: 16384 }, cost: { input: 0.1, output: 0.3 } }, "meta-llama/llama-3.2-3b-instruct": { id: "meta-llama/llama-3.2-3b-instruct", name: "Llama 3.2 3B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2023-12-31", release_date: "2024-09-25", last_updated: "2024-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.05, output: 0.33 } }, "meta-llama/llama-3.1-8b-instruct": { id: "meta-llama/llama-3.1-8b-instruct", name: "Llama 3.1 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12-31", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.05, output: 0.08, cache_read: 0.025 } }, "arcee-ai/virtuoso-large": { id: "arcee-ai/virtuoso-large", name: "Virtuoso Large", description: "Flagship model for demanding analysis, coding, and production agent workflows", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-05", last_updated: "2025-05-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 64000 }, cost: { input: 0.75, output: 1.2 } }, "arcee-ai/trinity-large-thinking": { id: "arcee-ai/trinity-large-thinking", name: "Trinity Large Thinking", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "trinity", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.22, output: 0.85, cache_read: 0.06 } }, "bytedance-seed/seed-1.6": { id: "bytedance-seed/seed-1.6", name: "Seed 1.6", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.25, output: 2, tiers: [{ input: 0.5, output: 4, tier: { type: "context", size: 128000 } }] } }, "bytedance-seed/seed-2.0-mini": { id: "bytedance-seed/seed-2.0-mini", name: "Seed-2.0-Mini", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 131072 }, cost: { input: 0.1, output: 0.4, tiers: [{ input: 0.2, output: 0.8, tier: { type: "context", size: 128000 } }] } }, "bytedance-seed/seed-1.6-flash": { id: "bytedance-seed/seed-1.6-flash", name: "Seed 1.6 Flash", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 32768 }, cost: { input: 0.075, output: 0.3, tiers: [{ input: 0.1, output: 0.8, tier: { type: "context", size: 128000 } }] } }, "bytedance-seed/seed-2.0-lite": { id: "bytedance-seed/seed-2.0-lite", name: "Seed-2.0-Lite", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "seed", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-10", last_updated: "2026-03-10", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 131072 }, cost: { input: 0.25, output: 2, tiers: [{ input: 0.5, output: 4, tier: { type: "context", size: 128000 } }] } }, "stepfun/step-3.5-flash": { id: "stepfun/step-3.5-flash", name: "Step 3.5 Flash", description: "StepFun flash lane for quick multimodal reasoning and coding assistance", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, knowledge: "2025-01", release_date: "2026-01-29", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.1, output: 0.3 } }, "stepfun/step-3.7-flash": { id: "stepfun/step-3.7-flash", name: "Step 3.7 Flash", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, input: 256000, output: 256000 }, cost: { input: 0.2, output: 1.15, cache_read: 0.04 } }, "anthracite-org/magnum-v4-72b": { id: "anthracite-org/magnum-v4-72b", name: "Magnum v4 72B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", attachment: false, reasoning: false, tool_call: false, structured_output: true, temperature: true, knowledge: "2024-06-30", release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 16384, output: 2048 }, cost: { input: 3, output: 5 } } } }, huggingface: { id: "huggingface", env: ["HF_TOKEN"], npm: "@ai-sdk/openai-compatible", api: "https://router.huggingface.co/v1", name: "Hugging Face", doc: "https://huggingface.co/docs/inference-providers", models: { "google/gemma-4-26B-A4B-it": { id: "google/gemma-4-26B-A4B-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.13, output: 0.4 } }, "google/gemma-4-31B-it": { id: "google/gemma-4-31B-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.14, output: 0.4 } }, "thinkingmachines/Inkling-Small": { id: "thinkingmachines/Inkling-Small", name: "Inkling Small", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "ling", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-07-30", last_updated: "2026-07-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 1048576 }, cost: { input: 0.5, output: 1.2 } }, "thinkingmachines/Inkling": { id: "thinkingmachines/Inkling", name: "Inkling", description: "Multimodal model for analyzing text, images, documents, and rich media", family: "ling", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 1, output: 4.05 } }, "zai-org/GLM-5": { id: "zai-org/GLM-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.2 } }, "zai-org/GLM-4.5": { id: "zai-org/GLM-4.5", name: "GLM-4.5", description: "Hybrid-reasoning GLM release that made the 4.5 line broadly useful", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.6, output: 2.2 } }, "zai-org/GLM-4.5-Air": { id: "zai-org/GLM-4.5-Air", name: "GLM-4.5-Air", description: "Lighter GLM-4.5 variant for fast coding assistance and cheaper agents", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.13, output: 0.85 } }, "zai-org/GLM-4.5V": { id: "zai-org/GLM-4.5V", name: "GLM-4.5V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 16384 }, cost: { input: 0.6, output: 1.8 } }, "zai-org/GLM-4.7-Flash": { id: "zai-org/GLM-4.7-Flash", name: "GLM-4.7-Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-08-08", last_updated: "2025-08-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0, output: 0 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 1.4, output: 4.4 } }, "zai-org/GLM-5.1": { id: "zai-org/GLM-5.1", name: "GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-03", last_updated: "2026-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.2 } }, "zai-org/GLM-4.6": { id: "zai-org/GLM-4.6", name: "GLM-4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.55, output: 2.2 } }, "zai-org/GLM-4.7": { id: "zai-org/GLM-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11 } }, "tencent/Hy3": { id: "tencent/Hy3", name: "Hy3", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 64000 }, cost: { input: 0.14, output: 0.58 } }, "Qwen/Qwen3.5-27B": { id: "Qwen/Qwen3.5-27B", name: "Qwen3.5 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.3, output: 2.4 } }, "Qwen/Qwen3.5-9B": { id: "Qwen/Qwen3.5-9B", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.17, output: 0.25 } }, "Qwen/Qwen3-235B-A22B-Instruct-2507": { id: "Qwen/Qwen3-235B-A22B-Instruct-2507", name: "Qwen3 235B-A22B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-21", last_updated: "2025-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.855, output: 2.565 } }, "Qwen/Qwen3.5-122B-A10B": { id: "Qwen/Qwen3.5-122B-A10B", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.4, output: 3.2 } }, "Qwen/Qwen3-Coder-30B-A3B-Instruct": { id: "Qwen/Qwen3-Coder-30B-A3B-Instruct", name: "Qwen3-Coder 30B-A3B Instruct", description: "Smaller Qwen coder for efficient local agents and repo-level fixes", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.07, output: 0.26 } }, "Qwen/Qwen3-235B-A22B": { id: "Qwen/Qwen3-235B-A22B", name: "Qwen3 235B-A22B", description: "Large open Qwen MoE for multilingual reasoning, coding, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 16384 }, cost: { input: 0.2, output: 0.8 } }, "Qwen/Qwen3-Embedding-4B": { id: "Qwen/Qwen3-Embedding-4B", name: "Qwen 3 Embedding 4B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2024-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 2048 }, cost: { input: 0.01, output: 0 } }, "Qwen/Qwen3.5-35B-A3B": { id: "Qwen/Qwen3.5-35B-A3B", name: "Qwen3.5 35B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.25, output: 2 } }, "Qwen/Qwen3-Coder-Next": { id: "Qwen/Qwen3-Coder-Next", name: "Qwen3-Coder-Next", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-03", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.2, output: 1.5 } }, "Qwen/Qwen3.6-27B": { id: "Qwen/Qwen3.6-27B", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.47, output: 3.19 } }, "Qwen/Qwen3.5-397B-A17B": { id: "Qwen/Qwen3.5-397B-A17B", name: "Qwen3.5-397B-A17B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2026-02-01", last_updated: "2026-02-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.6, output: 3.6 } }, "Qwen/Qwen3-Embedding-8B": { id: "Qwen/Qwen3-Embedding-8B", name: "Qwen 3 Embedding 8B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2024-12", release_date: "2025-01-01", last_updated: "2025-01-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 4096 }, cost: { input: 0.01, output: 0 } }, "Qwen/Qwen3.6-35B-A3B": { id: "Qwen/Qwen3.6-35B-A3B", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.15, output: 0.95 } }, "Qwen/Qwen3-Next-80B-A3B-Thinking": { id: "Qwen/Qwen3-Next-80B-A3B-Thinking", name: "Qwen3-Next-80B-A3B-Thinking", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-11", last_updated: "2025-09-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.3, output: 2 } }, "Qwen/Qwen3-Coder-480B-A35B-Instruct": { id: "Qwen/Qwen3-Coder-480B-A35B-Instruct", name: "Qwen3-Coder-480B-A35B-Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 66536 }, cost: { input: 2, output: 2 } }, "Qwen/Qwen3-32B": { id: "Qwen/Qwen3-32B", name: "Qwen3 32B", description: "Dense open Qwen model for self-hosted chat, reasoning, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.29, output: 0.59 } }, "Qwen/Qwen3-Next-80B-A3B-Instruct": { id: "Qwen/Qwen3-Next-80B-A3B-Instruct", name: "Qwen3-Next-80B-A3B-Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-11", last_updated: "2025-09-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 66536 }, cost: { input: 0.25, output: 1 } }, "Qwen/Qwen3-235B-A22B-Thinking-2507": { id: "Qwen/Qwen3-235B-A22B-Thinking-2507", name: "Qwen3-235B-A22B-Thinking-2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.3, output: 3 } }, "MiniMaxAI/MiniMax-M2": { id: "MiniMaxAI/MiniMax-M2", name: "MiniMax-M2", description: "Efficient open MiniMax model built for coding agents and tool-heavy workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 128000 }, cost: { input: 0.3, output: 1.2 } }, "MiniMaxAI/MiniMax-M2.7": { id: "MiniMaxAI/MiniMax-M2.7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06 } }, "MiniMaxAI/MiniMax-M2.1": { id: "MiniMaxAI/MiniMax-M2.1", name: "MiniMax-M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-10", release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "MiniMaxAI/MiniMax-M2.5": { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "MiniMaxAI/MiniMax-M3": { id: "MiniMaxAI/MiniMax-M3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 128000 }, cost: { input: 0.3, output: 1.2 } }, "deepseek-ai/DeepSeek-V3": { id: "deepseek-ai/DeepSeek-V3", name: "DeepSeek-V3", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-12-26", last_updated: "2024-12-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 64000, output: 8192 }, cost: { input: 0.4, output: 1.3 } }, "deepseek-ai/DeepSeek-V4-Flash-0731": { id: "deepseek-ai/DeepSeek-V4-Flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 0.14, output: 0.28 } }, "deepseek-ai/DeepSeek-R1-0528": { id: "deepseek-ai/DeepSeek-R1-0528", name: "DeepSeek-R1-0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-05-28", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 163840 }, cost: { input: 3, output: 5 } }, "deepseek-ai/DeepSeek-R1": { id: "deepseek-ai/DeepSeek-R1", name: "DeepSeek-R1", description: "Classic open reasoning model for transparent math, coding, and deliberate problem solving", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-01-20", last_updated: "2025-05-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 64000, output: 32768 }, cost: { input: 0.7, output: 2.5 } }, "deepseek-ai/DeepSeek-V3.2": { id: "deepseek-ai/DeepSeek-V3.2", name: "DeepSeek-V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 65536 }, cost: { input: 0.28, output: 0.4 } }, "deepseek-ai/DeepSeek-V3.1": { id: "deepseek-ai/DeepSeek-V3.1", name: "DeepSeek-V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.27, output: 1 } }, "deepseek-ai/DeepSeek-V4-Flash": { id: "deepseek-ai/DeepSeek-V4-Flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 0.14, output: 0.28 } }, "deepseek-ai/DeepSeek-V4-Pro": { id: "deepseek-ai/DeepSeek-V4-Pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 393216 }, cost: { input: 0.435, output: 0.87, cache_read: 0.003625 } }, "stepfun-ai/Step-3.5-Flash": { id: "stepfun-ai/Step-3.5-Flash", name: "Step 3.5 Flash", description: "StepFun flash lane for quick multimodal reasoning and coding assistance", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-01-29", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 256000 }, cost: { input: 0.1, output: 0.3 } }, "stepfun-ai/Step-3.7-Flash": { id: "stepfun-ai/Step-3.7-Flash", name: "Step 3.7 Flash", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 256000 }, cost: { input: 0.2, output: 1.15 } }, "moonshotai/Kimi-K2-Instruct": { id: "moonshotai/Kimi-K2-Instruct", name: "Kimi-K2-Instruct", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-07-14", last_updated: "2025-07-14", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 1, output: 3 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi-K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "moonshotai/Kimi-K2.5": { id: "moonshotai/Kimi-K2.5", name: "Kimi-K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-01-01", last_updated: "2026-01-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "moonshotai/Kimi-K2-Instruct-0905": { id: "moonshotai/Kimi-K2-Instruct-0905", name: "Kimi-K2-Instruct-0905", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-09-04", last_updated: "2025-09-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 1, output: 3 } }, "moonshotai/Kimi-K2.7-Code": { id: "moonshotai/Kimi-K2.7-Code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4 } }, "moonshotai/Kimi-K2-Thinking": { id: "moonshotai/Kimi-K2-Thinking", name: "Kimi-K2-Thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-08", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "moonshotai/Kimi-K3": { id: "moonshotai/Kimi-K3", name: "Kimi K3", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 3, output: 15 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.1, output: 0.5 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.25, output: 0.69 } }, "meta-llama/Llama-3.3-70B-Instruct": { id: "meta-llama/Llama-3.3-70B-Instruct", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 4096 }, cost: { input: 0.59, output: 0.79 } }, "XiaomiMiMo/MiMo-V2.5-Pro": { id: "XiaomiMiMo/MiMo-V2.5-Pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1, output: 3 } }, "XiaomiMiMo/MiMo-V2.5": { id: "XiaomiMiMo/MiMo-V2.5", name: "MiMo-V2.5", description: "MiMo model for long-context reasoning, perception, and agentic tasks", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0.4, output: 2 } }, "XiaomiMiMo/MiMo-V2-Flash": { id: "XiaomiMiMo/MiMo-V2-Flash", name: "MiMo-V2-Flash", description: "MiMo flash model for fast multimodal assistance and agent workflows", family: "mimo", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12", release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 4096 }, cost: { input: 0.1, output: 0.3 } } } }, "minimax-coding-plan": { id: "minimax-coding-plan", env: ["MINIMAX_API_KEY"], npm: "@ai-sdk/anthropic", api: "https://api.minimax.io/anthropic/v1", name: "MiniMax Token Plan (minimax.io)", doc: "https://platform.minimax.io/docs/token-plan/intro", models: { "MiniMax-M2": { id: "MiniMax-M2", name: "MiniMax-M2", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 128000 }, cost: { input: 0, output: 0 } }, "MiniMax-M2.7": { id: "MiniMax-M2.7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "MiniMax-M2.1": { id: "MiniMax-M2.1", name: "MiniMax-M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "MiniMax-M2.5": { id: "MiniMax-M2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "MiniMax-M2.5-highspeed": { id: "MiniMax-M2.5-highspeed", name: "MiniMax-M2.5-highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-13", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "MiniMax-M2.7-highspeed": { id: "MiniMax-M2.7-highspeed", name: "MiniMax-M2.7-highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "MiniMax-M3": { id: "MiniMax-M3", name: "MiniMax-M3", description: "MiniMax multimodal coding model for long-context reasoning and agent tasks", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-25", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, "siliconflow-cn": { id: "siliconflow-cn", env: ["SILICONFLOW_CN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.siliconflow.cn/v1", name: "SiliconFlow (China)", doc: "https://cloud.siliconflow.com/models", models: { "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1049000, output: 262000 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26, cache_write: 0 } }, "zai-org/GLM-4.5-Air": { id: "zai-org/GLM-4.5-Air", name: "zai-org/GLM-4.5-Air", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-air", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-28", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.14, output: 0.86 } }, "PaddlePaddle/PaddleOCR-VL-1.5": { id: "PaddlePaddle/PaddleOCR-VL-1.5", name: "PaddlePaddle/PaddleOCR-VL-1.5", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2026-01-29", last_updated: "2026-01-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 16384, output: 16384 }, cost: { input: 0, output: 0 } }, "tencent/Hunyuan-A13B-Instruct": { id: "tencent/Hunyuan-A13B-Instruct", name: "tencent/Hunyuan-A13B-Instruct", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "hunyuan", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-06-30", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.14, output: 0.57 } }, "Pro/zai-org/GLM-5": { id: "Pro/zai-org/GLM-5", name: "Pro/zai-org/GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 205000, output: 205000 }, cost: { input: 1, output: 3.2 } }, "Pro/zai-org/GLM-5.1": { id: "Pro/zai-org/GLM-5.1", name: "Pro/zai-org/GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-08", last_updated: "2026-04-08", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 205000, output: 205000 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26, cache_write: 0 } }, "Pro/MiniMaxAI/MiniMax-M2.5": { id: "Pro/MiniMaxAI/MiniMax-M2.5", name: "Pro/MiniMaxAI/MiniMax-M2.5", description: "Frontier MiniMax model for engineering, office tasks, and agentic reasoning", family: "minimax", attachment: false, reasoning: false, tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-13", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 192000, output: 131000 }, cost: { input: 0.3, output: 1.22 } }, "Pro/deepseek-ai/DeepSeek-V3": { id: "Pro/deepseek-ai/DeepSeek-V3", name: "Pro/deepseek-ai/DeepSeek-V3", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-12-26", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.25, output: 1 } }, "Pro/deepseek-ai/DeepSeek-R1": { id: "Pro/deepseek-ai/DeepSeek-R1", name: "Pro/deepseek-ai/DeepSeek-R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-05-28", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.5, output: 2.18 } }, "Pro/deepseek-ai/DeepSeek-V3.2": { id: "Pro/deepseek-ai/DeepSeek-V3.2", name: "Pro/deepseek-ai/DeepSeek-V3.2", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-03", last_updated: "2025-12-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.27, output: 0.42 } }, "Pro/deepseek-ai/DeepSeek-V3.1-Terminus": { id: "Pro/deepseek-ai/DeepSeek-V3.1-Terminus", name: "Pro/deepseek-ai/DeepSeek-V3.1-Terminus", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-29", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.27, output: 1 } }, "Pro/moonshotai/Kimi-K2.6": { id: "Pro/moonshotai/Kimi-K2.6", name: "Pro/moonshotai/Kimi-K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "Pro/moonshotai/Kimi-K2.5": { id: "Pro/moonshotai/Kimi-K2.5", name: "Pro/moonshotai/Kimi-K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.45, output: 2.25, cache_read: 0.07 } }, "Qwen/Qwen3.5-27B": { id: "Qwen/Qwen3.5-27B", name: "Qwen/Qwen3.5-27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-25", last_updated: "2026-02-25", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.26, output: 2.09 } }, "Qwen/Qwen3.5-9B": { id: "Qwen/Qwen3.5-9B", name: "Qwen/Qwen3.5-9B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.22, output: 1.74 } }, "Qwen/Qwen3-14B": { id: "Qwen/Qwen3-14B", name: "Qwen/Qwen3-14B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-30", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.07, output: 0.28 } }, "Qwen/Qwen3.5-122B-A10B": { id: "Qwen/Qwen3.5-122B-A10B", name: "Qwen/Qwen3.5-122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-26", last_updated: "2026-02-26", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.29, output: 2.32 } }, "Qwen/Qwen3.5-4B": { id: "Qwen/Qwen3.5-4B", name: "Qwen/Qwen3.5-4B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0, output: 0 } }, "Qwen/Qwen3-8B": { id: "Qwen/Qwen3-8B", name: "Qwen/Qwen3-8B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-30", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.06, output: 0.06 } }, "Qwen/Qwen3.5-35B-A3B": { id: "Qwen/Qwen3.5-35B-A3B", name: "Qwen/Qwen3.5-35B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-25", last_updated: "2026-02-25", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.23, output: 1.86 } }, "Qwen/Qwen3.5-397B-A17B": { id: "Qwen/Qwen3.5-397B-A17B", name: "Qwen/Qwen3.5-397B-A17B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-16", last_updated: "2026-02-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.29, output: 1.74 } }, "Qwen/Qwen3.6-35B-A3B": { id: "Qwen/Qwen3.6-35B-A3B", name: "Qwen/Qwen3.6-35B-A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.23, output: 1.86 } }, "Qwen/Qwen3-32B": { id: "Qwen/Qwen3-32B", name: "Qwen/Qwen3-32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-04-30", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.14, output: 0.57 } }, "Qwen/Qwen3-235B-A22B-Thinking-2507": { id: "Qwen/Qwen3-235B-A22B-Thinking-2507", name: "Qwen/Qwen3-235B-A22B-Thinking-2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-28", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.13, output: 0.6 } }, "Qwen/Qwen3-VL-32B-Thinking": { id: "Qwen/Qwen3-VL-32B-Thinking", name: "Qwen/Qwen3-VL-32B-Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-21", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.2, output: 1.5 } }, "Qwen/Qwen3-VL-30B-A3B-Instruct": { id: "Qwen/Qwen3-VL-30B-A3B-Instruct", name: "Qwen/Qwen3-VL-30B-A3B-Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-05", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.29, output: 1 } }, "Qwen/Qwen3-VL-32B-Instruct": { id: "Qwen/Qwen3-VL-32B-Instruct", name: "Qwen/Qwen3-VL-32B-Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-21", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.2, output: 0.6 } }, "Qwen/Qwen3-Coder-480B-A35B-Instruct": { id: "Qwen/Qwen3-Coder-480B-A35B-Instruct", name: "Qwen/Qwen3-Coder-480B-A35B-Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-31", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.25, output: 1 } }, "Qwen/Qwen3-30B-A3B-Instruct-2507": { id: "Qwen/Qwen3-30B-A3B-Instruct-2507", name: "Qwen/Qwen3-30B-A3B-Instruct-2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-30", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.09, output: 0.3 } }, "Qwen/Qwen3-VL-8B-Instruct": { id: "Qwen/Qwen3-VL-8B-Instruct", name: "Qwen/Qwen3-VL-8B-Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-15", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.18, output: 0.68 } }, "Qwen/Qwen3-VL-30B-A3B-Thinking": { id: "Qwen/Qwen3-VL-30B-A3B-Thinking", name: "Qwen/Qwen3-VL-30B-A3B-Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-11", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.29, output: 1 } }, "Qwen/Qwen3-VL-235B-A22B-Thinking": { id: "Qwen/Qwen3-VL-235B-A22B-Thinking", name: "Qwen/Qwen3-VL-235B-A22B-Thinking", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-04", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.45, output: 3.5 } }, "Qwen/Qwen3-VL-235B-A22B-Instruct": { id: "Qwen/Qwen3-VL-235B-A22B-Instruct", name: "Qwen/Qwen3-VL-235B-A22B-Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-04", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.3, output: 1.5 } }, "Qwen/Qwen3-Coder-30B-A3B-Instruct": { id: "Qwen/Qwen3-Coder-30B-A3B-Instruct", name: "Qwen/Qwen3-Coder-30B-A3B-Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-01", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.07, output: 0.28 } }, "Qwen/Qwen2.5-72B-Instruct": { id: "Qwen/Qwen2.5-72B-Instruct", name: "Qwen/Qwen2.5-72B-Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-09-18", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 33000, output: 4000 }, cost: { input: 0.59, output: 0.59 } }, "Qwen/Qwen2.5-7B-Instruct": { id: "Qwen/Qwen2.5-7B-Instruct", name: "Qwen/Qwen2.5-7B-Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-09-18", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 33000, output: 4000 }, cost: { input: 0.05, output: 0.05 } }, "inclusionAI/Ling-flash-2.0": { id: "inclusionAI/Ling-flash-2.0", name: "inclusionAI/Ling-flash-2.0", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "ling", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-18", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.14, output: 0.57 } }, "ByteDance-Seed/Seed-OSS-36B-Instruct": { id: "ByteDance-Seed/Seed-OSS-36B-Instruct", name: "ByteDance-Seed/Seed-OSS-36B-Instruct", description: "Tool-capable chat model for instruction following and agentic application workflows", family: "seed", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-04", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.21, output: 0.57 } }, "deepseek-ai/DeepSeek-R1": { id: "deepseek-ai/DeepSeek-R1", name: "deepseek-ai/DeepSeek-R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-05-28", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.5, output: 2.18 } }, "deepseek-ai/DeepSeek-V3.2": { id: "deepseek-ai/DeepSeek-V3.2", name: "deepseek-ai/DeepSeek-V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-03", last_updated: "2025-12-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.27, output: 0.42 } }, "deepseek-ai/DeepSeek-OCR": { id: "deepseek-ai/DeepSeek-OCR", name: "deepseek-ai/DeepSeek-OCR", description: "OCR model for extracting structured text from documents and screenshots", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2025-10-20", last_updated: "2025-10-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } }, "deepseek-ai/DeepSeek-V4-Flash": { id: "deepseek-ai/DeepSeek-V4-Flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.003 } }, "deepseek-ai/DeepSeek-V4-Pro": { id: "deepseek-ai/DeepSeek-V4-Pro", name: "deepseek-ai/DeepSeek-V4-Pro", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1049000, output: 393000 }, cost: { input: 1.74, output: 3.48, cache_read: 0.145 } }, "deepseek-ai/DeepSeek-V3.1-Terminus": { id: "deepseek-ai/DeepSeek-V3.1-Terminus", name: "deepseek-ai/DeepSeek-V3.1-Terminus", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-09-29", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.27, output: 1 } }, "deepseek-ai/DeepSeek-V3": { id: "deepseek-ai/DeepSeek-V3", name: "deepseek-ai/DeepSeek-V3", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-12-26", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 164000, output: 164000 }, cost: { input: 0.25, output: 1 } }, "stepfun-ai/Step-3.5-Flash": { id: "stepfun-ai/Step-3.5-Flash", name: "stepfun-ai/Step-3.5-Flash", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", family: "step", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.1, output: 0.3 } }, "baidu/ERNIE-4.5-300B-A47B": { id: "baidu/ERNIE-4.5-300B-A47B", name: "baidu/ERNIE-4.5-300B-A47B", description: "Tool-capable chat model for instruction following and agentic application workflows", family: "ernie", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-02", last_updated: "2025-11-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.28, output: 1.1 } } } }, tinfoil: { id: "tinfoil", env: ["TINFOIL_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://inference.tinfoil.sh/v1", name: "Tinfoil", doc: "https://docs.tinfoil.sh", models: { "gemma4-31b": { id: "gemma4-31b", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 32768 }, cost: { input: 0.4, output: 1 } }, "kimi-k2-6": { id: "kimi-k2-6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 262144 }, cost: { input: 1.5, output: 5.25 } }, "gpt-oss-safeguard-120b": { id: "gpt-oss-safeguard-120b", name: "gpt-oss-safeguard-120b", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06", release_date: "2025-10-29", last_updated: "2025-10-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 32768 }, cost: { input: 0.15, output: 0.6 } }, "llama3-3-70b": { id: "llama3-3-70b", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 1.75, output: 2.75 } }, "glm-5-2": { id: "glm-5-2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 384000, output: 131072 }, cost: { input: 1.5, output: 5.25, cache_read: 0.375 } }, "nomic-embed-text": { id: "nomic-embed-text", name: "Nomic Embed Text v1.5", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, release_date: "2024-02", last_updated: "2024-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 8192, output: 768 }, cost: { input: 0.05, output: 0 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "gpt-oss-120b", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-06", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 32768 }, cost: { input: 0.15, output: 0.6 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 131072 }, cost: { input: 2, output: 6 } } } }, xiaomi: { id: "xiaomi", env: ["XIAOMI_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.xiaomimimo.com/v1", name: "Xiaomi", doc: "https://platform.xiaomimimo.com/#/docs", models: { "mimo-v2-omni": { id: "mimo-v2-omni", name: "MiMo-V2-Omni", description: "Legacy model retained for compatibility with older integrations", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-06-24", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 131072 }, status: "deprecated", cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "mimo-v2-flash": { id: "mimo-v2-flash", name: "MiMo-V2-Flash", description: "Legacy model retained for compatibility with older integrations", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12-01", release_date: "2025-12-16", last_updated: "2026-06-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, status: "deprecated", cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "mimo-v2.5-pro-ultraspeed": { id: "mimo-v2.5-pro-ultraspeed", name: "MiMo-V2.5-Pro-UltraSpeed", description: "MiMo pro model for strong multimodal reasoning and agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-06-08", last_updated: "2026-06-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, status: "beta", cost: { input: 1.305, output: 2.61, cache_read: 0.0108 } }, "mimo-v2-pro": { id: "mimo-v2-pro", name: "MiMo-V2-Pro", description: "Earlier MiMo Pro model for multimodal agents, reasoning, and code tasks", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-06-24", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, status: "deprecated", cost: { input: 0.435, output: 0.87, cache_read: 0.0036 } }, "mimo-v2.5": { id: "mimo-v2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-06-24", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.0028 } }, "mimo-v2.5-pro": { id: "mimo-v2.5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-06-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.435, output: 0.87, cache_read: 0.0036 } } } }, stackit: { id: "stackit", env: ["STACKIT_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.openai-compat.model-serving.eu01.onstackit.cloud/v1", name: "STACKIT", doc: "https://docs.stackit.cloud/products/data-and-ai/ai-model-serving/basics/available-shared-models", models: { "intfloat/e5-mistral-7b-instruct": { id: "intfloat/e5-mistral-7b-instruct", name: "E5 Mistral 7B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "mistral", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, release_date: "2023-12-11", last_updated: "2023-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 4096, output: 4096 }, cost: { input: 0.02, output: 0.02 } }, "google/gemma-3-27b-it": { id: "google/gemma-3-27b-it", name: "Gemma 3 27B", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-05-17", last_updated: "2025-05-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 37000, output: 4096 }, cost: { input: 0.53, output: 0.76 } }, "Qwen/Qwen3-VL-Embedding-8B": { id: "Qwen/Qwen3-VL-Embedding-8B", name: "Qwen3-VL Embedding 8B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "qwen", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: false, release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 4096 }, cost: { input: 0.09, output: 0.09 } }, "Qwen/Qwen3.6-27B": { id: "Qwen/Qwen3.6-27B", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.53, output: 0.76 } }, "Qwen/Qwen3-VL-235B-A22B-Instruct-FP8": { id: "Qwen/Qwen3-VL-235B-A22B-Instruct-FP8", name: "Qwen3-VL 235B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2024-11-01", last_updated: "2024-11-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 218000, output: 16384 }, cost: { input: 1.76, output: 2.05 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.18, output: 0.29 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 8192 }, cost: { input: 0.53, output: 0.76 } }, "cortecs/Llama-3.3-70B-Instruct-FP8-Dynamic": { id: "cortecs/Llama-3.3-70B-Instruct-FP8-Dynamic", name: "Llama 3.3 70B", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 4096 }, cost: { input: 0.53, output: 0.76 } } } }, deepinfra: { id: "deepinfra", env: ["DEEPINFRA_API_KEY"], npm: "@ai-sdk/deepinfra", name: "Deep Infra", doc: "https://deepinfra.com/models", models: { "nvidia/Llama-3.3-Nemotron-Super-49B-v1.5": { id: "nvidia/Llama-3.3-Nemotron-Super-49B-v1.5", name: "Llama 3.3 Nemotron Super 49B v1.5", description: "Nemotron model for efficient reasoning, coding, and specialized AI agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-25", last_updated: "2025-07-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, status: "deprecated", cost: { input: 0.4, output: 0.4 } }, "nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning": { id: "nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning", name: "Nemotron 3 Nano Omni 30B A3B Reasoning", description: "Open Nemotron omni model combining reasoning with text, vision, and audio", family: "nemotron", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-28", last_updated: "2026-04-28", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, status: "deprecated", cost: { input: 0.2, output: 0.8 } }, "nvidia/Nemotron-3-Nano-30B-A3B": { id: "nvidia/Nemotron-3-Nano-30B-A3B", name: "Nemotron 3 Nano 30B A3B", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2025-12-15", last_updated: "2025-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.05, output: 0.2, cache_read: 0.025 } }, "google/gemma-4-26B-A4B-it": { id: "google/gemma-4-26B-A4B-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.07, output: 0.34 } }, "google/gemma-4-E4B-it": { id: "google/gemma-4-E4B-it", name: "Gemma 4 E4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 8192 }, cost: { input: 0.02, output: 0.1 } }, "google/gemma-4-31B-it": { id: "google/gemma-4-31B-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.13, output: 0.38 } }, "thinkingmachines/Inkling-Small": { id: "thinkingmachines/Inkling-Small", name: "Inkling Small", description: "Multimodal MoE reasoning model (276B total, 12B active) for text, image, and audio", family: "ling", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-30", last_updated: "2026-07-30", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 1048576 }, cost: { input: 0.45, output: 1.2, cache_read: 0.1 } }, "thinkingmachines/Inkling": { id: "thinkingmachines/Inkling", name: "Inkling", description: "Multimodal MoE reasoning model (975B total, 41B active) for text, image, and audio", family: "ling", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-07-15", last_updated: "2026-07-15", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 1048576 }, cost: { input: 0.95, output: 4.05, cache_read: 0.16 } }, "zai-org/GLM-5": { id: "zai-org/GLM-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-12", release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 16384 }, cost: { input: 0.6, output: 2.08, cache_read: 0.12 } }, "zai-org/GLM-4.7-Flash": { id: "zai-org/GLM-4.7-Flash", name: "GLM-4.7-Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 16384 }, cost: { input: 0.06, output: 0.4, cache_read: 0.01 } }, "zai-org/GLM-5.2": { id: "zai-org/GLM-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 32768 }, cost: { input: 0.75, output: 2.4, cache_read: 0.14 } }, "zai-org/GLM-5.1": { id: "zai-org/GLM-5.1", name: "GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 16384 }, cost: { input: 1.05, output: 3.5, cache_read: 0.205 } }, "zai-org/GLM-4.6": { id: "zai-org/GLM-4.6", name: "GLM-4.6", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 0.5, output: 2, cache_read: 0.1 } }, "zai-org/GLM-4.7": { id: "zai-org/GLM-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 16384 }, cost: { input: 0.4, output: 1.75, cache_read: 0.08 } }, "tencent/Hy3": { id: "tencent/Hy3", name: "Hy3", description: "Tencent Hy reasoning model for coding, instruction following, and agent tasks", family: "Hy", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 64000 }, cost: { input: 0.14, output: 0.58, cache_read: 0.035 } }, "Qwen/Qwen3.5-27B": { id: "Qwen/Qwen3.5-27B", name: "Qwen3.5 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.26, output: 2.6 } }, "Qwen/Qwen3.5-9B": { id: "Qwen/Qwen3.5-9B", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.1, output: 0.15 } }, "Qwen/Qwen3-235B-A22B-Instruct-2507": { id: "Qwen/Qwen3-235B-A22B-Instruct-2507", name: "Qwen3 235B-A22B Instruct 2507", description: "Updated large open Qwen3 MoE instruct model for multilingual chat, coding, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-21", last_updated: "2025-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.09, output: 0.55 } }, "Qwen/Qwen3.5-122B-A10B": { id: "Qwen/Qwen3.5-122B-A10B", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.29, output: 2.4 } }, "Qwen/Qwen3.7-Max": { id: "Qwen/Qwen3.7-Max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 65536 }, cost: { input: 2.5, output: 7.5, cache_read: 0.5, tiers: [{ input: 5, output: 15, cache_read: 1, tier: { type: "context", size: 32000 } }, { input: 6.25, output: 18.5, cache_read: 1.25, tier: { type: "context", size: 128000 } }] } }, "Qwen/Qwen3.5-35B-A3B": { id: "Qwen/Qwen3.5-35B-A3B", name: "Qwen 3.5 35B A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-01", last_updated: "2026-04-20", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 81920 }, cost: { input: 0.14, output: 1, cache_read: 0.05 } }, "Qwen/Qwen3.6-27B": { id: "Qwen/Qwen3.6-27B", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.32, output: 3.2 } }, "Qwen/Qwen3.5-397B-A17B": { id: "Qwen/Qwen3.5-397B-A17B", name: "Qwen 3.5 397B A17B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-01", last_updated: "2026-04-20", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 81920 }, cost: { input: 0.45, output: 3, cache_read: 0.22 } }, "Qwen/Qwen3.6-35B-A3B": { id: "Qwen/Qwen3.6-35B-A3B", name: "Qwen3.6 35B A3B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 81920 }, cost: { input: 0.1, output: 0.95 } }, "Qwen/Qwen3.8-Max": { id: "Qwen/Qwen3.8-Max", name: "Qwen3.8 Max", description: "2.4-trillion-parameter MoE flagship for coding, professional work, multimodal understanding, and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 131072 }, cost: { input: 1.65, output: 4.951, cache_read: 0.206 } }, "Qwen/Qwen3-32B": { id: "Qwen/Qwen3-32B", name: "Qwen3 32B", description: "Dense open Qwen model for self-hosted chat, reasoning, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 16384 }, cost: { input: 0.08, output: 0.28 } }, "Qwen/Qwen3-Next-80B-A3B-Instruct": { id: "Qwen/Qwen3-Next-80B-A3B-Instruct", name: "Qwen3-Next 80B-A3B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.09, output: 1.1 } }, "Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo": { id: "Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo", name: "Qwen3 Coder 480B A35B Instruct Turbo", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 66536 }, cost: { input: 0.3, output: 1, cache_read: 0.1 } }, "Qwen/Qwen3-Max": { id: "Qwen/Qwen3-Max", name: "Qwen3 Max", description: "Flagship Qwen3 model for coding agents, complex reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-23", last_updated: "2025-09-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 65536 }, cost: { input: 1.2, output: 6, cache_read: 0.24, tiers: [{ input: 2.4, output: 12, cache_read: 0.48, tier: { type: "context", size: 32000 } }, { input: 3, output: 15, cache_read: 0.6, tier: { type: "context", size: 128000 } }] } }, "MiniMaxAI/MiniMax-M2.7": { id: "MiniMaxAI/MiniMax-M2.7", name: "MiniMax-M2.7", description: "Open MiniMax flagship for coding agents, office automation, and complex environments", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 131072 }, cost: { input: 0.25, output: 1, cache_read: 0.05 } }, "MiniMaxAI/MiniMax-M2.5": { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-06", release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 131072 }, status: "deprecated", cost: { input: 0.15, output: 1.15, cache_read: 0.03 } }, "MiniMaxAI/MiniMax-M3": { id: "MiniMaxAI/MiniMax-M3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 524288, output: 128000 }, cost: { input: 0.28, output: 1.1, cache_read: 0.056 } }, "deepseek-ai/DeepSeek-V3": { id: "deepseek-ai/DeepSeek-V3", name: "DeepSeek-V3", description: "Open DeepSeek MoE chat model for coding, math, and general reasoning", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-12-26", last_updated: "2024-12-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 8192 }, cost: { input: 0.32, output: 0.89 } }, "deepseek-ai/DeepSeek-V4-Flash-0731": { id: "deepseek-ai/DeepSeek-V4-Flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 384000 }, cost: { input: 0.09, output: 0.18, cache_read: 0.018 } }, "deepseek-ai/DeepSeek-R1-0528": { id: "deepseek-ai/DeepSeek-R1-0528", name: "DeepSeek-R1-0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-05-28", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 64000 }, cost: { input: 0.5, output: 2.15, cache_read: 0.35 } }, "deepseek-ai/DeepSeek-V3.2": { id: "deepseek-ai/DeepSeek-V3.2", name: "DeepSeek-V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2025-12-02", last_updated: "2025-12-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 163840, output: 64000 }, cost: { input: 0.26, output: 0.38, cache_read: 0.13 } }, "deepseek-ai/DeepSeek-V3.1": { id: "deepseek-ai/DeepSeek-V3.1", name: "DeepSeek-V3.1", description: "Hybrid-reasoning DeepSeek model with thinking and non-thinking modes", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-21", last_updated: "2025-08-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 8192 }, cost: { input: 0.25, output: 0.95, cache_read: 0.13 } }, "deepseek-ai/DeepSeek-V4-Flash": { id: "deepseek-ai/DeepSeek-V4-Flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 16384 }, cost: { input: 0.09, output: 0.18, cache_read: 0.018 } }, "deepseek-ai/DeepSeek-V4-Pro": { id: "deepseek-ai/DeepSeek-V4-Pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 16384 }, cost: { input: 1.3, output: 2.6, cache_read: 0.1 } }, "stepfun-ai/Step-3.7-Flash": { id: "stepfun-ai/Step-3.7-Flash", name: "Step 3.7 Flash", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 256000 }, cost: { input: 0.2, output: 1.15, cache_read: 0.04 } }, "moonshotai/Kimi-K2.6": { id: "moonshotai/Kimi-K2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.75, output: 3.5, cache_read: 0.15 } }, "moonshotai/Kimi-K2.5": { id: "moonshotai/Kimi-K2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0.45, output: 2.25, cache_read: 0.07 } }, "moonshotai/Kimi-K2.7-Code": { id: "moonshotai/Kimi-K2.7-Code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.68, output: 3.4, cache_read: 0.136 } }, "moonshotai/Kimi-K3": { id: "moonshotai/Kimi-K3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 2.85, output: 14.25, cache_read: 0.285 } }, "openai/gpt-oss-20b": { id: "openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.03, output: 0.14 } }, "openai/gpt-oss-120b": { id: "openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.037, output: 0.17 } }, "meta-llama/Llama-4-Scout-17B-16E-Instruct": { id: "meta-llama/Llama-4-Scout-17B-16E-Instruct", name: "Llama 4 Scout 17B", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: true, reasoning: false, tool_call: true, structured_output: true, release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 327680, output: 16384 }, cost: { input: 0.1, output: 0.3 } }, "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8": { id: "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8", name: "Llama 4 Maverick 17B FP8", description: "Open multimodal Llama model for strong reasoning and fast responses", family: "llama", attachment: true, reasoning: false, tool_call: false, structured_output: true, release_date: "2025-04-05", last_updated: "2025-04-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 16384 }, cost: { input: 0.2, output: 0.8 } }, "meta-llama/Llama-3.3-70B-Instruct-Turbo": { id: "meta-llama/Llama-3.3-70B-Instruct-Turbo", name: "Llama 3.3 70B Turbo", description: "Compact Llama instruction model for fast chat and local deployment", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.1, output: 0.32 } }, "XiaomiMiMo/MiMo-V2.5-Pro": { id: "XiaomiMiMo/MiMo-V2.5-Pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "audio"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 16384 }, cost: { input: 1, output: 3, cache_read: 0.2 } }, "XiaomiMiMo/MiMo-V2.5": { id: "XiaomiMiMo/MiMo-V2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 16384 }, cost: { input: 0.4, output: 2, cache_read: 0.08 } } } }, anthropic: { id: "anthropic", env: ["ANTHROPIC_API_KEY"], npm: "@ai-sdk/anthropic", name: "Anthropic", doc: "https://docs.anthropic.com/en/docs/about-claude/models", models: { "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-04", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-06-07", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, experimental: { modes: { fast: { cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-sonnet-4-5": { id: "claude-sonnet-4-5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "claude-sonnet-4-5-20250929": { id: "claude-sonnet-4-5-20250929", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "claude-opus-4-5-20251101": { id: "claude-opus-4-5-20251101", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-01", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-haiku-4-5-20251001": { id: "claude-haiku-4-5-20251001", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "claude-opus-4-7": { id: "claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-14", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-opus-4-5": { id: "claude-opus-4-5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-29", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "claude-opus-5": { id: "claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, experimental: { modes: { fast: { cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } } } }, "cloudflare-ai-gateway": { id: "cloudflare-ai-gateway", env: ["CLOUDFLARE_API_TOKEN", "CLOUDFLARE_ACCOUNT_ID", "CLOUDFLARE_GATEWAY_ID"], npm: "ai-gateway-provider", name: "Cloudflare AI Gateway", doc: "https://developers.cloudflare.com/ai-gateway/", models: { "workers-ai/@cf/aisingapore/gemma-sea-lion-v4-27b-it": { id: "workers-ai/@cf/aisingapore/gemma-sea-lion-v4-27b-it", name: "Gemma SEA-LION v4 27B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.35, output: 0.56 } }, "workers-ai/@cf/nvidia/nemotron-3-120b-a12b": { id: "workers-ai/@cf/nvidia/nemotron-3-120b-a12b", name: "Nemotron 3 Super 120B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.5, output: 1.5 } }, "workers-ai/@cf/google/gemma-3-12b-it": { id: "workers-ai/@cf/google/gemma-3-12b-it", name: "Gemma 3 12B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-11", last_updated: "2025-04-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.35, output: 0.56 } }, "workers-ai/@cf/zai-org/glm-4.7-flash": { id: "workers-ai/@cf/zai-org/glm-4.7-flash", name: "GLM-4.7-Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.06, output: 0.4 } }, "workers-ai/@cf/zai-org/glm-5.2": { id: "workers-ai/@cf/zai-org/glm-5.2", name: "Glm 5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "workers-ai/@cf/baai/bge-base-en-v1.5": { id: "workers-ai/@cf/baai/bge-base-en-v1.5", name: "BGE Base EN v1.5", description: "General-purpose chat model for instruction following, writing, and analysis", family: "bge", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.067, output: 0 } }, "workers-ai/@cf/baai/bge-reranker-base": { id: "workers-ai/@cf/baai/bge-reranker-base", name: "BGE Reranker Base", description: "Reranking model for improving retrieval quality in search and recommendation systems", family: "bge", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-09", last_updated: "2025-04-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.0031, output: 0 } }, "workers-ai/@cf/baai/bge-large-en-v1.5": { id: "workers-ai/@cf/baai/bge-large-en-v1.5", name: "BGE Large EN v1.5", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "bge", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.2, output: 0 } }, "workers-ai/@cf/baai/bge-small-en-v1.5": { id: "workers-ai/@cf/baai/bge-small-en-v1.5", name: "BGE Small EN v1.5", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "bge", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.02, output: 0 } }, "workers-ai/@cf/baai/bge-m3": { id: "workers-ai/@cf/baai/bge-m3", name: "BGE M3", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "bge", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.012, output: 0 } }, "workers-ai/@cf/pipecat-ai/smart-turn-v2": { id: "workers-ai/@cf/pipecat-ai/smart-turn-v2", name: "Pipecat Smart Turn v2", description: "General-purpose chat model for instruction following, writing, and analysis", family: "smart-turn", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "workers-ai/@cf/qwen/qwen3-30b-a3b-fp8": { id: "workers-ai/@cf/qwen/qwen3-30b-a3b-fp8", name: "Qwen3 30B A3B FP8", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.051, output: 0.34 } }, "workers-ai/@cf/qwen/qwq-32b": { id: "workers-ai/@cf/qwen/qwq-32b", name: "QwQ 32B", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-11", last_updated: "2025-04-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.66, output: 1 } }, "workers-ai/@cf/qwen/qwen2.5-coder-32b-instruct": { id: "workers-ai/@cf/qwen/qwen2.5-coder-32b-instruct", name: "Qwen 2.5 Coder 32B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-11", last_updated: "2025-04-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.66, output: 1 } }, "workers-ai/@cf/qwen/qwen3-embedding-0.6b": { id: "workers-ai/@cf/qwen/qwen3-embedding-0.6b", name: "Qwen3 Embedding 0.6B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.012, output: 0 } }, "workers-ai/@cf/myshell-ai/melotts": { id: "workers-ai/@cf/myshell-ai/melotts", name: "MyShell MeloTTS", description: "General-purpose chat model for instruction following, writing, and analysis", family: "melotts", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "workers-ai/@cf/mistralai/mistral-small-3.1-24b-instruct": { id: "workers-ai/@cf/mistralai/mistral-small-3.1-24b-instruct", name: "Mistral Small 3.1 24B Instruct", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-11", last_updated: "2025-04-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.35, output: 0.56 } }, "workers-ai/@cf/meta/m2m100-1.2b": { id: "workers-ai/@cf/meta/m2m100-1.2b", name: "M2M100 1.2B", description: "General-purpose chat model for instruction following, writing, and analysis", family: "m2m", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.34, output: 0.34 } }, "workers-ai/@cf/meta/llama-3-8b-instruct-awq": { id: "workers-ai/@cf/meta/llama-3-8b-instruct-awq", name: "Llama 3 8B Instruct AWQ", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.12, output: 0.27 } }, "workers-ai/@cf/meta/llama-3.2-1b-instruct": { id: "workers-ai/@cf/meta/llama-3.2-1b-instruct", name: "Llama 3.2 1B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.027, output: 0.2 } }, "workers-ai/@cf/meta/llama-3-8b-instruct": { id: "workers-ai/@cf/meta/llama-3-8b-instruct", name: "Llama 3 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.28, output: 0.83 } }, "workers-ai/@cf/meta/llama-2-7b-chat-fp16": { id: "workers-ai/@cf/meta/llama-2-7b-chat-fp16", name: "Llama 2 7B Chat FP16", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.56, output: 6.67 } }, "workers-ai/@cf/meta/llama-3.2-3b-instruct": { id: "workers-ai/@cf/meta/llama-3.2-3b-instruct", name: "Llama 3.2 3B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.051, output: 0.34 } }, "workers-ai/@cf/meta/llama-3.1-8b-instruct-awq": { id: "workers-ai/@cf/meta/llama-3.1-8b-instruct-awq", name: "Llama 3.1 8B Instruct AWQ", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.12, output: 0.27 } }, "workers-ai/@cf/meta/llama-3.3-70b-instruct-fp8-fast": { id: "workers-ai/@cf/meta/llama-3.3-70b-instruct-fp8-fast", name: "Llama 3.3 70B Instruct FP8 Fast", description: "Compact Llama instruction model for fast chat and local deployment", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.29, output: 2.25 } }, "workers-ai/@cf/meta/llama-3.1-8b-instruct": { id: "workers-ai/@cf/meta/llama-3.1-8b-instruct", name: "Llama 3.1 8B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.28, output: 0.8299999999999998 } }, "workers-ai/@cf/meta/llama-guard-3-8b": { id: "workers-ai/@cf/meta/llama-guard-3-8b", name: "Llama Guard 3 8B", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.48, output: 0.03 } }, "workers-ai/@cf/meta/llama-3.2-11b-vision-instruct": { id: "workers-ai/@cf/meta/llama-3.2-11b-vision-instruct", name: "Llama 3.2 11B Vision Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.049, output: 0.68 } }, "workers-ai/@cf/meta/llama-3.1-8b-instruct-fp8": { id: "workers-ai/@cf/meta/llama-3.1-8b-instruct-fp8", name: "Llama 3.1 8B Instruct FP8", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.29 } }, "workers-ai/@cf/meta/llama-4-scout-17b-16e-instruct": { id: "workers-ai/@cf/meta/llama-4-scout-17b-16e-instruct", name: "Llama 4 Scout 17B 16E Instruct", description: "Open multimodal Llama model for long-context analysis and efficient agents", family: "llama", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.27, output: 0.85 } }, "workers-ai/@cf/pfnet/plamo-embedding-1b": { id: "workers-ai/@cf/pfnet/plamo-embedding-1b", name: "PLaMo Embedding 1B", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "plamo", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.019, output: 0 } }, "workers-ai/@cf/deepgram/aura-2-en": { id: "workers-ai/@cf/deepgram/aura-2-en", name: "Deepgram Aura 2 (EN)", description: "General-purpose chat model for instruction following, writing, and analysis", family: "aura", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "workers-ai/@cf/deepgram/aura-2-es": { id: "workers-ai/@cf/deepgram/aura-2-es", name: "Deepgram Aura 2 (ES)", description: "General-purpose chat model for instruction following, writing, and analysis", family: "aura", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "workers-ai/@cf/deepgram/nova-3": { id: "workers-ai/@cf/deepgram/nova-3", name: "Deepgram Nova 3", description: "General-purpose chat model for instruction following, writing, and analysis", family: "nova", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-11-14", last_updated: "2025-11-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "workers-ai/@cf/facebook/bart-large-cnn": { id: "workers-ai/@cf/facebook/bart-large-cnn", name: "BART Large CNN", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "bart", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-09", last_updated: "2025-04-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0, output: 0 } }, "workers-ai/@cf/mistral/mistral-7b-instruct-v0.1": { id: "workers-ai/@cf/mistral/mistral-7b-instruct-v0.1", name: "Mistral 7B Instruct v0.1", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.11, output: 0.19 } }, "workers-ai/@cf/ibm-granite/granite-4.0-h-micro": { id: "workers-ai/@cf/ibm-granite/granite-4.0-h-micro", name: "IBM Granite 4.0 H Micro", description: "Efficient model for low-latency assistance, extraction, and routine automation", family: "granite", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.017, output: 0.11 } }, "workers-ai/@cf/deepseek-ai/deepseek-r1-distill-qwen-32b": { id: "workers-ai/@cf/deepseek-ai/deepseek-r1-distill-qwen-32b", name: "DeepSeek R1 Distill Qwen 32B", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "deepseek-thinking", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.5, output: 4.88 } }, "workers-ai/@cf/huggingface/distilbert-sst-2-int8": { id: "workers-ai/@cf/huggingface/distilbert-sst-2-int8", name: "DistilBERT SST-2 INT8", description: "General-purpose chat model for instruction following, writing, and analysis", family: "distilbert", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-04-03", last_updated: "2025-04-03", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.026, output: 0 } }, "workers-ai/@cf/ai4bharat/indictrans2-en-indic-1B": { id: "workers-ai/@cf/ai4bharat/indictrans2-en-indic-1B", name: "IndicTrans2 EN-Indic 1B", description: "General-purpose chat model for instruction following, writing, and analysis", family: "indictrans", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-09-25", last_updated: "2025-09-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.34, output: 0.34 } }, "workers-ai/@cf/moonshotai/kimi-k2.5": { id: "workers-ai/@cf/moonshotai/kimi-k2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "workers-ai/@cf/moonshotai/kimi-k2.6": { id: "workers-ai/@cf/moonshotai/kimi-k2.6", name: "Kimi K2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "workers-ai/@cf/openai/gpt-oss-20b": { id: "workers-ai/@cf/openai/gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.2, output: 0.3 } }, "workers-ai/@cf/openai/gpt-oss-120b": { id: "workers-ai/@cf/openai/gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.35, output: 0.75 } }, "anthropic/claude-sonnet-4-6": { id: "anthropic/claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-02-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, provider: { npm: "ai-gateway-provider" }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75, tiers: [{ input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 6, output: 22.5, cache_read: 0.6, cache_write: 7.5 } } }, "anthropic/claude-haiku-4-5": { id: "anthropic/claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "anthropic/claude-3-opus": { id: "anthropic/claude-3-opus", name: "Claude Opus 3", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-08-31", release_date: "2024-02-29", last_updated: "2024-02-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-opus-4-6": { id: "anthropic/claude-opus-4-6", name: "Claude Opus 4.6 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 37.5, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 10, output: 37.5, cache_read: 1, cache_write: 12.5 } } }, "anthropic/claude-fable-5": { id: "anthropic/claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 10, output: 50, cache_read: 1, cache_write: 12.5 } }, "anthropic/claude-opus-4-8": { id: "anthropic/claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-3.5-haiku": { id: "anthropic/claude-3.5-haiku", name: "Claude Haiku 3.5 (latest)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07-31", release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 0.8, output: 4, cache_read: 0.08, cache_write: 1 } }, "anthropic/claude-opus-4-1": { id: "anthropic/claude-opus-4-1", name: "Claude Opus 4.1 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-sonnet-4-5": { id: "anthropic/claude-sonnet-4-5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-3-haiku": { id: "anthropic/claude-3-haiku", name: "Claude Haiku 3", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-08-31", release_date: "2024-03-13", last_updated: "2024-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, cost: { input: 0.25, output: 1.25, cache_read: 0.03, cache_write: 0.3 } }, "anthropic/claude-sonnet-4": { id: "anthropic/claude-sonnet-4", name: "Claude Sonnet 4 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-3-sonnet": { id: "anthropic/claude-3-sonnet", name: "Claude Sonnet 3", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2023-08-31", release_date: "2024-03-04", last_updated: "2024-03-04", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 4096 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 0.3 } }, "anthropic/claude-opus-4": { id: "anthropic/claude-opus-4", name: "Claude Opus 4 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "anthropic/claude-3-5-haiku": { id: "anthropic/claude-3-5-haiku", name: "Claude Haiku 3.5 (latest)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-07-31", release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 0.8, output: 4, cache_read: 0.08, cache_write: 1 } }, "anthropic/claude-3.5-sonnet": { id: "anthropic/claude-3.5-sonnet", name: "Claude Sonnet 3.5 v2", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-04-30", release_date: "2024-10-22", last_updated: "2024-10-22", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "anthropic/claude-opus-4-7": { id: "anthropic/claude-opus-4-7", name: "Claude Opus 4.7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, provider: { npm: "@ai-sdk/anthropic" }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-opus-4-5": { id: "anthropic/claude-opus-4-5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "anthropic/claude-sonnet-5": { id: "anthropic/claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 2, output: 10, cache_read: 0.2, cache_write: 2.5 } }, "anthropic/claude-opus-5": { id: "anthropic/claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "moonshotai/kimi-k3": { id: "moonshotai/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "openai/gpt-4o": { id: "openai/gpt-4o", name: "GPT-4o", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "openai/gpt-5.6-sol": { id: "openai/gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "openai/o3-mini": { id: "openai/o3-mini", name: "o3-mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "openai/o3-pro": { id: "openai/o3-pro", name: "o3-pro", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-06-10", last_updated: "2025-06-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 20, output: 80 } }, "openai/gpt-4o-mini": { id: "openai/gpt-4o-mini", name: "GPT-4o mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.08 } }, "openai/gpt-3.5-turbo": { id: "openai/gpt-3.5-turbo", name: "GPT-3.5-turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2021-09-01", release_date: "2023-03-01", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16385, output: 4096 }, cost: { input: 0.5, output: 1.5, cache_read: 1.25 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT-5.4", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, provider: { npm: "ai-gateway-provider" }, cost: { input: 2.5, output: 15, cache_read: 0.25 } }, "openai/gpt-5.2-codex": { id: "openai/gpt-5.2-codex", name: "GPT-5.2 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "ai-gateway-provider" }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/o1": { id: "openai/o1", name: "o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2023-09", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 15, output: 60, cache_read: 7.5 } }, "openai/gpt-5.6-luna": { id: "openai/gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 1, output: 6, cache_read: 0.1, tiers: [{ input: 2, output: 9, cache_read: 0.2, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 2, output: 9, cache_read: 0.2 } } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.3-codex": { id: "openai/gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, provider: { npm: "ai-gateway-provider" }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT-5.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.13 } }, "openai/gpt-4-turbo": { id: "openai/gpt-4-turbo", name: "GPT-4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-12", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 10, output: 30 } }, "openai/gpt-5.1-codex": { id: "openai/gpt-5.1-codex", name: "GPT-5.1 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "openai/o3": { id: "openai/o3", name: "o3", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "openai/gpt-5.6-terra": { id: "openai/gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "openai/o4-mini": { id: "openai/o4-mini", name: "o4-mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4, cache_read: 0.28 } }, "openai/gpt-4": { id: "openai/gpt-4", name: "GPT-4", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-11", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 8192 }, cost: { input: 30, output: 60 } } } }, lynkr: { id: "lynkr", env: ["LYNKR_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "http://127.0.0.1:8081/v1", name: "Lynkr", doc: "https://github.com/Fast-Editor/Lynkr", models: { "lynkr-auto": { id: "lynkr-auto", name: "Lynkr Auto (complexity routing)", description: "Virtual model: Lynkr scores each request on complexity and routes it to the tier model the user configured (local Ollama/llama.cpp for simple requests, configured cloud providers for complex ones).", family: "auto", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-12-03", last_updated: "2026-07-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0, output: 0 } } } }, "alibaba-token-plan-cn": { id: "alibaba-token-plan-cn", env: ["ALIBABA_TOKEN_PLAN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1", name: "Alibaba Token Plan (China)", doc: "https://www.alibabacloud.com/help/zh/model-studio/token-plan-overview", models: { "qwen3.7-plus": { id: "qwen3.7-plus", name: "Qwen3.7 Plus", description: "Multimodal Qwen workhorse for long-context agents, visual inputs, and coding", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3.8-max-preview": { id: "qwen3.8-max-preview", name: "Qwen3.8 Max Preview", description: "Preview Qwen flagship for million-token multimodal reasoning and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "xhigh"] }, { type: "budget_tokens", min: 0, max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-07-19", last_updated: "2026-07-19", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, status: "beta", cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5": { id: "glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 16384 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 128000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 98304 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "wan2.7-image-pro": { id: "wan2.7-image-pro", name: "Wan2.7 Image Pro", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 8192, output: 0 }, cost: { input: 0, output: 0 } }, "qwen3.7-max": { id: "qwen3.7-max", name: "Qwen3.7 Max", description: "Qwen frontier model tuned for agent frameworks, coding assistants, and long tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-05-21", last_updated: "2026-05-21", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "wan2.7-image": { id: "wan2.7-image", name: "Wan2.7 Image", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 8192, output: 0 }, cost: { input: 0, output: 0 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "happyhorse-1.1-i2v": { id: "happyhorse-1.1-i2v", name: "HappyHorse 1.1 Image-to-Video", description: "Video model for image-to-video generation", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2026-07-17", last_updated: "2026-07-17", modalities: { input: ["image", "text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 0, output: 0 } }, "qwen3.8-max": { id: "qwen3.8-max", name: "Qwen3.8 Max", description: "2.4-trillion-parameter MoE flagship for coding, professional work, multimodal understanding, and long-horizon agentic workflows", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "xhigh"] }, { type: "budget_tokens", min: 0, max: 262144 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-08-03", last_updated: "2026-08-03", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "deepseek-v4-flash-0731": { id: "deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "deepseek-v3.2": { id: "deepseek-v3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-03", last_updated: "2025-12-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0, output: 0 } }, "happyhorse-1.1-r2v": { id: "happyhorse-1.1-r2v", name: "HappyHorse 1.1 Reference-to-Video", description: "Video model for reference-guided video generation", attachment: true, reasoning: false, tool_call: false, temperature: true, release_date: "2026-07-17", last_updated: "2026-07-17", modalities: { input: ["image", "text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 0, output: 0 } }, "qwen-image-2.0-pro": { id: "qwen-image-2.0-pro", name: "Qwen Image 2.0 Pro", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 8192, output: 0 }, cost: { input: 0, output: 0 } }, "MiniMax-M2.5": { id: "MiniMax-M2.5", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, input: 196601, output: 32768 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "qwen3.6-flash": { id: "qwen3.6-flash", name: "Qwen3.6 Flash", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen3.6", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 131072 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-27", last_updated: "2026-04-27", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "happyhorse-1.1-t2v": { id: "happyhorse-1.1-t2v", name: "HappyHorse 1.1 Text-to-Video", description: "Video model for prompt-driven text-to-video generation", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-07-17", last_updated: "2026-07-17", modalities: { input: ["text"], output: ["video"] }, open_weights: false, limit: { context: 0, output: 0 }, cost: { input: 0, output: 0 } }, "qwen-image-2.0": { id: "qwen-image-2.0", name: "Qwen Image 2.0", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "qwen", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text"], output: ["image"] }, open_weights: false, limit: { context: 8192, output: 0 }, cost: { input: 0, output: 0 } }, "qwen3.6-plus": { id: "qwen3.6-plus", name: "Qwen3.6 Plus", description: "Earlier Qwen multimodal workhorse for million-token agent and document tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "budget_tokens", max: 131072 }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, "stepfun-ai": { id: "stepfun-ai", env: ["STEPFUN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.stepfun.ai/v1", name: "StepFun (Global)", doc: "https://platform.stepfun.ai/docs/en/overview/concept", models: { "step-2-16k": { id: "step-2-16k", name: "Step 2 (16K)", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06", release_date: "2025-01-01", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 5.21, output: 16.44, cache_read: 1.04 } }, "stepaudio-2.5-asr": { id: "stepaudio-2.5-asr", name: "StepAudio 2.5 ASR", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "step", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-24", last_updated: "2026-07-02", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 } }, "step-1-32k": { id: "step-1-32k", name: "Step 1 (32K)", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06", release_date: "2025-01-01", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 32768 }, cost: { input: 2.05, output: 9.59, cache_read: 0.41 } }, "stepaudio-2.5-tts": { id: "stepaudio-2.5-tts", name: "StepAudio 2.5 TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "step", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-16", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "step-tts-2": { id: "step-tts-2", name: "Step TTS 2", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "step", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-03-01", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "step-3.5-flash-2603": { id: "step-3.5-flash-2603", name: "Step 3.5 Flash 2603", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0.1, output: 0.3, cache_read: 0.02 } }, "step-3.7-flash": { id: "step-3.7-flash", name: "Step 3.7 Flash", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-06-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0.185, output: 1.11, cache_read: 0.037 } }, "step-3.5-flash": { id: "step-3.5-flash", name: "Step 3.5 Flash", description: "StepFun flash lane for quick multimodal reasoning and coding assistance", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-01-29", last_updated: "2026-06-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0.1, output: 0.3, cache_read: 0.02 } } } }, chutes: { id: "chutes", env: ["CHUTES_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://llm.chutes.ai/v1", name: "Chutes", doc: "https://llm.chutes.ai/v1/models", models: { "Nemotron-3-Nano-Omni-30B-TEE": { id: "Nemotron-3-Nano-Omni-30B-TEE", name: "Nemotron 3 Nano Omni 30B TEE", description: "Omni-modal model for text, vision, audio, and multimodal agent tasks", family: "nemotron", attachment: false, reasoning: false, tool_call: false, temperature: true, release_date: "2026-07-23", last_updated: "2026-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 0 }, cost: { input: 0.0245, output: 0.0978, cache_read: 0.0024499999999999995 } }, "google/gemma-4-31B-turbo-TEE": { id: "google/gemma-4-31B-turbo-TEE", name: "gemma 4 31B turbo TEE", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0.12, output: 0.37, cache_read: 0.011999999999999997 } }, "zai-org/GLM-5.1-TEE": { id: "zai-org/GLM-5.1-TEE", name: "GLM 5.1 TEE", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 65535 }, cost: { input: 0.98, output: 3.08, cache_read: 0.09799999999999998 } }, "zai-org/GLM-5.2-TEE": { id: "zai-org/GLM-5.2-TEE", name: "GLM 5.2 TEE", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 65535 }, cost: { input: 1.25, output: 3.95, cache_read: 0.12499999999999997 } }, "unsloth/Mistral-Nemo-Instruct-2407-TEE": { id: "unsloth/Mistral-Nemo-Instruct-2407-TEE", name: "Mistral Nemo Instruct 2407 TEE", description: "Efficient Mistral-NVIDIA open model for multilingual chat and local deployment", family: "mistral-nemo", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2024-07", release_date: "2024-07-01", last_updated: "2024-07-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.0245, output: 0.0978, cache_read: 0.0024499999999999995 } }, "Qwen/Qwen3-235B-A22B-Thinking-2507-TEE": { id: "Qwen/Qwen3-235B-A22B-Thinking-2507-TEE", name: "Qwen3 235B A22B Thinking 2507 TEE", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-07", last_updated: "2026-06-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.2989, output: 1.1957, cache_read: 0.029889999999999993 } }, "Qwen/Qwen3-32B-TEE": { id: "Qwen/Qwen3-32B-TEE", name: "Qwen3 32B TEE", description: "Dense open Qwen model for self-hosted chat, reasoning, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 40960 }, cost: { input: 0.104, output: 0.416, cache_read: 0.010399999999999998 } }, "Qwen/Qwen3.6-27B-TEE": { id: "Qwen/Qwen3.6-27B-TEE", name: "Qwen3.6 27B TEE", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.3, output: 2, cache_read: 0.029999999999999992 } }, "Qwen/Qwen3.5-397B-A17B-TEE": { id: "Qwen/Qwen3.5-397B-A17B-TEE", name: "Qwen3.5 397B A17B TEE", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.45, output: 3, cache_read: 0.04499999999999999 } }, "deepseek-ai/DeepSeek-V3.2-TEE": { id: "deepseek-ai/DeepSeek-V3.2-TEE", name: "DeepSeek V3.2 TEE", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-12", last_updated: "2026-06-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 1, output: 1, cache_read: 0.09999999999999998 } }, "deepseek-ai/DeepSeek-V4-Flash-0731-TEE": { id: "deepseek-ai/DeepSeek-V4-Flash-0731-TEE", name: "DeepSeek V4 Flash 0731 TEE", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-08-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0.14, output: 0.28, cache_read: 0.013999999999999999 } }, "moonshotai/Kimi-K2.6-TEE": { id: "moonshotai/Kimi-K2.6-TEE", name: "Kimi K2.6 TEE", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-12", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65535 }, cost: { input: 0.58, output: 3.4, cache_read: 0.05799999999999998 } }, "moonshotai/Kimi-K3-TEE": { id: "moonshotai/Kimi-K3-TEE", name: "Kimi K3 TEE", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-07-29", last_updated: "2026-07-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 65535 }, cost: { input: 3, output: 15, cache_read: 0.29999999999999993 } } } }, cerebras: { id: "cerebras", env: ["CEREBRAS_API_KEY"], npm: "@ai-sdk/cerebras", name: "Cerebras", doc: "https://inference-docs.cerebras.ai/models/overview", models: { "gemma-4-31b": { id: "gemma-4-31b", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-07-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 40960 }, status: "beta", cost: { input: 0.99, output: 1.49 } }, "zai-glm-4.7": { id: "zai-glm-4.7", name: "Z.AI GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["none"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01-07", last_updated: "2026-06-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 40960 }, status: "beta", cost: { input: 2.25, output: 2.75, cache_read: 2.25, cache_write: 0 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT OSS 120B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2026-06-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 40960 }, cost: { input: 0.35, output: 0.75 } } } }, "qiniu-ai": { id: "qiniu-ai", env: ["QINIU_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.qnaigc.com/v1", name: "Qiniu", doc: "https://developer.qiniu.com/aitokenapi", models: { "qwen3-coder-480b-a35b-instruct": { id: "qwen3-coder-480b-a35b-instruct", name: "Qwen3 Coder 480B A35B Instruct", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-14", last_updated: "2025-08-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 4096 } }, "qwen-vl-max-2025-01-25": { id: "qwen-vl-max-2025-01-25", name: "Qwen VL-MAX-2025-01-25", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 } }, "qwen3-32b": { id: "qwen3-32b", name: "Qwen3 32B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 40000, output: 4096 } }, "deepseek-v3.1": { id: "deepseek-v3.1", name: "DeepSeek-V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-19", last_updated: "2025-08-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 } }, "doubao-1.5-vision-pro": { id: "doubao-1.5-vision-pro", name: "Doubao 1.5 Vision Pro", description: "Flagship model for demanding analysis, coding, and production agent workflows", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16000 } }, "claude-3.7-sonnet": { id: "claude-3.7-sonnet", name: "Claude 3.7 Sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 } }, "qwen3-30b-a3b": { id: "qwen3-30b-a3b", name: "Qwen3 30B A3B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 40000, output: 4096 } }, "glm-4.5-air": { id: "glm-4.5-air", name: "GLM 4.5 Air", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 4096 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 64000 } }, "mimo-v2-flash": { id: "mimo-v2-flash", name: "Mimo-V2-Flash", description: "MiMo flash model for fast multimodal assistance and agent workflows", family: "mimo", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12-01", release_date: "2025-12-16", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.1, output: 0.3, cache_read: 0.01 } }, "doubao-seed-2.0-pro": { id: "doubao-seed-2.0-pro", name: "Doubao Seed 2.0 Pro", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 } }, "qwen3-235b-a22b-thinking-2507": { id: "qwen3-235b-a22b-thinking-2507", name: "Qwen3 235B A22B Thinking 2507", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-12", last_updated: "2025-08-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 4096 } }, "qwen-max-2025-01-25": { id: "qwen-max-2025-01-25", name: "Qwen2.5-Max-2025-01-25", description: "Flagship Qwen model for complex reasoning, coding, and agentic workflows", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 } }, "qwen3-vl-30b-a3b-thinking": { id: "qwen3-vl-30b-a3b-thinking", name: "Qwen3-Vl 30b A3b Thinking", description: "Multimodal model for analyzing text, images, documents, and rich media", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-09", last_updated: "2026-02-09", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 } }, "gemini-3.0-flash-preview": { id: "gemini-3.0-flash-preview", name: "Gemini 3.0 Flash Preview", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-18", last_updated: "2025-12-18", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 } }, "gpt-oss-20b": { id: "gpt-oss-20b", name: "gpt-oss-20b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-06", last_updated: "2025-08-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 } }, "doubao-seed-2.0-lite": { id: "doubao-seed-2.0-lite", name: "Doubao Seed 2.0 Lite", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 } }, "qwen3-next-80b-a3b-thinking": { id: "qwen3-next-80b-a3b-thinking", name: "Qwen3 Next 80B A3B Thinking", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-12", last_updated: "2025-09-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 } }, "doubao-1.5-pro-32k": { id: "doubao-1.5-pro-32k", name: "Doubao 1.5 Pro 32k", description: "Flagship model for demanding analysis, coding, and production agent workflows", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 12000 } }, "doubao-seed-2.0-code": { id: "doubao-seed-2.0-code", name: "Doubao Seed 2.0 Code", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 128000 } }, "MiniMax-M1": { id: "MiniMax-M1", name: "MiniMax M1", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 80000 } }, "claude-3.5-haiku": { id: "claude-3.5-haiku", name: "Claude 3.5 Haiku", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 } }, "qwen3-max-preview": { id: "qwen3-max-preview", name: "Qwen3 Max Preview", description: "Flagship model for demanding analysis, coding, and production agent workflows", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-06", last_updated: "2025-09-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 } }, "qwen3-235b-a22b": { id: "qwen3-235b-a22b", name: "Qwen 3 235B A22B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 } }, "claude-4.1-opus": { id: "claude-4.1-opus", name: "Claude 4.1 Opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-06", last_updated: "2025-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 } }, "claude-4.5-opus": { id: "claude-4.5-opus", name: "Claude 4.5 Opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-11-25", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 200000 } }, "claude-4.5-sonnet": { id: "claude-4.5-sonnet", name: "Claude 4.5 Sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 } }, "qwen3-max": { id: "qwen3-max", name: "Qwen3 Max", description: "Flagship model for demanding analysis, coding, and production agent workflows", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-24", last_updated: "2025-09-24", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 65536 } }, "qwen2.5-vl-7b-instruct": { id: "qwen2.5-vl-7b-instruct", name: "Qwen 2.5 VL 7B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 } }, "doubao-1.5-thinking-pro": { id: "doubao-1.5-thinking-pro", name: "Doubao 1.5 Thinking Pro", description: "Flagship model for demanding analysis, coding, and production agent workflows", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16000 } }, "deepseek-r1-0528": { id: "deepseek-r1-0528", name: "DeepSeek-R1-0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 } }, "claude-4.5-haiku": { id: "claude-4.5-haiku", name: "Claude 4.5 Haiku", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-10-16", last_updated: "2025-10-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 } }, "doubao-seed-1.6": { id: "doubao-seed-1.6", name: "Doubao-Seed 1.6", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-15", last_updated: "2025-08-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 } }, "glm-4.5": { id: "glm-4.5", name: "GLM 4.5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 98304 } }, "deepseek-v3-0324": { id: "deepseek-v3-0324", name: "DeepSeek-V3-0324", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16000 } }, "deepseek-v3": { id: "deepseek-v3", name: "DeepSeek-V3", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-08-13", last_updated: "2025-08-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16000 } }, "qwen3-235b-a22b-instruct-2507": { id: "qwen3-235b-a22b-instruct-2507", name: "Qwen3 235b A22B Instruct 2507", description: "Tool-capable chat model for instruction following and agentic application workflows", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-12", last_updated: "2025-08-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262144, output: 64000 } }, "gemini-2.0-flash": { id: "gemini-2.0-flash", name: "Gemini 2.0 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 8192 } }, "doubao-seed-2.0-mini": { id: "doubao-seed-2.0-mini", name: "Doubao Seed 2.0 Mini", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 } }, "gemini-3.0-pro-image-preview": { id: "gemini-3.0-pro-image-preview", name: "Gemini 3.0 Pro Image Preview", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 32768, output: 8192 } }, "gemini-3.0-pro-preview": { id: "gemini-3.0-pro-preview", name: "Gemini 3.0 Pro Preview", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-11-19", last_updated: "2025-11-19", modalities: { input: ["text", "image", "video", "pdf", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "gpt-oss-120b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-06", last_updated: "2025-08-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 } }, "qwen3-30b-a3b-thinking-2507": { id: "qwen3-30b-a3b-thinking-2507", name: "Qwen3 30b A3b Thinking 2507", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-04", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 126000, output: 32000 } }, "gemini-2.5-flash-image": { id: "gemini-2.5-flash-image", name: "Gemini 2.5 Flash Image", description: "Image model for prompt-driven generation, editing, and visual design workflows", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-10-22", last_updated: "2025-10-22", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 32768, output: 8192 } }, "kling-v2-6": { id: "kling-v2-6", name: "Kling-V2 6", description: "Video model for prompt-guided generation, editing, and motion workflows", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-01-13", last_updated: "2026-01-13", modalities: { input: ["text", "image", "video"], output: ["video"] }, open_weights: false, limit: { context: 99999999, output: 99999999 } }, "deepseek-r1": { id: "deepseek-r1", name: "DeepSeek-R1", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 } }, "qwen-turbo": { id: "qwen-turbo", name: "Qwen-Turbo", description: "Efficient Qwen model for fast chat, extraction, and high-volume workloads", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 4096 } }, "doubao-seed-1.6-thinking": { id: "doubao-seed-1.6-thinking", name: "Doubao-Seed 1.6 Thinking", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-15", last_updated: "2025-08-15", modalities: { input: ["image", "text", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 } }, "kimi-k2": { id: "kimi-k2", name: "Kimi K2", description: "Kimi model for long-context chat, coding, and agentic reasoning", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 } }, "qwen3-30b-a3b-instruct-2507": { id: "qwen3-30b-a3b-instruct-2507", name: "Qwen3 30b A3b Instruct 2507", description: "Tool-capable chat model for instruction following and agentic application workflows", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-04", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 } }, "doubao-seed-1.6-flash": { id: "doubao-seed-1.6-flash", name: "Doubao-Seed 1.6 Flash", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-15", last_updated: "2025-08-15", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 32000 } }, "claude-3.5-sonnet": { id: "claude-3.5-sonnet", name: "Claude 3.5 Sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-09", last_updated: "2025-09-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8200 } }, "qwen3.5-397b-a17b": { id: "qwen3.5-397b-a17b", name: "Qwen3.5 397B A17B", description: "Multimodal reasoning model for visual analysis, planning, and tool use", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-22", last_updated: "2026-02-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 64000 } }, "gemini-2.5-flash-lite": { id: "gemini-2.5-flash-lite", name: "Gemini 2.5 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 64000 } }, "claude-4.0-sonnet": { id: "claude-4.0-sonnet", name: "Claude 4.0 Sonnet", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 } }, "gemini-2.0-flash-lite": { id: "gemini-2.0-flash-lite", name: "Gemini 2.0 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 8192 } }, "claude-4.0-opus": { id: "claude-4.0-opus", name: "Claude 4.0 Opus", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 } }, "qwen3-next-80b-a3b-instruct": { id: "qwen3-next-80b-a3b-instruct", name: "Qwen3 Next 80B A3B Instruct", description: "Tool-capable chat model for instruction following and agentic application workflows", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-12", last_updated: "2025-09-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 32768 } }, "qwen2.5-vl-72b-instruct": { id: "qwen2.5-vl-72b-instruct", name: "Qwen 2.5 VL 72B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 } }, "meituan/longcat-flash-lite": { id: "meituan/longcat-flash-lite", name: "Meituan/Longcat-Flash-Lite", description: "Efficient model for low-latency assistance, extraction, and routine automation", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-06", last_updated: "2026-02-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 320000 } }, "meituan/longcat-flash-chat": { id: "meituan/longcat-flash-chat", name: "Meituan/Longcat-Flash-Chat", description: "Efficient model for low-latency assistance, extraction, and routine automation", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2025-11-05", last_updated: "2025-11-05", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 } }, "minimax/minimax-m2.5-highspeed": { id: "minimax/minimax-m2.5-highspeed", name: "Minimax/Minimax-M2.5 Highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-14", last_updated: "2026-02-14", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 128000 } }, "minimax/minimax-m2.5": { id: "minimax/minimax-m2.5", name: "Minimax/Minimax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 128000 } }, "minimax/minimax-m2": { id: "minimax/minimax-m2", name: "Minimax/Minimax-M2", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-10-28", last_updated: "2025-10-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 } }, "minimax/minimax-m2.1": { id: "minimax/minimax-m2.1", name: "Minimax/Minimax-M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 204800, output: 128000 } }, "deepseek/deepseek-v3.2-exp": { id: "deepseek/deepseek-v3.2-exp", name: "DeepSeek/DeepSeek-V3.2-Exp", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 } }, "deepseek/deepseek-math-v2": { id: "deepseek/deepseek-math-v2", name: "Deepseek/Deepseek-Math-V2", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-12-04", last_updated: "2025-12-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 160000, output: 160000 } }, "deepseek/deepseek-v3.2-251201": { id: "deepseek/deepseek-v3.2-251201", name: "Deepseek/DeepSeek-V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 } }, "deepseek/deepseek-v3.2-exp-thinking": { id: "deepseek/deepseek-v3.2-exp-thinking", name: "DeepSeek/DeepSeek-V3.2-Exp-Thinking", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 } }, "deepseek/deepseek-v3.1-terminus-thinking": { id: "deepseek/deepseek-v3.1-terminus-thinking", name: "DeepSeek/DeepSeek-V3.1-Terminus-Thinking", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2025-09-22", last_updated: "2025-09-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 } }, "deepseek/deepseek-v3.1-terminus": { id: "deepseek/deepseek-v3.1-terminus", name: "DeepSeek/DeepSeek-V3.1-Terminus", description: "DeepSeek chat model for instruction following, coding, and analysis", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-22", last_updated: "2025-09-22", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32000 } }, "x-ai/grok-4.1-fast-reasoning": { id: "x-ai/grok-4.1-fast-reasoning", name: "X-Ai/Grok 4.1 Fast Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-19", last_updated: "2025-12-19", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 20000000, output: 2000000 } }, "x-ai/grok-4-fast-reasoning": { id: "x-ai/grok-4-fast-reasoning", name: "X-Ai/Grok-4-Fast-Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-18", last_updated: "2025-12-18", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 } }, "x-ai/grok-4.1-fast": { id: "x-ai/grok-4.1-fast", name: "x-AI/Grok-4.1-Fast", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-11-20", last_updated: "2025-11-20", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 } }, "x-ai/grok-4-fast": { id: "x-ai/grok-4-fast", name: "x-AI/Grok-4-Fast", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-20", last_updated: "2025-09-20", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 } }, "x-ai/grok-code-fast-1": { id: "x-ai/grok-code-fast-1", name: "x-AI/Grok-Code-Fast 1", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-02", last_updated: "2025-09-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 1e4 } }, "x-ai/grok-4-fast-non-reasoning": { id: "x-ai/grok-4-fast-non-reasoning", name: "X-Ai/Grok-4-Fast-Non-Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-18", last_updated: "2025-12-18", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 } }, "x-ai/grok-4.1-fast-non-reasoning": { id: "x-ai/grok-4.1-fast-non-reasoning", name: "X-Ai/Grok 4.1 Fast Non Reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-19", last_updated: "2025-12-19", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 } }, "xiaomi/mimo-v2-flash": { id: "xiaomi/mimo-v2-flash", name: "Xiaomi/Mimo-V2-Flash", description: "MiMo flash model for fast multimodal assistance and agent workflows", family: "mimo", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12-01", release_date: "2025-12-16", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.1, output: 0.3, cache_read: 0.01 } }, "stepfun-ai/gelab-zero-4b-preview": { id: "stepfun-ai/gelab-zero-4b-preview", name: "Stepfun-Ai/Gelab Zero 4b Preview", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 4096 } }, "z-ai/glm-5": { id: "z-ai/glm-5", name: "Z-Ai/GLM 5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 } }, "z-ai/glm-4.6": { id: "z-ai/glm-4.6", name: "Z-AI/GLM 4.6", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-10-11", last_updated: "2025-10-11", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 200000 } }, "z-ai/autoglm-phone-9b": { id: "z-ai/autoglm-phone-9b", name: "Z-Ai/Autoglm Phone 9b", description: "GLM vision model for visual reasoning, documents, and multimodal agents", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 12800, output: 4096 } }, "z-ai/glm-4.7": { id: "z-ai/glm-4.7", name: "Z-Ai/GLM 4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 200000 } }, "moonshotai/kimi-k2.5": { id: "moonshotai/kimi-k2.5", name: "Moonshotai/Kimi-K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2026-01-28", last_updated: "2026-01-28", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 } }, "moonshotai/kimi-k2-thinking": { id: "moonshotai/kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-11-07", last_updated: "2025-11-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 1e5 } }, "moonshotai/kimi-k2-0905": { id: "moonshotai/kimi-k2-0905", name: "Kimi K2 0905", description: "Kimi model for long-context chat, coding, and agentic reasoning", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-08", last_updated: "2025-09-08", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 1e5 } }, "openai/gpt-5": { id: "openai/gpt-5", name: "OpenAI/GPT-5", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", attachment: false, reasoning: false, tool_call: true, structured_output: false, temperature: true, release_date: "2025-09-19", last_updated: "2025-09-19", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "OpenAI/GPT-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 } }, "stepfun/step-3.5-flash": { id: "stepfun/step-3.5-flash", name: "Stepfun/Step-3.5 Flash", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: true, reasoning: false, tool_call: false, structured_output: false, temperature: true, release_date: "2026-02-02", last_updated: "2026-02-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 64000, output: 4096 } } } }, longcat: { id: "longcat", env: ["LONGCAT_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.longcat.chat/openai", name: "LongCat", doc: "https://longcat.chat/platform/docs/", models: { "LongCat-2.0": { id: "LongCat-2.0", name: "LongCat-2.0", description: "Meituan LongCat-2.0, a reasoning model with tool calling and a 1M-token context window", family: "longcat", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 131072 }, cost: { input: 0.75, output: 2.95, cache_read: 0.015 } } } }, "ollama-cloud": { id: "ollama-cloud", env: ["OLLAMA_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://ollama.com/v1", name: "Ollama Cloud", doc: "https://docs.ollama.com/cloud", models: { "glm-5.1": { id: "glm-5.1", name: "glm-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, release_date: "2026-03-27", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 } }, "nemotron-3-super": { id: "nemotron-3-super", name: "nemotron-3-super", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-03-11", last_updated: "2026-03-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 } }, "deepseek-v4-flash": { id: "deepseek-v4-flash", name: "deepseek-v4-flash", description: "Fast DeepSeek model for efficient chat, coding help, and agent loops", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "kimi-k2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 } }, "minimax-m2.7": { id: "minimax-m2.7", name: "minimax-m2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 196608 } }, "nemotron-3-nano:30b": { id: "nemotron-3-nano:30b", name: "nemotron-3-nano:30b", description: "Small Nemotron 3 MoE for efficient coding, math, and long-context agents", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2025-12-15", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 } }, "mistral-large-3:675b": { id: "mistral-large-3:675b", name: "mistral-large-3:675b", description: "Flagship Mistral model for advanced reasoning, coding, and multilingual work", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, release_date: "2025-12-02", last_updated: "2026-01-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 976000, output: 131072 } }, "nemotron-3-ultra": { id: "nemotron-3-ultra", name: "nemotron-3-ultra", description: "Largest Nemotron 3 model for maximum open-weight reasoning and agent accuracy", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-06-04", last_updated: "2026-06-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 128000 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "kimi-k2.6", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, release_date: "2026-04-20", last_updated: "2026-04-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 } }, "qwen3.5:397b": { id: "qwen3.5:397b", name: "qwen3.5:397b", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_details" }, release_date: "2026-02-15", last_updated: "2026-02-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 } }, "minimax-m3": { id: "minimax-m3", name: "minimax-m3", description: "MiniMax multimodal coding model for long-context reasoning and agent tasks", family: "minimax-m3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-31", last_updated: "2026-05-31", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 512000, output: 131072 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "deepseek-v4-pro", description: "Flagship DeepSeek model for coding, reasoning, and agentic work", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 } }, "gpt-oss:120b": { id: "gpt-oss:120b", name: "gpt-oss:120b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, release_date: "2025-08-05", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 } }, "deepseek-v4-flash:0731": { id: "deepseek-v4-flash:0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["high", "max"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 } }, "gemma4:31b": { id: "gemma4:31b", name: "gemma4:31b", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, knowledge: "2025-01", release_date: "2026-04-02", last_updated: "2026-04-08", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 } }, "minimax-m2.5": { id: "minimax-m2.5", name: "minimax-m2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, knowledge: "2025-01", release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "kimi-k2.7-code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 } }, "kimi-k3": { id: "kimi-k3", name: "kimi-k3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 } }, "gpt-oss:20b": { id: "gpt-oss:20b", name: "gpt-oss:20b", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, release_date: "2025-08-05", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 } } } }, jiekou: { id: "jiekou", env: ["JIEKOU_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.jiekou.ai/openai", name: "Jiekou.AI", doc: "https://docs.jiekou.ai/docs/support/quickstart?utm_source=github_models.dev", models: { "gpt-5.1-codex-mini": { id: "gpt-5.1-codex-mini", name: "gpt-5.1-codex-mini", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.225, output: 1.8 } }, "gpt-5.2-pro": { id: "gpt-5.2-pro", name: "gpt-5.2-pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 18.9, output: 151.2 } }, "gemini-2.5-flash-lite-preview-06-17": { id: "gemini-2.5-flash-lite-preview-06-17", name: "gemini-2.5-flash-lite-preview-06-17", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "video", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.09, output: 0.36 } }, "grok-4-fast-reasoning": { id: "grok-4-fast-reasoning", name: "grok-4-fast-reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 0.18, output: 0.45 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "gemini-2.5-flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.27, output: 2.25 } }, "grok-4-0709": { id: "grok-4-0709", name: "grok-4-0709", description: "Grok model for agentic tool use, reasoning, coding, and live assistance", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 8192 }, cost: { input: 2.7, output: 13.5 } }, "claude-opus-4-6": { id: "claude-opus-4-6", name: "claude-opus-4-6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }, { type: "budget_tokens", min: 1024, max: 127999 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02", last_updated: "2026-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25 } }, "o3-mini": { id: "o3-mini", name: "o3-mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 1.1, output: 4.4 } }, "grok-code-fast-1": { id: "grok-code-fast-1", name: "grok-code-fast-1", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.18, output: 1.35 } }, "gemini-3-flash-preview": { id: "gemini-3-flash-preview", name: "gemini-3-flash-preview", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3 } }, "gpt-5-codex": { id: "gpt-5-codex", name: "gpt-5-codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.125, output: 9 } }, "grok-4-fast-non-reasoning": { id: "grok-4-fast-non-reasoning", name: "grok-4-fast-non-reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 0.18, output: 0.45 } }, "gpt-5-chat-latest": { id: "gpt-5-chat-latest", name: "gpt-5-chat-latest", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.125, output: 9 } }, "grok-4-1-fast-reasoning": { id: "grok-4-1-fast-reasoning", name: "grok-4-1-fast-reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 0.18, output: 0.45 } }, "claude-sonnet-4-5-20250929": { id: "claude-sonnet-4-5-20250929", name: "claude-sonnet-4-5-20250929", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 2.7, output: 13.5 } }, "gpt-5.2-codex": { id: "gpt-5.2-codex", name: "gpt-5.2-codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.75, output: 14 } }, "claude-opus-4-5-20251101": { id: "claude-opus-4-5-20251101", name: "claude-opus-4-5-20251101", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 65536 }, cost: { input: 4.5, output: 22.5 } }, "gpt-5-pro": { id: "gpt-5-pro", name: "gpt-5-pro", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 272000 }, cost: { input: 13.5, output: 108 } }, "gpt-5.2": { id: "gpt-5.2", name: "gpt-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.575, output: 12.6 } }, "gemini-2.5-pro-preview-06-05": { id: "gemini-2.5-pro-preview-06-05", name: "gemini-2.5-pro-preview-06-05", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 200000 }, cost: { input: 1.125, output: 9 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "gpt-5-mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.225, output: 1.8 } }, "claude-haiku-4-5-20251001": { id: "claude-haiku-4-5-20251001", name: "claude-haiku-4-5-20251001", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 20000, output: 64000 }, cost: { input: 0.9, output: 4.5 } }, "gemini-2.5-flash-preview-05-20": { id: "gemini-2.5-flash-preview-05-20", name: "gemini-2.5-flash-preview-05-20", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 200000 }, cost: { input: 0.135, output: 3.15 } }, "gemini-2.5-flash-lite-preview-09-2025": { id: "gemini-2.5-flash-lite-preview-09-2025", name: "gemini-2.5-flash-lite-preview-09-2025", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.09, output: 0.36 } }, "gpt-5.1": { id: "gpt-5.1", name: "gpt-5.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02", last_updated: "2026-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.125, output: 9 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "gemini-2.5-pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 1.125, output: 9 } }, "grok-4-1-fast-non-reasoning": { id: "grok-4-1-fast-non-reasoning", name: "grok-4-1-fast-non-reasoning", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 2000000 }, cost: { input: 0.18, output: 0.45 } }, "gpt-5.1-codex": { id: "gpt-5.1-codex", name: "gpt-5.1-codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.125, output: 9 } }, "gpt-5-nano": { id: "gpt-5-nano", name: "gpt-5-nano", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 0.045, output: 0.36 } }, "gemini-3-pro-preview": { id: "gemini-3-pro-preview", name: "gemini-3-pro-preview", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.8, output: 10.8 } }, "gemini-2.5-flash-lite": { id: "gemini-2.5-flash-lite", name: "gemini-2.5-flash-lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 0.09, output: 0.36 } }, "claude-sonnet-4-20250514": { id: "claude-sonnet-4-20250514", name: "claude-sonnet-4-20250514", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 2.7, output: 13.5 } }, o3: { id: "o3", name: "o3", description: "O-series reasoning model for hard analysis, math, coding, and planning", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131072, output: 131072 }, cost: { input: 10, output: 40 } }, "o4-mini": { id: "o4-mini", name: "o4-mini", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 1.1, output: 4.4 } }, "claude-opus-4-20250514": { id: "claude-opus-4-20250514", name: "claude-opus-4-20250514", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 13.5, output: 67.5 } }, "gpt-5.1-codex-max": { id: "gpt-5.1-codex-max", name: "gpt-5.1-codex-max", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, output: 128000 }, cost: { input: 1.125, output: 9 } }, "claude-opus-4-1-20250805": { id: "claude-opus-4-1-20250805", name: "claude-opus-4-1-20250805", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 13.5, output: 67.5 } }, "zai-org/glm-4.7-flash": { id: "zai-org/glm-4.7-flash", name: "GLM-4.7-Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 128000 }, cost: { input: 0.07, output: 0.4 } }, "zai-org/glm-4.5": { id: "zai-org/glm-4.5", name: "GLM-4.5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.6, output: 2.2 } }, "zai-org/glm-4.5v": { id: "zai-org/glm-4.5v", name: "GLM 4.5V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glmv", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 16384 }, cost: { input: 0.6, output: 1.8 } }, "zai-org/glm-4.7": { id: "zai-org/glm-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2 } }, "qwen/qwen3-coder-480b-a35b-instruct": { id: "qwen/qwen3-coder-480b-a35b-instruct", name: "Qwen3 Coder 480B A35B Instruct", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.29, output: 1.2 } }, "qwen/qwen3-235b-a22b-thinking-2507": { id: "qwen/qwen3-235b-a22b-thinking-2507", name: "Qwen3 235B A22b Thinking 2507", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.3, output: 3 } }, "qwen/qwen3-next-80b-a3b-thinking": { id: "qwen/qwen3-next-80b-a3b-thinking", name: "Qwen3 Next 80B A3B Thinking", description: "Qwen reasoning model for deliberate problem solving, math, and coding", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 0.15, output: 1.5 } }, "qwen/qwen3-32b-fp8": { id: "qwen/qwen3-32b-fp8", name: "Qwen3 32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 20000 }, cost: { input: 0.1, output: 0.45 } }, "qwen/qwen3-30b-a3b-fp8": { id: "qwen/qwen3-30b-a3b-fp8", name: "Qwen3 30B A3B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 20000 }, cost: { input: 0.09, output: 0.45 } }, "qwen/qwen3-235b-a22b-fp8": { id: "qwen/qwen3-235b-a22b-fp8", name: "Qwen3 235B A22B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: false, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40960, output: 20000 }, cost: { input: 0.2, output: 0.8 } }, "qwen/qwen3-235b-a22b-instruct-2507": { id: "qwen/qwen3-235b-a22b-instruct-2507", name: "Qwen3 235B A22B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.15, output: 0.8 } }, "qwen/qwen3-coder-next": { id: "qwen/qwen3-coder-next", name: "qwen/qwen3-coder-next", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-02", last_updated: "2026-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0.2, output: 1.5 } }, "qwen/qwen3-next-80b-a3b-instruct": { id: "qwen/qwen3-next-80b-a3b-instruct", name: "Qwen3 Next 80B A3B Instruct", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 0.15, output: 1.5 } }, "xiaomimimo/mimo-v2-flash": { id: "xiaomimimo/mimo-v2-flash", name: "XiaomiMiMo/MiMo-V2-Flash", description: "MiMo flash model for fast multimodal assistance and agent workflows", family: "mimo", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 131072 }, cost: { input: 0, output: 0 } }, "minimax/minimax-m2.1": { id: "minimax/minimax-m2.1", name: "Minimax M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 131071 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "deepseek/deepseek-v3.1": { id: "deepseek/deepseek-v3.1", name: "DeepSeek V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 32767 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 32768 }, cost: { input: 0.27, output: 1 } }, "deepseek/deepseek-r1-0528": { id: "deepseek/deepseek-r1-0528", name: "DeepSeek R1 0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 32768 }, cost: { input: 0.7, output: 2.5 } }, "deepseek/deepseek-v3-0324": { id: "deepseek/deepseek-v3-0324", name: "DeepSeek V3 0324", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 163840 }, cost: { input: 0.28, output: 1.14 } }, "moonshotai/kimi-k2.5": { id: "moonshotai/kimi-k2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024, max: 262143 }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3 } }, "moonshotai/kimi-k2-instruct": { id: "moonshotai/kimi-k2-instruct", name: "Kimi K2 Instruct", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 }, cost: { input: 0.57, output: 2.3 } }, "moonshotai/kimi-k2-0905": { id: "moonshotai/kimi-k2-0905", name: "Kimi K2 0905", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 2.5 } }, "baidu/ernie-4.5-vl-424b-a47b": { id: "baidu/ernie-4.5-vl-424b-a47b", name: "ERNIE 4.5 VL 424B A47B", description: "Multimodal reasoning model for visual analysis, planning, and tool use", family: "ernie", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 123000, output: 16000 }, cost: { input: 0.42, output: 1.25 } }, "baidu/ernie-4.5-300b-a47b-paddle": { id: "baidu/ernie-4.5-300b-a47b-paddle", name: "ERNIE 4.5 300B A47B", description: "Open-weight instruction model for adaptable chat and self-hosted production workloads", family: "ernie", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 123000, output: 12000 }, cost: { input: 0.28, output: 1.1 } }, "minimaxai/minimax-m1-80k": { id: "minimaxai/minimax-m1-80k", name: "MiniMax M1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: true, release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 40000 }, cost: { input: 0.55, output: 2.2 } } } }, perplexity: { id: "perplexity", env: ["PERPLEXITY_API_KEY"], npm: "@ai-sdk/perplexity", name: "Perplexity", doc: "https://docs.perplexity.ai", models: { "sonar-deep-research": { id: "sonar-deep-research", name: "Perplexity Sonar Deep Research", description: "Sonar search model for current answers, retrieval, and citation-backed chat", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: false, temperature: false, knowledge: "2025-01", release_date: "2025-02-01", last_updated: "2025-09-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 32768 }, cost: { input: 2, output: 8, reasoning: 3 } }, sonar: { id: "sonar", name: "Sonar", description: "Fast web-grounded Sonar for current answers, citations, and lightweight retrieval", family: "sonar", attachment: false, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 1, output: 1 } }, "sonar-pro": { id: "sonar-pro", name: "Sonar Pro", description: "Deeper Sonar search model with broader retrieval and stronger synthesis", family: "sonar-pro", attachment: true, reasoning: false, tool_call: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 8192 }, cost: { input: 3, output: 15 } }, "sonar-reasoning-pro": { id: "sonar-reasoning-pro", name: "Sonar Reasoning Pro", description: "Web-grounded Sonar for multi-step research questions that need cited reasoning", family: "sonar-reasoning", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: false, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, cost: { input: 2, output: 8 } } } }, "perplexity-agent": { id: "perplexity-agent", env: ["PERPLEXITY_API_KEY"], npm: "@ai-sdk/openai", api: "https://api.perplexity.ai/v1", name: "Perplexity Agent", doc: "https://docs.perplexity.ai/docs/agent-api/models", models: { "nvidia/nemotron-3-super-120b-a12b": { id: "nvidia/nemotron-3-super-120b-a12b", name: "Nemotron 3 Super 120B", description: "Nemotron middle tier for collaborative agents and high-volume reasoning workloads", family: "nemotron", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2026-02", release_date: "2026-03-11", last_updated: "2026-03-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 32000 }, cost: { input: 0.25, output: 2.5 } }, "google/gemini-2.5-flash": { id: "google/gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-03-20", last_updated: "2025-06-05", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03 } }, "google/gemini-3-flash-preview": { id: "google/gemini-3-flash-preview", name: "Gemini 3 Flash Preview", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, tiers: [{ input: 0.5, output: 3, cache_read: 0.05, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 0.5, output: 3, cache_read: 0.05 } } }, "google/gemini-3.1-pro-preview": { id: "google/gemini-3.1-pro-preview", name: "Gemini 3.1 Pro Preview", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "google/gemini-2.5-pro": { id: "google/gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2025-01", release_date: "2025-03-20", last_updated: "2025-06-05", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "moonshot-ai/kimi-k2.7-code": { id: "moonshot-ai/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-07-30", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "moonshot-ai/kimi-k3": { id: "moonshot-ai/kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-30", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "xai/grok-4-1-fast-non-reasoning": { id: "xai/grok-4-1-fast-non-reasoning", name: "Grok 4.1 Fast (Non-Reasoning)", description: "Fast Grok model for responsive chat, reasoning, and tool-assisted work", family: "grok", attachment: true, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-07", release_date: "2025-11-19", last_updated: "2025-11-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 2000000, output: 30000 }, cost: { input: 0.2, output: 0.5, cache_read: 0.05 } }, "anthropic/claude-sonnet-4-6": { id: "anthropic/claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-02-17", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "anthropic/claude-haiku-4-5": { id: "anthropic/claude-haiku-4-5", name: "Claude Haiku 4.5", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1 } }, "anthropic/claude-opus-4-6": { id: "anthropic/claude-opus-4-6", name: "Claude Opus 4.6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "anthropic/claude-sonnet-4-5": { id: "anthropic/claude-sonnet-4-5", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3 } }, "anthropic/claude-opus-4-7": { id: "anthropic/claude-opus-4-7", name: "Claude Opus 4.7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "anthropic/claude-opus-4-5": { id: "anthropic/claude-opus-4-5", name: "Claude Opus 4.5", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "perplexity/sonar": { id: "perplexity/sonar", name: "Sonar", description: "Sonar search model for current answers, retrieval, and citation-backed chat", family: "sonar", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2025-09-01", release_date: "2024-01-01", last_updated: "2025-09-01", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 8192 }, cost: { input: 0.25, output: 2.5, cache_read: 0.0625 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5 } }, "openai/gpt-5.4": { id: "openai/gpt-5.4", name: "GPT-5.4", description: "Frontier GPT model for professional reasoning, coding, and multimodal work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25 } }, "openai/gpt-5.2": { id: "openai/gpt-5.2", name: "GPT-5.2", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "openai/gpt-5-mini": { id: "openai/gpt-5-mini", name: "GPT-5 Mini", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "openai/gpt-5.1": { id: "openai/gpt-5.1", name: "GPT-5.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } } } }, moonshotai: { id: "moonshotai", env: ["MOONSHOT_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.moonshot.ai/v1", name: "Moonshot AI", doc: "https://platform.moonshot.ai/docs/api/chat", models: { "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "kimi-k2-thinking-turbo": { id: "kimi-k2-thinking-turbo", name: "Kimi K2 Thinking Turbo", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-08", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.15, output: 8, cache_read: 0.15 } }, "kimi-k2-0711-preview": { id: "kimi-k2-0711-preview", name: "Kimi K2 0711", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-07-14", last_updated: "2025-07-14", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "kimi-k2.7-code-highspeed": { id: "kimi-k2.7-code-highspeed", name: "Kimi K2.7 Code HighSpeed", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 1.9, output: 8, cache_read: 0.38 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.16 } }, "kimi-k2-turbo-preview": { id: "kimi-k2-turbo-preview", name: "Kimi K2 Turbo", description: "Fast Kimi model for responsive chat, coding help, and agent loops", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 2.4, output: 10, cache_read: 0.6 } }, "kimi-k2-0905-preview": { id: "kimi-k2-0905-preview", name: "Kimi K2 0905", description: "Kimi model for long-context chat, coding, and agentic reasoning", family: "kimi-k2", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-10", release_date: "2025-09-05", last_updated: "2025-09-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "kimi-k2-thinking": { id: "kimi-k2-thinking", name: "Kimi K2 Thinking", description: "Thinking Kimi model for slower research passes, planning, and hard technical questions", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-08", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 2.5, cache_read: 0.15 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }, { type: "effort", values: ["low", "high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 3, output: 15, cache_read: 0.3 } } } }, openai: { id: "openai", env: ["OPENAI_API_KEY"], npm: "@ai-sdk/openai", name: "OpenAI", doc: "https://platform.openai.com/docs/models", models: { "gpt-image-2": { id: "gpt-image-2", name: "gpt-image-2", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 0, input: 0, output: 0 }, cost: { input: 5, output: 30, cache_read: 1.25 } }, "gpt-5.2-pro": { id: "gpt-5.2-pro", name: "GPT-5.2 Pro", description: "Higher-accuracy GPT-5.2 variant for tougher reasoning and review workflows", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 21, output: 168 } }, "gpt-5.5-pro": { id: "gpt-5.5-pro", name: "GPT-5.5 Pro", description: "Highest-accuracy GPT-5.5 tier for slower, precision-heavy reasoning and coding", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "gpt-4.1-mini": { id: "gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 0.4, output: 1.6, cache_read: 0.1 } }, "gpt-4o": { id: "gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "gpt-5.3-codex-spark": { id: "gpt-5.3-codex-spark", name: "GPT-5.3 Codex Spark", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex-spark", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, input: 1e5, output: 32000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5.4-pro": { id: "gpt-5.4-pro", name: "GPT-5.4 Pro", description: "More exact GPT-5.4 tier for demanding professional reasoning and agent tasks", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 30, output: 180, tiers: [{ input: 60, output: 270, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 60, output: 270 } } }, "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 10, output: 60, cache_read: 1, cache_write: 12.5 }, provider: { body: { service_tier: "priority" } } }, pro: { provider: { body: { reasoning: { mode: "pro" } } } } } }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 45, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1, cache_write: 12.5 } } }, "text-embedding-ada-002": { id: "text-embedding-ada-002", name: "text-embedding-ada-002", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2022-12", release_date: "2022-12-15", last_updated: "2022-12-15", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 1536 }, cost: { input: 0.1, output: 0 } }, "gpt-4.1-nano": { id: "gpt-4.1-nano", name: "GPT-4.1 nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, status: "deprecated", cost: { input: 0.1, output: 0.4, cache_read: 0.025 } }, "gpt-5.2-chat-latest": { id: "gpt-5.2-chat-latest", name: "GPT-5.2 Chat", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["medium"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "o3-mini": { id: "o3-mini", name: "o3-mini", description: "Smaller o-series reasoner for economical coding, math, and planning tasks", family: "o-mini", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2024-12-20", last_updated: "2025-01-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 1.1, output: 4.4, cache_read: 0.55 } }, "gpt-image-1-mini": { id: "gpt-image-1-mini", name: "gpt-image-1-mini", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-09-26", last_updated: "2025-09-26", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 0, input: 0, output: 0 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 12.5, output: 75, cache_read: 1.25 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "o3-pro": { id: "o3-pro", name: "o3-pro", description: "High-effort o3 tier for difficult technical reasoning and careful answers", family: "o-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-06-10", last_updated: "2025-06-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 20, output: 80 } }, "gpt-4o-mini": { id: "gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 0.15, output: 0.6, cache_read: 0.075 } }, "chatgpt-image-latest": { id: "chatgpt-image-latest", name: "chatgpt-image-latest", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-12-16", last_updated: "2025-12-16", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 0, input: 0, output: 0 } }, "gpt-5": { id: "gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "gpt-realtime-2.1": { id: "gpt-realtime-2.1", name: "GPT-Realtime-2.1", description: "Realtime speech-to-speech model with configurable reasoning, tool use, and robust voice-agent behavior", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2024-09-30", release_date: "2026-07-06", last_updated: "2026-07-06", modalities: { input: ["text", "audio", "image"], output: ["text", "audio"] }, open_weights: false, limit: { context: 128000, input: 96000, output: 32000 }, cost: { input: 4, output: 24, cache_read: 0.4, input_audio: 32, output_audio: 64 } }, "gpt-3.5-turbo": { id: "gpt-3.5-turbo", name: "GPT-3.5-turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: true, knowledge: "2021-09-01", release_date: "2023-03-01", last_updated: "2023-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16385, output: 4096 }, status: "deprecated", cost: { input: 0.5, output: 1.5, cache_read: 0 } }, "gpt-4o-2024-05-13": { id: "gpt-4o-2024-05-13", name: "GPT-4o (2024-05-13)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-05-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, status: "deprecated", cost: { input: 5, output: 15 } }, "gpt-4o-2024-11-20": { id: "gpt-4o-2024-11-20", name: "GPT-4o (2024-11-20)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-11-20", last_updated: "2024-11-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 5, output: 30, cache_read: 0.5 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "gpt-5.3-chat-latest": { id: "gpt-5.3-chat-latest", name: "GPT-5.3 Chat (latest)", description: "Chat-tuned GPT model for conversational assistance, writing, and tool workflows", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-image-1.5": { id: "gpt-image-1.5", name: "gpt-image-1.5", description: "Image model for prompt-driven generation, editing, and visual design workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-11-25", last_updated: "2025-11-25", modalities: { input: ["text", "image"], output: ["text", "image"] }, open_weights: false, limit: { context: 0, input: 0, output: 0 } }, "gpt-5.4-nano": { id: "gpt-5.4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "gpt-5-pro": { id: "gpt-5-pro", name: "GPT-5 Pro", description: "Higher-accuracy GPT-5 tier for tough analysis, coding reviews, and planning", family: "gpt-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-10-06", last_updated: "2025-10-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 272000 }, cost: { input: 15, output: 120 } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 1.5, output: 9, cache_read: 0.15 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, o1: { id: "o1", name: "o1", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2023-09", release_date: "2024-12-05", last_updated: "2024-12-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 15, output: 60, cache_read: 7.5 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 0.4, output: 2.4, cache_read: 0.04, cache_write: 0.5 }, provider: { body: { service_tier: "priority" } } }, pro: { provider: { body: { reasoning: { mode: "pro" } } } } } }, cost: { input: 0.2, output: 1.2, cache_read: 0.02, cache_write: 0.25, tiers: [{ input: 0.4, output: 1.8, cache_read: 0.04, cache_write: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 0.4, output: 1.8, cache_read: 0.04, cache_write: 0.5 } } }, "gpt-5.2": { id: "gpt-5.2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5.3-codex": { id: "gpt-5.3-codex", name: "GPT-5.3 Codex", description: "Coding-optimized GPT model for repository edits, reviews, and agentic software work", family: "gpt-codex", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-02-05", last_updated: "2026-02-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } }, "o1-pro": { id: "o1-pro", name: "o1-pro", description: "O-series reasoning model for hard analysis, math, coding, and planning", family: "o-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2023-09", release_date: "2025-03-19", last_updated: "2025-03-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 150, output: 600 } }, "gpt-5.6": { id: "gpt-5.6", name: "GPT-5.6", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 10, output: 60, cache_read: 1, cache_write: 12.5 }, provider: { body: { service_tier: "priority" } } }, pro: { provider: { body: { reasoning: { mode: "pro" } } } } } }, cost: { input: 5, output: 30, cache_read: 0.5, cache_write: 6.25, tiers: [{ input: 10, output: 45, cache_read: 1, cache_write: 12.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1, cache_write: 12.5 } } }, "gpt-5.1": { id: "gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "gpt-4-turbo": { id: "gpt-4-turbo", name: "GPT-4 Turbo", description: "Compact GPT model for low-latency assistance and high-volume workloads", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-12", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 4096 }, status: "deprecated", cost: { input: 10, output: 30 } }, "gpt-4o-2024-08-06": { id: "gpt-4o-2024-08-06", name: "GPT-4o (2024-08-06)", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2024-08-06", last_updated: "2024-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 16384 }, cost: { input: 2.5, output: 10, cache_read: 1.25 } }, "gpt-5-nano": { id: "gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, o3: { id: "o3", name: "o3", description: "Deliberate o-series reasoner for hard math, coding, and multi-step analysis", family: "o", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 4, output: 24, cache_read: 0.4, cache_write: 5 }, provider: { body: { service_tier: "priority" } } }, pro: { provider: { body: { reasoning: { mode: "pro" } } } } } }, cost: { input: 2, output: 12, cache_read: 0.2, cache_write: 2.5, tiers: [{ input: 4, output: 18, cache_read: 0.4, cache_write: 5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4, cache_write: 5 } } }, "gpt-image-1": { id: "gpt-image-1", name: "gpt-image-1", description: "OpenAI image model for production generation, edits, and brand-safe visual workflows", family: "gpt-image", attachment: true, reasoning: false, tool_call: false, temperature: false, release_date: "2025-04-24", last_updated: "2025-04-24", modalities: { input: ["text", "image"], output: ["image"] }, open_weights: false, limit: { context: 0, input: 0, output: 0 }, status: "deprecated" }, "gpt-4.1": { id: "gpt-4.1", name: "GPT-4.1", description: "Long-lived GPT workhorse for coding, instruction following, and production apps", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 32768 }, cost: { input: 2, output: 8, cache_read: 0.5 } }, "o4-mini": { id: "o4-mini", name: "o4-mini", description: "Fast o-series model for compact reasoning, coding, and tool use", family: "o-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05", release_date: "2025-04-16", last_updated: "2025-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 1e5 }, status: "deprecated", cost: { input: 1.1, output: 4.4, cache_read: 0.275 } }, "gpt-4": { id: "gpt-4", name: "GPT-4", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-11", release_date: "2023-11-06", last_updated: "2024-04-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8192, output: 8192 }, status: "deprecated", cost: { input: 30, output: 60 } }, "text-embedding-3-large": { id: "text-embedding-3-large", name: "text-embedding-3-large", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2024-01", release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8191, output: 3072 }, cost: { input: 0.13, output: 0 } }, "text-embedding-3-small": { id: "text-embedding-3-small", name: "text-embedding-3-small", description: "Embedding model for semantic search, retrieval, clustering, and ranking pipelines", family: "text-embedding", attachment: false, reasoning: false, tool_call: false, temperature: false, knowledge: "2024-01", release_date: "2024-01-25", last_updated: "2024-01-25", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 8191, output: 1536 }, cost: { input: 0.02, output: 0 } } } }, xpersona: { id: "xpersona", env: ["XPERSONA_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://www.xpersona.co/v1", name: "Xpersona", doc: "https://www.xpersona.co/docs", models: { "claude-sonnet-4-6": { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 0.9, output: 5.55, reasoning: 5.55, cache_read: 0.09 } }, "xpersona-frieren-coder": { id: "xpersona-frieren-coder", name: "Xpersona Frieren 1", description: "Coding model for repository understanding, refactors, and agentic engineering tasks", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-30", release_date: "2026-05-01", last_updated: "2026-05-25", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 384000 }, cost: { input: 1.5, output: 6, reasoning: 6, cache_read: 0.15 } }, "gemini-3.5-flash": { id: "gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 1.55, output: 12.2, reasoning: 12.2, cache_read: 0.155 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 0.6, output: 3.7, reasoning: 3.7, cache_read: 0.06 } }, "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 372000, output: 128000 }, cost: { input: 1.5, output: 12, reasoning: 12, cache_read: 0.15 } }, "claude-fable-5": { id: "claude-fable-5", name: "Claude Fable 5", description: "Claude model for creative writing, analysis, and controlled agent workflows", family: "claude-fable", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-09", last_updated: "2026-06-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3, output: 18.5, reasoning: 18.5, cache_read: 0.3 } }, "claude-opus-4-8": { id: "claude-opus-4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 128000 }, cost: { input: 1.5, output: 9.25, reasoning: 9.25, cache_read: 0.15 } }, "gpt-5.5": { id: "gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, cost: { input: 1.5, output: 12, reasoning: 12, cache_read: 0.15 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 128000 }, cost: { input: 0.75, output: 6, reasoning: 6, cache_read: 0.075 } }, "xpersona-gpt-5.5": { id: "xpersona-gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-12-30", release_date: "2026-05-29", last_updated: "2026-05-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 3, output: 18, reasoning: 18, cache_read: 0.3 } }, "gpt-5.4-mini": { id: "gpt-5.4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 272000, output: 128000 }, cost: { input: 0.375, output: 4, reasoning: 4, cache_read: 0.0375 } }, "gpt-5.6": { id: "gpt-5.6", name: "GPT-5.6", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 372000, output: 128000 }, cost: { input: 1.5, output: 12, reasoning: 12, cache_read: 0.15 } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "xhigh", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 372000, output: 128000 }, cost: { input: 1.5, output: 2, reasoning: 2, cache_read: 0.15 } } } }, sarvam: { id: "sarvam", env: ["SARVAM_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.sarvam.ai/v1", name: "Sarvam AI", doc: "https://docs.sarvam.ai/api-reference-docs/getting-started/models", models: { "sarvam-30b": { id: "sarvam-30b", name: "Sarvam-30B", description: "Efficient Indian-language reasoning model for chat, coding, and multilingual work", family: "sarvam", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: [null, "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-18", last_updated: "2026-03-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 } }, "sarvam-105b": { id: "sarvam-105b", name: "Sarvam-105B", description: "Flagship Indian-language reasoning model for enterprise multilingual applications", family: "sarvam", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: [null, "low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-18", last_updated: "2026-03-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 131072 } } } }, zai: { id: "zai", env: ["ZHIPU_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.z.ai/api/paas/v4", name: "Z.AI", doc: "https://docs.z.ai/guides/overview/pricing", models: { "glm-4.6v": { id: "glm-4.6v", name: "GLM-4.6V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-08", last_updated: "2025-12-08", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 32768 }, cost: { input: 0.3, output: 0.9 } }, "glm-5": { id: "glm-5", name: "GLM-5", description: "General GLM flagship for coding, analysis, and tool-heavy engineering workflows", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 1, output: 3.2, cache_read: 0.2, cache_write: 0 } }, "glm-4.5-air": { id: "glm-4.5-air", name: "GLM-4.5-Air", description: "Lighter GLM-4.5 variant for fast coding assistance and cheaper agents", family: "glm-air", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.2, output: 1.1, cache_read: 0.03, cache_write: 0 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26, cache_write: 0 } }, "glm-4.7-flash": { id: "glm-4.7-flash", name: "GLM-4.7-Flash", description: "Budget GLM lane for fast coding help, routing, and everyday automation", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26, cache_write: 0 } }, "glm-4.7-flashx": { id: "glm-4.7-flashx", name: "GLM-4.7-FlashX", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0.07, output: 0.4, cache_read: 0.01, cache_write: 0 } }, "glm-4.6": { id: "glm-4.6", name: "GLM-4.6", description: "Late GLM-4 workhorse for coding agents, reasoning, and structured tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "glm-4.5": { id: "glm-4.5", name: "GLM-4.5", description: "Hybrid-reasoning GLM release that made the 4.5 line broadly useful", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "glm-4.5v": { id: "glm-4.5v", name: "GLM-4.5V", description: "GLM vision model for visual reasoning, documents, and multimodal agents", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-08-11", last_updated: "2025-08-11", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 64000, output: 16384 }, cost: { input: 0.6, output: 1.8 } }, "glm-4.7": { id: "glm-4.7", name: "GLM-4.7", description: "Mature GLM model for dependable coding, reasoning, and structured agent tasks", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.2, cache_read: 0.11, cache_write: 0 } }, "glm-5-turbo": { id: "glm-5-turbo", name: "GLM-5-Turbo", description: "Faster GLM-5 lane for coding agents that need lower latency", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24, cache_write: 0 } }, "glm-5v-turbo": { id: "glm-5v-turbo", name: "GLM-5V-Turbo", description: "Fast GLM vision model for screenshots, documents, and multimodal agent tasks", family: "glm", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 131072 }, cost: { input: 1.2, output: 4, cache_read: 0.24, cache_write: 0 } }, "glm-4.5-flash": { id: "glm-4.5-flash", name: "GLM-4.5-Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 98304 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } }, inferx: { id: "inferx", env: ["INFERX_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://model.inferx.net/endpoints/v1", name: "InferX", doc: "https://model.inferx.net/endpoints", models: { "qwen3-coder-next-fp8-1m": { id: "qwen3-coder-next-fp8-1m", name: "Qwen3 Coder Next FP8 1M", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-03", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1024000, output: 65536 }, cost: { input: 0, output: 0 } }, "qwen3-coder-next-fp8": { id: "qwen3-coder-next-fp8", name: "Qwen3 Coder Next FP8", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-02-03", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256144, output: 65536 }, cost: { input: 0, output: 0 } }, "google/gemma-4-31b-it-fp8": { id: "google/gemma-4-31b-it-fp8", name: "Gemma 4 31B IT FP8", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32768 }, cost: { input: 0, output: 0 } }, "qwen/qwen3.6-35b-a3b-fp8": { id: "qwen/qwen3.6-35b-a3b-fp8", name: "Qwen3.6 35B A3B FP8", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 65536 }, cost: { input: 0, output: 0 } }, "qwen/qwen3.5-122b-a10b-nvfp4": { id: "qwen/qwen3.5-122b-a10b-nvfp4", name: "Qwen3.5 122B A10B NVFP4", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 256144, output: 65536 }, cost: { input: 0, output: 0 } }, "qwen/qwen3.6-27b-fp8": { id: "qwen/qwen3.6-27b-fp8", name: "Qwen3.6 27B FP8", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "video", "audio"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 65536 }, cost: { input: 0, output: 0 } } } }, meganova: { id: "meganova", env: ["MEGANOVA_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.meganova.ai/v1", name: "Meganova", doc: "https://docs.meganova.ai", models: { "zai-org/GLM-5": { id: "zai-org/GLM-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-11", last_updated: "2026-02-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 0.8, output: 2.56 } }, "zai-org/GLM-4.6": { id: "zai-org/GLM-4.6", name: "GLM-4.6", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-09-30", last_updated: "2025-09-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 0.45, output: 1.9 } }, "zai-org/GLM-4.7": { id: "zai-org/GLM-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 131072 }, cost: { input: 0.2, output: 0.8 } }, "mistralai/Mistral-Nemo-Instruct-2407": { id: "mistralai/Mistral-Nemo-Instruct-2407", name: "Mistral Nemo Instruct 2407", description: "Mistral model for multilingual chat, reasoning, and tool-assisted workflows", family: "mistral", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 65536 }, cost: { input: 0.02, output: 0.04 } }, "mistralai/Mistral-Small-3.2-24B-Instruct-2506": { id: "mistralai/Mistral-Small-3.2-24B-Instruct-2506", name: "Mistral Small 3.2 24B Instruct", description: "Efficient Mistral model for fast chat, extraction, and production assistants", family: "mistral-small", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-10", release_date: "2025-06-20", last_updated: "2025-06-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 32768, output: 8192 }, cost: { input: 0, output: 0 } }, "Qwen/Qwen3-235B-A22B-Instruct-2507": { id: "Qwen/Qwen3-235B-A22B-Instruct-2507", name: "Qwen3 235B A22B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-23", last_updated: "2025-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.09, output: 0.6 } }, "Qwen/Qwen2.5-VL-32B-Instruct": { id: "Qwen/Qwen2.5-VL-32B-Instruct", name: "Qwen2.5 VL 32B Instruct", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-03-24", last_updated: "2025-03-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 16384, output: 16384 }, cost: { input: 0.2, output: 0.6 } }, "Qwen/Qwen3.5-Plus": { id: "Qwen/Qwen3.5-Plus", name: "Qwen3.5 Plus", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-04", release_date: "2026-02", last_updated: "2026-02", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 65536 }, cost: { input: 0.4, output: 2.4, reasoning: 2.4 } }, "MiniMaxAI/MiniMax-M2.1": { id: "MiniMaxAI/MiniMax-M2.1", name: "MiniMax M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 131072 }, cost: { input: 0.28, output: 1.2 } }, "MiniMaxAI/MiniMax-M2.5": { id: "MiniMaxAI/MiniMax-M2.5", name: "MiniMax M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2 } }, "deepseek-ai/DeepSeek-R1-0528": { id: "deepseek-ai/DeepSeek-R1-0528", name: "DeepSeek R1 0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-07", release_date: "2025-05-28", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 64000 }, cost: { input: 0.5, output: 2.15 } }, "deepseek-ai/DeepSeek-V3-0324": { id: "deepseek-ai/DeepSeek-V3-0324", name: "DeepSeek V3 0324", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2025-03-24", last_updated: "2025-03-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 163840 }, cost: { input: 0.25, output: 0.88 } }, "deepseek-ai/DeepSeek-V3.2": { id: "deepseek-ai/DeepSeek-V3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-12-03", last_updated: "2025-12-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 164000, output: 164000 }, cost: { input: 0.26, output: 0.38 } }, "deepseek-ai/DeepSeek-V3.2-Exp": { id: "deepseek-ai/DeepSeek-V3.2-Exp", name: "DeepSeek V3.2 Exp", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-10", last_updated: "2025-10-10", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 164000, output: 164000 }, cost: { input: 0.27, output: 0.4 } }, "deepseek-ai/DeepSeek-V3.1": { id: "deepseek-ai/DeepSeek-V3.1", name: "DeepSeek V3.1", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-25", last_updated: "2025-08-25", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 164000, output: 164000 }, cost: { input: 0.27, output: 1 } }, "moonshotai/Kimi-K2.5": { id: "moonshotai/Kimi-K2.5", name: "Kimi K2.5", description: "Kimi multimodal agent model for visual understanding, coding, and planning", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2026-01", release_date: "2026-01-27", last_updated: "2026-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.45, output: 2.8 } }, "moonshotai/Kimi-K2-Thinking": { id: "moonshotai/Kimi-K2-Thinking", name: "Kimi K2 Thinking", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-08", release_date: "2025-11-06", last_updated: "2025-11-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.6, output: 2.6 } }, "meta-llama/Llama-3.3-70B-Instruct": { id: "meta-llama/Llama-3.3-70B-Instruct", name: "Llama 3.3 70B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: false, tool_call: true, temperature: true, release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 16384 }, cost: { input: 0.1, output: 0.3 } }, "XiaomiMiMo/MiMo-V2-Flash": { id: "XiaomiMiMo/MiMo-V2-Flash", name: "MiMo V2 Flash", description: "MiMo flash model for fast multimodal assistance and agent workflows", family: "mimo", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2024-12-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 32000 }, cost: { input: 0.1, output: 0.3 } } } }, stepfun: { id: "stepfun", env: ["STEPFUN_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.stepfun.com/v1", name: "StepFun (China)", doc: "https://platform.stepfun.com/docs/zh/overview/concept", models: { "step-3.5-flash": { id: "step-3.5-flash", name: "Step 3.5 Flash", description: "StepFun flash lane for quick multimodal reasoning and coding assistance", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-01-29", last_updated: "2026-06-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0.1, output: 0.3, cache_read: 0.02 } }, "step-3.7-flash": { id: "step-3.7-flash", name: "Step 3.7 Flash", description: "Newer StepFun flash model for faster agents, coding, and multimodal prompts", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2026-03-01", release_date: "2026-05-29", last_updated: "2026-06-29", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0.185, output: 1.11, cache_read: 0.037 } }, "step-3.5-flash-2603": { id: "step-3.5-flash-2603", name: "Step 3.5 Flash 2603", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-01", release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, input: 256000, output: 256000 }, cost: { input: 0.1, output: 0.3, cache_read: 0.02 } }, "step-tts-2": { id: "step-tts-2", name: "Step TTS 2", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "step", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-03-01", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "stepaudio-2.5-tts": { id: "stepaudio-2.5-tts", name: "StepAudio 2.5 TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "step", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-16", last_updated: "2026-07-02", modalities: { input: ["text"], output: ["audio"] }, open_weights: false, limit: { context: 0, output: 0 } }, "step-1-32k": { id: "step-1-32k", name: "Step 1 (32K)", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06", release_date: "2025-01-01", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32768, input: 32768, output: 32768 }, cost: { input: 2.05, output: 9.59, cache_read: 0.41 } }, "stepaudio-2.5-asr": { id: "stepaudio-2.5-asr", name: "StepAudio 2.5 ASR", description: "Speech transcription model for accurate audio-to-text and captioning workflows", family: "step", attachment: false, reasoning: false, tool_call: false, temperature: false, release_date: "2026-04-24", last_updated: "2026-07-02", modalities: { input: ["audio"], output: ["text"] }, open_weights: false, limit: { context: 0, output: 0 } }, "step-2-16k": { id: "step-2-16k", name: "Step 2 (16K)", description: "StepFun flash model for efficient multimodal reasoning, coding, and tool use", attachment: false, reasoning: false, tool_call: true, temperature: true, knowledge: "2024-06", release_date: "2025-01-01", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 16384, input: 16384, output: 8192 }, cost: { input: 5.21, output: 16.44, cache_read: 1.04 } } } }, cortecs: { id: "cortecs", env: ["CORTECS_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.cortecs.ai/v1", name: "Cortecs", doc: "https://api.cortecs.ai/v1/models", models: { "claude-opus4-7": { id: "claude-opus4-7", name: "Claude Opus 4.7", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 5.437, output: 27.186, cache_read: 0.544, cache_write: 6.797 } }, "qwen3-32b": { id: "qwen3-32b", name: "Qwen3 32B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 40000, output: 40000 }, cost: { input: 0.099, output: 0.299 } }, "mistral-medium-3.5": { id: "mistral-medium-3.5", name: "mistral-medium-3.5", description: "Mistral Medium 3.5 is a frontier multimodal 128B model combining reasoning, coding, and instruction-following with strong agentic performance and efficient deployment.", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2026-04-30", last_updated: "2026-04-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 1.671, output: 5.57 } }, "gpt-4.1-mini": { id: "gpt-4.1-mini", name: "GPT-4.1 mini", description: "Affordable GPT-4.1 lane for fast coding help and structured extraction", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 1047576 }, cost: { input: 0.434, output: 1.704, cache_read: 0.134 } }, "gpt-4o": { id: "gpt-4o", name: "GPT-4o", description: "Omni-era GPT for multimodal chat, practical coding, and general assistants", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-09", release_date: "2024-05-13", last_updated: "2024-08-06", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 2.659, output: 10.635, cache_read: 1.33 } }, "glm-5": { id: "glm-5", name: "GLM-5", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, cost: { input: 0.988, output: 3.164, cache_read: 0.247 } }, "claude-4-6-sonnet": { id: "claude-4-6-sonnet", name: "Claude Sonnet 4.6", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 3.196, output: 15.94, cache_read: 0.32, cache_write: 3.999 } }, "gemini-3.5-flash": { id: "gemini-3.5-flash", name: "Gemini 3.5 Flash", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-19", last_updated: "2026-05-19", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 1.483, output: 8.898, cache_read: 0.148, cache_write: 0.988 } }, "qwen3.6-35b-a3b": { id: "qwen3.6-35b-a3b", name: "Qwen3.6 35B-A3B", description: "Open multimodal Qwen MoE for local agents that need vision, audio, and code", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-17", last_updated: "2026-04-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.167, output: 0.557 } }, "claude-haiku-4-5": { id: "claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude model for responsive assistance, classification, and lightweight agents", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 200000 }, cost: { input: 0.996, output: 4.982, cache_read: 0.099, cache_write: 1.186 } }, "holo2-30b-a3b": { id: "holo2-30b-a3b", name: "holo2-30b-a3b", description: "Holo2 30B A3B is a text-and-vision model optimized for analyzing graphical user interfaces, including web, desktop, and mobile, and enabling agents to interpret interfaces, reason over content, and take actions.", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2025-12-10", last_updated: "2025-12-10", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 22000, output: 22000 }, cost: { input: 0.334, output: 0.78 } }, "apertus-70b": { id: "apertus-70b", name: "Apertus 70B", description: "Apertus 70B is an open, multilingual language model designed for research, long-context reasoning, and sovereignty-focused AI systems.", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: false, temperature: false, knowledge: "2025-09", release_date: "2025-09-02", last_updated: "2025-09-02", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 65536, output: 65536 }, cost: { input: 1.393, output: 2.228 } }, "voxtral-small-2507": { id: "voxtral-small-2507", name: "voxtral-small-2507", description: "Voxtral Small is a multimodal model with audio input, combining advanced speech capabilities with strong text performance for transcription, translation, and audio understanding.", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2026-02-02", last_updated: "2026-02-02", modalities: { input: ["text", "audio"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 }, cost: { input: 0.111, output: 0.334, cache_read: 0.011 } }, "gemini-2.5-flash": { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 0.299, output: 2.491, cache_read: 0.029, cache_write: 0.097 } }, "gpt-5.6-sol": { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 1050000 }, cost: { input: 5.5, output: 32.998, cache_read: 0.55, cache_write: 6.879 } }, "glm-5.1": { id: "glm-5.1", name: "GLM-5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 202752 }, cost: { input: 1.384, output: 4.348, cache_read: 0.346 } }, "gemini-3.5-flash-lite": { id: "gemini-3.5-flash-lite", name: "Gemini 3.5 Flash Lite", description: "Fast Gemini model balancing multimodal reasoning, tool use, and cost", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2026-03", release_date: "2026-07-21", last_updated: "2026-07-21", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 0.33, output: 2.749, cache_read: 0.033 } }, "gpt-oss-safeguard-120b": { id: "gpt-oss-safeguard-120b", name: "GPT OSS Safeguard 120B", description: "Safety model for policy screening, moderation, and risk-aware routing workflows", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-10-29", last_updated: "2025-10-29", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.179, output: 0.697 } }, "kimi-k2.5": { id: "kimi-k2.5", name: "Kimi K2.5", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 256000 }, cost: { input: 0.495, output: 2.768, cache_read: 0.124 } }, "minimax-m2.7": { id: "minimax-m2.7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 196072 }, cost: { input: 0.668, output: 2.674 } }, "gpt-4.1-nano": { id: "gpt-4.1-nano", name: "GPT-4.1 nano", description: "Tiny GPT-4.1 option for classification, routing, and very high-volume tasks", family: "gpt-nano", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 1047576 }, cost: { input: 0.111, output: 0.434, cache_read: 0.056 } }, "qwen3-coder-30b-a3b-instruct": { id: "qwen3-coder-30b-a3b-instruct", name: "Qwen3-Coder 30B-A3B Instruct", description: "Smaller Qwen coder for efficient local agents and repo-level fixes", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-04", last_updated: "2025-04", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262000 }, cost: { input: 0.067, output: 0.245, cache_read: 0.014 } }, "gpt-oss-20b": { id: "gpt-oss-20b", name: "GPT OSS 20B", description: "Open GPT reasoning model for self-hosted agents and controllable deployments", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 131000 }, cost: { input: 0.045, output: 0.167 } }, "qwen3-vl-235b-a22b": { id: "qwen3-vl-235b-a22b", name: "qwen3-vl-235b-a22b", description: "Qwen3 VL 235B A22B is a 235B-parameter MoE vision-language flagship model (\u224822B active) designed for frontier-level multimodal understanding across text, images, documents, and long videos.", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2026-01-13", last_updated: "2026-01-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.617, output: 3.119, cache_read: 0.052 } }, "glm-4.7-flash": { id: "glm-4.7-flash", name: "GLM-4.7-Flash", description: "Efficient GLM model for fast reasoning, coding, and agent workflows", family: "glm-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2026-01-19", last_updated: "2026-01-19", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 203000, output: 203000 }, cost: { input: 0.08, output: 0.478 } }, "mistral-nemo-instruct-2407": { id: "mistral-nemo-instruct-2407", name: "mistral-nemo-instruct-2407", description: "A 12B parameter, instruct-tuned language model by Mistral AI and NVIDIA, designed for advanced instruction following, multi-turn conversations, and generating text and code across multiple languages.", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2024-08-07", last_updated: "2024-08-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 131072 }, cost: { input: 0.145, output: 0.145, cache_read: 0.014 } }, "glm-5.2": { id: "glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 1.2, output: 4.2, cache_read: 0.26 } }, "ministral-8b-2512": { id: "ministral-8b-2512", name: "ministral-8b-2512", description: "Ministral 3 8B is a balanced, efficient multimodal model offering strong text and vision capabilities, optimized for edge and local deployment.", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2025-12-03", last_updated: "2025-12-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.167, output: 0.167, cache_read: 0.017 } }, "qwen3-next-80b-a3b-thinking": { id: "qwen3-next-80b-a3b-thinking", name: "Qwen3-Next 80B-A3B (Thinking)", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-09", last_updated: "2025-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.149, output: 1.195 } }, "ministral-14b-2512": { id: "ministral-14b-2512", name: "ministral-14b-2512", description: "Ministral 3 14B is a frontier-level 14B multimodal model optimized for local deployment, delivering state-of-the-art text and vision reasoning with a 256K context window and strong agentic capabilities.", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2025-12-03", last_updated: "2025-12-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.223, output: 0.223, cache_read: 0.022 } }, "ministral-3b-2512": { id: "ministral-3b-2512", name: "ministral-3b-2512", description: "Ministral 3 3B is a compact, efficient multimodal model with strong language, vision capabilities, and ideal for custom fine-tuning.", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2025-12-03", last_updated: "2025-12-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.111, output: 0.111, cache_read: 0.011 } }, "qwen3.5-9b": { id: "qwen3.5-9b", name: "Qwen3.5 9B", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.111, output: 0.167 } }, "kimi-k2.6": { id: "kimi-k2.6", name: "Kimi K2.6", description: "Kimi reasoning model for long-horizon research, planning, and tool use", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 256000 }, cost: { input: 0.773, output: 3.38, cache_read: 0.193 } }, "mistral-medium-2508": { id: "mistral-medium-2508", name: "mistral-medium-2508", description: "Mistral Medium 2508 is a frontier-class multimodal LLM with a 128,000 token context window, optimized for reasoning, coding, and multimodal tasks.", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2024-08-07", last_updated: "2024-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.446, output: 2.228, cache_read: 0.045 } }, "pixtral-12b-2409": { id: "pixtral-12b-2409", name: "pixtral-12b-2409", description: "Pixtral 2409 12B is a state-of-the-art multimodal model with 12B parameters and a 400M vision encoder, natively trained on interleaved text and image data. It excels in tasks spanning vision-language reasoning, instruction following, and pure text understanding, making it highly effective for real-world multimodal applications.", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2024-11-09", last_updated: "2024-11-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.223, output: 0.223 } }, "pixtral-large-2502": { id: "pixtral-large-2502", name: "pixtral-large-2502", description: "Pixtral Large (25.02) is a 124B open-weight multimodal model built on Mistral Large 2, offering advanced image understanding and strong performance across text and code tasks.", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2025-05-26", last_updated: "2025-05-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 1.993, output: 5.978 } }, "qwen3.6-27b": { id: "qwen3.6-27b", name: "Qwen3.6 27B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.446, output: 3.008 } }, "gpt-4o-mini": { id: "gpt-4o-mini", name: "GPT-4o mini", description: "Small omni GPT for cheap multimodal assistance and production-scale traffic", family: "gpt-mini", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2023-09", release_date: "2024-07-18", last_updated: "2024-07-18", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.159, output: 0.638, cache_read: 0.081 } }, "minimax-m3": { id: "minimax-m3", name: "MiniMax-M3", description: "MiniMax multimodal model for long-context coding, perception, and agent planning", family: "minimax", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 0.395, output: 1.977, cache_read: 0.099 } }, "gpt-5": { id: "gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 400000 }, cost: { input: 1.375, output: 10.96, cache_read: 0.156 } }, "nemotron-nano-v2-12b": { id: "nemotron-nano-v2-12b", name: "nemotron-nano-v2-12b", description: "NVIDIA Nemotron Nano v2 12B is a 12-billion-parameter multimodal reasoning model designed for advanced video understanding, document intelligence, and visual reasoning, built with a hybrid Transformer-Mamba architecture for high efficiency and low latency.", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2025-10-31", last_updated: "2025-10-31", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.24, output: 0.707 } }, "gemma-4-26b-a4b-it": { id: "gemma-4-26b-a4b-it", name: "Gemma 4 26B A4B IT", description: "Open Gemma instruction model for efficient chat and self-hosted deployments", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.111, output: 0.557 } }, "llama-3.3-70b-instruct": { id: "llama-3.3-70b-instruct", name: "Llama-3.3-70B-Instruct", description: "Popular open Llama workhorse for multilingual chat, coding, and self-hosting", family: "llama", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2024-12-06", last_updated: "2024-12-06", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 131000 }, cost: { input: 0.129, output: 0.399 } }, "mistral-large-2402": { id: "mistral-large-2402", name: "mistral-large-2402", description: "Mistral Large (24.02) is Mistral AI\u2019s most advanced language model, built for complex multilingual reasoning, code generation, and deep text understanding.", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2025-05-26", last_updated: "2025-05-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 }, cost: { input: 4.284, output: 12.952 } }, "minicpm-v-4.5": { id: "minicpm-v-4.5", name: "minicpm-v-4.5", description: "MiniCPM-V 4.5 is a compact, high-performance vision-language model excelling in video understanding, OCR, and multimodal reasoning with efficient deployment.", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 }, cost: { input: 0.651, output: 1.097 } }, "qwen3guard-gen-8b": { id: "qwen3guard-gen-8b", name: "qwen3guard-gen-8b", description: "Qwen3Guard-Gen-8B is a large-scale multilingual safety moderation model designed for high-accuracy prompt and response classification.", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, release_date: "2026-02-04", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 }, cost: { input: 0, output: 0 } }, "deepseek-v4-pro": { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 1.73, output: 3.46, cache_read: 0.432 } }, "gemma-3-27b-it": { id: "gemma-3-27b-it", name: "gemma-3-27b-it", description: "Gemma 3 is a family of lightweight, multimodal models from Google, supporting text and image inputs, multilingual capabilities, and a 131K context window.", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: false, release_date: "2025-03-12", last_updated: "2025-03-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.099, output: 0.299 } }, "deepseek-r1-0528": { id: "deepseek-r1-0528", name: "DeepSeek R1 0528", description: "DeepSeek reasoning model for multi-step analysis, math, coding, and tools", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-05-28", last_updated: "2025-05-28", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 164000, output: 164000 }, cost: { input: 0.652, output: 2.57, cache_read: 0.163 } }, "llama-3.1-nemotron-ultra-253b-v1": { id: "llama-3.1-nemotron-ultra-253b-v1", name: "llama-3.1-nemotron-ultra-253b-v1", description: "A reasoning-optimized LLM based on Llama 3.1, Nemotron Ultra 253B delivers strong performance in tasks like RAG and tool use, with high efficiency and reduced latency.", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2025-04-07", last_updated: "2025-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.598, output: 1.794 } }, "nvidia-nemotron-3-nano-30b-a3b": { id: "nvidia-nemotron-3-nano-30b-a3b", name: "nvidia-nemotron-3-nano-30b-a3b", description: "Nemotron-Nano-3-30B-A3B is a compact Mixture-of-Experts model optimized for efficient reasoning, chat, and coding, with strong multilingual support and long-context RAG and agent workflows.", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2026-01-12", last_updated: "2026-01-12", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.06, output: 0.24 } }, "nova-2-lite": { id: "nova-2-lite", name: "nova-2-lite", description: "Nova 2 Lite is an advanced multimodal reasoning model that combines efficiency and performance, delivering reliable AI for agentic workflows and enterprise applications.", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2025-12-04", last_updated: "2025-12-04", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 0.373, output: 3.144 } }, "gpt-5.4": { id: "gpt-5.4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, output: 1050000 }, cost: { input: 2.898, output: 15.453, cache_read: 0.242 } }, "cosmos3-super-reasoner": { id: "cosmos3-super-reasoner", name: "cosmos3-super-reasoner", description: "Cosmos3 Super Reasoner is a high-capacity reasoning model designed for complex multi-agent tasks and advanced physical AI understanding.", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2026-06-02", last_updated: "2026-06-02", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 256000, output: 256000 }, cost: { input: 0.099, output: 0.296 } }, "deepseek-v4-flash-0731": { id: "deepseek-v4-flash-0731", name: "DeepSeek V4 Flash 0731", description: "Official DeepSeek V4 Flash release with enhanced agentic capabilities and integrated DSpark speculative decoding", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2025-05", release_date: "2026-07-31", last_updated: "2026-07-31", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 0.25, output: 0.3, cache_read: 0.062 } }, "mixtral-8x7B-instruct-v0.1": { id: "mixtral-8x7B-instruct-v0.1", name: "Mixtral 8x7B Instruct v0.1", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: true, knowledge: "2023-09", release_date: "2023-12-11", last_updated: "2023-12-11", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 32000, output: 32000 }, cost: { input: 0.488, output: 0.758 } }, "qwen3-235b-a22b-instruct-2507": { id: "qwen3-235b-a22b-instruct-2507", name: "Qwen3 235B-A22B Instruct 2507", description: "Qwen instruction model for multilingual chat, reasoning, and tool use", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, release_date: "2025-07-21", last_updated: "2025-07-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 131000 }, cost: { input: 0.069, output: 0.455, cache_read: 0.018 } }, "claude-opus4-8": { id: "claude-opus4-8", name: "Claude Opus 4.8", description: "Top Claude Opus tier for the hardest reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01", release_date: "2026-05-28", last_updated: "2026-05-28", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 5.437, output: 27.186, cache_read: 0.544, cache_write: 6.797 } }, "mistral-small-2603": { id: "mistral-small-2603", name: "Mistral Small 4", description: "Fast Mistral production model for chat, extraction, and cost-sensitive agents", family: "mistral-small", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-06", release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.143, output: 0.568, cache_read: 0.014 } }, "codestral-2508": { id: "codestral-2508", name: "Codestral 2508", description: "Mistral coding model for code completion, generation, and developer workflows", family: "mistral", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03", release_date: "2025-07-30", last_updated: "2025-07-30", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.334, output: 1.003, cache_read: 0.033 } }, "deepseek-v3.2": { id: "deepseek-v3.2", name: "DeepSeek V3.2", description: "DeepSeek chat model for instruction following, coding, and analysis", family: "deepseek", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-07", release_date: "2025-12-01", last_updated: "2025-12-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 163840, output: 163840 }, cost: { input: 0.296, output: 0.495, cache_read: 0.075 } }, "claude-sonnet-4": { id: "claude-sonnet-4", name: "Claude Sonnet 4 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-05-22", last_updated: "2025-05-22", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 200000 }, cost: { input: 2.898, output: 14.493, cache_read: 0.29, cache_write: 3.624 } }, "mistral-small-2503": { id: "mistral-small-2503", name: "mistral-small-2503", description: "Combines advanced text and vision capabilities with 24 billion parameters, supporting multilingual tasks and long contexts up to 131k tokens, making it versatile for various applications without sacrificing performance.", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2025-03-20", last_updated: "2025-03-20", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.111, output: 0.334 } }, "gemini-3.1-flash-lite": { id: "gemini-3.1-flash-lite", name: "Gemini 3.1 Flash Lite", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-05-07", last_updated: "2026-05-07", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 1048576 }, cost: { input: 0.272, output: 1.631, cache_read: 0.025, cache_write: 0.082 } }, "nova-pro-v1": { id: "nova-pro-v1", name: "Nova Pro 1.0", description: "Flagship model for demanding analysis, coding, and production agent workflows", family: "nova-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2024-04", release_date: "2024-12-03", last_updated: "2024-12-03", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 5000 }, cost: { input: 0.918, output: 3.671 } }, "glm-4.7": { id: "glm-4.7", name: "GLM-4.7", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-04", release_date: "2025-12-22", last_updated: "2025-12-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202752, output: 198000 }, cost: { input: 0.78, output: 2.785 } }, "gpt-oss-120b": { id: "gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131000, output: 128000 }, cost: { input: 0.089, output: 0.446, cache_read: 0.01 } }, "minimax-m2.5": { id: "minimax-m2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196680, output: 196608 }, cost: { input: 0.296, output: 1.087, cache_read: 0.03 } }, "minimax-m2": { id: "minimax-m2", name: "MiniMax-M2", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 400000, output: 400000 }, cost: { input: 0.349, output: 1.405 } }, "gpt-5.6-luna": { id: "gpt-5.6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 1050000 }, cost: { input: 1.1, output: 6.599, cache_read: 0.11, cache_write: 1.38 } }, "gemma-4-31b-it": { id: "gemma-4-31b-it", name: "Gemma 4 31B IT", description: "Largest Gemma 4 instruction model for open, self-hosted chat and reasoning", family: "gemma", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-02", last_updated: "2026-04-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.223, output: 0.39 } }, "hermes-4-405b": { id: "hermes-4-405b", name: "hermes-4-405b", description: "Hermes 4 405B is a frontier hybrid-mode reasoning model built on Llama 3.1, optimized for advanced logic, math, coding, and structured output generation.", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2024-08-13", last_updated: "2024-08-13", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.996, output: 2.989 } }, "claude-opus4-6": { id: "claude-opus4-6", name: "Claude Opus 4.6", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 5.313, output: 26.561, cache_read: 0.531, cache_write: 6.645 } }, "gpt-5-mini": { id: "gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 400000 }, cost: { input: 0.279, output: 2.192, cache_read: 0.056 } }, "mistral-7b-instruct-v0.2": { id: "mistral-7b-instruct-v0.2", name: "mistral-7b-instruct-v0.2", description: "Mistral 7B Instruct is a compact, 7B parameter model optimized for fast and efficient text and code generation with a 32K token context window.", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, release_date: "2025-05-26", last_updated: "2025-05-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 }, cost: { input: 0.159, output: 0.219 } }, "kimi-k2.7-code": { id: "kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.75, output: 3.5, cache_read: 0.201 } }, "mistral-small-3.2-24b-instruct-2506": { id: "mistral-small-3.2-24b-instruct-2506", name: "mistral-small-3.2-24b-instruct-2506", description: "Mistral-Small-3.2-24B-Instruct-2506 is a 24B parameter instruction-tuned model with enhanced long-context support (128k) and state-of-the-art vision understanding.", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2025-05-26", last_updated: "2025-05-26", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 131000, output: 131000 }, cost: { input: 0.1, output: 0.312 } }, "nova-micro-v1": { id: "nova-micro-v1", name: "nova-micro-v1", description: "Nova Micro is a multilingual text-to-text foundation model with strong reasoning capabilities and broad language coverage across 200+ languages.", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.04, output: 0.159 } }, "claude-opus4-5": { id: "claude-opus4-5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 200000 }, cost: { input: 5.313, output: 26.568, cache_read: 0.531, cache_write: 6.645 } }, "nvidia-nemotron-3-nano-omni": { id: "nvidia-nemotron-3-nano-omni", name: "nvidia-nemotron-3-nano-omni", description: "Nemotron-3-Nano-Omni is an open, efficient omni-modal reasoning model that unifies text, image, audio, and video for agentic AI workflows.", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2026-04-29", last_updated: "2026-04-29", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 300000 }, cost: { input: 0.059, output: 0.237 } }, "gpt-5.1": { id: "gpt-5.1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 400000 }, cost: { input: 1.375, output: 10.96, cache_read: 0.156 } }, "qwen3-30b-a3b-instruct-2507": { id: "qwen3-30b-a3b-instruct-2507", name: "qwen3-30b-a3b-instruct-2507", description: "Qwen3-30B-A3B-Instruct-2507 is an advanced Mixture-of-Experts model optimized for reasoning, coding, and multilingual instruction following.", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2025-07-28", last_updated: "2025-07-28", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 262000, output: 262000 }, cost: { input: 0.099, output: 0.299 } }, "nova-lite-v1": { id: "nova-lite-v1", name: "nova-lite-v1", description: "Nova Lite is a fast, low-cost multimodal foundation model capable of reasoning over text, images, and video in 200+ languages.", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 300000, output: 300000 }, cost: { input: 0.069, output: 0.275 } }, "devstral-2512": { id: "devstral-2512", name: "Devstral 2", description: "Mistral coding agent model for repository tasks and software engineering workflows", family: "devstral", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-12", release_date: "2025-12-09", last_updated: "2025-12-09", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 262000 }, cost: { input: 0.446, output: 2.228, cache_read: 0.045 } }, "gemini-2.5-pro": { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65535 }, cost: { input: 1.495, output: 9.964, cache_read: 0.242, cache_write: 0.434 } }, "kimi-k3": { id: "kimi-k3", name: "Kimi K3", description: "Multimodal Kimi model with 1M context and toggleable max-effort thinking for long-horizon agent work", family: "kimi-k3", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: false, release_date: "2026-07-16", last_updated: "2026-07-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 1048576 }, cost: { input: 3, output: 14.999 } }, "llama-3.1-8b-instruct": { id: "llama-3.1-8b-instruct", name: "llama-3.1-8b-instruct", description: "Optimized for dialogue, this LLM by Meta outperforms other open-source chat models in benchmarks while prioritizing helpfulness and safety.", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: false, release_date: "2024-04-09", last_updated: "2024-04-09", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 128000, output: 128000 }, cost: { input: 0.167, output: 0.167 } }, "gpt-5-nano": { id: "gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: false, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 400000 }, cost: { input: 0.06, output: 0.439, cache_read: 0.019 } }, "glm-5-turbo": { id: "glm-5-turbo", name: "GLM-5-Turbo", description: "Faster GLM-5 lane for coding agents that need lower latency", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-03-16", last_updated: "2026-03-16", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 202752 }, cost: { input: 1.186, output: 3.955, cache_read: 0.296, cache_write: 1.544 } }, "glm-5v-turbo": { id: "glm-5v-turbo", name: "GLM-5V-Turbo", description: "Fast GLM vision model for screenshots, documents, and multimodal agent tasks", family: "glm", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-04-01", last_updated: "2026-04-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 202752, output: 202752 }, cost: { input: 1.186, output: 3.955, cache_read: 0.296, cache_write: 1.544 } }, "qwen3.5-397b-a17b": { id: "qwen3.5-397b-a17b", name: "Qwen3.5 397B-A17B", description: "Large open Qwen multimodal MoE for visual agents and long technical tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-15", last_updated: "2026-02-15", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262000, output: 250000 }, cost: { input: 0.668, output: 4.01 } }, "minimax-m2.1": { id: "minimax-m2.1", name: "MiniMax-M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196000, output: 196000 }, cost: { input: 0.359, output: 1.435 } }, "gpt-5.6-terra": { id: "gpt-5.6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 1050000 }, cost: { input: 2.749, output: 16.498, cache_read: 0.275, cache_write: 3.437 } }, "claude-sonnet-5": { id: "claude-sonnet-5", name: "Claude Sonnet 5", description: "Everyday Claude agent model for coding, planning, browsing, and general work", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-06-30", last_updated: "2026-06-30", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 2.2, output: 11, cache_read: 0.219, cache_write: 2.749 } }, "gpt-4.1": { id: "gpt-4.1", name: "GPT-4.1", description: "GPT model for general reasoning, writing, coding, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: false, tool_call: true, structured_output: false, temperature: true, knowledge: "2024-04", release_date: "2025-04-14", last_updated: "2025-04-14", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1047576, output: 1047576 }, cost: { input: 2.192, output: 8.769, cache_read: 0.546 } }, "qwen3guard-gen-0.6b": { id: "qwen3guard-gen-0.6b", name: "qwen3guard-gen-0.6b", description: "Qwen3Guard-Gen-0.6B is a lightweight multilingual safety moderation model that classifies prompts and responses into safe, controversial, or unsafe categories.", attachment: false, reasoning: false, tool_call: false, structured_output: false, temperature: false, release_date: "2026-02-04", last_updated: "2026-02-04", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 }, cost: { input: 0, output: 0 } }, "llama-3.1-405b-instruct": { id: "llama-3.1-405b-instruct", name: "Llama 3.1 405B Instruct", description: "Open Llama instruction model for multilingual chat, reasoning, and coding", family: "llama", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2024-07-23", last_updated: "2024-07-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 1.95, output: 1.95 } }, "claude-opus-5": { id: "claude-opus-5", name: "Claude Opus 5", description: "Strongest Claude Opus model for coding, agents, and professional work", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-05", release_date: "2026-07-24", last_updated: "2026-07-24", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 1e6 }, cost: { input: 5.5, output: 27.498, cache_read: 0.55, cache_write: 6.874 } }, "qwen3-coder-next": { id: "qwen3-coder-next", name: "Qwen3 Coder Next", description: "Qwen coding model for software agents, repository edits, and code reasoning", family: "qwen", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2025-09", release_date: "2026-02-03", last_updated: "2026-02-03", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.167, output: 0.891 } }, "mistral-7b-instruct-v0.3": { id: "mistral-7b-instruct-v0.3", name: "mistral-7b-instruct-v0.3", description: "Mistral-7B-Instruct-v0.3 model is a fine-tuned version of the Mistral 7B base model, optimized for instruction-following tasks. Released in 2023, it is intended for demonstration purposes and does not include built-in guardrails or moderation features.", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: false, release_date: "2025-05-26", last_updated: "2025-05-26", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 127000, output: 127000 }, cost: { input: 0.111, output: 0.111 } }, "qwen3.5-122b-a10b": { id: "qwen3.5-122b-a10b", name: "Qwen3.5 122B-A10B", description: "Qwen vision-language model for visual reasoning, documents, and agent tasks", family: "qwen", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-23", last_updated: "2026-02-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.495, output: 3.46, cache_read: 0.124 } }, "hermes-4-70b": { id: "hermes-4-70b", name: "Hermes 4 70B", description: "Reasoning model for deliberate analysis, multi-step problem solving, and tool use", attachment: false, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2023-12", release_date: "2025-08-26", last_updated: "2025-08-26", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 128000, output: 128000 }, cost: { input: 0.129, output: 0.399 } }, "claude-4-5-sonnet": { id: "claude-4-5-sonnet", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }, { type: "budget_tokens", min: 1024 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 200000 }, cost: { input: 2.989, output: 14.945, cache_read: 0.326, cache_write: 4.078 } }, "mistral-large-2512": { id: "mistral-large-2512", name: "Mistral Large 3", description: "Mistral's largest general model for enterprise agents, coding, and multilingual reasoning", family: "mistral-large", attachment: true, reasoning: false, tool_call: true, structured_output: true, temperature: true, knowledge: "2024-11", release_date: "2024-11-01", last_updated: "2025-12-02", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.557, output: 1.671, cache_read: 0.056 } }, "qwen2.5-vl-72b-instruct": { id: "qwen2.5-vl-72b-instruct", name: "qwen2.5-vl-72b-instruct", description: "Qwen2.5-VL is a powerful vision-language model with advanced capabilities in visual understanding, long video reasoning, and structured output generation.", attachment: true, reasoning: true, reasoning_options: [], tool_call: false, structured_output: true, temperature: false, release_date: "2025-01-27", last_updated: "2025-01-27", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 32000, output: 32000 }, cost: { input: 0.25, output: 0.747 } } } }, "xiaomi-token-plan-sgp": { id: "xiaomi-token-plan-sgp", env: ["XIAOMI_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://token-plan-sgp.xiaomimimo.com/v1", name: "Xiaomi Token Plan (Singapore)", doc: "https://platform.xiaomimimo.com/#/docs", models: { "mimo-v2.5-pro": { id: "mimo-v2.5-pro", name: "MiMo-V2.5-Pro", description: "Stronger MiMo Pro tier for multimodal reasoning and coding-agent execution", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0 } }, "mimo-v2.5-tts-voiceclone": { id: "mimo-v2.5-tts-voiceclone", name: "MiMo-V2.5-TTS-VoiceClone", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "mimo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } }, "mimo-v2.5": { id: "mimo-v2.5", name: "MiMo-V2.5", description: "Open MiMo model for multimodal coding agents and long-context automation", family: "mimo", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text", "image", "audio", "video"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0 } }, "mimo-v2.5-tts-voicedesign": { id: "mimo-v2.5-tts-voicedesign", name: "MiMo-V2.5-TTS-VoiceDesign", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "mimo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } }, "mimo-v2-pro": { id: "mimo-v2-pro", name: "MiMo-V2-Pro", description: "Earlier MiMo Pro model for multimodal agents, reasoning, and code tasks", family: "mimo", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, temperature: true, knowledge: "2024-12", release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 131072 }, status: "deprecated", cost: { input: 0, output: 0, cache_read: 0 } }, "mimo-v2-tts": { id: "mimo-v2-tts", name: "MiMo-V2-TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "mimo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } }, "mimo-v2.5-tts": { id: "mimo-v2.5-tts", name: "MiMo-V2.5-TTS", description: "Speech generation model for controllable voice, narration, and audio delivery", family: "mimo", attachment: false, reasoning: false, tool_call: false, release_date: "2026-04-22", last_updated: "2026-04-22", modalities: { input: ["text"], output: ["audio"] }, open_weights: true, limit: { context: 8192, output: 8192 }, cost: { input: 0, output: 0 } } } }, "hpc-ai": { id: "hpc-ai", env: ["HPC_AI_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://api.hpc-ai.com/inference/v1", name: "HPC-AI", doc: "https://www.hpc-ai.com/doc/docs/quickstart/", models: { "zai-org/glm-5.1": { id: "zai-org/glm-5.1", name: "GLM 5.1", description: "Flagship GLM model for hybrid reasoning, coding, and agentic engineering", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-08", last_updated: "2026-06-01", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 202000, output: 202000 }, cost: { input: 0.615, output: 2.46, cache_read: 0.133 } }, "zai-org/glm-5.2": { id: "zai-org/glm-5.2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "minimax/minimax-m2.5": { id: "minimax/minimax-m2.5", name: "MiniMax-M2.5", description: "Prior MiniMax coding model for agent workflows, office edits, and automation", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196000, output: 195000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03 } }, "deepseek/deepseek-v4-flash": { id: "deepseek/deepseek-v4-flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1048576, output: 128000 }, cost: { input: 0.14, output: 0.28, cache_read: 0.028 } }, "deepseek/deepseek-v4-pro": { id: "deepseek/deepseek-v4-pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["high", "max"] }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1002000, output: 128000 }, cost: { input: 1.74, output: 3.48, cache_read: 0.145 } }, "anthropic/claude-opus-4.7": { id: "anthropic/claude-opus-4.7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, temperature: true, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, cost: { input: 5, output: 25, cache_read: 0.5 } }, "moonshotai/kimi-k2.5": { id: "moonshotai/kimi-k2.5", name: "Kimi K2.5", description: "Earlier Kimi frontier model for long-context agents, coding, and multimodal work", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-01", last_updated: "2026-01", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.6, output: 3, cache_read: 0.1 } }, "moonshotai/kimi-k2.7-code": { id: "moonshotai/kimi-k2.7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: true, limit: { context: 256000, output: 256000 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "openai/gpt-5.5": { id: "openai/gpt-5.5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } } } }, "minimax-cn": { id: "minimax-cn", env: ["MINIMAX_API_KEY"], npm: "@ai-sdk/anthropic", api: "https://api.minimaxi.com/anthropic/v1", name: "MiniMax (minimaxi.com)", doc: "https://platform.minimaxi.com/docs/guides/quickstart", models: { "MiniMax-M2": { id: "MiniMax-M2", name: "MiniMax-M2", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 128000 }, cost: { input: 0.3, output: 1.2 } }, "MiniMax-M2.7": { id: "MiniMax-M2.7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06, cache_write: 0.375 } }, "MiniMax-M2.1": { id: "MiniMax-M2.1", name: "MiniMax-M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "MiniMax-M2.5": { id: "MiniMax-M2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.3, output: 1.2, cache_read: 0.03, cache_write: 0.375 } }, "MiniMax-M2.5-highspeed": { id: "MiniMax-M2.5-highspeed", name: "MiniMax-M2.5-highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-13", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.4, cache_read: 0.06, cache_write: 0.375 } }, "MiniMax-M2.7-highspeed": { id: "MiniMax-M2.7-highspeed", name: "MiniMax-M2.7-highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0.6, output: 2.4, cache_read: 0.06, cache_write: 0.375 } }, "MiniMax-M3": { id: "MiniMax-M3", name: "MiniMax-M3", description: "MiniMax multimodal coding model for long-context reasoning and agent tasks", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-25", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 0.3, output: 1.2, cache_read: 0.06, tiers: [{ input: 0.6, output: 2.4, cache_read: 0.12, tier: { type: "context", size: 512000 } }], context_over_200k: { input: 0.6, output: 2.4, cache_read: 0.12 } } } } }, ebcloud: { id: "ebcloud", env: ["EBCLOUD_API_KEY"], npm: "@ai-sdk/openai-compatible", api: "https://maas-api.ebcloud.com/v1", name: "EBCloud", doc: "https://docs.ebtech.com/ai/model-api.html", models: { "Kimi-K2.6": { id: "Kimi-K2.6", name: "Kimi K2.6", description: "Multimodal Kimi workhorse for agent loops, coding tasks, and visual context", family: "kimi-k2", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-04-21", last_updated: "2026-04-21", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.9286, output: 3.8571 } }, "DeepSeek-V4-Flash": { id: "DeepSeek-V4-Flash", name: "DeepSeek V4 Flash", description: "Fast DeepSeek V4 lane for economical reasoning, coding, and long-context work", family: "deepseek-flash", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.143, output: 0.2857 } }, "GLM-5.1": { id: "GLM-5.1", name: "GLM-5.1", description: "Strong GLM coding model for agentic engineering, terminals, and repository generation", family: "glm", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, release_date: "2026-04-07", last_updated: "2026-04-07", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 200000, output: 131072 }, cost: { input: 0.8571, output: 3.4286 } }, "DeepSeek-V4-Pro": { id: "DeepSeek-V4-Pro", name: "DeepSeek V4 Pro", description: "Open MoE flagship with million-token context for coding and long agent runs", family: "deepseek-thinking", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, interleaved: { field: "reasoning_content" }, structured_output: true, temperature: true, knowledge: "2025-05", release_date: "2026-04-24", last_updated: "2026-04-24", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 384000 }, cost: { input: 0.4286, output: 0.8571 } } } }, databricks: { id: "databricks", env: ["DATABRICKS_HOST", "DATABRICKS_TOKEN"], npm: "@ai-sdk/openai-compatible", api: "https://${DATABRICKS_HOST}/ai-gateway/mlflow/v1", name: "Databricks", doc: "https://docs.databricks.com/aws/en/machine-learning/foundation-models/", models: { "databricks-gpt-5-nano": { id: "databricks-gpt-5-nano", name: "GPT-5 Nano", description: "Tiny GPT-5 lane for routing, extraction, classification, and bulk jobs", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.05, output: 0.4, cache_read: 0.005 } }, "databricks-gemini-3-1-flash-lite": { id: "databricks-gemini-3-1-flash-lite", name: "Gemini 3.1 Flash Lite Preview", description: "Low-latency Gemini model for high-volume multimodal and agent workloads", family: "gemini-flash-lite", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-03-03", last_updated: "2026-03-03", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.25, output: 1.5, cache_read: 0.025, input_audio: 0.5 } }, "databricks-gpt-oss-120b": { id: "databricks-gpt-oss-120b", name: "GPT OSS 120B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.072, output: 0.28 } }, "databricks-claude-opus-4-5": { id: "databricks-claude-opus-4-5", name: "Claude Opus 4.5 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05", release_date: "2025-11-24", last_updated: "2025-11-24", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "databricks-claude-sonnet-4-6": { id: "databricks-claude-sonnet-4-6", name: "Claude Sonnet 4.6", description: "Claude workhorse for coding agents, careful analysis, and production cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-08-31", release_date: "2026-02-17", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "databricks-claude-sonnet-4": { id: "databricks-claude-sonnet-4", name: "Claude Sonnet 4.5", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "databricks-gemini-3-flash": { id: "databricks-gemini-3-flash", name: "Gemini 3 Flash Preview", description: "New Gemini flash lane bringing frontier-style multimodal reasoning to cheaper runs", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-12-17", last_updated: "2025-12-17", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.5, output: 3, cache_read: 0.05, input_audio: 1 } }, "databricks-gpt-oss-20b": { id: "databricks-gpt-oss-20b", name: "GPT OSS 20B", description: "Open-weight GPT model for self-hosted reasoning and instruction-following workloads", family: "gpt-oss", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 131072, output: 32768 }, cost: { input: 0.05, output: 0.2 } }, "databricks-glm-5-2": { id: "databricks-glm-5-2", name: "GLM-5.2", description: "Open flagship GLM for long-horizon coding agents and million-token context work", family: "glm", attachment: false, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, release_date: "2026-06-13", last_updated: "2026-06-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 131072 }, cost: { input: 1.4, output: 4.4, cache_read: 0.26 } }, "databricks-claude-opus-4-7": { id: "databricks-claude-opus-4-7", name: "Claude Opus 4.7", description: "Stronger Opus tier for advanced software work and high-stakes reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: false, knowledge: "2026-01-31", release_date: "2026-04-16", last_updated: "2026-04-16", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "databricks-gpt-5-6-sol": { id: "databricks-gpt-5-6-sol", name: "GPT-5.6 Sol", description: "Frontier GPT-5.6 model for complex professional work, coding, and agentic workflows", family: "gpt-sol", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high", "max"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "databricks-gpt-5-4-nano": { id: "databricks-gpt-5-4-nano", name: "GPT-5.4 nano", description: "Cheapest GPT-5.4 lane for simple routing, extraction, and bulk automation", family: "gpt-nano", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.2, output: 1.25, cache_read: 0.02 } }, "databricks-gemini-2-5-pro": { id: "databricks-gemini-2-5-pro", name: "Gemini 2.5 Pro", description: "Google's proven reasoning model for coding, math, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 128, max: 32768 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 1.25, output: 10, cache_read: 0.125, tiers: [{ input: 2.5, output: 15, cache_read: 0.25, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 2.5, output: 15, cache_read: 0.25 } } }, "databricks-gpt-5-6-terra": { id: "databricks-gpt-5-6-terra", name: "GPT-5.6 Terra", description: "Balanced GPT-5.6 model for capable, cost-efficient everyday work", family: "gpt-terra", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "databricks-gpt-5-5": { id: "databricks-gpt-5-5", name: "GPT-5.5", description: "Default frontier GPT for coding, computer use, research, and knowledge work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-12-01", release_date: "2026-04-23", last_updated: "2026-04-23", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 12.5, output: 75, cache_read: 1.25 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 5, output: 30, cache_read: 0.5, tiers: [{ input: 10, output: 45, cache_read: 1, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 10, output: 45, cache_read: 1 } } }, "databricks-gpt-5-2": { id: "databricks-gpt-5-2", name: "GPT-5.2", description: "Reliable GPT generation for broad coding, writing, and tool-assisted product work", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2025-12-11", last_updated: "2025-12-11", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.75, output: 14, cache_read: 0.175 } }, "databricks-gemini-3-1-pro": { id: "databricks-gemini-3-1-pro", name: "Gemini 3.1 Pro Preview Custom Tools", description: "Advanced Gemini model for complex reasoning, coding, and multimodal analysis", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2026-02-19", last_updated: "2026-02-19", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "databricks-claude-sonnet-4-5": { id: "databricks-claude-sonnet-4-5", name: "Claude Sonnet 4.5 (latest)", description: "Balanced Claude model for coding, analysis, agent workflows, and cost control", family: "claude-sonnet", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-07-31", release_date: "2025-09-29", last_updated: "2025-09-29", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 3, output: 15, cache_read: 0.3, cache_write: 3.75 } }, "databricks-claude-haiku-4-5": { id: "databricks-claude-haiku-4-5", name: "Claude Haiku 4.5 (latest)", description: "Fast Claude lane for lightweight agents, office tasks, and responsive chat", family: "claude-haiku", attachment: true, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, knowledge: "2025-02-28", release_date: "2025-10-15", last_updated: "2025-10-15", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 64000 }, cost: { input: 1, output: 5, cache_read: 0.1, cache_write: 1.25 } }, "databricks-kimi-k2-7-code": { id: "databricks-kimi-k2-7-code", name: "Kimi K2.7 Code", description: "Coding-focused Kimi model, stronger on long-horizon repo work with less overthinking", family: "kimi-k2", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-01", release_date: "2026-06-12", last_updated: "2026-06-12", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 262144, output: 262144 }, cost: { input: 0.95, output: 4, cache_read: 0.19 } }, "databricks-claude-opus-4-1": { id: "databricks-claude-opus-4-1", name: "Claude Opus 4.1 (latest)", description: "Flagship Claude model for deep reasoning, coding, and long-horizon agents", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-03-31", release_date: "2025-08-05", last_updated: "2025-08-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 200000, output: 32000 }, cost: { input: 15, output: 75, cache_read: 1.5, cache_write: 18.75 } }, "databricks-gemini-3-pro": { id: "databricks-gemini-3-pro", name: "Gemini 3 Pro Preview", description: "Preview Gemini flagship for complex reasoning, coding, and rich multimodal prompts", family: "gemini-pro", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-11-18", last_updated: "2025-11-18", modalities: { input: ["text", "image", "video", "audio", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 2, output: 12, cache_read: 0.2, tiers: [{ input: 4, output: 18, cache_read: 0.4, tier: { type: "context", size: 200000 } }], context_over_200k: { input: 4, output: 18, cache_read: 0.4 } } }, "databricks-gemini-2-5-flash": { id: "databricks-gemini-2-5-flash", name: "Gemini 2.5 Flash", description: "Fast Gemini workhorse for multimodal apps where latency and price matter", family: "gemini-flash", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 0, max: 24576 }], tool_call: true, structured_output: true, temperature: true, knowledge: "2025-01", release_date: "2025-06-17", last_updated: "2025-06-17", modalities: { input: ["text", "image", "audio", "video", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1048576, output: 65536 }, cost: { input: 0.3, output: 2.5, cache_read: 0.03, input_audio: 1 } }, "databricks-claude-opus-4-6": { id: "databricks-claude-opus-4-6", name: "Claude Opus 4.6", description: "High-end Claude for difficult coding, planning, and slower expert reasoning", family: "claude-opus", attachment: true, reasoning: true, reasoning_options: [{ type: "budget_tokens", min: 1024 }], tool_call: true, temperature: true, knowledge: "2025-05-31", release_date: "2026-02-05", last_updated: "2026-03-13", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1e6, output: 128000 }, experimental: { modes: { fast: { cost: { input: 30, output: 150, cache_read: 3, cache_write: 37.5 }, provider: { body: { speed: "fast" }, headers: { "anthropic-beta": "fast-mode-2026-02-01" } } } } }, cost: { input: 5, output: 25, cache_read: 0.5, cache_write: 6.25 } }, "databricks-gpt-5-1": { id: "databricks-gpt-5-1", name: "GPT-5.1", description: "Sharper GPT-5 generation for coding, product work, and tool-assisted tasks", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["none", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-11-13", last_updated: "2025-11-13", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "databricks-gpt-5-4-mini": { id: "databricks-gpt-5-4-mini", name: "GPT-5.4 mini", description: "Strong small GPT for coding subagents, quick tool use, and high-volume work", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-17", last_updated: "2026-03-17", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 1.5, output: 9, cache_read: 0.15 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 0.75, output: 4.5, cache_read: 0.075 } }, "databricks-gpt-5-6-luna": { id: "databricks-gpt-5-6-luna", name: "GPT-5.6 Luna", description: "Cost-efficient GPT-5.6 model for fast, high-volume workloads", family: "gpt-luna", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2026-02-16", release_date: "2026-07-09", last_updated: "2026-07-09", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1, output: 6, cache_read: 0.1, tiers: [{ input: 2, output: 9, cache_read: 0.2, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 2, output: 9, cache_read: 0.2 } } }, "databricks-gpt-5": { id: "databricks-gpt-5", name: "GPT-5", description: "Original GPT-5 workhorse for reasoning, coding, writing, and tool workflows", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-09-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 1.25, output: 10, cache_read: 0.125 } }, "databricks-gpt-5-4": { id: "databricks-gpt-5-4", name: "GPT-5.4", description: "Agent-ready GPT for coding and computer-use workflows at a lower cost", family: "gpt", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2025-08-31", release_date: "2026-03-05", last_updated: "2026-03-05", modalities: { input: ["text", "image", "pdf"], output: ["text"] }, open_weights: false, limit: { context: 1050000, input: 922000, output: 128000 }, experimental: { modes: { fast: { cost: { input: 5, output: 30, cache_read: 0.5 }, provider: { body: { service_tier: "priority" } } } } }, cost: { input: 2.5, output: 15, cache_read: 0.25, tiers: [{ input: 5, output: 22.5, cache_read: 0.5, tier: { type: "context", size: 272000 } }], context_over_200k: { input: 5, output: 22.5, cache_read: 0.5 } } }, "databricks-gpt-5-mini": { id: "databricks-gpt-5-mini", name: "GPT-5 Mini", description: "Small GPT-5 for responsive agents, coding help, and everyday automation", family: "gpt-mini", attachment: true, reasoning: true, reasoning_options: [{ type: "effort", values: ["minimal", "low", "medium", "high"] }], tool_call: true, structured_output: true, temperature: false, knowledge: "2024-05-30", release_date: "2025-08-07", last_updated: "2025-08-07", modalities: { input: ["text", "image"], output: ["text"] }, open_weights: false, limit: { context: 400000, input: 272000, output: 128000 }, cost: { input: 0.25, output: 2, cache_read: 0.025 } } } }, "minimax-cn-coding-plan": { id: "minimax-cn-coding-plan", env: ["MINIMAX_API_KEY"], npm: "@ai-sdk/anthropic", api: "https://api.minimaxi.com/anthropic/v1", name: "MiniMax Token Plan (minimaxi.com)", doc: "https://platform.minimaxi.com/docs/token-plan/intro", models: { "MiniMax-M2": { id: "MiniMax-M2", name: "MiniMax-M2", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-10-27", last_updated: "2025-10-27", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 196608, output: 128000 }, cost: { input: 0, output: 0 } }, "MiniMax-M2.7": { id: "MiniMax-M2.7", name: "MiniMax-M2.7", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "MiniMax-M2.1": { id: "MiniMax-M2.1", name: "MiniMax-M2.1", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2025-12-23", last_updated: "2025-12-23", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "MiniMax-M2.5": { id: "MiniMax-M2.5", name: "MiniMax-M2.5", description: "MiniMax model for chat, coding, office work, and agentic tasks", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-12", last_updated: "2026-02-12", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "MiniMax-M2.5-highspeed": { id: "MiniMax-M2.5-highspeed", name: "MiniMax-M2.5-highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-02-13", last_updated: "2026-02-13", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "MiniMax-M2.7-highspeed": { id: "MiniMax-M2.7-highspeed", name: "MiniMax-M2.7-highspeed", description: "High-speed MiniMax model for low-latency coding and agent workflows", family: "minimax", attachment: false, reasoning: true, reasoning_options: [], tool_call: true, temperature: true, release_date: "2026-03-18", last_updated: "2026-03-18", modalities: { input: ["text"], output: ["text"] }, open_weights: true, limit: { context: 204800, output: 131072 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } }, "MiniMax-M3": { id: "MiniMax-M3", name: "MiniMax-M3", description: "MiniMax multimodal coding model for long-context reasoning and agent tasks", family: "minimax", attachment: true, reasoning: true, reasoning_options: [{ type: "toggle" }], tool_call: true, temperature: true, release_date: "2026-06-01", last_updated: "2026-06-25", modalities: { input: ["text", "image", "video"], output: ["text"] }, open_weights: true, limit: { context: 1e6, output: 128000 }, cost: { input: 0, output: 0, cache_read: 0, cache_write: 0 } } } } }; -}); - // packages/unifia/src/provider/models.ts -import path13 from "path"; +import path14 from "path"; var ModelsDev; var init_models = __esm(async () => { init_zod(); @@ -168978,7 +169275,7 @@ var init_models = __esm(async () => { } ModelsDev.onRefresh = onRefresh; const source = url3(); - const filepath = path13.join(Global.Path.cache, source === "https://models.dev" ? "models.json" : `models-${Hash.fast(source)}.json`); + const filepath = path14.join(Global.Path.cache, source === "https://models.dev" ? "models.json" : `models-${Hash.fast(source)}.json`); const ttl = 5 * 60 * 1000; ModelsDev.Model = zod_default.object({ id: zod_default.string(), @@ -169051,11 +169348,11 @@ var init_models = __esm(async () => { const result6 = await Filesystem.readJson(Flag.UNIFIA_MODELS_PATH ?? filepath).catch(() => {}); if (result6) return result6; - const snapshot4 = await Promise.resolve().then(() => (init_models_snapshot(), exports_models_snapshot)).then((m3) => m3.snapshot).catch(() => { + const snapshot3 = await import("./models-snapshot.js").then((m3) => m3.snapshot).catch(() => { return; }); - if (snapshot4) - return snapshot4; + if (snapshot3) + return snapshot3; if (Flag.UNIFIA_DISABLE_MODELS_FETCH) return {}; try { @@ -169134,15 +169431,15 @@ var init_models = __esm(async () => { }); // packages/unifia/src/util/archive.ts -import path14 from "path"; +import path15 from "path"; var Archive; var init_archive = __esm(() => { init_process2(); ((Archive) => { async function extractZip(zipPath, destDir) { if (process.platform === "win32") { - const winZipPath = path14.resolve(zipPath); - const winDestDir = path14.resolve(destDir); + const winZipPath = path15.resolve(zipPath); + const winDestDir = path15.resolve(destDir); const cmd = `$global:ProgressPreference = 'SilentlyContinue'; Expand-Archive -Path '${winZipPath}' -DestinationPath '${winDestDir}' -Force`; await Process.run(["powershell", "-NoProfile", "-NonInteractive", "-Command", cmd]); return; @@ -169155,13 +169452,13 @@ var init_archive = __esm(() => { // packages/util/src/module.ts import { createRequire as createRequire3 } from "module"; -import path15 from "path"; +import path16 from "path"; var Module2; var init_module = __esm(() => { ((Module) => { function resolve9(id2, dir2) { try { - return createRequire3(path15.join(dir2, "package.json")).resolve(id2); + return createRequire3(path16.join(dir2, "package.json")).resolve(id2); } catch {} } Module.resolve = resolve9; @@ -169187,14 +169484,14 @@ var init_launch = __esm(() => { }); // packages/unifia/src/lsp/server-shared.ts -import path16 from "path"; +import path17 from "path"; import fs6 from "fs/promises"; var log7, pathExists = async (p2) => fs6.stat(p2).then(() => true).catch(() => false), run7 = (cmd, opts = {}) => Process.run(cmd, { ...opts, nothrow: true }), output = (cmd, opts = {}) => Process.text(cmd, { ...opts, nothrow: true }), NearestRoot = (includePatterns, excludePatterns) => { return async (file4) => { if (excludePatterns) { const excludedFiles = Filesystem.up({ targets: excludePatterns, - start: path16.dirname(file4), + start: path17.dirname(file4), stop: Instance.directory }); const excluded = await excludedFiles.next(); @@ -169204,14 +169501,14 @@ var log7, pathExists = async (p2) => fs6.stat(p2).then(() => true).catch(() => f } const files = Filesystem.up({ targets: includePatterns, - start: path16.dirname(file4), + start: path17.dirname(file4), stop: Instance.directory }); const first2 = await files.next(); await files.return(); if (!first2.value) return Instance.directory; - return path16.dirname(first2.value); + return path17.dirname(first2.value); }; }; var init_server_shared = __esm(async () => { @@ -169225,7 +169522,7 @@ var init_server_shared = __esm(async () => { }); // packages/unifia/src/lsp/server-defs-a.ts -import path17 from "path"; +import path18 from "path"; import fs7 from "fs/promises"; import { text as text5 } from "stream/consumers"; var Deno2, Typescript, Vue, ESLint, Oxlint, Biome, Gopls, Rubocop, Ty, Pyright, ElixirLS, Zls; @@ -169248,14 +169545,14 @@ var init_server_defs_a = __esm(async () => { root: async (file4) => { const files = Filesystem.up({ targets: ["deno.json", "deno.jsonc"], - start: path17.dirname(file4), + start: path18.dirname(file4), stop: Instance.directory }); const first2 = await files.next(); await files.return(); if (!first2.value) return; - return path17.dirname(first2.value); + return path18.dirname(first2.value); }, extensions: [".ts", ".tsx", ".js", ".jsx", ".mjs"], async spawn(root) { @@ -169336,7 +169633,7 @@ var init_server_defs_a = __esm(async () => { if (!eslint) return; log7.info("spawning eslint server"); - const serverPath = path17.join(Global.Path.bin, "vscode-eslint", "server", "out", "eslintServer.js"); + const serverPath = path18.join(Global.Path.bin, "vscode-eslint", "server", "out", "eslintServer.js"); if (!await Filesystem.exists(serverPath)) { if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; @@ -169344,7 +169641,7 @@ var init_server_defs_a = __esm(async () => { const response = await fetch("https://github.com/microsoft/vscode-eslint/archive/refs/heads/main.zip"); if (!response.ok) return; - const zipPath = path17.join(Global.Path.bin, "vscode-eslint.zip"); + const zipPath = path18.join(Global.Path.bin, "vscode-eslint.zip"); if (response.body) await Filesystem.writeStream(zipPath, response.body); const ok = await Archive.extractZip(zipPath, Global.Path.bin).then(() => true).catch((error46) => { @@ -169354,8 +169651,8 @@ var init_server_defs_a = __esm(async () => { if (!ok) return; await fs7.rm(zipPath, { force: true }); - const extractedPath = path17.join(Global.Path.bin, "vscode-eslint-main"); - const finalPath = path17.join(Global.Path.bin, "vscode-eslint"); + const extractedPath = path18.join(Global.Path.bin, "vscode-eslint-main"); + const finalPath = path18.join(Global.Path.bin, "vscode-eslint"); const stats = await fs7.stat(finalPath).catch(() => { return; }); @@ -169394,10 +169691,10 @@ var init_server_defs_a = __esm(async () => { extensions: [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".mts", ".cts", ".vue", ".astro", ".svelte"], async spawn(root) { const ext2 = process.platform === "win32" ? ".cmd" : ""; - const serverTarget = path17.join("node_modules", ".bin", "oxc_language_server" + ext2); - const lintTarget = path17.join("node_modules", ".bin", "oxlint" + ext2); + const serverTarget = path18.join("node_modules", ".bin", "oxc_language_server" + ext2); + const lintTarget = path18.join("node_modules", ".bin", "oxlint" + ext2); const resolveBin = async (target) => { - const localBin = path17.join(root, target); + const localBin = path18.join(root, target); if (await Filesystem.exists(localBin)) return localBin; const candidates = Filesystem.up({ @@ -169479,7 +169776,7 @@ var init_server_defs_a = __esm(async () => { ".html" ], async spawn(root) { - const localBin = path17.join(root, "node_modules", ".bin", "biome"); + const localBin = path18.join(root, "node_modules", ".bin", "biome"); let bin; if (await Filesystem.exists(localBin)) bin = localBin; @@ -169537,7 +169834,7 @@ var init_server_defs_a = __esm(async () => { log7.error("Failed to install gopls"); return; } - bin = path17.join(Global.Path.bin, "gopls" + (process.platform === "win32" ? ".exe" : "")); + bin = path18.join(Global.Path.bin, "gopls" + (process.platform === "win32" ? ".exe" : "")); log7.info(`installed gopls`, { bin }); @@ -169575,7 +169872,7 @@ var init_server_defs_a = __esm(async () => { log7.error("Failed to install rubocop"); return; } - bin = path17.join(Global.Path.bin, "rubocop" + (process.platform === "win32" ? ".exe" : "")); + bin = path18.join(Global.Path.bin, "rubocop" + (process.platform === "win32" ? ".exe" : "")); log7.info(`installed rubocop`, { bin }); @@ -169605,10 +169902,10 @@ var init_server_defs_a = __esm(async () => { } let binary2 = which("ty"); const initialization = {}; - const potentialVenvPaths = [process.env["VIRTUAL_ENV"], path17.join(root, ".venv"), path17.join(root, "venv")].filter((p2) => p2 !== undefined); + const potentialVenvPaths = [process.env["VIRTUAL_ENV"], path18.join(root, ".venv"), path18.join(root, "venv")].filter((p2) => p2 !== undefined); for (const venvPath of potentialVenvPaths) { const isWindows = process.platform === "win32"; - const potentialPythonPath = isWindows ? path17.join(venvPath, "Scripts", "python.exe") : path17.join(venvPath, "bin", "python"); + const potentialPythonPath = isWindows ? path18.join(venvPath, "Scripts", "python.exe") : path18.join(venvPath, "bin", "python"); if (await Filesystem.exists(potentialPythonPath)) { initialization["pythonPath"] = potentialPythonPath; break; @@ -169617,7 +169914,7 @@ var init_server_defs_a = __esm(async () => { if (!binary2) { for (const venvPath of potentialVenvPaths) { const isWindows = process.platform === "win32"; - const potentialTyPath = isWindows ? path17.join(venvPath, "Scripts", "ty.exe") : path17.join(venvPath, "bin", "ty"); + const potentialTyPath = isWindows ? path18.join(venvPath, "Scripts", "ty.exe") : path18.join(venvPath, "bin", "ty"); if (await Filesystem.exists(potentialTyPath)) { binary2 = potentialTyPath; break; @@ -169654,10 +169951,10 @@ var init_server_defs_a = __esm(async () => { } args3.push("--stdio"); const initialization = {}; - const potentialVenvPaths = [process.env["VIRTUAL_ENV"], path17.join(root, ".venv"), path17.join(root, "venv")].filter((p2) => p2 !== undefined); + const potentialVenvPaths = [process.env["VIRTUAL_ENV"], path18.join(root, ".venv"), path18.join(root, "venv")].filter((p2) => p2 !== undefined); for (const venvPath of potentialVenvPaths) { const isWindows = process.platform === "win32"; - const potentialPythonPath = isWindows ? path17.join(venvPath, "Scripts", "python.exe") : path17.join(venvPath, "bin", "python"); + const potentialPythonPath = isWindows ? path18.join(venvPath, "Scripts", "python.exe") : path18.join(venvPath, "bin", "python"); if (await Filesystem.exists(potentialPythonPath)) { initialization["pythonPath"] = potentialPythonPath; break; @@ -169682,8 +169979,8 @@ var init_server_defs_a = __esm(async () => { async spawn(root) { let binary2 = which("elixir-ls"); if (!binary2) { - const elixirLsPath = path17.join(Global.Path.bin, "elixir-ls"); - binary2 = path17.join(Global.Path.bin, "elixir-ls-master", "release", process.platform === "win32" ? "language_server.bat" : "language_server.sh"); + const elixirLsPath = path18.join(Global.Path.bin, "elixir-ls"); + binary2 = path18.join(Global.Path.bin, "elixir-ls-master", "release", process.platform === "win32" ? "language_server.bat" : "language_server.sh"); if (!await Filesystem.exists(binary2)) { const elixir = which("elixir"); if (!elixir) { @@ -169696,7 +169993,7 @@ var init_server_defs_a = __esm(async () => { const response = await fetch("https://github.com/elixir-lsp/elixir-ls/archive/refs/heads/master.zip"); if (!response.ok) return; - const zipPath = path17.join(Global.Path.bin, "elixir-ls.zip"); + const zipPath = path18.join(Global.Path.bin, "elixir-ls.zip"); if (response.body) await Filesystem.writeStream(zipPath, response.body); const ok = await Archive.extractZip(zipPath, Global.Path.bin).then(() => true).catch((error46) => { @@ -169709,7 +170006,7 @@ var init_server_defs_a = __esm(async () => { force: true, recursive: true }); - const cwd = path17.join(Global.Path.bin, "elixir-ls-master"); + const cwd = path18.join(Global.Path.bin, "elixir-ls-master"); const env3 = { MIX_ENV: "prod", ...process.env }; await Process.run(["mix", "deps.get"], { cwd, env: env3 }); await Process.run(["mix", "compile"], { cwd, env: env3 }); @@ -169789,7 +170086,7 @@ var init_server_defs_a = __esm(async () => { log7.error("Failed to download zls"); return; } - const tempPath = path17.join(Global.Path.bin, assetName); + const tempPath = path18.join(Global.Path.bin, assetName); if (downloadResponse.body) await Filesystem.writeStream(tempPath, downloadResponse.body); if (ext2 === "zip") { @@ -169803,7 +170100,7 @@ var init_server_defs_a = __esm(async () => { await run7(["tar", "-xf", tempPath], { cwd: Global.Path.bin }); } await fs7.rm(tempPath, { force: true }); - bin = path17.join(Global.Path.bin, "zls" + (platform === "win32" ? ".exe" : "")); + bin = path18.join(Global.Path.bin, "zls" + (platform === "win32" ? ".exe" : "")); if (!await Filesystem.exists(bin)) { log7.error("Failed to extract zls binary"); return; @@ -169823,7 +170120,7 @@ var init_server_defs_a = __esm(async () => { }); // packages/unifia/src/lsp/server-defs-b.ts -import path18 from "path"; +import path19 from "path"; import os6 from "os"; import fs8 from "fs/promises"; var CSharp, FSharp, SourceKit, RustAnalyzer, Clangd, Svelte, Astro, JDTLS, KotlinLS, YamlLS, LuaLS; @@ -169852,7 +170149,7 @@ var init_server_defs_b = __esm(async () => { log7.error(".NET SDK is required to install csharp-ls"); return; } - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; log7.info("installing csharp-ls via dotnet tool"); const proc = Process.spawn(["dotnet", "tool", "install", "csharp-ls", "--tool-path", Global.Path.bin], { @@ -169865,7 +170162,7 @@ var init_server_defs_b = __esm(async () => { log7.error("Failed to install csharp-ls"); return; } - bin = path18.join(Global.Path.bin, "csharp-ls" + (process.platform === "win32" ? ".exe" : "")); + bin = path19.join(Global.Path.bin, "csharp-ls" + (process.platform === "win32" ? ".exe" : "")); log7.info(`installed csharp-ls`, { bin }); } return { @@ -169886,7 +170183,7 @@ var init_server_defs_b = __esm(async () => { log7.error(".NET SDK is required to install fsautocomplete"); return; } - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; log7.info("installing fsautocomplete via dotnet tool"); const proc = Process.spawn(["dotnet", "tool", "install", "fsautocomplete", "--tool-path", Global.Path.bin], { @@ -169899,7 +170196,7 @@ var init_server_defs_b = __esm(async () => { log7.error("Failed to install fsautocomplete"); return; } - bin = path18.join(Global.Path.bin, "fsautocomplete" + (process.platform === "win32" ? ".exe" : "")); + bin = path19.join(Global.Path.bin, "fsautocomplete" + (process.platform === "win32" ? ".exe" : "")); log7.info(`installed fsautocomplete`, { bin }); } return { @@ -169943,15 +170240,15 @@ var init_server_defs_b = __esm(async () => { return; } let currentDir = crateRoot; - while (currentDir !== path18.dirname(currentDir)) { - const cargoTomlPath = path18.join(currentDir, "Cargo.toml"); + while (currentDir !== path19.dirname(currentDir)) { + const cargoTomlPath = path19.join(currentDir, "Cargo.toml"); try { const cargoTomlContent = await Filesystem.readText(cargoTomlPath); if (cargoTomlContent.includes("[workspace]")) { return currentDir; } } catch (_err) {} - const parentDir = path18.dirname(currentDir); + const parentDir = path19.dirname(currentDir); if (parentDir === currentDir) break; currentDir = parentDir; @@ -169989,7 +170286,7 @@ var init_server_defs_b = __esm(async () => { }; } const ext2 = process.platform === "win32" ? ".exe" : ""; - const direct = path18.join(Global.Path.bin, "clangd" + ext2); + const direct = path19.join(Global.Path.bin, "clangd" + ext2); if (await Filesystem.exists(direct)) { return { process: spawn(direct, args3, { @@ -170003,7 +170300,7 @@ var init_server_defs_b = __esm(async () => { continue; if (!entry.name.startsWith("clangd_")) continue; - const candidate = path18.join(Global.Path.bin, entry.name, "bin", "clangd" + ext2); + const candidate = path19.join(Global.Path.bin, entry.name, "bin", "clangd" + ext2); if (await Filesystem.exists(candidate)) { return { process: spawn(candidate, args3, { @@ -170012,7 +170309,7 @@ var init_server_defs_b = __esm(async () => { }; } } - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; log7.info("downloading clangd from GitHub releases"); const releaseResponse = await fetch("https://api.github.com/repos/clangd/clangd/releases/latest"); @@ -170058,7 +170355,7 @@ var init_server_defs_b = __esm(async () => { log7.error("Failed to download clangd"); return; } - const archive = path18.join(Global.Path.bin, name3); + const archive = path19.join(Global.Path.bin, name3); const buf = await downloadResponse.arrayBuffer(); if (buf.byteLength === 0) { log7.error("Failed to write clangd archive"); @@ -170083,7 +170380,7 @@ var init_server_defs_b = __esm(async () => { await run7(["tar", "-xf", archive], { cwd: Global.Path.bin }); } await fs8.rm(archive, { force: true }); - const bin = path18.join(Global.Path.bin, "clangd_" + tag4, "bin", "clangd" + ext2); + const bin = path19.join(Global.Path.bin, "clangd_" + tag4, "bin", "clangd" + ext2); if (!await Filesystem.exists(bin)) { log7.error("Failed to extract clangd binary"); return; @@ -170091,8 +170388,8 @@ var init_server_defs_b = __esm(async () => { if (platform !== "win32") { await fs8.chmod(bin, 493).catch(() => {}); } - await fs8.unlink(path18.join(Global.Path.bin, "clangd")).catch(() => {}); - await fs8.symlink(bin, path18.join(Global.Path.bin, "clangd")).catch(() => {}); + await fs8.unlink(path19.join(Global.Path.bin, "clangd")).catch(() => {}); + await fs8.symlink(bin, path19.join(Global.Path.bin, "clangd")).catch(() => {}); log7.info(`installed clangd`, { bin }); return { process: spawn(bin, args3, { @@ -170109,7 +170406,7 @@ var init_server_defs_b = __esm(async () => { let binary2 = which("svelteserver"); const args3 = []; if (!binary2) { - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; const resolved = await Npm.which("svelte-language-server"); if (!resolved) @@ -170139,11 +170436,11 @@ var init_server_defs_b = __esm(async () => { log7.info("typescript not found, required for Astro language server"); return; } - const tsdk = path18.dirname(tsserver); + const tsdk = path19.dirname(tsserver); let binary2 = which("astro-ls"); const args3 = []; if (!binary2) { - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; const resolved = await Npm.which("@astrojs/language-server"); if (!resolved) @@ -170200,11 +170497,11 @@ var init_server_defs_b = __esm(async () => { log7.error("JDTLS requires at least Java 21."); return; } - const distPath = path18.join(Global.Path.bin, "jdtls"); - const launcherDir = path18.join(distPath, "plugins"); + const distPath = path19.join(Global.Path.bin, "jdtls"); + const launcherDir = path19.join(distPath, "plugins"); const installed = await pathExists(launcherDir); if (!installed) { - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; log7.info("Downloading JDTLS LSP server."); await fs8.mkdir(distPath, { recursive: true }); @@ -170216,23 +170513,23 @@ var init_server_defs_b = __esm(async () => { log7.error("Failed to download JDTLS", { status: download.status, statusText: download.statusText }); return; } - await Filesystem.writeStream(path18.join(distPath, archiveName), download.body); + await Filesystem.writeStream(path19.join(distPath, archiveName), download.body); log7.info("Extracting JDTLS archive"); const tarResult = await run7(["tar", "-xzf", archiveName], { cwd: distPath }); if (tarResult.code !== 0) { log7.error("Failed to extract JDTLS", { exitCode: tarResult.code, stderr: tarResult.stderr.toString() }); return; } - await fs8.rm(path18.join(distPath, archiveName), { force: true }); + await fs8.rm(path19.join(distPath, archiveName), { force: true }); log7.info("JDTLS download and extraction completed"); } const jarFileName = (await fs8.readdir(launcherDir).catch(() => [])).find((item) => /^org\.eclipse\.equinox\.launcher_.*\.jar$/.test(item))?.trim() ?? ""; - const launcherJar = path18.join(launcherDir, jarFileName); + const launcherJar = path19.join(launcherDir, jarFileName); if (!await pathExists(launcherJar)) { log7.error(`Failed to locate the JDTLS launcher module in the installed directory: ${distPath}.`); return; } - const configFile = path18.join(distPath, (() => { + const configFile = path19.join(distPath, (() => { switch (process.platform) { case "darwin": return "config_mac"; @@ -170244,7 +170541,7 @@ var init_server_defs_b = __esm(async () => { return "config_linux"; } })()); - const dataDir = await fs8.mkdtemp(path18.join(os6.tmpdir(), "opencode-jdtls-data")); + const dataDir = await fs8.mkdtemp(path19.join(os6.tmpdir(), "opencode-jdtls-data")); return { process: spawn(java, [ "-jar", @@ -170282,11 +170579,11 @@ var init_server_defs_b = __esm(async () => { return NearestRoot(["pom.xml"])(file4); }, async spawn(root) { - const distPath = path18.join(Global.Path.bin, "kotlin-ls"); - const launcherScript = process.platform === "win32" ? path18.join(distPath, "kotlin-lsp.cmd") : path18.join(distPath, "kotlin-lsp.sh"); + const distPath = path19.join(Global.Path.bin, "kotlin-ls"); + const launcherScript = process.platform === "win32" ? path19.join(distPath, "kotlin-lsp.cmd") : path19.join(distPath, "kotlin-lsp.sh"); const installed = await Filesystem.exists(launcherScript); if (!installed) { - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; log7.info("Downloading Kotlin Language Server from GitHub."); const releaseResponse = await fetch("https://api.github.com/repos/Kotlin/kotlin-lsp/releases/latest"); @@ -170323,7 +170620,7 @@ var init_server_defs_b = __esm(async () => { const assetName = `kotlin-lsp-${version4}-${kotlinPlatform}-${kotlinArch}.zip`; const releaseURL = `https://download-cdn.jetbrains.com/kotlin-lsp/${version4}/${assetName}`; await fs8.mkdir(distPath, { recursive: true }); - const archivePath = path18.join(distPath, "kotlin-ls.zip"); + const archivePath = path19.join(distPath, "kotlin-ls.zip"); const download = await fetch(releaseURL); if (!download.ok || !download.body) { log7.error("Failed to download Kotlin Language Server", { @@ -170364,7 +170661,7 @@ var init_server_defs_b = __esm(async () => { let binary2 = which("yaml-language-server"); const args3 = []; if (!binary2) { - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; const resolved = await Npm.which("yaml-language-server"); if (!resolved) @@ -170398,7 +170695,7 @@ var init_server_defs_b = __esm(async () => { async spawn(root) { let bin = which("lua-language-server"); if (!bin) { - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; log7.info("downloading lua-language-server from GitHub releases"); const releaseResponse = await fetch("https://api.github.com/repos/LuaLS/lua-language-server/releases/latest"); @@ -170450,10 +170747,10 @@ var init_server_defs_b = __esm(async () => { log7.error("Failed to download lua-language-server"); return; } - const tempPath = path18.join(Global.Path.bin, assetName); + const tempPath = path19.join(Global.Path.bin, assetName); if (downloadResponse.body) await Filesystem.writeStream(tempPath, downloadResponse.body); - const installDir = path18.join(Global.Path.bin, `lua-language-server-${lualsArch}-${lualsPlatform}`); + const installDir = path19.join(Global.Path.bin, `lua-language-server-${lualsArch}-${lualsPlatform}`); const stats = await fs8.stat(installDir).catch(() => { return; }); @@ -170477,7 +170774,7 @@ var init_server_defs_b = __esm(async () => { return; } await fs8.rm(tempPath, { force: true }); - bin = path18.join(installDir, "bin", "lua-language-server" + (platform === "win32" ? ".exe" : "")); + bin = path19.join(installDir, "bin", "lua-language-server" + (platform === "win32" ? ".exe" : "")); if (!await Filesystem.exists(bin)) { log7.error("Failed to extract lua-language-server binary"); return; @@ -170504,7 +170801,7 @@ var init_server_defs_b = __esm(async () => { }); // packages/unifia/src/lsp/server-defs-c.ts -import path19 from "path"; +import path20 from "path"; import fs9 from "fs/promises"; var PHPIntelephense, Prisma, Dart, Ocaml, BashLS, TerraformLS, TexLab, DockerfileLS, Gleam, Clojure, Nixd, Tinymist, HLS, JuliaLS; var init_server_defs_c = __esm(async () => { @@ -170527,7 +170824,7 @@ var init_server_defs_c = __esm(async () => { let binary2 = which("intelephense"); const args3 = []; if (!binary2) { - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; const resolved = await Npm.which("intelephense"); if (!resolved) @@ -170610,7 +170907,7 @@ var init_server_defs_c = __esm(async () => { let binary2 = which("bash-language-server"); const args3 = []; if (!binary2) { - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; const resolved = await Npm.which("bash-language-server"); if (!resolved) @@ -170636,7 +170933,7 @@ var init_server_defs_c = __esm(async () => { async spawn(root) { let bin = which("terraform-ls"); if (!bin) { - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; log7.info("downloading terraform-ls from HashiCorp releases"); const releaseResponse = await fetch("https://api.releases.hashicorp.com/v1/releases/terraform-ls/latest"); @@ -170660,7 +170957,7 @@ var init_server_defs_c = __esm(async () => { log7.error("Failed to download terraform-ls"); return; } - const tempPath = path19.join(Global.Path.bin, "terraform-ls.zip"); + const tempPath = path20.join(Global.Path.bin, "terraform-ls.zip"); if (downloadResponse.body) await Filesystem.writeStream(tempPath, downloadResponse.body); const ok = await Archive.extractZip(tempPath, Global.Path.bin).then(() => true).catch((error46) => { @@ -170670,7 +170967,7 @@ var init_server_defs_c = __esm(async () => { if (!ok) return; await fs9.rm(tempPath, { force: true }); - bin = path19.join(Global.Path.bin, "terraform-ls" + (platform === "win32" ? ".exe" : "")); + bin = path20.join(Global.Path.bin, "terraform-ls" + (platform === "win32" ? ".exe" : "")); if (!await Filesystem.exists(bin)) { log7.error("Failed to extract terraform-ls binary"); return; @@ -170700,7 +170997,7 @@ var init_server_defs_c = __esm(async () => { async spawn(root) { let bin = which("texlab"); if (!bin) { - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; log7.info("downloading texlab from GitHub releases"); const response = await fetch("https://api.github.com/repos/latex-lsp/texlab/releases/latest"); @@ -170731,7 +171028,7 @@ var init_server_defs_c = __esm(async () => { log7.error("Failed to download texlab"); return; } - const tempPath = path19.join(Global.Path.bin, assetName); + const tempPath = path20.join(Global.Path.bin, assetName); if (downloadResponse.body) await Filesystem.writeStream(tempPath, downloadResponse.body); if (ext2 === "zip") { @@ -170746,7 +171043,7 @@ var init_server_defs_c = __esm(async () => { await run7(["tar", "-xzf", tempPath], { cwd: Global.Path.bin }); } await fs9.rm(tempPath, { force: true }); - bin = path19.join(Global.Path.bin, "texlab" + (platform === "win32" ? ".exe" : "")); + bin = path20.join(Global.Path.bin, "texlab" + (platform === "win32" ? ".exe" : "")); if (!await Filesystem.exists(bin)) { log7.error("Failed to extract texlab binary"); return; @@ -170771,7 +171068,7 @@ var init_server_defs_c = __esm(async () => { let binary2 = which("docker-langserver"); const args3 = []; if (!binary2) { - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; const resolved = await Npm.which("dockerfile-language-server-nodejs"); if (!resolved) @@ -170861,7 +171158,7 @@ var init_server_defs_c = __esm(async () => { async spawn(root) { let bin = which("tinymist"); if (!bin) { - if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) + if (Flag.UNIFIA_DISABLE_LSP_DOWNLOAD) return; log7.info("downloading tinymist from GitHub releases"); const response = await fetch("https://api.github.com/repos/Myriad-Dreamin/tinymist/releases/latest"); @@ -170897,7 +171194,7 @@ var init_server_defs_c = __esm(async () => { log7.error("Failed to download tinymist"); return; } - const tempPath = path19.join(Global.Path.bin, assetName); + const tempPath = path20.join(Global.Path.bin, assetName); if (downloadResponse.body) await Filesystem.writeStream(tempPath, downloadResponse.body); if (ext2 === "zip") { @@ -170911,7 +171208,7 @@ var init_server_defs_c = __esm(async () => { await run7(["tar", "-xzf", tempPath, "--strip-components=1"], { cwd: Global.Path.bin }); } await fs9.rm(tempPath, { force: true }); - bin = path19.join(Global.Path.bin, "tinymist" + (platform === "win32" ? ".exe" : "")); + bin = path20.join(Global.Path.bin, "tinymist" + (platform === "win32" ? ".exe" : "")); if (!await Filesystem.exists(bin)) { log7.error("Failed to extract tinymist binary"); return; @@ -171090,8 +171387,8 @@ function toBatchEvents(projection) { class LangfuseExporter { config; name = "langfuse"; - constructor(config3) { - this.config = config3; + constructor(config2) { + this.config = config2; } async export(batch) { if (!batch.length) @@ -171133,10 +171430,10 @@ var init_langfuse = __esm(() => { }); // packages/unifia/src/observability/exporter.ts -function fromConfig(config3) { - if (!config3?.exporters?.length) +function fromConfig(config2) { + if (!config2?.exporters?.length) return []; - return config3.exporters.map((entry) => { + return config2.exporters.map((entry) => { switch (entry.type) { case "langfuse": return new LangfuseExporter(entry); @@ -171458,7 +171755,7 @@ var init_config_schema = __esm(async () => { $schema: zod_default.string().optional().describe("JSON schema reference for configuration validation"), logLevel: Log.Level.optional().describe("Log level"), server: Server.optional().describe("Server configuration for unifia serve and web commands"), - command: zod_default.record(zod_default.string(), Command).optional().describe("Command configuration, see https://opencode.ai/docs/commands"), + command: zod_default.record(zod_default.string(), Command).optional().describe("Command configuration, see https://github.com/Rwanbt/unifia"), skills: Skills.optional().describe("Additional skill folder paths"), watcher: zod_default.object({ ignore: zod_default.array(zod_default.string()).optional() @@ -171487,7 +171784,7 @@ var init_config_schema = __esm(async () => { title: Agent.optional(), summary: Agent.optional(), compaction: Agent.optional() - }).catchall(Agent).optional().describe("Agent configuration, see https://opencode.ai/docs/agents"), + }).catchall(Agent).optional().describe("Agent configuration, see https://github.com/Rwanbt/unifia"), provider: zod_default.record(zod_default.string(), Provider).optional().describe("Custom provider configurations and model overrides"), mcp: zod_default.record(zod_default.string(), zod_default.union([ Mcp, @@ -171524,12 +171821,12 @@ var init_config_schema = __esm(async () => { if (typeof data2 === "boolean") return true; const serverIds = new Set(Object.values(LSPServer).map((s5) => s5.id)); - return Object.entries(data2).every(([id2, config3]) => { - if (config3.disabled) + return Object.entries(data2).every(([id2, config2]) => { + if (config2.disabled) return true; if (serverIds.has(id2)) return true; - return Boolean(config3.extensions); + return Boolean(config2.extensions); }); }, { error: "For custom LSP servers, 'extensions' array is required." @@ -172492,7 +172789,7 @@ function ceil2(x3) { function clamp9(x3, min13, max13) { return new this(x3).clamp(min13, max13); } -function config3(obj) { +function config2(obj) { if (!obj || typeof obj !== "object") throw Error(decimalError + "Object expected"); var i6, p2, v3, useDefaults = obj.defaults === true, ps2 = [ @@ -172655,7 +172952,7 @@ function clone3(obj) { Decimal.ROUND_HALF_CEIL = 7; Decimal.ROUND_HALF_FLOOR = 8; Decimal.EUCLID = 9; - Decimal.config = Decimal.set = config3; + Decimal.config = Decimal.set = config2; Decimal.clone = clone3; Decimal.isDecimal = isDecimalInstance; Decimal.abs = abs4; @@ -174129,7 +174426,7 @@ var init_sync = __esm(async () => { } Database.transaction((tx2) => { projector(tx2, event.data); - if (Flag.OPENCODE_EXPERIMENTAL_WORKSPACES) { + if (Flag.UNIFIA_EXPERIMENTAL_WORKSPACES) { tx2.insert(EventSequenceTable).values({ aggregate_id: event.aggregateID, seq: event.seq @@ -174231,7 +174528,7 @@ var init_sync = __esm(async () => { // packages/unifia/src/git/credentials.ts import fs10 from "fs/promises"; import os7 from "os"; -import path20 from "path"; +import path21 from "path"; async function readCredentials() { try { const raw3 = await fs10.readFile(CREDS_FILE, "utf8"); @@ -174268,8 +174565,8 @@ async function buildAuthEnv(creds) { if (creds.passphrase) { throw new Error("SSH keys with a passphrase are not yet supported. Please use an unencrypted key or HTTPS token auth."); } - const keyDir = await fs10.mkdtemp(path20.join(os7.tmpdir(), "oc-git-")); - const keyPath = path20.join(keyDir, "key"); + const keyDir = await fs10.mkdtemp(path21.join(os7.tmpdir(), "oc-git-")); + const keyPath = path21.join(keyDir, "key"); await fs10.writeFile(keyPath, creds.privateKey, { mode: 384, encoding: "utf8" }); const sshCmd = `ssh -i "${keyPath}" -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new -o BatchMode=yes`; return { @@ -174287,7 +174584,7 @@ function maskCredentials(creds) { var CREDS_FILE, CREDS_MODE = 384; var init_credentials = __esm(async () => { await init_global(); - CREDS_FILE = path20.join(Global.Path.config, "git-credentials.json"); + CREDS_FILE = path21.join(Global.Path.config, "git-credentials.json"); }); // packages/unifia/src/security/dlp.ts @@ -174529,12 +174826,12 @@ var init_client = __esm(async () => { }); // packages/unifia/src/github/auth.ts -import path21 from "path"; +import path22 from "path"; function backend() { - const override = process.env.OPENCODE_AUTH_STORAGE?.toLowerCase(); + const override = process.env.UNIFIA_AUTH_STORAGE?.toLowerCase(); if (override === "file" || override === "keychain" || override === "encrypted-file") return override; - return process.env.OPENCODE_CLIENT === "mobile-embedded" ? "encrypted-file" : "file"; + return process.env.UNIFIA_CLIENT === "mobile-embedded" ? "encrypted-file" : "file"; } function keychain() { const kc = new KeychainStorage(SERVICE); @@ -174572,7 +174869,7 @@ async function writeEncrypted(session) { const iv = crypto3.randomBytes(12); const cipher = crypto3.createCipheriv("aes-256-gcm", key, iv); const ciphertext = Buffer.concat([cipher.update(JSON.stringify(session), "utf8"), cipher.final()]); - await fs11.mkdir(path21.dirname(encryptedFile2), { recursive: true }); + await fs11.mkdir(path22.dirname(encryptedFile2), { recursive: true }); await fs11.writeFile(encryptedFile2, JSON.stringify({ v: 1, iv: iv.toString("base64"), @@ -174594,9 +174891,15 @@ async function writePlain(session) { await fs11.rm(file4, { force: true }); return; } - const tmp = `${file4}.tmp`; - await fs11.writeFile(tmp, JSON.stringify(session, null, 2), { mode: 384 }); - await fs11.rename(tmp, file4); + const crypto3 = await import("crypto"); + const tmp = `${file4}.${process.pid}.${crypto3.randomUUID()}.tmp`; + try { + await fs11.writeFile(tmp, JSON.stringify(session, null, 2), { mode: 384, flag: "wx" }); + await fs11.rename(tmp, file4); + } catch (cause) { + await fs11.rm(tmp, { force: true }); + throw cause; + } } async function readSession() { const b2 = backend(); @@ -174721,12 +175024,12 @@ var init_auth2 = __esm(async () => { init_dlp(), init_client() ]); - file4 = path21.join(Global.Path.data, "github-auth.json"); - encryptedFile2 = path21.join(Global.Path.data, "github-auth.enc.json"); + file4 = path22.join(Global.Path.data, "github-auth.json"); + encryptedFile2 = path22.join(Global.Path.data, "github-auth.enc.json"); }); // packages/unifia/src/git/android-launcher.ts -import path22 from "path"; +import path23 from "path"; function resolveGitInvocation() { if (cached4) return cached4; @@ -174736,10 +175039,10 @@ function resolveGitInvocation() { cached4 = { bin: "git", args: (gitArgs) => gitArgs }; return cached4; } - const gitBin = path22.posix.join(rootfs, "usr/bin/git"); - const gitExecPath = path22.posix.join(rootfs, "usr/libexec/git-core"); - const gitSslCaInfo = path22.posix.join(rootfs, "etc/ssl/certs/ca-certificates.crt"); - const ldLibraryPath = [path22.posix.join(rootfs, "lib"), path22.posix.join(rootfs, "usr/lib"), gitExecPath].join(":"); + const gitBin = path23.posix.join(rootfs, "usr/bin/git"); + const gitExecPath = path23.posix.join(rootfs, "usr/libexec/git-core"); + const gitSslCaInfo = path23.posix.join(rootfs, "etc/ssl/certs/ca-certificates.crt"); + const ldLibraryPath = [path23.posix.join(rootfs, "lib"), path23.posix.join(rootfs, "usr/lib"), gitExecPath].join(":"); cached4 = { bin: linker, args: (gitArgs) => [`--library-path`, ldLibraryPath, gitBin, `--exec-path=${gitExecPath}`, ...gitArgs], @@ -174801,7 +175104,7 @@ async function buildGithubAuthEnv(cwd, remote) { } } async function persistGithubGitConfigForTerminal() { - if (process.env.OPENCODE_CLIENT !== "mobile-embedded") + if (process.env.UNIFIA_CLIENT !== "mobile-embedded") return; try { const manual2 = await readCredentials(); @@ -175327,7 +175630,7 @@ var init_git = __esm(async () => { }); // packages/unifia/src/storage/storage.ts -import path23 from "path"; +import path24 from "path"; var Storage; var init_storage = __esm(async () => { init_error(); @@ -175374,7 +175677,7 @@ var init_storage = __esm(async () => { } Storage.Service = Service3; function file5(dir2, key) { - return path23.join(dir2, ...key) + ".json"; + return path24.join(dir2, ...key) + ".json"; } function missing(err2) { if (!err2 || typeof err2 !== "object") @@ -175392,7 +175695,7 @@ var init_storage = __esm(async () => { } const MIGRATIONS = [ exports_Effect.fn("Storage.migration.1")(function* (dir2, fs12) { - const project = path23.resolve(dir2, "../project"); + const project = path24.resolve(dir2, "../project"); if (!(yield* fs12.isDir(project))) return; const projectDirs = yield* fs12.glob("*", { @@ -175400,7 +175703,7 @@ var init_storage = __esm(async () => { include: "all" }); for (const projectDir of projectDirs) { - const full = path23.join(project, projectDir); + const full = path24.join(project, projectDir); if (!(yield* fs12.isDir(full))) continue; log11.info(`migrating project ${projectDir}`); @@ -175430,7 +175733,7 @@ var init_storage = __esm(async () => { if (!id2) continue; projectID = id2; - yield* fs12.writeWithDirs(path23.join(dir2, "project", projectID + ".json"), JSON.stringify({ + yield* fs12.writeWithDirs(path24.join(dir2, "project", projectID + ".json"), JSON.stringify({ id: id2, vcs: "git", worktree, @@ -175444,7 +175747,7 @@ var init_storage = __esm(async () => { cwd: full, absolute: true })) { - const dest = path23.join(dir2, "session", projectID, path23.basename(sessionFile)); + const dest = path24.join(dir2, "session", projectID, path24.basename(sessionFile)); log11.info("copying", { sessionFile, dest }); const session = yield* fs12.readJson(sessionFile); const info3 = decodeSession(session, { onExcessProperty: "preserve" }); @@ -175456,7 +175759,7 @@ var init_storage = __esm(async () => { cwd: full, absolute: true })) { - const next3 = path23.join(dir2, "message", info3.value.id, path23.basename(msgFile)); + const next3 = path24.join(dir2, "message", info3.value.id, path24.basename(msgFile)); log11.info("copying", { msgFile, dest: next3 @@ -175471,7 +175774,7 @@ var init_storage = __esm(async () => { cwd: full, absolute: true })) { - const out2 = path23.join(dir2, "part", item.value.id, path23.basename(partFile)); + const out2 = path24.join(dir2, "part", item.value.id, path24.basename(partFile)); const part = yield* fs12.readJson(partFile); log11.info("copying", { partFile, @@ -175494,8 +175797,8 @@ var init_storage = __esm(async () => { if (exports_Option.isNone(session)) continue; const diffs = session.value.summary.diffs; - yield* fs12.writeWithDirs(path23.join(dir2, "session_diff", session.value.id + ".json"), JSON.stringify(diffs, null, 2)); - yield* fs12.writeWithDirs(path23.join(dir2, "session", session.value.projectID, session.value.id + ".json"), JSON.stringify({ + yield* fs12.writeWithDirs(path24.join(dir2, "session_diff", session.value.id + ".json"), JSON.stringify(diffs, null, 2)); + yield* fs12.writeWithDirs(path24.join(dir2, "session", session.value.projectID, session.value.id + ".json"), JSON.stringify({ ...raw3, summary: { additions: diffs.reduce((sum9, x3) => sum9 + x3.additions, 0), @@ -175511,9 +175814,9 @@ var init_storage = __esm(async () => { lookup: () => exports_TxReentrantLock.make(), idleTimeToLive: 0 }); - const state2 = yield* exports_Effect.cached(exports_Effect.gen(function* () { - const dir2 = path23.join(Global.Path.data, "storage"); - const marker = path23.join(dir2, "migration"); + const state = yield* exports_Effect.cached(exports_Effect.gen(function* () { + const dir2 = path24.join(Global.Path.data, "storage"); + const marker = path24.join(dir2, "migration"); const migration = yield* fs12.readFileString(marker).pipe(exports_Effect.map(parseMigration), exports_Effect.catchIf(missing, () => exports_Effect.succeed(0)), exports_Effect.orElseSucceed(() => 0)); for (let i6 = migration;i6 < MIGRATIONS.length; i6++) { log11.info("running migration", { index: i6 }); @@ -175533,7 +175836,7 @@ var init_storage = __esm(async () => { yield* fs12.writeWithDirs(target, JSON.stringify(content, null, 2)); }); const withResolved = (key, fn3) => exports_Effect.scoped(exports_Effect.gen(function* () { - const target = file5((yield* state2).dir, key); + const target = file5((yield* state).dir, key); return yield* fn3(target, yield* exports_RcMap.get(locks, target)); })); const remove20 = exports_Effect.fn("Storage.remove")(function* (key) { @@ -175556,13 +175859,13 @@ var init_storage = __esm(async () => { yield* withResolved(key, (target, rw) => exports_TxReentrantLock.withWriteLock(rw, writeJson(target, content))); }); const list2 = exports_Effect.fn("Storage.list")(function* (prefix3) { - const dir2 = (yield* state2).dir; - const cwd = path23.join(dir2, ...prefix3); + const dir2 = (yield* state).dir; + const cwd = path24.join(dir2, ...prefix3); const result6 = yield* fs12.glob("**/*", { cwd, include: "file" }).pipe(exports_Effect.catch(() => exports_Effect.succeed([]))); - return result6.map((x3) => [...prefix3, ...x3.slice(0, -5).split(path23.sep)]).toSorted((a4, b2) => a4.join("/").localeCompare(b2.join("/"))); + return result6.map((x3) => [...prefix3, ...x3.slice(0, -5).split(path24.sep)]).toSorted((a4, b2) => a4.join("/").localeCompare(b2.join("/"))); }); return Service3.of({ remove: remove20, @@ -176385,8 +176688,8 @@ class ParseStatus2 { } } var makeIssue2 = (params) => { - const { data: data2, path: path24, errorMaps, issueData } = params; - const fullPath = [...path24, ...issueData.path || []]; + const { data: data2, path: path25, errorMaps, issueData } = params; + const fullPath = [...path25, ...issueData.path || []]; const fullIssue = { ...issueData, path: fullPath @@ -176431,11 +176734,11 @@ var init_errorUtil2 = __esm(() => { // node_modules/zod/v3/types.js class ParseInputLazyPath2 { - constructor(parent, value8, path24, key) { + constructor(parent, value8, path25, key) { this._cachedPath = []; this.parent = parent; this.data = value8; - this._path = path24; + this._path = path25; this._key = key; } get path() { @@ -179757,10 +180060,10 @@ var init_v3 = __esm(() => { // node_modules/eventsource-parser/dist/index.js function noop(_arg) {} -function createParser(config4) { - if (typeof config4 == "function") +function createParser(config3) { + if (typeof config3 == "function") throw new TypeError("`config` must be an object, got a function instead. Did you mean `createParser({onEvent: fn})`?"); - const { onEvent = noop, onError: onError5 = noop, onRetry = noop, onComment, maxBufferSize } = config4, pendingFragments = []; + const { onEvent = noop, onError: onError5 = noop, onRetry = noop, onComment, maxBufferSize } = config3, pendingFragments = []; let pendingFragmentsLength = 0, isFirstChunk = true, id2, data2 = "", dataLines = 0, eventType, terminated = false; function feed(chunk) { if (terminated) @@ -182356,19 +182659,19 @@ var require_token_io = __commonJS((exports, module2) => { getUserDataDir: () => getUserDataDir }); module2.exports = __toCommonJS(token_io_exports); - var import_path6 = __toESM2(__require("path")); + var import_path8 = __toESM2(__require("path")); var import_fs5 = __toESM2(__require("fs")); var import_os2 = __toESM2(__require("os")); var import_token_error = require_token_error(); function findRootDir() { try { let dir2 = process.cwd(); - while (dir2 !== import_path6.default.dirname(dir2)) { - const pkgPath = import_path6.default.join(dir2, ".vercel"); + while (dir2 !== import_path8.default.dirname(dir2)) { + const pkgPath = import_path8.default.join(dir2, ".vercel"); if (import_fs5.default.existsSync(pkgPath)) { return dir2; } - dir2 = import_path6.default.dirname(dir2); + dir2 = import_path8.default.dirname(dir2); } } catch (e2) { throw new import_token_error.VercelOidcTokenError("Token refresh only supported in node server environments"); @@ -182381,9 +182684,9 @@ var require_token_io = __commonJS((exports, module2) => { } switch (import_os2.default.platform()) { case "darwin": - return import_path6.default.join(import_os2.default.homedir(), "Library/Application Support"); + return import_path8.default.join(import_os2.default.homedir(), "Library/Application Support"); case "linux": - return import_path6.default.join(import_os2.default.homedir(), ".local/share"); + return import_path8.default.join(import_os2.default.homedir(), ".local/share"); case "win32": if (process.env.LOCALAPPDATA) { return process.env.LOCALAPPDATA; @@ -182425,14 +182728,14 @@ var require_auth_config = __commonJS((exports, module2) => { }); module2.exports = __toCommonJS(auth_config_exports); var fs12 = __toESM2(__require("fs")); - var path24 = __toESM2(__require("path")); + var path25 = __toESM2(__require("path")); var import_token_util = require_token_util(); function getAuthConfigPath() { const dataDir = (0, import_token_util.getVercelDataDir)(); if (!dataDir) { throw new Error(`Unable to find Vercel CLI data directory. Your platform: ${process.platform}. Supported: darwin, linux, win32.`); } - return path24.join(dataDir, "auth.json"); + return path25.join(dataDir, "auth.json"); } function readAuthConfig() { try { @@ -182449,13 +182752,13 @@ var require_auth_config = __commonJS((exports, module2) => { return null; } } - function writeAuthConfig(config4) { + function writeAuthConfig(config3) { const authPath = getAuthConfigPath(); - const authDir = path24.dirname(authPath); + const authDir = path25.dirname(authPath); if (!fs12.existsSync(authDir)) { fs12.mkdirSync(authDir, { mode: 504, recursive: true }); } - fs12.writeFileSync(authPath, JSON.stringify(config4, null, 2), { mode: 384 }); + fs12.writeFileSync(authPath, JSON.stringify(config3, null, 2), { mode: 384 }); } function isValidAccessToken(authConfig) { if (!authConfig.token) @@ -182588,7 +182891,7 @@ var require_token_util = __commonJS((exports, module2) => { saveToken: () => saveToken }); module2.exports = __toCommonJS(token_util_exports); - var path24 = __toESM2(__require("path")); + var path25 = __toESM2(__require("path")); var fs12 = __toESM2(__require("fs")); var import_token_error = require_token_error(); var import_token_io = require_token_io(); @@ -182600,7 +182903,7 @@ var require_token_util = __commonJS((exports, module2) => { if (!dataDir) { return null; } - return path24.join(dataDir, vercelFolder); + return path25.join(dataDir, vercelFolder); } async function getVercelCliToken() { const authConfig = (0, import_auth_config.readAuthConfig)(); @@ -182665,7 +182968,7 @@ var require_token_util = __commonJS((exports, module2) => { if (!dir2) { throw new import_token_error.VercelOidcTokenError("Unable to find project root directory. Have you linked your project with `vc link?`"); } - const prjPath = path24.join(dir2, ".vercel", "project.json"); + const prjPath = path25.join(dir2, ".vercel", "project.json"); if (!fs12.existsSync(prjPath)) { throw new import_token_error.VercelOidcTokenError("project.json not found, have you linked your project with `vc link?`"); } @@ -182680,9 +182983,9 @@ var require_token_util = __commonJS((exports, module2) => { if (!dir2) { throw new import_token_error.VercelOidcTokenError("Unable to find user data directory. Please reach out to Vercel support."); } - const tokenPath = path24.join(dir2, "com.vercel.token", `${projectId}.json`); + const tokenPath = path25.join(dir2, "com.vercel.token", `${projectId}.json`); const tokenJson = JSON.stringify(token); - fs12.mkdirSync(path24.dirname(tokenPath), { mode: 504, recursive: true }); + fs12.mkdirSync(path25.dirname(tokenPath), { mode: 504, recursive: true }); fs12.writeFileSync(tokenPath, tokenJson); fs12.chmodSync(tokenPath, 432); return; @@ -182692,7 +182995,7 @@ var require_token_util = __commonJS((exports, module2) => { if (!dir2) { throw new import_token_error.VercelOidcTokenError("Unable to find user data directory. Please reach out to Vercel support."); } - const tokenPath = path24.join(dir2, "com.vercel.token", `${projectId}.json`); + const tokenPath = path25.join(dir2, "com.vercel.token", `${projectId}.json`); if (!fs12.existsSync(tokenPath)) { return null; } @@ -183182,8 +183485,8 @@ async function getGatewayAuthToken(options4) { }; } var import_oidc, import_oidc2, marker17 = "vercel.ai.gateway.error", symbol17, _a17, _b17, GatewayError, name16 = "GatewayAuthenticationError", marker22, symbol23, _a23, _b23, GatewayAuthenticationError, name23 = "GatewayInvalidRequestError", marker32, symbol33, _a33, _b32, GatewayInvalidRequestError, name33 = "GatewayRateLimitError", marker42, symbol43, _a42, _b42, GatewayRateLimitError, name42 = "GatewayModelNotFoundError", marker52, symbol53, modelNotFoundParamSchema, _a52, _b52, GatewayModelNotFoundError, name52 = "GatewayInternalServerError", marker62, symbol63, _a62, _b62, GatewayInternalServerError, name62 = "GatewayResponseError", marker72, symbol73, _a72, _b72, GatewayResponseError, gatewayErrorResponseSchema, name72 = "GatewayTimeoutError", marker82, symbol83, _a82, _b82, GatewayTimeoutError, GATEWAY_AUTH_METHOD_HEADER = "ai-gateway-auth-method", gatewayAuthMethodSchema, GatewayFetchMetadata = class { - constructor(config4) { - this.config = config4; + constructor(config3) { + this.config = config3; } async getAvailableModels() { try { @@ -183221,9 +183524,9 @@ var import_oidc, import_oidc2, marker17 = "vercel.ai.gateway.error", symbol17, _ } } }, gatewayAvailableModelsResponseSchema, gatewayCreditsResponseSchema, GatewayLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.supportedUrls = { "*/*": [/.*/] }; } @@ -183343,9 +183646,9 @@ var import_oidc, import_oidc2, marker17 = "vercel.ai.gateway.error", symbol17, _ }; } }, GatewayEmbeddingModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.maxEmbeddingsPerCall = 2048; this.supportsParallelCalls = true; @@ -183402,9 +183705,9 @@ var import_oidc, import_oidc2, marker17 = "vercel.ai.gateway.error", symbol17, _ }; } }, gatewayEmbeddingResponseSchema, GatewayImageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.maxImagesPerCall = Number.MAX_SAFE_INTEGER; } @@ -183484,9 +183787,9 @@ var import_oidc, import_oidc2, marker17 = "vercel.ai.gateway.error", symbol17, _ }; } }, providerMetadataEntrySchema, gatewayImageWarningSchema, gatewayImageUsageSchema, gatewayImageResponseSchema, GatewayVideoModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.maxVideosPerCall = Number.MAX_SAFE_INTEGER; } @@ -183617,7 +183920,7 @@ var import_oidc, import_oidc2, marker17 = "vercel.ai.gateway.error", symbol17, _ "ai-model-id": this.modelId }; } -}, providerMetadataEntrySchema2, gatewayVideoDataSchema, gatewayVideoWarningSchema, gatewayVideoEventSchema, parallelSearchInputSchema, parallelSearchOutputSchema, parallelSearchToolFactory, parallelSearch = (config4 = {}) => parallelSearchToolFactory(config4), perplexitySearchInputSchema, perplexitySearchOutputSchema, perplexitySearchToolFactory, perplexitySearch = (config4 = {}) => perplexitySearchToolFactory(config4), gatewayTools, VERSION3 = "3.0.80", AI_GATEWAY_PROTOCOL_VERSION = "0.0.1", gateway; +}, providerMetadataEntrySchema2, gatewayVideoDataSchema, gatewayVideoWarningSchema, gatewayVideoEventSchema, parallelSearchInputSchema, parallelSearchOutputSchema, parallelSearchToolFactory, parallelSearch = (config3 = {}) => parallelSearchToolFactory(config3), perplexitySearchInputSchema, perplexitySearchOutputSchema, perplexitySearchToolFactory, perplexitySearch = (config3 = {}) => perplexitySearchToolFactory(config3), gatewayTools, VERSION3 = "3.0.80", AI_GATEWAY_PROTOCOL_VERSION = "0.0.1", gateway; var init_dist13 = __esm(() => { init_dist12(); init_dist10(); @@ -187170,8 +187473,8 @@ function fixJson(input) { } let result6 = input.slice(0, lastValidIndex + 1); for (let i6 = stack.length - 1;i6 >= 0; i6--) { - const state2 = stack[i6]; - switch (state2) { + const state = stack[i6]; + switch (state) { case "INSIDE_STRING": { result6 += '"'; break; @@ -188397,10 +188700,10 @@ function processUIMessageStream({ }) { return stream4.pipeThrough(new TransformStream({ async transform(chunk, controller) { - await runUpdateMessageJob(async ({ state: state2, write: write2 }) => { + await runUpdateMessageJob(async ({ state, write: write2 }) => { var _a21, _b16, _c2, _d; function getToolInvocation(toolCallId) { - const toolInvocations = state2.message.parts.filter(isToolUIPart); + const toolInvocations = state.message.parts.filter(isToolUIPart); const toolInvocation = toolInvocations.find((invocation) => invocation.toolCallId === toolCallId); if (toolInvocation == null) { throw new UIMessageStreamError({ @@ -188413,7 +188716,7 @@ function processUIMessageStream({ } function updateToolPart(options4) { var _a222; - const part = state2.message.parts.find((part2) => isStaticToolUIPart(part2) && part2.toolCallId === options4.toolCallId); + const part = state.message.parts.find((part2) => isStaticToolUIPart(part2) && part2.toolCallId === options4.toolCallId); const anyOptions = options4; const anyPart = part; if (part != null) { @@ -188437,7 +188740,7 @@ function processUIMessageStream({ } } } else { - state2.message.parts.push({ + state.message.parts.push({ type: `tool-${options4.toolName}`, toolCallId: options4.toolCallId, state: options4.state, @@ -188455,7 +188758,7 @@ function processUIMessageStream({ } function updateDynamicToolPart(options4) { var _a222, _b24; - const part = state2.message.parts.find((part2) => part2.type === "dynamic-tool" && part2.toolCallId === options4.toolCallId); + const part = state.message.parts.find((part2) => part2.type === "dynamic-tool" && part2.toolCallId === options4.toolCallId); const anyOptions = options4; const anyPart = part; if (part != null) { @@ -188480,7 +188783,7 @@ function processUIMessageStream({ } } } else { - state2.message.parts.push({ + state.message.parts.push({ type: "dynamic-tool", toolName: options4.toolName, toolCallId: options4.toolCallId, @@ -188498,18 +188801,18 @@ function processUIMessageStream({ } async function updateMessageMetadata(metadata2) { if (metadata2 != null) { - const mergedMetadata = state2.message.metadata != null ? mergeObjects(state2.message.metadata, metadata2) : metadata2; + const mergedMetadata = state.message.metadata != null ? mergeObjects(state.message.metadata, metadata2) : metadata2; if (messageMetadataSchema != null) { await validateTypes({ value: mergedMetadata, schema: messageMetadataSchema, context: { field: "message.metadata", - entityId: state2.message.id + entityId: state.message.id } }); } - state2.message.metadata = mergedMetadata; + state.message.metadata = mergedMetadata; } } switch (chunk.type) { @@ -188520,13 +188823,13 @@ function processUIMessageStream({ providerMetadata: chunk.providerMetadata, state: "streaming" }; - state2.activeTextParts[chunk.id] = textPart; - state2.message.parts.push(textPart); + state.activeTextParts[chunk.id] = textPart; + state.message.parts.push(textPart); write2(); break; } case "text-delta": { - const textPart = state2.activeTextParts[chunk.id]; + const textPart = state.activeTextParts[chunk.id]; if (textPart == null) { throw new UIMessageStreamError({ chunkType: "text-delta", @@ -188540,7 +188843,7 @@ function processUIMessageStream({ break; } case "text-end": { - const textPart = state2.activeTextParts[chunk.id]; + const textPart = state.activeTextParts[chunk.id]; if (textPart == null) { throw new UIMessageStreamError({ chunkType: "text-end", @@ -188550,7 +188853,7 @@ function processUIMessageStream({ } textPart.state = "done"; textPart.providerMetadata = (_b16 = chunk.providerMetadata) != null ? _b16 : textPart.providerMetadata; - delete state2.activeTextParts[chunk.id]; + delete state.activeTextParts[chunk.id]; write2(); break; } @@ -188561,13 +188864,13 @@ function processUIMessageStream({ providerMetadata: chunk.providerMetadata, state: "streaming" }; - state2.activeReasoningParts[chunk.id] = reasoningPart; - state2.message.parts.push(reasoningPart); + state.activeReasoningParts[chunk.id] = reasoningPart; + state.message.parts.push(reasoningPart); write2(); break; } case "reasoning-delta": { - const reasoningPart = state2.activeReasoningParts[chunk.id]; + const reasoningPart = state.activeReasoningParts[chunk.id]; if (reasoningPart == null) { throw new UIMessageStreamError({ chunkType: "reasoning-delta", @@ -188581,7 +188884,7 @@ function processUIMessageStream({ break; } case "reasoning-end": { - const reasoningPart = state2.activeReasoningParts[chunk.id]; + const reasoningPart = state.activeReasoningParts[chunk.id]; if (reasoningPart == null) { throw new UIMessageStreamError({ chunkType: "reasoning-end", @@ -188591,12 +188894,12 @@ function processUIMessageStream({ } reasoningPart.providerMetadata = (_d = chunk.providerMetadata) != null ? _d : reasoningPart.providerMetadata; reasoningPart.state = "done"; - delete state2.activeReasoningParts[chunk.id]; + delete state.activeReasoningParts[chunk.id]; write2(); break; } case "file": { - state2.message.parts.push({ + state.message.parts.push({ type: "file", mediaType: chunk.mediaType, url: chunk.url, @@ -188606,7 +188909,7 @@ function processUIMessageStream({ break; } case "source-url": { - state2.message.parts.push({ + state.message.parts.push({ type: "source-url", sourceId: chunk.sourceId, url: chunk.url, @@ -188617,7 +188920,7 @@ function processUIMessageStream({ break; } case "source-document": { - state2.message.parts.push({ + state.message.parts.push({ type: "source-document", sourceId: chunk.sourceId, mediaType: chunk.mediaType, @@ -188629,8 +188932,8 @@ function processUIMessageStream({ break; } case "tool-input-start": { - const toolInvocations = state2.message.parts.filter(isStaticToolUIPart); - state2.partialToolCalls[chunk.toolCallId] = { + const toolInvocations = state.message.parts.filter(isStaticToolUIPart); + state.partialToolCalls[chunk.toolCallId] = { text: "", toolName: chunk.toolName, index: toolInvocations.length, @@ -188662,7 +188965,7 @@ function processUIMessageStream({ break; } case "tool-input-delta": { - const partialToolCall = state2.partialToolCalls[chunk.toolCallId]; + const partialToolCall = state.partialToolCalls[chunk.toolCallId]; if (partialToolCall == null) { throw new UIMessageStreamError({ chunkType: "tool-input-delta", @@ -188723,7 +189026,7 @@ function processUIMessageStream({ break; } case "tool-input-error": { - const existingPart = state2.message.parts.filter(isToolUIPart).find((p2) => p2.toolCallId === chunk.toolCallId); + const existingPart = state.message.parts.filter(isToolUIPart).find((p2) => p2.toolCallId === chunk.toolCallId); const isDynamic = existingPart != null ? existingPart.type === "dynamic-tool" : !!chunk.dynamic; if (isDynamic) { updateDynamicToolPart({ @@ -188823,17 +189126,17 @@ function processUIMessageStream({ break; } case "start-step": { - state2.message.parts.push({ type: "step-start" }); + state.message.parts.push({ type: "step-start" }); break; } case "finish-step": { - state2.activeTextParts = {}; - state2.activeReasoningParts = {}; + state.activeTextParts = {}; + state.activeReasoningParts = {}; break; } case "start": { if (chunk.messageId != null) { - state2.message.id = chunk.messageId; + state.message.id = chunk.messageId; } await updateMessageMetadata(chunk.messageMetadata); if (chunk.messageId != null || chunk.messageMetadata != null) { @@ -188843,7 +189146,7 @@ function processUIMessageStream({ } case "finish": { if (chunk.finishReason != null) { - state2.finishReason = chunk.finishReason; + state.finishReason = chunk.finishReason; } await updateMessageMetadata(chunk.messageMetadata); if (chunk.messageMetadata != null) { @@ -188865,8 +189168,8 @@ function processUIMessageStream({ default: { if (isDataUIMessageChunk(chunk)) { if ((dataPartSchemas == null ? undefined : dataPartSchemas[chunk.type]) != null) { - const partIdx = state2.message.parts.findIndex((p2) => ("id" in p2) && ("data" in p2) && p2.id === chunk.id && p2.type === chunk.type); - const actualPartIdx = partIdx >= 0 ? partIdx : state2.message.parts.length; + const partIdx = state.message.parts.findIndex((p2) => ("id" in p2) && ("data" in p2) && p2.id === chunk.id && p2.type === chunk.type); + const actualPartIdx = partIdx >= 0 ? partIdx : state.message.parts.length; await validateTypes({ value: chunk.data, schema: dataPartSchemas[chunk.type], @@ -188882,11 +189185,11 @@ function processUIMessageStream({ onData == null || onData(dataChunk); break; } - const existingUIPart = dataChunk.id != null ? state2.message.parts.find((chunkArg) => dataChunk.type === chunkArg.type && dataChunk.id === chunkArg.id) : undefined; + const existingUIPart = dataChunk.id != null ? state.message.parts.find((chunkArg) => dataChunk.type === chunkArg.type && dataChunk.id === chunkArg.id) : undefined; if (existingUIPart != null) { existingUIPart.data = dataChunk.data; } else { - state2.message.parts.push(dataChunk); + state.message.parts.push(dataChunk); } onData == null || onData(dataChunk); write2(); @@ -188930,12 +189233,12 @@ function handleUIMessageStreamFinish({ if (onFinish == null && onStepFinish == null) { return idInjectedStream; } - const state2 = createStreamingUIMessageState({ + const state = createStreamingUIMessageState({ lastMessage: lastMessage ? structuredClone(lastMessage) : undefined, messageId: messageId != null ? messageId : "" }); const runUpdateMessageJob = async (job) => { - await job({ state: state2, write: () => {} }); + await job({ state, write: () => {} }); }; let finishCalled = false; const callOnFinish = async () => { @@ -188943,30 +189246,30 @@ function handleUIMessageStreamFinish({ return; } finishCalled = true; - const isContinuation = state2.message.id === (lastMessage == null ? undefined : lastMessage.id); + const isContinuation = state.message.id === (lastMessage == null ? undefined : lastMessage.id); await onFinish({ isAborted: isAborted3, isContinuation, - responseMessage: state2.message, + responseMessage: state.message, messages: [ ...isContinuation ? originalMessages.slice(0, -1) : originalMessages, - state2.message + state.message ], - finishReason: state2.finishReason + finishReason: state.finishReason }); }; const callOnStepFinish = async () => { if (!onStepFinish) { return; } - const isContinuation = state2.message.id === (lastMessage == null ? undefined : lastMessage.id); + const isContinuation = state.message.id === (lastMessage == null ? undefined : lastMessage.id); try { await onStepFinish({ isContinuation, - responseMessage: structuredClone(state2.message), + responseMessage: structuredClone(state.message), messages: [ ...isContinuation ? originalMessages.slice(0, -1) : originalMessages, - structuredClone(state2.message) + structuredClone(state.message) ] }); } catch (error46) { @@ -194500,7 +194803,7 @@ var require_is2 = __commonJS((exports) => { var require_messages = __commonJS((exports) => { Object.defineProperty(exports, "__esModule", { value: true }); exports.Message = exports.NotificationType9 = exports.NotificationType8 = exports.NotificationType7 = exports.NotificationType6 = exports.NotificationType5 = exports.NotificationType4 = exports.NotificationType3 = exports.NotificationType2 = exports.NotificationType1 = exports.NotificationType0 = exports.NotificationType = exports.RequestType9 = exports.RequestType8 = exports.RequestType7 = exports.RequestType6 = exports.RequestType5 = exports.RequestType4 = exports.RequestType3 = exports.RequestType2 = exports.RequestType1 = exports.RequestType = exports.RequestType0 = exports.AbstractMessageSignature = exports.ParameterStructures = exports.ResponseError = exports.ErrorCodes = undefined; - var is8 = require_is2(); + var is7 = require_is2(); var ErrorCodes; (function(ErrorCodes2) { ErrorCodes2.ParseError = -32700; @@ -194523,7 +194826,7 @@ var require_messages = __commonJS((exports) => { class ResponseError extends Error { constructor(code, message, data2) { super(message); - this.code = is8.number(code) ? code : ErrorCodes.UnknownErrorCode; + this.code = is7.number(code) ? code : ErrorCodes.UnknownErrorCode; this.data = data2; Object.setPrototypeOf(this, ResponseError.prototype); } @@ -194740,17 +195043,17 @@ var require_messages = __commonJS((exports) => { (function(Message2) { function isRequest2(message) { const candidate = message; - return candidate && is8.string(candidate.method) && (is8.string(candidate.id) || is8.number(candidate.id)); + return candidate && is7.string(candidate.method) && (is7.string(candidate.id) || is7.number(candidate.id)); } Message2.isRequest = isRequest2; function isNotification(message) { const candidate = message; - return candidate && is8.string(candidate.method) && message.id === undefined; + return candidate && is7.string(candidate.method) && message.id === undefined; } Message2.isNotification = isNotification; function isResponse(message) { const candidate = message; - return candidate && (candidate.result !== undefined || !!candidate.error) && (is8.string(candidate.id) || is8.number(candidate.id) || candidate.id === null); + return candidate && (candidate.result !== undefined || !!candidate.error) && (is7.string(candidate.id) || is7.number(candidate.id) || candidate.id === null); } Message2.isResponse = isResponse; })(Message || (exports.Message = Message = {})); @@ -194866,7 +195169,7 @@ var require_linkedMap = __commonJS((exports) => { return item.value; } forEach(callbackfn, thisArg) { - const state2 = this._state; + const state = this._state; let current = this._head; while (current) { if (thisArg) { @@ -194874,21 +195177,21 @@ var require_linkedMap = __commonJS((exports) => { } else { callbackfn(current.value, current.key, this); } - if (this._state !== state2) { + if (this._state !== state) { throw new Error(`LinkedMap got modified during iteration.`); } current = current.next; } } keys() { - const state2 = this._state; + const state = this._state; let current = this._head; const iterator = { [Symbol.iterator]: () => { return iterator; }, next: () => { - if (this._state !== state2) { + if (this._state !== state) { throw new Error(`LinkedMap got modified during iteration.`); } if (current) { @@ -194903,14 +195206,14 @@ var require_linkedMap = __commonJS((exports) => { return iterator; } values() { - const state2 = this._state; + const state = this._state; let current = this._head; const iterator = { [Symbol.iterator]: () => { return iterator; }, next: () => { - if (this._state !== state2) { + if (this._state !== state) { throw new Error(`LinkedMap got modified during iteration.`); } if (current) { @@ -194925,14 +195228,14 @@ var require_linkedMap = __commonJS((exports) => { return iterator; } entries() { - const state2 = this._state; + const state = this._state; let current = this._head; const iterator = { [Symbol.iterator]: () => { return iterator; }, next: () => { - if (this._state !== state2) { + if (this._state !== state) { throw new Error(`LinkedMap got modified during iteration.`); } if (current) { @@ -195297,11 +195600,11 @@ var require_cancellation = __commonJS((exports) => { isCancellationRequested: true, onCancellationRequested: events_1.Event.None }); - function is8(value8) { + function is7(value8) { const candidate = value8; return candidate && (candidate === CancellationToken2.None || candidate === CancellationToken2.Cancelled || Is2.boolean(candidate.isCancellationRequested) && !!candidate.onCancellationRequested); } - CancellationToken2.is = is8; + CancellationToken2.is = is7; })(CancellationToken || (exports.CancellationToken = CancellationToken = {})); var shortcutEvent = Object.freeze(function(callback5, context4) { const handle2 = (0, ral_1.default)().timer.setTimeout(callback5.bind(context4), 0); @@ -195521,11 +195824,11 @@ var require_messageReader = __commonJS((exports) => { var semaphore_1 = require_semaphore(); var MessageReader; (function(MessageReader2) { - function is8(value8) { + function is7(value8) { let candidate = value8; return candidate && Is2.func(candidate.listen) && Is2.func(candidate.dispose) && Is2.func(candidate.onError) && Is2.func(candidate.onClose) && Is2.func(candidate.onPartialMessage); } - MessageReader2.is = is8; + MessageReader2.is = is7; })(MessageReader || (exports.MessageReader = MessageReader = {})); class AbstractMessageReader { @@ -195712,11 +196015,11 @@ var require_messageWriter = __commonJS((exports) => { `; var MessageWriter; (function(MessageWriter2) { - function is8(value8) { + function is7(value8) { let candidate = value8; return candidate && Is2.func(candidate.dispose) && Is2.func(candidate.onClose) && Is2.func(candidate.onError) && Is2.func(candidate.write); } - MessageWriter2.is = is8; + MessageWriter2.is = is7; })(MessageWriter || (exports.MessageWriter = MessageWriter = {})); class AbstractMessageWriter { @@ -195838,7 +196141,7 @@ var require_messageBuffer = __commonJS((exports) => { if (this._chunks.length === 0) { return; } - let state2 = 0; + let state = 0; let chunkIndex = 0; let offset = 0; let chunkBytesRead = 0; @@ -195851,39 +196154,39 @@ var require_messageBuffer = __commonJS((exports) => { const value8 = chunk[offset]; switch (value8) { case CR3: - switch (state2) { + switch (state) { case 0: - state2 = 1; + state = 1; break; case 2: - state2 = 3; + state = 3; break; default: - state2 = 0; + state = 0; } break; case LF3: - switch (state2) { + switch (state) { case 1: - state2 = 2; + state = 2; break; case 3: - state2 = 4; + state = 4; offset++; break row; default: - state2 = 0; + state = 0; } break; default: - state2 = 0; + state = 0; } offset++; } chunkBytesRead += chunk.byteLength; chunkIndex++; } - if (state2 !== 4) { + if (state !== 4) { return; } const buffer4 = this._read(chunkBytesRead + offset); @@ -195976,10 +196279,10 @@ var require_connection = __commonJS((exports) => { })(CancelNotification || (CancelNotification = {})); var ProgressToken; (function(ProgressToken2) { - function is8(value8) { + function is7(value8) { return typeof value8 === "string" || typeof value8 === "number"; } - ProgressToken2.is = is8; + ProgressToken2.is = is7; })(ProgressToken || (exports.ProgressToken = ProgressToken = {})); var ProgressNotification; (function(ProgressNotification2) { @@ -195992,10 +196295,10 @@ var require_connection = __commonJS((exports) => { exports.ProgressType = ProgressType; var StarRequestHandler; (function(StarRequestHandler2) { - function is8(value8) { + function is7(value8) { return Is2.func(value8); } - StarRequestHandler2.is = is8; + StarRequestHandler2.is = is7; })(StarRequestHandler || (StarRequestHandler = {})); exports.NullLogger = Object.freeze({ error: () => {}, @@ -196097,27 +196400,27 @@ var require_connection = __commonJS((exports) => { exports.ConnectionError = ConnectionError; var ConnectionStrategy; (function(ConnectionStrategy2) { - function is8(value8) { + function is7(value8) { const candidate = value8; return candidate && Is2.func(candidate.cancelUndispatched); } - ConnectionStrategy2.is = is8; + ConnectionStrategy2.is = is7; })(ConnectionStrategy || (exports.ConnectionStrategy = ConnectionStrategy = {})); var IdCancellationReceiverStrategy; (function(IdCancellationReceiverStrategy2) { - function is8(value8) { + function is7(value8) { const candidate = value8; return candidate && (candidate.kind === undefined || candidate.kind === "id") && Is2.func(candidate.createCancellationTokenSource) && (candidate.dispose === undefined || Is2.func(candidate.dispose)); } - IdCancellationReceiverStrategy2.is = is8; + IdCancellationReceiverStrategy2.is = is7; })(IdCancellationReceiverStrategy || (exports.IdCancellationReceiverStrategy = IdCancellationReceiverStrategy = {})); var RequestCancellationReceiverStrategy; (function(RequestCancellationReceiverStrategy2) { - function is8(value8) { + function is7(value8) { const candidate = value8; return candidate && candidate.kind === "request" && Is2.func(candidate.createCancellationTokenSource) && (candidate.dispose === undefined || Is2.func(candidate.dispose)); } - RequestCancellationReceiverStrategy2.is = is8; + RequestCancellationReceiverStrategy2.is = is7; })(RequestCancellationReceiverStrategy || (exports.RequestCancellationReceiverStrategy = RequestCancellationReceiverStrategy = {})); var CancellationReceiverStrategy; (function(CancellationReceiverStrategy2) { @@ -196126,10 +196429,10 @@ var require_connection = __commonJS((exports) => { return new cancellation_1.CancellationTokenSource; } }); - function is8(value8) { + function is7(value8) { return IdCancellationReceiverStrategy.is(value8) || RequestCancellationReceiverStrategy.is(value8); } - CancellationReceiverStrategy2.is = is8; + CancellationReceiverStrategy2.is = is7; })(CancellationReceiverStrategy || (exports.CancellationReceiverStrategy = CancellationReceiverStrategy = {})); var CancellationSenderStrategy; (function(CancellationSenderStrategy2) { @@ -196139,11 +196442,11 @@ var require_connection = __commonJS((exports) => { }, cleanup(_3) {} }); - function is8(value8) { + function is7(value8) { const candidate = value8; return candidate && Is2.func(candidate.sendCancellation) && Is2.func(candidate.cleanup); } - CancellationSenderStrategy2.is = is8; + CancellationSenderStrategy2.is = is7; })(CancellationSenderStrategy || (exports.CancellationSenderStrategy = CancellationSenderStrategy = {})); var CancellationStrategy; (function(CancellationStrategy2) { @@ -196151,27 +196454,27 @@ var require_connection = __commonJS((exports) => { receiver: CancellationReceiverStrategy.Message, sender: CancellationSenderStrategy.Message }); - function is8(value8) { + function is7(value8) { const candidate = value8; return candidate && CancellationReceiverStrategy.is(candidate.receiver) && CancellationSenderStrategy.is(candidate.sender); } - CancellationStrategy2.is = is8; + CancellationStrategy2.is = is7; })(CancellationStrategy || (exports.CancellationStrategy = CancellationStrategy = {})); var MessageStrategy; (function(MessageStrategy2) { - function is8(value8) { + function is7(value8) { const candidate = value8; return candidate && Is2.func(candidate.handleMessage); } - MessageStrategy2.is = is8; + MessageStrategy2.is = is7; })(MessageStrategy || (exports.MessageStrategy = MessageStrategy = {})); var ConnectionOptions; (function(ConnectionOptions2) { - function is8(value8) { + function is7(value8) { const candidate = value8; return candidate && (CancellationStrategy.is(candidate.cancellationStrategy) || ConnectionStrategy.is(candidate.connectionStrategy) || MessageStrategy.is(candidate.messageStrategy)); } - ConnectionOptions2.is = is8; + ConnectionOptions2.is = is7; })(ConnectionOptions || (exports.ConnectionOptions = ConnectionOptions = {})); var ConnectionState; (function(ConnectionState2) { @@ -196199,7 +196502,7 @@ var require_connection = __commonJS((exports) => { let trace4 = Trace.Off; let traceFormat = TraceFormat.Text; let tracer4; - let state2 = ConnectionState.New; + let state = ConnectionState.New; const errorEmitter = new events_1.Emitter; const closeEmitter = new events_1.Emitter; const unhandledNotificationEmitter = new events_1.Emitter; @@ -196235,17 +196538,17 @@ var require_connection = __commonJS((exports) => { return; } function isListening() { - return state2 === ConnectionState.Listening; + return state === ConnectionState.Listening; } function isClosed() { - return state2 === ConnectionState.Closed; + return state === ConnectionState.Closed; } function isDisposed() { - return state2 === ConnectionState.Disposed; + return state === ConnectionState.Disposed; } function closeHandler() { - if (state2 === ConnectionState.New || state2 === ConnectionState.Listening) { - state2 = ConnectionState.Closed; + if (state === ConnectionState.New || state === ConnectionState.Listening) { + state = ConnectionState.Closed; closeEmitter.fire(undefined); } } @@ -197043,7 +197346,7 @@ ${JSON.stringify(message, null, 4)}`); if (isDisposed()) { return; } - state2 = ConnectionState.Disposed; + state = ConnectionState.Disposed; disposeEmitter.fire(undefined); const error46 = new messages_1.ResponseError(messages_1.ErrorCodes.PendingResponseRejected, "Pending response rejected since connection got disposed"); for (const promise5 of responsePromises.values()) { @@ -197063,7 +197366,7 @@ ${JSON.stringify(message, null, 4)}`); listen: () => { throwIfClosedOrDisposed(); throwIfListening(); - state2 = ConnectionState.Listening; + state = ConnectionState.Listening; messageReader.listen(callback5); }, inspect: () => { @@ -197471,7 +197774,7 @@ var require_main = __commonJS((exports) => { exports.createMessageConnection = exports.createServerSocketTransport = exports.createClientSocketTransport = exports.createServerPipeTransport = exports.createClientPipeTransport = exports.generateRandomPipeName = exports.StreamMessageWriter = exports.StreamMessageReader = exports.SocketMessageWriter = exports.SocketMessageReader = exports.PortMessageWriter = exports.PortMessageReader = exports.IPCMessageWriter = exports.IPCMessageReader = undefined; var ril_1 = require_ril(); ril_1.default.install(); - var path24 = __require("path"); + var path25 = __require("path"); var os8 = __require("os"); var crypto_1 = __require("crypto"); var net_1 = __require("net"); @@ -197613,9 +197916,9 @@ var require_main = __commonJS((exports) => { } let result6; if (XDG_RUNTIME_DIR) { - result6 = path24.join(XDG_RUNTIME_DIR, `vscode-ipc-${randomSuffix}.sock`); + result6 = path25.join(XDG_RUNTIME_DIR, `vscode-ipc-${randomSuffix}.sock`); } else { - result6 = path24.join(os8.tmpdir(), `vscode-${randomSuffix}.sock`); + result6 = path25.join(os8.tmpdir(), `vscode-${randomSuffix}.sock`); } const limit = safeIpcPathLengths.get(process.platform); if (limit !== undefined && result6.length > limit) { @@ -197854,7 +198157,7 @@ function withTimeout(promise5, ms2) { } // packages/unifia/src/lsp/client.ts -import path24 from "path"; +import path25 from "path"; import { pathToFileURL as pathToFileURL3, fileURLToPath as fileURLToPath4 } from "url"; var import_node5, DIAGNOSTICS_DEBOUNCE_MS = 150, LSPClient; var init_client2 = __esm(async () => { @@ -197982,9 +198285,9 @@ var init_client2 = __esm(async () => { async open(input2) { if (shuttingDown) return; - input2.path = path24.isAbsolute(input2.path) ? input2.path : path24.resolve(Instance.directory, input2.path); + input2.path = path25.isAbsolute(input2.path) ? input2.path : path25.resolve(Instance.directory, input2.path); const text7 = await Filesystem.readText(input2.path); - const extension2 = path24.extname(input2.path); + const extension2 = path25.extname(input2.path); const languageId = LANGUAGE_EXTENSIONS[extension2] ?? "plaintext"; const version4 = files[input2.path]; if (version4 !== undefined) { @@ -198047,7 +198350,7 @@ var init_client2 = __esm(async () => { return diagnostics; }, async waitForDiagnostics(input2) { - const normalizedPath = Filesystem.normalizePath(path24.isAbsolute(input2.path) ? input2.path : path24.resolve(Instance.directory, input2.path)); + const normalizedPath = Filesystem.normalizePath(path25.isAbsolute(input2.path) ? input2.path : path25.resolve(Instance.directory, input2.path)); log11.info("waiting for diagnostics", { path: normalizedPath }); let unsub; let debounceTimer; @@ -198079,13 +198382,10 @@ var init_client2 = __esm(async () => { try { await connection.sendNotification("exit"); } catch {} - await new Promise((r4) => setTimeout(r4, 50)); - try { - connection.end(); - } catch {} try { connection.dispose(); } catch {} + await new Promise((r4) => setTimeout(r4, 50)); await Process.stop(input.server.process).catch(() => {}); l2.info("shutdown"); } @@ -198103,7 +198403,7 @@ var init_pool = __esm(async () => { await init_log(); log11 = Log.create({ service: "lsp.pool" }); ((LSPPool) => { - function create(config4) { + function create(config3) { const pool = new Map; const evictListeners = []; function key(serverID, root) { @@ -198112,7 +198412,7 @@ var init_pool = __esm(async () => { function resetIdleTimer(entry) { if (entry.idleTimer) clearTimeout(entry.idleTimer); - if (config4.idleTimeoutMs <= 0) + if (config3.idleTimeoutMs <= 0) return; entry.idleTimer = setTimeout(async () => { log11.info("idle timeout, shutting down LSP", { @@ -198120,7 +198420,7 @@ var init_pool = __esm(async () => { root: entry.root }); await shutdownEntry(entry); - }, config4.idleTimeoutMs); + }, config3.idleTimeoutMs); } async function shutdownEntry(entry) { const k3 = key(entry.serverID, entry.root); @@ -198136,7 +198436,7 @@ var init_pool = __esm(async () => { } } return { - config: config4, + config: config3, track(client, serverID, root) { const k3 = key(serverID, root); if (pool.has(k3)) @@ -198152,7 +198452,7 @@ var init_pool = __esm(async () => { log11.info("tracking LSP client", { serverID, active: pool.size, - max: config4.maxConcurrent + max: config3.maxConcurrent }); }, touch(serverID, root) { @@ -198200,7 +198500,7 @@ var init_pool = __esm(async () => { return pool.size; }, atCapacity() { - return pool.size >= config4.maxConcurrent; + return pool.size >= config3.maxConcurrent; }, entries() { return [...pool.values()]; @@ -198215,7 +198515,7 @@ var init_pool = __esm(async () => { }); // packages/unifia/src/lsp/index.ts -import path25 from "path"; +import path26 from "path"; import { pathToFileURL as pathToFileURL4, fileURLToPath as fileURLToPath5 } from "url"; var LSP; var init_lsp = __esm(async () => { @@ -198410,12 +198710,12 @@ var init_lsp = __esm(async () => { } LSP.Service = Service3; LSP.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { - const config4 = yield* Config.Service; - const state2 = yield* InstanceState.make(exports_Effect.fn("LSP.state")(function* () { - const cfg = yield* config4.get(); + const config3 = yield* Config.Service; + const state = yield* InstanceState.make(exports_Effect.fn("LSP.state")(function* () { + const cfg = yield* config3.get(); const servers = {}; - if (cfg.lsp === false) { - log12.info("all LSPs are disabled"); + if (cfg.lsp === false || Flag.UNIFIA_DISABLE_LSP) { + log12.info("all LSPs are disabled", { reason: cfg.lsp === false ? "config" : "UNIFIA_DISABLE_LSP" }); } else { for (const server of Object.values(LSPServer)) { servers[server.id] = server; @@ -198474,9 +198774,9 @@ var init_lsp = __esm(async () => { const getClients = exports_Effect.fnUntraced(function* (file5) { if (!Instance.containsPath(file5)) return []; - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); return yield* exports_Effect.promise(async () => { - const extension2 = path25.parse(file5).ext || file5; + const extension2 = path26.parse(file5).ext || file5; const result6 = []; for (const server of Object.values(s5.servers)) { if (server.extensions.length && !server.extensions.includes(extension2)) @@ -198493,24 +198793,24 @@ var init_lsp = __esm(async () => { }); const run8 = exports_Effect.fnUntraced(function* (file5, fn3) { const clients = yield* getClients(file5); - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); for (const c2 of clients) s5.pool.touch(c2.serverID, c2.root); return yield* exports_Effect.promise(() => Promise.all(clients.map((x3) => fn3(x3)))); }); const runAll = exports_Effect.fnUntraced(function* (fn3) { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); for (const c2 of s5.clients) s5.pool.touch(c2.serverID, c2.root); return yield* exports_Effect.promise(() => Promise.all(s5.clients.map((x3) => fn3(x3)))); }); const init5 = exports_Effect.fn("LSP.init")(function* () { - yield* InstanceState.get(state2); + yield* InstanceState.get(state); }); const warmup2 = exports_Effect.fn("LSP.warmup")(function* () { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); yield* exports_Effect.promise(async () => { - const sentinel = path25.join(Instance.directory, "__lsp_warmup_sentinel__"); + const sentinel = path26.join(Instance.directory, "__lsp_warmup_sentinel__"); await Promise.all(Object.values(s5.servers).map(async (server) => { if (!server.extensions.length) return; @@ -198524,13 +198824,13 @@ var init_lsp = __esm(async () => { }); }); const status2 = exports_Effect.fn("LSP.status")(function* () { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); const result6 = []; for (const client of s5.clients) { result6.push({ id: client.serverID, name: s5.servers[client.serverID].id, - root: path25.relative(Instance.directory, client.root), + root: path26.relative(Instance.directory, client.root), status: "connected" }); } @@ -198540,16 +198840,16 @@ var init_lsp = __esm(async () => { result6.push({ id: entry.serverID, name: s5.servers[entry.serverID]?.id ?? entry.serverID, - root: path25.relative(Instance.directory, entry.root), + root: path26.relative(Instance.directory, entry.root), status: "error" }); } return result6; }); const hasClients2 = exports_Effect.fn("LSP.hasClients")(function* (file5) { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); return yield* exports_Effect.promise(async () => { - const extension2 = path25.parse(file5).ext || file5; + const extension2 = path26.parse(file5).ext || file5; for (const server of Object.values(s5.servers)) { if (server.extensions.length && !server.extensions.includes(extension2)) continue; @@ -198756,7 +199056,7 @@ var init_lsp = __esm(async () => { }); // packages/unifia/src/snapshot/index.ts -import path26 from "path"; +import path27 from "path"; var Snapshot; var init_snapshot = __esm(async () => { init_dist3(); @@ -198800,7 +199100,7 @@ var init_snapshot = __esm(async () => { Snapshot.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const fs12 = yield* AppFileSystem.Service; const spawner = yield* exports_ChildProcessSpawner.ChildProcessSpawner; - const config4 = yield* Config.Service; + const config3 = yield* Config.Service; const locks = new Map; const lock = (key) => { const hit = locks.get(key); @@ -198810,14 +199110,14 @@ var init_snapshot = __esm(async () => { locks.set(key, next3); return next3; }; - const state2 = yield* InstanceState.make(exports_Effect.fn("Snapshot.state")(function* (ctx) { - const state3 = { + const state = yield* InstanceState.make(exports_Effect.fn("Snapshot.state")(function* (ctx) { + const state2 = { directory: ctx.directory, worktree: ctx.worktree, - gitdir: path26.join(Global.Path.data, "snapshot", ctx.project.id, Hash.fast(ctx.worktree)), + gitdir: path27.join(Global.Path.data, "snapshot", ctx.project.id, Hash.fast(ctx.worktree)), vcs: ctx.project.vcs }; - const args3 = (cmd) => ["--git-dir", state3.gitdir, "--work-tree", state3.worktree, ...cmd]; + const args3 = (cmd) => ["--git-dir", state2.gitdir, "--work-tree", state2.worktree, ...cmd]; const git = exports_Effect.fnUntraced(function* (cmd, opts) { const proc = exports_ChildProcess.make("git", cmd, { cwd: opts?.cwd, @@ -198836,15 +199136,15 @@ var init_snapshot = __esm(async () => { const exists3 = (file5) => fs12.exists(file5).pipe(exports_Effect.orDie); const read3 = (file5) => fs12.readFileString(file5).pipe(exports_Effect.catch(() => exports_Effect.succeed(""))); const remove19 = (file5) => fs12.remove(file5).pipe(exports_Effect.catch(() => exports_Effect.void)); - const locked2 = (fx) => lock(state3.gitdir).withPermits(1)(fx); + const locked2 = (fx) => lock(state2.gitdir).withPermits(1)(fx); const enabled = exports_Effect.fnUntraced(function* () { - if (state3.vcs !== "git") + if (state2.vcs !== "git") return false; - return (yield* config4.get()).snapshot !== false; + return (yield* config3.get()).snapshot !== false; }); const excludes = exports_Effect.fnUntraced(function* () { const result6 = yield* git(["rev-parse", "--path-format=absolute", "--git-path", "info/exclude"], { - cwd: state3.worktree + cwd: state2.worktree }); const file5 = result6.text.trim(); if (!file5) @@ -198855,13 +199155,13 @@ var init_snapshot = __esm(async () => { }); const sync8 = exports_Effect.fnUntraced(function* (list = []) { const file5 = yield* excludes(); - const target = path26.join(state3.gitdir, "info", "exclude"); + const target = path27.join(state2.gitdir, "info", "exclude"); const text7 = [ file5 ? (yield* read3(file5)).trimEnd() : "", ...list.map((item) => `/${item.replaceAll("\\", "/")}`) ].filter(Boolean).join(` `); - yield* fs12.ensureDir(path26.join(state3.gitdir, "info")).pipe(exports_Effect.orDie); + yield* fs12.ensureDir(path27.join(state2.gitdir, "info")).pipe(exports_Effect.orDie); yield* fs12.writeFileString(target, text7 ? `${text7} ` : "").pipe(exports_Effect.orDie); }); @@ -198869,10 +199169,10 @@ var init_snapshot = __esm(async () => { yield* sync8(); const [diff3, other] = yield* exports_Effect.all([ git([...quote, ...args3(["diff-files", "--name-only", "-z", "--", "."])], { - cwd: state3.directory + cwd: state2.directory }), git([...quote, ...args3(["ls-files", "--others", "--exclude-standard", "-z", "--", "."])], { - cwd: state3.directory + cwd: state2.directory }) ], { concurrency: 2 }); if (diff3.code !== 0 || other.code !== 0) { @@ -198889,14 +199189,14 @@ var init_snapshot = __esm(async () => { const all7 = Array.from(new Set([...tracked, ...untracked])); if (!all7.length) return; - const large = (yield* exports_Effect.all(all7.map((item) => fs12.stat(path26.join(state3.directory, item)).pipe(exports_Effect.catch(() => exports_Effect.void)).pipe(exports_Effect.map((stat4) => { + const large = (yield* exports_Effect.all(all7.map((item) => fs12.stat(path27.join(state2.directory, item)).pipe(exports_Effect.catch(() => exports_Effect.void)).pipe(exports_Effect.map((stat4) => { if (!stat4 || stat4.type !== "File") return; const size24 = typeof stat4.size === "bigint" ? Number(stat4.size) : stat4.size; return size24 > limit ? item : undefined; }))), { concurrency: 8 })).filter((item) => Boolean(item)); yield* sync8(large); - const result6 = yield* git([...cfg, ...args3(["add", "--sparse", "."])], { cwd: state3.directory }); + const result6 = yield* git([...cfg, ...args3(["add", "--sparse", "."])], { cwd: state2.directory }); if (result6.code !== 0) { log12.warn("failed to add snapshot files", { exitCode: result6.code, @@ -198908,9 +199208,9 @@ var init_snapshot = __esm(async () => { return yield* locked2(exports_Effect.gen(function* () { if (!(yield* enabled())) return; - if (!(yield* exists3(state3.gitdir))) + if (!(yield* exists3(state2.gitdir))) return; - const result6 = yield* git(args3(["gc", `--prune=${prune}`]), { cwd: state3.directory }); + const result6 = yield* git(args3(["gc", `--prune=${prune}`]), { cwd: state2.directory }); if (result6.code !== 0) { log12.warn("cleanup failed", { exitCode: result6.code, @@ -198925,22 +199225,22 @@ var init_snapshot = __esm(async () => { return yield* locked2(exports_Effect.gen(function* () { if (!(yield* enabled())) return; - const existed = yield* exists3(state3.gitdir); - yield* fs12.ensureDir(state3.gitdir).pipe(exports_Effect.orDie); + const existed = yield* exists3(state2.gitdir); + yield* fs12.ensureDir(state2.gitdir).pipe(exports_Effect.orDie); if (!existed) { yield* git(["init"], { - env: { GIT_DIR: state3.gitdir, GIT_WORK_TREE: state3.worktree } + env: { GIT_DIR: state2.gitdir, GIT_WORK_TREE: state2.worktree } }); - yield* git(["--git-dir", state3.gitdir, "config", "core.autocrlf", "false"]); - yield* git(["--git-dir", state3.gitdir, "config", "core.longpaths", "true"]); - yield* git(["--git-dir", state3.gitdir, "config", "core.symlinks", "true"]); - yield* git(["--git-dir", state3.gitdir, "config", "core.fsmonitor", "false"]); + yield* git(["--git-dir", state2.gitdir, "config", "core.autocrlf", "false"]); + yield* git(["--git-dir", state2.gitdir, "config", "core.longpaths", "true"]); + yield* git(["--git-dir", state2.gitdir, "config", "core.symlinks", "true"]); + yield* git(["--git-dir", state2.gitdir, "config", "core.fsmonitor", "false"]); log12.info("initialized"); } yield* add11(); - const result6 = yield* git(args3(["write-tree"]), { cwd: state3.directory }); + const result6 = yield* git(args3(["write-tree"]), { cwd: state2.directory }); const hash4 = result6.text.trim(); - log12.info("tracking", { hash: hash4, cwd: state3.directory, git: state3.gitdir }); + log12.info("tracking", { hash: hash4, cwd: state2.directory, git: state2.gitdir }); return hash4; })); }); @@ -198948,7 +199248,7 @@ var init_snapshot = __esm(async () => { return yield* locked2(exports_Effect.gen(function* () { yield* add11(); const result6 = yield* git([...quote, ...args3(["diff", "--cached", "--no-ext-diff", "--name-only", hash4, "--", "."])], { - cwd: state3.directory + cwd: state2.directory }); if (result6.code !== 0) { log12.warn("failed to get diff", { hash: hash4, exitCode: result6.code }); @@ -198957,29 +199257,29 @@ var init_snapshot = __esm(async () => { return { hash: hash4, files: result6.text.trim().split(` -`).map((x3) => x3.trim()).filter(Boolean).map((x3) => path26.join(state3.worktree, x3).replaceAll("\\", "/")) +`).map((x3) => x3.trim()).filter(Boolean).map((x3) => path27.join(state2.worktree, x3).replaceAll("\\", "/")) }; })); }); - const restore2 = exports_Effect.fnUntraced(function* (snapshot4) { + const restore2 = exports_Effect.fnUntraced(function* (snapshot3) { return yield* locked2(exports_Effect.gen(function* () { - log12.info("restore", { commit: snapshot4 }); - const result6 = yield* git([...core2, ...args3(["read-tree", snapshot4])], { cwd: state3.worktree }); + log12.info("restore", { commit: snapshot3 }); + const result6 = yield* git([...core2, ...args3(["read-tree", snapshot3])], { cwd: state2.worktree }); if (result6.code === 0) { const checkout = yield* git([...core2, ...args3(["checkout-index", "-a", "-f"])], { - cwd: state3.worktree + cwd: state2.worktree }); if (checkout.code === 0) return; log12.error("failed to restore snapshot", { - snapshot: snapshot4, + snapshot: snapshot3, exitCode: checkout.code, stderr: checkout.stderr }); return; } log12.error("failed to restore snapshot", { - snapshot: snapshot4, + snapshot: snapshot3, exitCode: result6.code, stderr: result6.stderr }); @@ -198997,19 +199297,19 @@ var init_snapshot = __esm(async () => { ops.push({ hash: item.hash, file: file5, - rel: path26.relative(state3.worktree, file5).replaceAll("\\", "/") + rel: path27.relative(state2.worktree, file5).replaceAll("\\", "/") }); } } const single = exports_Effect.fnUntraced(function* (op) { log12.info("reverting", { file: op.file, hash: op.hash }); const result6 = yield* git([...core2, ...args3(["checkout", op.hash, "--", op.rel])], { - cwd: state3.worktree + cwd: state2.worktree }); if (result6.code === 0) return; const tree = yield* git([...core2, ...args3(["ls-tree", op.hash, "--", op.rel])], { - cwd: state3.worktree + cwd: state2.worktree }); if (tree.code === 0 && tree.text.trim()) { log12.info("file existed in snapshot but checkout failed, keeping", { file: op.file, hash: op.hash }); @@ -199038,7 +199338,7 @@ var init_snapshot = __esm(async () => { continue; } const tree = yield* git([...quote, ...args3(["ls-tree", "--name-only", first2.hash, "--", ...run8.map((item) => item.rel)])], { - cwd: state3.worktree + cwd: state2.worktree }); if (tree.code !== 0) { log12.info("batched ls-tree failed, falling back to single-file revert", { @@ -199057,7 +199357,7 @@ var init_snapshot = __esm(async () => { if (list.length) { log12.info("reverting", { hash: first2.hash, files: list.length }); const result6 = yield* git([...core2, ...args3(["checkout", first2.hash, "--", ...list.map((item) => item.rel)])], { - cwd: state3.worktree + cwd: state2.worktree }); if (result6.code !== 0) { log12.info("batched checkout failed, falling back to single-file revert", { @@ -199085,7 +199385,7 @@ var init_snapshot = __esm(async () => { return yield* locked2(exports_Effect.gen(function* () { yield* add11(); const result6 = yield* git([...quote, ...args3(["diff", "--cached", "--no-ext-diff", hash4, "--", "."])], { - cwd: state3.worktree + cwd: state2.worktree }); if (result6.code !== 0) { log12.warn("failed to get diff", { @@ -199137,7 +199437,7 @@ var init_snapshot = __esm(async () => { if (!refs.length) return new Map; const proc = exports_ChildProcess.make("git", [...cfg, ...args3(["cat-file", "--batch"])], { - cwd: state3.directory, + cwd: state2.directory, extendEnv: true, stdin: exports_Stream.make(new TextEncoder().encode(refs.map((item) => item.ref).join(` `) + ` @@ -199197,7 +199497,7 @@ var init_snapshot = __esm(async () => { }, exports_Effect.scoped, exports_Effect.catch(() => exports_Effect.succeed(undefined))); const result6 = []; const status = new Map; - const statuses = yield* git([...quote, ...args3(["diff", "--no-ext-diff", "--name-status", "--no-renames", from, to2, "--", "."])], { cwd: state3.directory }); + const statuses = yield* git([...quote, ...args3(["diff", "--no-ext-diff", "--name-status", "--no-renames", from, to2, "--", "."])], { cwd: state2.directory }); for (const line2 of statuses.text.trim().split(` `)) { if (!line2) @@ -199208,7 +199508,7 @@ var init_snapshot = __esm(async () => { status.set(file5, code.startsWith("A") ? "added" : code.startsWith("D") ? "deleted" : "modified"); } const numstat = yield* git([...quote, ...args3(["diff", "--no-ext-diff", "--no-renames", "--numstat", from, to2, "--", "."])], { - cwd: state3.directory + cwd: state2.directory }); const rows = numstat.text.trim().split(` `).filter(Boolean).flatMap((line2) => { @@ -199256,28 +199556,28 @@ var init_snapshot = __esm(async () => { })); return Service3.of({ init: exports_Effect.fn("Snapshot.init")(function* () { - yield* InstanceState.get(state2); + yield* InstanceState.get(state); }), cleanup: exports_Effect.fn("Snapshot.cleanup")(function* () { - return yield* InstanceState.useEffect(state2, (s5) => s5.cleanup()); + return yield* InstanceState.useEffect(state, (s5) => s5.cleanup()); }), track: exports_Effect.fn("Snapshot.track")(function* () { - return yield* InstanceState.useEffect(state2, (s5) => s5.track()); + return yield* InstanceState.useEffect(state, (s5) => s5.track()); }), patch: exports_Effect.fn("Snapshot.patch")(function* (hash4) { - return yield* InstanceState.useEffect(state2, (s5) => s5.patch(hash4)); + return yield* InstanceState.useEffect(state, (s5) => s5.patch(hash4)); }), - restore: exports_Effect.fn("Snapshot.restore")(function* (snapshot4) { - return yield* InstanceState.useEffect(state2, (s5) => s5.restore(snapshot4)); + restore: exports_Effect.fn("Snapshot.restore")(function* (snapshot3) { + return yield* InstanceState.useEffect(state, (s5) => s5.restore(snapshot3)); }), revert: exports_Effect.fn("Snapshot.revert")(function* (patches) { - return yield* InstanceState.useEffect(state2, (s5) => s5.revert(patches)); + return yield* InstanceState.useEffect(state, (s5) => s5.revert(patches)); }), diff: exports_Effect.fn("Snapshot.diff")(function* (hash4) { - return yield* InstanceState.useEffect(state2, (s5) => s5.diff(hash4)); + return yield* InstanceState.useEffect(state, (s5) => s5.diff(hash4)); }), diffFull: exports_Effect.fn("Snapshot.diffFull")(function* (from, to2) { - return yield* InstanceState.useEffect(state2, (s5) => s5.diffFull(from, to2)); + return yield* InstanceState.useEffect(state, (s5) => s5.diffFull(from, to2)); }) }); })); @@ -199295,8 +199595,8 @@ var init_snapshot = __esm(async () => { return runPromise3((svc) => svc.patch(hash4)); } Snapshot.patch = patch3; - async function restore(snapshot4) { - return runPromise3((svc) => svc.restore(snapshot4)); + async function restore(snapshot3) { + return runPromise3((svc) => svc.restore(snapshot3)); } Snapshot.restore = restore; async function revert(patches) { @@ -200390,7 +200690,7 @@ var init_summary = __esm(async () => { SessionSummary.Service = Service3; SessionSummary.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const sessions = yield* Session.Service; - const snapshot4 = yield* Snapshot.Service; + const snapshot3 = yield* Snapshot.Service; const storage = yield* Storage.Service; const bus = yield* Bus.Service; const computeDiff = exports_Effect.fn("SessionSummary.computeDiff")(function* (input) { @@ -200411,7 +200711,7 @@ var init_summary = __esm(async () => { } } if (from && to2) - return yield* snapshot4.diffFull(from, to2); + return yield* snapshot3.diffFull(from, to2); return []; }); const summarize2 = exports_Effect.fn("SessionSummary.summarize")(function* (input) { @@ -201611,7 +201911,7 @@ var separatorArrayExplode = (style) => { }; // packages/sdk/js/src/gen/core/utils.gen.ts -var PATH_PARAM_RE, defaultPathSerializer = ({ path: path27, url: _url2 }) => { +var PATH_PARAM_RE, defaultPathSerializer = ({ path: path28, url: _url2 }) => { let url3 = _url2; const matches = _url2.match(PATH_PARAM_RE); if (matches) { @@ -201630,7 +201930,7 @@ var PATH_PARAM_RE, defaultPathSerializer = ({ path: path27, url: _url2 }) => { name21 = name21.substring(1); style = "matrix"; } - const value8 = path27[name21]; + const value8 = path28[name21]; if (value8 === undefined || value8 === null) { continue; } @@ -201662,15 +201962,15 @@ var PATH_PARAM_RE, defaultPathSerializer = ({ path: path27, url: _url2 }) => { return url3; }, getUrl = ({ baseUrl: baseUrl2, - path: path27, + path: path28, query, querySerializer, url: _url2 }) => { const pathUrl = _url2.startsWith("/") ? _url2 : `/${_url2}`; let url3 = (baseUrl2 ?? "") + pathUrl; - if (path27) { - url3 = defaultPathSerializer({ path: path27, url: url3 }); + if (path28) { + url3 = defaultPathSerializer({ path: path28, url: url3 }); } let search2 = query ? querySerializer(query) : ""; if (search2.startsWith("?")) { @@ -201834,12 +202134,12 @@ var createQuerySerializer = ({ allowReserved, array: array8, object: object6 } = querySerializer: typeof options4.querySerializer === "function" ? options4.querySerializer : createQuerySerializer(options4.querySerializer), url: options4.url }), mergeConfigs = (a4, b2) => { - const config4 = { ...a4, ...b2 }; - if (config4.baseUrl?.endsWith("/")) { - config4.baseUrl = config4.baseUrl.substring(0, config4.baseUrl.length - 1); + const config3 = { ...a4, ...b2 }; + if (config3.baseUrl?.endsWith("/")) { + config3.baseUrl = config3.baseUrl.substring(0, config3.baseUrl.length - 1); } - config4.headers = mergeHeaders(a4.headers, b2.headers); - return config4; + config3.headers = mergeHeaders(a4.headers, b2.headers); + return config3; }, mergeHeaders = (...headers) => { const mergedHeaders = new Headers; for (const header of headers) { @@ -201891,11 +202191,11 @@ var init_utils_gen2 = __esm(() => { }); // packages/sdk/js/src/gen/client/client.gen.ts -var createClient = (config4 = {}) => { - let _config = mergeConfigs(createConfig(), config4); +var createClient = (config3 = {}) => { + let _config = mergeConfigs(createConfig(), config3); const getConfig = () => ({ ..._config }); - const setConfig = (config5) => { - _config = mergeConfigs(_config, config5); + const setConfig = (config4) => { + _config = mergeConfigs(_config, config4); return getConfig(); }; const interceptors = createInterceptors(); @@ -202747,25 +203047,25 @@ function rewrite(request3, directory) { next3.headers.delete("x-unifia-directory"); return next3; } -function createUnifiaClient(config4) { - if (!config4?.fetch) { +function createUnifiaClient(config3) { + if (!config3?.fetch) { const customFetch = (req) => { req.timeout = false; return fetch(req); }; - config4 = { - ...config4, + config3 = { + ...config3, fetch: customFetch }; } - if (config4?.directory) { - config4.headers = { - ...config4.headers, - "x-unifia-directory": encodeURIComponent(config4.directory) + if (config3?.directory) { + config3.headers = { + ...config3.headers, + "x-unifia-directory": encodeURIComponent(config3.directory) }; } - const client2 = createClient(config4); - client2.interceptors.request.use((request3) => rewrite(request3, config4?.directory)); + const client2 = createClient(config3); + client2.interceptors.request.use((request3) => rewrite(request3, config3?.directory)); return new UnifiaClient({ client: client2 }); } var init_client4 = __esm(() => { @@ -202841,7 +203141,7 @@ function extractAccountId(tokens) { } return; } -function buildAuthorizeUrl(redirectUri, pkce, state2) { +function buildAuthorizeUrl(redirectUri, pkce, state) { const params = new URLSearchParams({ response_type: "code", client_id: CLIENT_ID2, @@ -202851,7 +203151,7 @@ function buildAuthorizeUrl(redirectUri, pkce, state2) { code_challenge_method: "S256", id_token_add_organizations: "true", codex_cli_simplified_flow: "true", - state: state2, + state, originator: "unifia" }); return `${ISSUER}/oauth/authorize?${params.toString()}`; @@ -202898,7 +203198,7 @@ async function startOAuthServer() { const url3 = new URL(req.url); if (url3.pathname === "/auth/callback") { const code = url3.searchParams.get("code"); - const state2 = url3.searchParams.get("state"); + const state = url3.searchParams.get("state"); const error46 = url3.searchParams.get("error"); const errorDescription = url3.searchParams.get("error_description"); if (error46) { @@ -202918,7 +203218,7 @@ async function startOAuthServer() { headers: { "Content-Type": "text/html" } }); } - if (!pendingOAuth || state2 !== pendingOAuth.state) { + if (!pendingOAuth || state !== pendingOAuth.state) { const errorMsg = "Invalid state - potential CSRF attack"; pendingOAuth?.reject(new Error(errorMsg)); pendingOAuth = undefined; @@ -202952,7 +203252,7 @@ function stopOAuthServer() { log13.info("codex oauth server stopped"); } } -function waitForOAuthCallback(pkce, state2) { +function waitForOAuthCallback(pkce, state) { return new Promise((resolve10, reject) => { const timeout4 = setTimeout(() => { if (pendingOAuth) { @@ -202962,7 +203262,7 @@ function waitForOAuthCallback(pkce, state2) { }, 5 * 60 * 1000); pendingOAuth = { pkce, - state: state2, + state, resolve: (tokens) => { clearTimeout(timeout4); resolve10(tokens); @@ -203080,9 +203380,9 @@ async function CodexAuthPlugin(input) { authorize: async () => { const { redirectUri } = await startOAuthServer(); const pkce = await generatePKCE(); - const state2 = generateState(); - const authUrl = buildAuthorizeUrl(redirectUri, pkce, state2); - const callbackPromise = waitForOAuthCallback(pkce, state2); + const state = generateState(); + const authUrl = buildAuthorizeUrl(redirectUri, pkce, state); + const callbackPromise = waitForOAuthCallback(pkce, state); return { url: authUrl, instructions: "Complete authorization in your browser. This window will close automatically.", @@ -203805,19 +204105,19 @@ var init_client5 = __esm(async () => { log15 = Log.create({ service: "anythingllm" }); ((AnythingLLMClient) => { let _config = null; - function configure(config4) { - _config = config4; - log15.info("configured", { url: config4.url }); + function configure(config3) { + _config = config3; + log15.info("configured", { url: config3.url }); } AnythingLLMClient.configure = configure; function isConfigured2() { return _config !== null; } AnythingLLMClient.isConfigured = isConfigured2; - async function request3(path27, opts) { + async function request3(path28, opts) { if (!_config) throw new Error("AnythingLLM client not configured"); - const url3 = `${_config.url.replace(/\/+$/, "")}${path27}`; + const url3 = `${_config.url.replace(/\/+$/, "")}${path28}`; const response = await fetch(url3, { ...opts, headers: { @@ -204035,8 +204335,8 @@ var init_plugin2 = __esm(async () => { } Plugin.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const bus = yield* Bus.Service; - const config4 = yield* Config.Service; - const state2 = yield* InstanceState.make(exports_Effect.fn("Plugin.state")(function* (ctx) { + const config3 = yield* Config.Service; + const state = yield* InstanceState.make(exports_Effect.fn("Plugin.state")(function* (ctx) { const hooks = []; const { Server: Server2 } = yield* exports_Effect.promise(() => init_server4().then(() => exports_server)); const client3 = createUnifiaClient({ @@ -204047,7 +204347,7 @@ var init_plugin2 = __esm(async () => { } : undefined, fetch: async (...args3) => Server2.Default().fetch(...args3) }); - const cfg = yield* config4.get(); + const cfg = yield* config3.get(); const input = { client: client3, project: ctx.project, @@ -204090,7 +204390,7 @@ var init_plugin2 = __esm(async () => { log12.info("skipping external plugins in pure mode", { count: cfg.plugin_origins.length }); } if (plugins.length) - yield* config4.waitForDependencies(); + yield* config3.waitForDependencies(); const loaded = yield* exports_Effect.promise(() => PluginLoader.loadExternal({ items: plugins, kind: "server", @@ -204160,7 +204460,7 @@ var init_plugin2 = __esm(async () => { const trigger2 = exports_Effect.fn("Plugin.trigger")(function* (name21, input, output2) { if (!name21) return output2; - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); for (const hook of s5.hooks) { const fn3 = hook[name21]; if (!fn3) @@ -204170,11 +204470,11 @@ var init_plugin2 = __esm(async () => { return output2; }); const list2 = exports_Effect.fn("Plugin.list")(function* () { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); return s5.hooks; }); const has18 = exports_Effect.fn("Plugin.has")(function* (name21) { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); for (const hook of s5.hooks) { if (typeof hook[name21] === "function") return true; @@ -204182,7 +204482,7 @@ var init_plugin2 = __esm(async () => { return false; }); const init5 = exports_Effect.fn("Plugin.init")(function* () { - yield* InstanceState.get(state2); + yield* InstanceState.get(state); }); return Service3.of({ trigger: trigger2, list: list2, has: has18, init: init5 }); })); @@ -205570,12 +205870,12 @@ var anthropicErrorDataSchema, anthropicFailedResponseHandler, anthropicMessagesR }, toolSearchRegex_20251119OutputSchema, toolSearchRegex_20251119InputSchema, factory9, toolSearchRegex_20251119 = (args3 = {}) => { return factory9(args3); }, AnthropicMessagesLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; var _a21; this.modelId = modelId; - this.config = config4; - this.generateId = (_a21 = config4.generateId) != null ? _a21 : generateId; + this.config = config3; + this.generateId = (_a21 = config3.generateId) != null ? _a21 : generateId; } supportsUrl(url3) { return url3.protocol === "https:"; @@ -209015,26 +209315,26 @@ var require_tslib = __commonJS((exports, module2) => { __importDefault = function(mod2) { return mod2 && mod2.__esModule ? mod2 : { default: mod2 }; }; - __classPrivateFieldGet2 = function(receiver, state2, kind, f4) { + __classPrivateFieldGet2 = function(receiver, state, kind, f4) { if (kind === "a" && !f4) throw new TypeError("Private accessor was defined without a getter"); - if (typeof state2 === "function" ? receiver !== state2 || !f4 : !state2.has(receiver)) + if (typeof state === "function" ? receiver !== state || !f4 : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f4 : kind === "a" ? f4.call(receiver) : f4 ? f4.value : state2.get(receiver); + return kind === "m" ? f4 : kind === "a" ? f4.call(receiver) : f4 ? f4.value : state.get(receiver); }; - __classPrivateFieldSet2 = function(receiver, state2, value8, kind, f4) { + __classPrivateFieldSet2 = function(receiver, state, value8, kind, f4) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f4) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state2 === "function" ? receiver !== state2 || !f4 : !state2.has(receiver)) + if (typeof state === "function" ? receiver !== state || !f4 : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return kind === "a" ? f4.call(receiver, value8) : f4 ? f4.value = value8 : state2.set(receiver, value8), value8; + return kind === "a" ? f4.call(receiver, value8) : f4 ? f4.value = value8 : state.set(receiver, value8), value8; }; - __classPrivateFieldIn = function(state2, receiver) { + __classPrivateFieldIn = function(state, receiver) { if (receiver === null || typeof receiver !== "object" && typeof receiver !== "function") throw new TypeError("Cannot use 'in' operator on non-object"); - return typeof state2 === "function" ? receiver === state2 : state2.has(receiver); + return typeof state === "function" ? receiver === state : state.has(receiver); }; __addDisposableResource = function(env3, value8, async) { if (value8 !== null && value8 !== undefined) { @@ -209104,13 +209404,13 @@ var require_tslib = __commonJS((exports, module2) => { } return next3(); }; - __rewriteRelativeImportExtension = function(path27, preserveJsx) { - if (typeof path27 === "string" && /^\.\.?\//.test(path27)) { - return path27.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function(m3, tsx, d4, ext2, cm) { + __rewriteRelativeImportExtension = function(path28, preserveJsx) { + if (typeof path28 === "string" && /^\.\.?\//.test(path28)) { + return path28.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function(m3, tsx, d4, ext2, cm) { return tsx ? preserveJsx ? ".jsx" : ".js" : d4 && (!ext2 || !cm) ? m3 : d4 + ext2 + "." + cm.toLowerCase() + "js"; }); } - return path27; + return path28; }; exporter("__extends", __extends); exporter("__assign", __assign); @@ -209662,8 +209962,8 @@ var require_dist_cjs = __commonJS((exports) => { var getDefaultClientConfiguration = (runtimeConfig) => { return getChecksumConfiguration(runtimeConfig); }; - var resolveDefaultRuntimeConfig = (config4) => { - return resolveChecksumRuntimeConfig(config4); + var resolveDefaultRuntimeConfig = (config3) => { + return resolveChecksumRuntimeConfig(config3); }; var FieldPosition; (function(FieldPosition2) { @@ -209878,13 +210178,13 @@ var require_schema2 = __commonJS((exports) => { input, output: output2 }); - var schemaDeserializationMiddleware = (config4) => (next3, context4) => async (args3) => { + var schemaDeserializationMiddleware = (config3) => (next3, context4) => async (args3) => { const { response } = await next3(args3); const { operationSchema } = getSmithyContext(context4); const [, ns2, n10, t2, i6, o3] = operationSchema ?? []; try { - const parsed = await config4.protocol.deserializeResponse(operation(ns2, n10, t2, i6, o3), { - ...config4, + const parsed = await config3.protocol.deserializeResponse(operation(ns2, n10, t2, i6, o3), { + ...config3, ...context4 }, response); return { @@ -209936,12 +210236,12 @@ var require_schema2 = __commonJS((exports) => { return k3.match(pattern); }) || [undefined, undefined])[1]; }; - var schemaSerializationMiddleware = (config4) => (next3, context4) => async (args3) => { + var schemaSerializationMiddleware = (config3) => (next3, context4) => async (args3) => { const { operationSchema } = getSmithyContext(context4); const [, ns2, n10, t2, i6, o3] = operationSchema ?? []; - const endpoint = context4.endpointV2 ? async () => toEndpointV1(context4.endpointV2) : config4.endpoint; - const request3 = await config4.protocol.serializeRequest(operation(ns2, n10, t2, i6, o3), args3.input, { - ...config4, + const endpoint = context4.endpointV2 ? async () => toEndpointV1(context4.endpointV2) : config3.endpoint; + const request3 = await config3.protocol.serializeRequest(operation(ns2, n10, t2, i6, o3), args3.input, { + ...config3, ...context4, endpoint }); @@ -209962,12 +210262,12 @@ var require_schema2 = __commonJS((exports) => { tags: ["SERIALIZER"], override: true }; - function getSchemaSerdePlugin(config4) { + function getSchemaSerdePlugin(config3) { return { applyToStack: (commandStack) => { - commandStack.add(schemaSerializationMiddleware(config4), serializerMiddlewareOption); - commandStack.add(schemaDeserializationMiddleware(config4), deserializerMiddlewareOption); - config4.protocol.setSerdeContext(config4); + commandStack.add(schemaSerializationMiddleware(config3), serializerMiddlewareOption); + commandStack.add(schemaDeserializationMiddleware(config3), deserializerMiddlewareOption); + config3.protocol.setSerdeContext(config3); } }; } @@ -210884,14 +211184,14 @@ var require_client5 = __commonJS((exports) => { } await sleep5(delayMs / 1000); } - const { state: state2, reason: reason2 } = await acceptorChecks(client3, input); + const { state, reason: reason2 } = await acceptorChecks(client3, input); if (reason2) { const message = createMessageFromResponse(reason2); observedResponses[message] |= 0; observedResponses[message] += 1; } - if (state2 !== WaiterState.RETRY) { - return { state: state2, reason: reason2, final: reason2, observedResponses }; + if (state !== WaiterState.RETRY) { + return { state, reason: reason2, final: reason2, observedResponses }; } currentAttempt += 1; if (!didWarn403 && Date.now() >= warn403Time) { @@ -211006,12 +211306,12 @@ var require_client5 = __commonJS((exports) => { middlewareStack = constructStack(); initConfig; handlers; - constructor(config4) { - this.config = config4; - const { protocol, protocolSettings } = config4; + constructor(config3) { + this.config = config3; + const { protocol, protocolSettings } = config3; if (protocolSettings) { if (typeof protocol === "function") { - config4.protocol = new protocol(protocolSettings); + config3.protocol = new protocol(protocolSettings); } } } @@ -211239,14 +211539,14 @@ var require_client5 = __commonJS((exports) => { for (const [waiterName, waiterFn] of Object.entries(waiters)) { if (Client2.prototype[waiterName] === undefined) { Client2.prototype[waiterName] = async function(commandInput = {}, waiterConfiguration, ...rest) { - let config4 = waiterConfiguration; + let config3 = waiterConfiguration; if (typeof waiterConfiguration === "number") { - config4 = { + config3 = { maxWaitTime: waiterConfiguration }; } return waiterFn({ - ...config4, + ...config3, client: this }, commandInput, ...rest); }; @@ -211417,8 +211717,8 @@ var require_client5 = __commonJS((exports) => { return Object.assign(getChecksumConfiguration(runtimeConfig), getRetryConfiguration(runtimeConfig)); }; var getDefaultClientConfiguration = getDefaultExtensionConfiguration; - var resolveDefaultRuntimeConfig = (config4) => { - return Object.assign(resolveChecksumRuntimeConfig(config4), resolveRetryRuntimeConfig(config4)); + var resolveDefaultRuntimeConfig = (config3) => { + return Object.assign(resolveChecksumRuntimeConfig(config3), resolveRetryRuntimeConfig(config3)); }; var getArrayIfSingleItem = (mayBeArray) => Array.isArray(mayBeArray) ? mayBeArray : [mayBeArray]; var getValueFromTextNode = (obj) => { @@ -211565,9 +211865,9 @@ var require_client5 = __commonJS((exports) => { function makeBuilder(common, service3, name21, ep) { return function makeCommand(added, plugins, op, $2, smithyContext = {}) { const epMerged = Object.assign({}, common, added); - return Command3.classBuilder().ep(epMerged).m(function(CommandCtor, clientStack, config4, options4) { - const list = plugins.call(this, CommandCtor, clientStack, config4, options4); - list.unshift(ep(config4, CommandCtor.getEndpointParameterInstructions())); + return Command3.classBuilder().ep(epMerged).m(function(CommandCtor, clientStack, config3, options4) { + const list = plugins.call(this, CommandCtor, clientStack, config3, options4); + list.unshift(ep(config3, CommandCtor.getEndpointParameterInstructions())); return list; }).s(service3, op, smithyContext).n(name21, op.charAt(0).toUpperCase() + op.slice(1) + "Command").sc($2).build(); }; @@ -211850,14 +212150,14 @@ var require_config4 = __commonJS((exports) => { }; var filePromises = {}; var fileIntercept = {}; - var readFile5 = (path27, options4) => { - if (fileIntercept[path27] !== undefined) { - return fileIntercept[path27]; + var readFile5 = (path28, options4) => { + if (fileIntercept[path28] !== undefined) { + return fileIntercept[path28]; } - if (!filePromises[path27] || options4?.ignoreCache) { - filePromises[path27] = readFile$1(path27, "utf8"); + if (!filePromises[path28] || options4?.ignoreCache) { + filePromises[path28] = readFile$1(path28, "utf8"); } - return filePromises[path27]; + return filePromises[path28]; }; var swallowError$1 = () => ({}); var loadSharedConfigFiles = async (init4 = {}) => { @@ -211909,8 +212209,8 @@ var require_config4 = __commonJS((exports) => { getFileRecord() { return fileIntercept; }, - interceptFile(path27, contents) { - fileIntercept[path27] = Promise.resolve(contents); + interceptFile(path28, contents) { + fileIntercept[path28] = Promise.resolve(contents); }, getTokenRecord() { return tokenIntercept; @@ -211932,11 +212232,11 @@ var require_config4 = __commonJS((exports) => { } var fromEnv2 = (envVarSelector, options4) => async () => { try { - const config4 = envVarSelector(process.env, options4); - if (config4 === undefined) { + const config3 = envVarSelector(process.env, options4); + if (config3 === undefined) { throw new Error; } - return config4; + return config3; } catch (e2) { throw new CredentialsProviderError(e2.message || `Not found in ENV: ${getSelectorName(envVarSelector.toString())}`, { logger: options4?.logger }); } @@ -212326,13 +212626,13 @@ var require_endpoints = __commonJS((exports) => { return endpointUrl; return; }, - configFileSelector: (profile, config4) => { + configFileSelector: (profile, config3) => { if (profile.services) { const servicesSectionKey = ["services", profile.services].join(CONFIG_PREFIX_SEPARATOR); - if (!config4 || !config4[servicesSectionKey]) { + if (!config3 || !config3[servicesSectionKey]) { throw new Error(`The services section "${profile.services}" specified in the profile is not present in the shared configuration file.`); } - const servicesSection = config4[servicesSectionKey]; + const servicesSection = config3[servicesSectionKey]; const servicePrefixParts = serviceId.split(" ").map((w2) => w2.toLowerCase()); const endpointUrl2 = servicesSection[[servicePrefixParts.join("_"), CONFIG_ENDPOINT_URL].join(CONFIG_PREFIX_SEPARATOR)]; if (endpointUrl2) @@ -212390,15 +212690,15 @@ var require_endpoints = __commonJS((exports) => { } return isValidArn; }; - var createConfigValueProvider = (configKey, canonicalEndpointParamKey, config4, isClientContextParam = false) => { + var createConfigValueProvider = (configKey, canonicalEndpointParamKey, config3, isClientContextParam = false) => { const configProvider = async () => { let configValue; if (isClientContextParam) { - const clientContextParams = config4.clientContextParams; + const clientContextParams = config3.clientContextParams; const nestedValue = clientContextParams?.[configKey]; - configValue = nestedValue ?? config4[configKey] ?? config4[canonicalEndpointParamKey]; + configValue = nestedValue ?? config3[configKey] ?? config3[canonicalEndpointParamKey]; } else { - configValue = config4[configKey] ?? config4[canonicalEndpointParamKey]; + configValue = config3[configKey] ?? config3[canonicalEndpointParamKey]; } if (typeof configValue === "function") { return configValue(); @@ -212407,21 +212707,21 @@ var require_endpoints = __commonJS((exports) => { }; if (configKey === "credentialScope" || canonicalEndpointParamKey === "CredentialScope") { return async () => { - const credentials = typeof config4.credentials === "function" ? await config4.credentials() : config4.credentials; + const credentials = typeof config3.credentials === "function" ? await config3.credentials() : config3.credentials; const configValue = credentials?.credentialScope ?? credentials?.CredentialScope; return configValue; }; } if (configKey === "accountId" || canonicalEndpointParamKey === "AccountId") { return async () => { - const credentials = typeof config4.credentials === "function" ? await config4.credentials() : config4.credentials; + const credentials = typeof config3.credentials === "function" ? await config3.credentials() : config3.credentials; const configValue = credentials?.accountId ?? credentials?.AccountId; return configValue; }; } if (configKey === "endpoint" || canonicalEndpointParamKey === "endpoint") { return async () => { - if (config4.isCustomEndpoint === false) { + if (config3.isCustomEndpoint === false) { return; } const endpoint = await configProvider(); @@ -212430,8 +212730,8 @@ var require_endpoints = __commonJS((exports) => { return endpoint.url.href; } if ("hostname" in endpoint) { - const { protocol, hostname: hostname3, port: port2, path: path27 } = endpoint; - return `${protocol}//${hostname3}${port2 ? ":" + port2 : ""}${path27}`; + const { protocol, hostname: hostname3, port: port2, path: path28 } = endpoint; + return `${protocol}//${hostname3}${port2 ? ":" + port2 : ""}${path28}`; } } return endpoint; @@ -212511,16 +212811,16 @@ var require_endpoints = __commonJS((exports) => { } function bindEndpointMiddleware(getEndpointFromConfig2) { const getEndpointFromInstructions2 = bindGetEndpointFromInstructions(getEndpointFromConfig2); - return ({ config: config4, instructions }) => { + return ({ config: config3, instructions }) => { return (next3, context4) => async (args3) => { - if (config4.isCustomEndpoint) { + if (config3.isCustomEndpoint) { setFeature(context4, "ENDPOINT_OVERRIDE", "N"); } const endpoint = await getEndpointFromInstructions2(args3.input, { getEndpointParameterInstructions() { return instructions; } - }, { ...config4 }, context4); + }, { ...config3 }, context4); context4.endpointV2 = endpoint; context4.authSchemes = endpoint.properties?.authSchemes; const authScheme = context4.authSchemes?.[0]; @@ -212558,10 +212858,10 @@ var require_endpoints = __commonJS((exports) => { }; function bindGetEndpointPlugin(getEndpointFromConfig2) { const endpointMiddleware2 = bindEndpointMiddleware(getEndpointFromConfig2); - return (config4, instructions) => ({ + return (config3, instructions) => ({ applyToStack: (clientStack) => { clientStack.addRelativeTo(endpointMiddleware2({ - config: config4, + config: config3, instructions }), endpointMiddlewareOptions); } @@ -212688,18 +212988,18 @@ var require_endpoints = __commonJS((exports) => { } return; } - var getAttrPathList = (path27) => { - const parts3 = path27.split("."); + var getAttrPathList = (path28) => { + const parts3 = path28.split("."); const pathList = []; for (const part of parts3) { const squareBracketIndex = part.indexOf("["); if (squareBracketIndex !== -1) { if (part.indexOf("]") !== part.length - 1) { - throw new EndpointError(`Path: '${path27}' does not end with ']'`); + throw new EndpointError(`Path: '${path28}' does not end with ']'`); } const arrayIndex = part.slice(squareBracketIndex + 1, -1); if (Number.isNaN(parseInt(arrayIndex))) { - throw new EndpointError(`Invalid array index: '${arrayIndex}' in path: '${path27}'`); + throw new EndpointError(`Invalid array index: '${arrayIndex}' in path: '${path28}'`); } if (squareBracketIndex !== 0) { pathList.push(part.slice(0, squareBracketIndex)); @@ -212711,9 +213011,9 @@ var require_endpoints = __commonJS((exports) => { } return pathList; }; - var getAttr = (value8, path27) => getAttrPathList(path27).reduce((acc, index3) => { + var getAttr = (value8, path28) => getAttrPathList(path28).reduce((acc, index3) => { if (typeof acc !== "object") { - throw new EndpointError(`Index '${index3}' in '${path27}' not found in '${JSON.stringify(value8)}'`); + throw new EndpointError(`Index '${index3}' in '${path28}' not found in '${JSON.stringify(value8)}'`); } else if (Array.isArray(acc)) { const i6 = parseInt(index3); return acc[i6 < 0 ? acc.length + i6 : i6]; @@ -212738,8 +213038,8 @@ var require_endpoints = __commonJS((exports) => { return value8; } if (typeof value8 === "object" && "hostname" in value8) { - const { hostname: hostname4, port: port2, protocol: protocol2 = "", path: path27 = "", query = {} } = value8; - const url3 = new URL(`${protocol2}//${hostname4}${port2 ? `:${port2}` : ""}${path27}`); + const { hostname: hostname4, port: port2, protocol: protocol2 = "", path: path28 = "", query = {} } = value8; + const url3 = new URL(`${protocol2}//${hostname4}${port2 ? `:${port2}` : ""}${path28}`); url3.search = Object.entries(query).map(([k3, v3]) => `${k3}=${v3}`).join("&"); return url3; } @@ -213996,11 +214296,11 @@ var require_serde = __commonJS((exports) => { tags: ["SERIALIZER"], override: true }; - function getSerdePlugin(config4, serializer, deserializer) { + function getSerdePlugin(config3, serializer, deserializer) { return { applyToStack: (commandStack) => { - commandStack.add(deserializerMiddleware(config4, deserializer), deserializerMiddlewareOption); - commandStack.add(serializerMiddleware(config4, serializer), serializerMiddlewareOption); + commandStack.add(deserializerMiddleware(config3, deserializer), deserializerMiddlewareOption); + commandStack.add(serializerMiddleware(config3, serializer), serializerMiddlewareOption); } }; } @@ -215400,7 +215700,7 @@ var init_aws4fetch_esm = __esm(() => { function createBedrockEventStreamDecoder(body3, processEvent) { const codec2 = new EventStreamCodec(import_util_utf82.toUtf8, import_util_utf82.fromUtf8); let buffer4 = new Uint8Array(0); - const textDecoder3 = new TextDecoder; + const textDecoder2 = new TextDecoder; return body3.pipeThrough(new TransformStream({ async transform(chunk, controller) { var _a21, _b16; @@ -215419,7 +215719,7 @@ function createBedrockEventStreamDecoder(body3, processEvent) { buffer4 = buffer4.slice(totalLength); const messageType = (_a21 = decoded.headers[":message-type"]) == null ? undefined : _a21.value; const eventType = (_b16 = decoded.headers[":event-type"]) == null ? undefined : _b16.value; - const data2 = textDecoder3.decode(decoded.body); + const data2 = textDecoder2.decode(decoded.body); await processEvent({ messageType, eventType, data: data2 }, controller); } catch (e2) { break; @@ -216182,9 +216482,9 @@ var import_util_utf82, BEDROCK_STOP_REASONS, BEDROCK_IMAGE_MIME_TYPES, BEDROCK_D }) }; }, BedrockChatLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.provider = "amazon-bedrock"; this.supportedUrls = {}; @@ -216850,9 +217150,9 @@ var import_util_utf82, BEDROCK_STOP_REASONS, BEDROCK_IMAGE_MIME_TYPES, BEDROCK_D return `${this.config.baseUrl()}/model/${encodedModelId}`; } }, BedrockStopReasonSchema, BedrockAdditionalModelResponseFieldsSchema, BedrockToolUseSchema, BedrockReasoningTextSchema, BedrockRedactedReasoningSchema, BedrockResponseSchema, BedrockStreamSchema, bedrockReasoningMetadataSchema, amazonBedrockEmbeddingModelOptionsSchema, BedrockEmbeddingModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.provider = "amazon-bedrock"; this.maxEmbeddingsPerCall = 1; @@ -216938,9 +217238,9 @@ var import_util_utf82, BEDROCK_STOP_REASONS, BEDROCK_IMAGE_MIME_TYPES, BEDROCK_D }; } }, BedrockEmbeddingResponseSchema, modelMaxImagesPerCall, BedrockImageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.provider = "amazon-bedrock"; } @@ -217103,9 +217403,9 @@ var import_util_utf82, BEDROCK_STOP_REASONS, BEDROCK_IMAGE_MIME_TYPES, BEDROCK_D }; } }, bedrockImageResponseSchema, VERSION5 = "4.0.83", bedrockRerankingResponseSchema, amazonBedrockRerankingModelOptionsSchema, BedrockRerankingModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.provider = "amazon-bedrock"; } @@ -218858,12 +219158,12 @@ var VERSION6 = "3.0.64", anthropicErrorDataSchema2, anthropicFailedResponseHandl }, toolSearchRegex_20251119OutputSchema2, toolSearchRegex_20251119InputSchema2, factory92, toolSearchRegex_202511192 = (args3 = {}) => { return factory92(args3); }, AnthropicMessagesLanguageModel2 = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; var _a21; this.modelId = modelId; - this.config = config4; - this.generateId = (_a21 = config4.generateId) != null ? _a21 : generateId; + this.config = config3; + this.generateId = (_a21 = config3.generateId) != null ? _a21 : generateId; } supportsUrl(url3) { return url3.protocol === "https:"; @@ -223295,13 +223595,13 @@ function escapeJSONDelta(delta) { return JSON.stringify(delta).slice(1, -1); } var openaiErrorDataSchema, openaiFailedResponseHandler, openaiChatResponseSchema, openaiChatChunkSchema, openaiLanguageModelChatOptions, OpenAIChatLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.supportedUrls = { "image/*": [/^https?:\/\/.*$/] }; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -223762,11 +224062,11 @@ var openaiErrorDataSchema, openaiFailedResponseHandler, openaiChatResponseSchema }; } }, openaiCompletionResponseSchema, openaiCompletionChunkSchema, openaiLanguageModelCompletionOptions, OpenAICompletionLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.supportedUrls = {}; this.modelId = modelId; - this.config = config4; + this.config = config3; } get providerOptionsName() { return this.config.provider.split(".")[0].trim(); @@ -223975,12 +224275,12 @@ var openaiErrorDataSchema, openaiFailedResponseHandler, openaiChatResponseSchema }; } }, openaiEmbeddingModelOptions, openaiTextEmbeddingResponseSchema, OpenAIEmbeddingModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.maxEmbeddingsPerCall = 2048; this.supportsParallelCalls = true; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -224035,9 +224335,9 @@ var openaiErrorDataSchema, openaiFailedResponseHandler, openaiChatResponseSchema }; } }, openaiImageResponseSchema, modelMaxImagesPerCall2, defaultResponseFormatPrefixes, OpenAIImageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; } get maxImagesPerCall() { @@ -224181,9 +224481,9 @@ var openaiErrorDataSchema, openaiFailedResponseHandler, openaiChatResponseSchema }; } }, openaiTranscriptionResponseSchema, openAITranscriptionModelOptions, languageMap, OpenAITranscriptionModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; } get provider() { @@ -224278,9 +224578,9 @@ var openaiErrorDataSchema, openaiFailedResponseHandler, openaiChatResponseSchema }; } }, openaiSpeechModelOptionsSchema, OpenAISpeechModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; } get provider() { @@ -224380,14 +224680,14 @@ var openaiErrorDataSchema, openaiFailedResponseHandler, openaiChatResponseSchema }, comparisonFilterSchema, compoundFilterSchema, fileSearchArgsSchema, fileSearchOutputSchema, fileSearch, imageGenerationArgsSchema, imageGenerationInputSchema, imageGenerationOutputSchema, imageGenerationToolFactory, imageGeneration = (args3 = {}) => { return imageGenerationToolFactory(args3); }, customArgsSchema, customInputSchema, customToolFactory, jsonValueSchema22, mcpArgsSchema, mcpInputSchema, mcpOutputSchema, mcpToolFactory, webSearchArgsSchema, webSearchInputSchema, webSearchOutputSchema, webSearchToolFactory, webSearchPreviewArgsSchema, webSearchPreviewInputSchema, webSearchPreviewOutputSchema, webSearchPreview, OpenAIResponsesLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.supportedUrls = { "image/*": [/^https?:\/\/.*$/], "application/pdf": [/^https?:\/\/.*$/] }; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -227578,14 +227878,14 @@ function createAzure(options4 = {}) { description: "Azure OpenAI resource name" }); const apiVersion = (_a21 = options4.apiVersion) != null ? _a21 : "v1"; - const url3 = ({ path: path27, modelId }) => { + const url3 = ({ path: path28, modelId }) => { var _a25; const baseUrlPrefix = (_a25 = options4.baseURL) != null ? _a25 : `https://${getResourceName()}.openai.azure.com/openai`; let fullUrl; if (options4.useDeploymentBasedUrls) { - fullUrl = new URL(`${baseUrlPrefix}/deployments/${modelId}${path27}`); + fullUrl = new URL(`${baseUrlPrefix}/deployments/${modelId}${path28}`); } else { - fullUrl = new URL(`${baseUrlPrefix}/v1${path27}`); + fullUrl = new URL(`${baseUrlPrefix}/v1${path28}`); } fullUrl.searchParams.set("api-version", apiVersion); return fullUrl.toString(); @@ -228471,12 +228771,12 @@ function createGoogleGenerativeAI(options4 = {}) { return provider; } var VERSION8 = "3.0.53", googleErrorDataSchema, googleFailedResponseHandler, googleEmbeddingContentPartSchema, googleEmbeddingModelOptions, GoogleGenerativeAIEmbeddingModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.maxEmbeddingsPerCall = 2048; this.supportsParallelCalls = true; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -228571,12 +228871,12 @@ var VERSION8 = "3.0.53", googleErrorDataSchema, googleFailedResponseHandler, goo }; } }, googleGenerativeAITextEmbeddingResponseSchema, googleGenerativeAISingleEmbeddingResponseSchema, dataUrlRegex, googleLanguageModelOptions, GoogleGenerativeAILanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; var _a21; this.modelId = modelId; - this.config = config4; - this.generateId = (_a21 = config4.generateId) != null ? _a21 : generateId; + this.config = config3; + this.generateId = (_a21 = config3.generateId) != null ? _a21 : generateId; } get provider() { return this.config.provider; @@ -229157,10 +229457,10 @@ var VERSION8 = "3.0.53", googleErrorDataSchema, googleFailedResponseHandler, goo urlRetrievalStatus: exports_external.string() })).nullish() }), responseSchema, chunkSchema, codeExecution, enterpriseWebSearch, fileSearchArgsBaseSchema, fileSearchArgsSchema2, fileSearch2, googleMaps, googleSearchToolArgsBaseSchema, googleSearchToolArgsSchema, googleSearch, urlContext, vertexRagStore, googleTools, GoogleGenerativeAIImageModel = class { - constructor(modelId, settings, config4) { + constructor(modelId, settings, config3) { this.modelId = modelId; this.settings = settings; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; } get maxImagesPerCall() { @@ -229361,9 +229661,9 @@ var VERSION8 = "3.0.53", googleErrorDataSchema, googleFailedResponseHandler, goo }; } }, googleImageResponseSchema, googleImageModelOptionsSchema, GoogleGenerativeAIVideoModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; } get provider() { @@ -230074,12 +230374,12 @@ var require_common4 = __commonJS((exports) => { } return Function.prototype[Symbol.hasInstance].call(GaxiosError, instance2); } - constructor(message, config4, response, cause) { + constructor(message, config3, response, cause) { super(message, { cause }); - this.config = config4; + this.config = config3; this.response = response; this.error = cause instanceof Error ? cause : undefined; - this.config = (0, extend_1.default)(true, {}, config4); + this.config = (0, extend_1.default)(true, {}, config3); if (this.response) { this.response.config = (0, extend_1.default)(true, {}, this.response.config); } @@ -230224,65 +230524,65 @@ var require_retry2 = __commonJS((exports) => { Object.defineProperty(exports, "__esModule", { value: true }); exports.getRetryConfig = getRetryConfig; async function getRetryConfig(err2) { - let config4 = getConfig(err2); - if (!err2 || !err2.config || !config4 && !err2.config.retry) { + let config3 = getConfig(err2); + if (!err2 || !err2.config || !config3 && !err2.config.retry) { return { shouldRetry: false }; } - config4 = config4 || {}; - config4.currentRetryAttempt = config4.currentRetryAttempt || 0; - config4.retry = config4.retry === undefined || config4.retry === null ? 3 : config4.retry; - config4.httpMethodsToRetry = config4.httpMethodsToRetry || [ + config3 = config3 || {}; + config3.currentRetryAttempt = config3.currentRetryAttempt || 0; + config3.retry = config3.retry === undefined || config3.retry === null ? 3 : config3.retry; + config3.httpMethodsToRetry = config3.httpMethodsToRetry || [ "GET", "HEAD", "PUT", "OPTIONS", "DELETE" ]; - config4.noResponseRetries = config4.noResponseRetries === undefined || config4.noResponseRetries === null ? 2 : config4.noResponseRetries; - config4.retryDelayMultiplier = config4.retryDelayMultiplier ? config4.retryDelayMultiplier : 2; - config4.timeOfFirstRequest = config4.timeOfFirstRequest ? config4.timeOfFirstRequest : Date.now(); - config4.totalTimeout = config4.totalTimeout ? config4.totalTimeout : Number.MAX_SAFE_INTEGER; - config4.maxRetryDelay = config4.maxRetryDelay ? config4.maxRetryDelay : Number.MAX_SAFE_INTEGER; + config3.noResponseRetries = config3.noResponseRetries === undefined || config3.noResponseRetries === null ? 2 : config3.noResponseRetries; + config3.retryDelayMultiplier = config3.retryDelayMultiplier ? config3.retryDelayMultiplier : 2; + config3.timeOfFirstRequest = config3.timeOfFirstRequest ? config3.timeOfFirstRequest : Date.now(); + config3.totalTimeout = config3.totalTimeout ? config3.totalTimeout : Number.MAX_SAFE_INTEGER; + config3.maxRetryDelay = config3.maxRetryDelay ? config3.maxRetryDelay : Number.MAX_SAFE_INTEGER; const retryRanges = [ [100, 199], [408, 408], [429, 429], [500, 599] ]; - config4.statusCodesToRetry = config4.statusCodesToRetry || retryRanges; - err2.config.retryConfig = config4; - const shouldRetryFn = config4.shouldRetry || shouldRetryRequest; + config3.statusCodesToRetry = config3.statusCodesToRetry || retryRanges; + err2.config.retryConfig = config3; + const shouldRetryFn = config3.shouldRetry || shouldRetryRequest; if (!await shouldRetryFn(err2)) { return { shouldRetry: false, config: err2.config }; } - const delay4 = getNextRetryDelay(config4); + const delay4 = getNextRetryDelay(config3); err2.config.retryConfig.currentRetryAttempt += 1; - const backoff = config4.retryBackoff ? config4.retryBackoff(err2, delay4) : new Promise((resolve10) => { + const backoff = config3.retryBackoff ? config3.retryBackoff(err2, delay4) : new Promise((resolve10) => { setTimeout(resolve10, delay4); }); - if (config4.onRetryAttempt) { - await config4.onRetryAttempt(err2); + if (config3.onRetryAttempt) { + await config3.onRetryAttempt(err2); } await backoff; return { shouldRetry: true, config: err2.config }; } function shouldRetryRequest(err2) { - const config4 = getConfig(err2); + const config3 = getConfig(err2); if (err2.config.signal?.aborted && err2.code !== "TimeoutError" || err2.code === "AbortError") { return false; } - if (!config4 || config4.retry === 0) { + if (!config3 || config3.retry === 0) { return false; } - if (!err2.response && (config4.currentRetryAttempt || 0) >= config4.noResponseRetries) { + if (!err2.response && (config3.currentRetryAttempt || 0) >= config3.noResponseRetries) { return false; } - if (!config4.httpMethodsToRetry || !config4.httpMethodsToRetry.includes(err2.config.method?.toUpperCase() || "GET")) { + if (!config3.httpMethodsToRetry || !config3.httpMethodsToRetry.includes(err2.config.method?.toUpperCase() || "GET")) { return false; } if (err2.response && err2.response.status) { let isInRange2 = false; - for (const [min14, max14] of config4.statusCodesToRetry) { + for (const [min14, max14] of config3.statusCodesToRetry) { const status = err2.response.status; if (status >= min14 && status <= max14) { isInRange2 = true; @@ -230293,8 +230593,8 @@ var require_retry2 = __commonJS((exports) => { return false; } } - config4.currentRetryAttempt = config4.currentRetryAttempt || 0; - if (config4.currentRetryAttempt >= config4.retry) { + config3.currentRetryAttempt = config3.currentRetryAttempt || 0; + if (config3.currentRetryAttempt >= config3.retry) { return false; } return true; @@ -230305,11 +230605,11 @@ var require_retry2 = __commonJS((exports) => { } return; } - function getNextRetryDelay(config4) { - const retryDelay = config4.currentRetryAttempt ? 0 : config4.retryDelay ?? 100; - const calculatedDelay = retryDelay + (Math.pow(config4.retryDelayMultiplier, config4.currentRetryAttempt) - 1) / 2 * 1000; - const maxAllowableDelay = config4.totalTimeout - (Date.now() - config4.timeOfFirstRequest); - return Math.min(calculatedDelay, maxAllowableDelay, config4.maxRetryDelay); + function getNextRetryDelay(config3) { + const retryDelay = config3.currentRetryAttempt ? 0 : config3.retryDelay ?? 100; + const calculatedDelay = retryDelay + (Math.pow(config3.retryDelayMultiplier, config3.currentRetryAttempt) - 1) / 2 * 1000; + const maxAllowableDelay = config3.totalTimeout - (Date.now() - config3.timeOfFirstRequest); + return Math.min(calculatedDelay, maxAllowableDelay, config3.maxRetryDelay); } }); @@ -230380,12 +230680,12 @@ var require_gaxios = __commonJS((exports) => { prepared = await this.#applyRequestInterceptors(prepared); return this.#applyResponseInterceptors(this._request(prepared)); } - async _defaultAdapter(config4) { - const fetchImpl = config4.fetchImplementation || this.defaults.fetchImplementation || await _a21.#getFetch(); - const preparedOpts = { ...config4 }; + async _defaultAdapter(config3) { + const fetchImpl = config3.fetchImplementation || this.defaults.fetchImplementation || await _a21.#getFetch(); + const preparedOpts = { ...config3 }; delete preparedOpts.data; - const res = await fetchImpl(config4.url, preparedOpts); - const data2 = await this.getResponseData(config4, res); + const res = await fetchImpl(config3.url, preparedOpts); + const data2 = await this.getResponseData(config3, res); if (!Object.getOwnPropertyDescriptor(res, "data")?.configurable) { Object.defineProperties(res, { data: { @@ -230396,7 +230696,7 @@ var require_gaxios = __commonJS((exports) => { } }); } - return Object.assign(res, { config: config4, data: data2 }); + return Object.assign(res, { config: config3, data: data2 }); } async _request(opts) { try { @@ -230427,9 +230727,9 @@ var require_gaxios = __commonJS((exports) => { } else { err2 = new common_js_1.GaxiosError("Unexpected Gaxios Error", opts, undefined, e2); } - const { shouldRetry, config: config4 } = await (0, retry_js_1.getRetryConfig)(err2); - if (shouldRetry && config4) { - err2.config.retryConfig.currentRetryAttempt = config4.retryConfig.currentRetryAttempt; + const { shouldRetry, config: config3 } = await (0, retry_js_1.getRetryConfig)(err2); + if (shouldRetry && config3) { + err2.config.retryConfig.currentRetryAttempt = config3.retryConfig.currentRetryAttempt; opts.retryConfig = err2.config?.retryConfig; this.#appendTimeoutToSignal(opts); return this._request(opts); @@ -230865,12 +231165,12 @@ var require_common5 = __commonJS((exports) => { } return Function.prototype[Symbol.hasInstance].call(GaxiosError, instance2); } - constructor(message, config4, response, cause) { + constructor(message, config3, response, cause) { super(message, { cause }); - this.config = config4; + this.config = config3; this.response = response; this.error = cause instanceof Error ? cause : undefined; - this.config = (0, extend_1.default)(true, {}, config4); + this.config = (0, extend_1.default)(true, {}, config3); if (this.response) { this.response.config = (0, extend_1.default)(true, {}, this.response.config); } @@ -231015,65 +231315,65 @@ var require_retry3 = __commonJS((exports) => { Object.defineProperty(exports, "__esModule", { value: true }); exports.getRetryConfig = getRetryConfig; async function getRetryConfig(err2) { - let config4 = getConfig(err2); - if (!err2 || !err2.config || !config4 && !err2.config.retry) { + let config3 = getConfig(err2); + if (!err2 || !err2.config || !config3 && !err2.config.retry) { return { shouldRetry: false }; } - config4 = config4 || {}; - config4.currentRetryAttempt = config4.currentRetryAttempt || 0; - config4.retry = config4.retry === undefined || config4.retry === null ? 3 : config4.retry; - config4.httpMethodsToRetry = config4.httpMethodsToRetry || [ + config3 = config3 || {}; + config3.currentRetryAttempt = config3.currentRetryAttempt || 0; + config3.retry = config3.retry === undefined || config3.retry === null ? 3 : config3.retry; + config3.httpMethodsToRetry = config3.httpMethodsToRetry || [ "GET", "HEAD", "PUT", "OPTIONS", "DELETE" ]; - config4.noResponseRetries = config4.noResponseRetries === undefined || config4.noResponseRetries === null ? 2 : config4.noResponseRetries; - config4.retryDelayMultiplier = config4.retryDelayMultiplier ? config4.retryDelayMultiplier : 2; - config4.timeOfFirstRequest = config4.timeOfFirstRequest ? config4.timeOfFirstRequest : Date.now(); - config4.totalTimeout = config4.totalTimeout ? config4.totalTimeout : Number.MAX_SAFE_INTEGER; - config4.maxRetryDelay = config4.maxRetryDelay ? config4.maxRetryDelay : Number.MAX_SAFE_INTEGER; + config3.noResponseRetries = config3.noResponseRetries === undefined || config3.noResponseRetries === null ? 2 : config3.noResponseRetries; + config3.retryDelayMultiplier = config3.retryDelayMultiplier ? config3.retryDelayMultiplier : 2; + config3.timeOfFirstRequest = config3.timeOfFirstRequest ? config3.timeOfFirstRequest : Date.now(); + config3.totalTimeout = config3.totalTimeout ? config3.totalTimeout : Number.MAX_SAFE_INTEGER; + config3.maxRetryDelay = config3.maxRetryDelay ? config3.maxRetryDelay : Number.MAX_SAFE_INTEGER; const retryRanges = [ [100, 199], [408, 408], [429, 429], [500, 599] ]; - config4.statusCodesToRetry = config4.statusCodesToRetry || retryRanges; - err2.config.retryConfig = config4; - const shouldRetryFn = config4.shouldRetry || shouldRetryRequest; + config3.statusCodesToRetry = config3.statusCodesToRetry || retryRanges; + err2.config.retryConfig = config3; + const shouldRetryFn = config3.shouldRetry || shouldRetryRequest; if (!await shouldRetryFn(err2)) { return { shouldRetry: false, config: err2.config }; } - const delay4 = getNextRetryDelay(config4); + const delay4 = getNextRetryDelay(config3); err2.config.retryConfig.currentRetryAttempt += 1; - const backoff = config4.retryBackoff ? config4.retryBackoff(err2, delay4) : new Promise((resolve10) => { + const backoff = config3.retryBackoff ? config3.retryBackoff(err2, delay4) : new Promise((resolve10) => { setTimeout(resolve10, delay4); }); - if (config4.onRetryAttempt) { - await config4.onRetryAttempt(err2); + if (config3.onRetryAttempt) { + await config3.onRetryAttempt(err2); } await backoff; return { shouldRetry: true, config: err2.config }; } function shouldRetryRequest(err2) { - const config4 = getConfig(err2); + const config3 = getConfig(err2); if (err2.config.signal?.aborted && err2.code !== "TimeoutError" || err2.code === "AbortError") { return false; } - if (!config4 || config4.retry === 0) { + if (!config3 || config3.retry === 0) { return false; } - if (!err2.response && (config4.currentRetryAttempt || 0) >= config4.noResponseRetries) { + if (!err2.response && (config3.currentRetryAttempt || 0) >= config3.noResponseRetries) { return false; } - if (!config4.httpMethodsToRetry || !config4.httpMethodsToRetry.includes(err2.config.method?.toUpperCase() || "GET")) { + if (!config3.httpMethodsToRetry || !config3.httpMethodsToRetry.includes(err2.config.method?.toUpperCase() || "GET")) { return false; } if (err2.response && err2.response.status) { let isInRange2 = false; - for (const [min14, max14] of config4.statusCodesToRetry) { + for (const [min14, max14] of config3.statusCodesToRetry) { const status = err2.response.status; if (status >= min14 && status <= max14) { isInRange2 = true; @@ -231084,8 +231384,8 @@ var require_retry3 = __commonJS((exports) => { return false; } } - config4.currentRetryAttempt = config4.currentRetryAttempt || 0; - if (config4.currentRetryAttempt >= config4.retry) { + config3.currentRetryAttempt = config3.currentRetryAttempt || 0; + if (config3.currentRetryAttempt >= config3.retry) { return false; } return true; @@ -231096,11 +231396,11 @@ var require_retry3 = __commonJS((exports) => { } return; } - function getNextRetryDelay(config4) { - const retryDelay = config4.currentRetryAttempt ? 0 : config4.retryDelay ?? 100; - const calculatedDelay = retryDelay + (Math.pow(config4.retryDelayMultiplier, config4.currentRetryAttempt) - 1) / 2 * 1000; - const maxAllowableDelay = config4.totalTimeout - (Date.now() - config4.timeOfFirstRequest); - return Math.min(calculatedDelay, maxAllowableDelay, config4.maxRetryDelay); + function getNextRetryDelay(config3) { + const retryDelay = config3.currentRetryAttempt ? 0 : config3.retryDelay ?? 100; + const calculatedDelay = retryDelay + (Math.pow(config3.retryDelayMultiplier, config3.currentRetryAttempt) - 1) / 2 * 1000; + const maxAllowableDelay = config3.totalTimeout - (Date.now() - config3.timeOfFirstRequest); + return Math.min(calculatedDelay, maxAllowableDelay, config3.maxRetryDelay); } }); @@ -231171,12 +231471,12 @@ var require_gaxios2 = __commonJS((exports) => { prepared = await this.#applyRequestInterceptors(prepared); return this.#applyResponseInterceptors(this._request(prepared)); } - async _defaultAdapter(config4) { - const fetchImpl = config4.fetchImplementation || this.defaults.fetchImplementation || await _a21.#getFetch(); - const preparedOpts = { ...config4 }; + async _defaultAdapter(config3) { + const fetchImpl = config3.fetchImplementation || this.defaults.fetchImplementation || await _a21.#getFetch(); + const preparedOpts = { ...config3 }; delete preparedOpts.data; - const res = await fetchImpl(config4.url, preparedOpts); - const data2 = await this.getResponseData(config4, res); + const res = await fetchImpl(config3.url, preparedOpts); + const data2 = await this.getResponseData(config3, res); if (!Object.getOwnPropertyDescriptor(res, "data")?.configurable) { Object.defineProperties(res, { data: { @@ -231187,7 +231487,7 @@ var require_gaxios2 = __commonJS((exports) => { } }); } - return Object.assign(res, { config: config4, data: data2 }); + return Object.assign(res, { config: config3, data: data2 }); } async _request(opts) { try { @@ -231218,9 +231518,9 @@ var require_gaxios2 = __commonJS((exports) => { } else { err2 = new common_js_1.GaxiosError("Unexpected Gaxios Error", opts, undefined, e2); } - const { shouldRetry, config: config4 } = await (0, retry_js_1.getRetryConfig)(err2); - if (shouldRetry && config4) { - err2.config.retryConfig.currentRetryAttempt = config4.retryConfig.currentRetryAttempt; + const { shouldRetry, config: config3 } = await (0, retry_js_1.getRetryConfig)(err2); + if (shouldRetry && config3) { + err2.config.retryConfig.currentRetryAttempt = config3.retryConfig.currentRetryAttempt; opts.retryConfig = err2.config?.retryConfig; this.#appendTimeoutToSignal(opts); return this._request(opts); @@ -234537,7 +234837,7 @@ var require_util6 = __commonJS((exports) => { exports.getWellKnownCertificateConfigFileLocation = getWellKnownCertificateConfigFileLocation; var fs12 = __require("fs"); var os9 = __require("os"); - var path27 = __require("path"); + var path28 = __require("path"); var WELL_KNOWN_CERTIFICATE_CONFIG_FILE = "certificate_config.json"; var CLOUDSDK_CONFIG_DIRECTORY = "gcloud"; function snakeToCamel4(str2) { @@ -234605,8 +234905,8 @@ var require_util6 = __commonJS((exports) => { } } function getWellKnownCertificateConfigFileLocation() { - const configDir = process.env.CLOUDSDK_CONFIG || (_isWindows() ? path27.join(process.env.APPDATA || "", CLOUDSDK_CONFIG_DIRECTORY) : path27.join(process.env.HOME || "", ".config", CLOUDSDK_CONFIG_DIRECTORY)); - return path27.join(configDir, WELL_KNOWN_CERTIFICATE_CONFIG_FILE); + const configDir = process.env.CLOUDSDK_CONFIG || (_isWindows() ? path28.join(process.env.APPDATA || "", CLOUDSDK_CONFIG_DIRECTORY) : path28.join(process.env.HOME || "", ".config", CLOUDSDK_CONFIG_DIRECTORY)); + return path28.join(configDir, WELL_KNOWN_CERTIFICATE_CONFIG_FILE); } function _isWindows() { return os9.platform().startsWith("win"); @@ -235168,25 +235468,25 @@ var require_authclient = __commonJS((exports) => { } static log = (0, google_logging_utils_1.log)("auth"); static DEFAULT_REQUEST_INTERCEPTOR = { - resolved: async (config4) => { - if (!config4.headers.has("x-goog-api-client")) { + resolved: async (config3) => { + if (!config3.headers.has("x-goog-api-client")) { const nodeVersion2 = process.version.replace(/^v/, ""); - config4.headers.set("x-goog-api-client", `gl-node/${nodeVersion2}`); + config3.headers.set("x-goog-api-client", `gl-node/${nodeVersion2}`); } - const userAgent = config4.headers.get("User-Agent"); + const userAgent = config3.headers.get("User-Agent"); if (!userAgent) { - config4.headers.set("User-Agent", shared_cjs_1.USER_AGENT); + config3.headers.set("User-Agent", shared_cjs_1.USER_AGENT); } else if (!userAgent.includes(`${shared_cjs_1.PRODUCT_NAME}/`)) { - config4.headers.set("User-Agent", `${userAgent} ${shared_cjs_1.USER_AGENT}`); + config3.headers.set("User-Agent", `${userAgent} ${shared_cjs_1.USER_AGENT}`); } try { - const symbols = config4; + const symbols = config3; const methodName = symbols[AuthClient.RequestMethodNameSymbol]; const logId = `${Math.floor(Math.random() * 1000)}`; symbols[AuthClient.RequestLogIdSymbol] = logId; const logObject = { - url: config4.url, - headers: config4.headers + url: config3.url, + headers: config3.headers }; if (methodName) { AuthClient.log.info("%s [%s] request %j", methodName, logId, logObject); @@ -235194,7 +235494,7 @@ var require_authclient = __commonJS((exports) => { AuthClient.log.info("[%s] request %j", logId, logObject); } } catch (e2) {} - return config4; + return config3; } }; static DEFAULT_RESPONSE_INTERCEPTOR = { @@ -235225,9 +235525,9 @@ var require_authclient = __commonJS((exports) => { throw error46; } }; - static setMethodName(config4, methodName) { + static setMethodName(config3, methodName) { try { - const symbols = config4; + const symbols = config3; symbols[AuthClient.RequestMethodNameSymbol] = methodName; } catch (e2) {} } @@ -236598,7 +236898,7 @@ var require_src8 = __commonJS((exports) => { var fs12 = _interopRequireWildcard(__require("fs")); var _gaxios = require_src3(); var jws = _interopRequireWildcard(require_jws()); - var path27 = _interopRequireWildcard(__require("path")); + var path28 = _interopRequireWildcard(__require("path")); var _util = __require("util"); function _interopRequireWildcard(e2, t2) { if (typeof WeakMap == "function") @@ -236980,7 +237280,7 @@ var require_src8 = __commonJS((exports) => { while (true) switch (_context2.n) { case 0: - ext2 = path27.extname(keyFile); + ext2 = path28.extname(keyFile); _t2 = ext2; _context2.n = _t2 === ".json" ? 1 : _t2 === ".der" ? 4 : _t2 === ".crt" ? 4 : _t2 === ".pem" ? 4 : _t2 === ".p12" ? 6 : _t2 === ".pfx" ? 6 : 7; break; @@ -238412,9 +238712,9 @@ var require_certificatesubjecttokensupplier = __commonJS((exports) => { throw new CertificateSourceUnavailableError(`Failed to read certificate config file at: ${configPath}`); } try { - const config4 = JSON.parse(fileContents); - const certPath = config4?.cert_configs?.workload?.cert_path; - const keyPath = config4?.cert_configs?.workload?.key_path; + const config3 = JSON.parse(fileContents); + const certPath = config3?.cert_configs?.workload?.cert_path; + const keyPath = config3?.cert_configs?.workload?.key_path; if (!certPath || !keyPath) { throw new InvalidConfigurationError(`Certificate config file (${configPath}) is missing required "cert_path" or "key_path" in the workload config.`); } @@ -239372,7 +239672,7 @@ var require_googleauth = __commonJS((exports) => { var gaxios_1 = require_src3(); var gcpMetadata = require_src6(); var os9 = __require("os"); - var path27 = __require("path"); + var path28 = __require("path"); var crypto_1 = require_crypto4(); var computeclient_1 = require_computeclient(); var idtokenclient_1 = require_idtokenclient(); @@ -239580,11 +239880,11 @@ var require_googleauth = __commonJS((exports) => { } else { const home = process.env["HOME"]; if (home) { - location2 = path27.join(home, ".config"); + location2 = path28.join(home, ".config"); } } if (location2) { - location2 = path27.join(location2, "gcloud", "application_default_credentials.json"); + location2 = path28.join(location2, "gcloud", "application_default_credentials.json"); if (!fs12.existsSync(location2)) { location2 = null; } @@ -239833,7 +240133,7 @@ var require_googleauth = __commonJS((exports) => { if (this.jsonContent) { return this._cacheClientFromJSON(this.jsonContent, this.clientOptions); } else if (this.keyFilename) { - const filePath = path27.resolve(this.keyFilename); + const filePath = path28.resolve(this.keyFilename); const stream4 = fs12.createReadStream(filePath); return await this.fromStreamAsync(stream4, this.clientOptions); } else if (this.apiKey) { @@ -240935,12 +241235,12 @@ function extractSources2({ return sources.length > 0 ? sources : undefined; } var dataUrlRegex2, googleErrorDataSchema2, googleFailedResponseHandler2, googleLanguageModelOptions2, GoogleGenerativeAILanguageModel2 = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; var _a21; this.modelId = modelId; - this.config = config4; - this.generateId = (_a21 = config4.generateId) != null ? _a21 : generateId; + this.config = config3; + this.generateId = (_a21 = config3.generateId) != null ? _a21 : generateId; } get provider() { return this.config.provider; @@ -241873,12 +242173,12 @@ function createVertex2(options4 = {}) { }); } var import_google_auth_library, authInstance = null, authOptions = null, VERSION9 = "4.0.95", googleVertexErrorDataSchema, googleVertexFailedResponseHandler, googleVertexEmbeddingModelOptions, GoogleVertexEmbeddingModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.maxEmbeddingsPerCall = 2048; this.supportsParallelCalls = true; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -241945,9 +242245,9 @@ var import_google_auth_library, authInstance = null, authOptions = null, VERSION }; } }, googleVertexTextEmbeddingResponseSchema, GoogleVertexImageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; } get maxImagesPerCall() { @@ -242181,9 +242481,9 @@ var import_google_auth_library, authInstance = null, authOptions = null, VERSION }; } }, vertexImageResponseSchema, googleVertexImageModelOptionsSchema, googleVertexTools, GoogleVertexVideoModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; } get provider() { @@ -244098,37 +244398,37 @@ function createOpenAI(options4 = {}) { }, `ai-sdk/openai/${VERSION10}`); const createChatModel = (modelId) => new OpenAIChatLanguageModel2(modelId, { provider: `${providerName}.chat`, - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch }); const createCompletionModel = (modelId) => new OpenAICompletionLanguageModel2(modelId, { provider: `${providerName}.completion`, - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch }); const createEmbeddingModel = (modelId) => new OpenAIEmbeddingModel2(modelId, { provider: `${providerName}.embedding`, - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch }); const createImageModel = (modelId) => new OpenAIImageModel2(modelId, { provider: `${providerName}.image`, - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch }); const createTranscriptionModel = (modelId) => new OpenAITranscriptionModel2(modelId, { provider: `${providerName}.transcription`, - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch }); const createSpeechModel = (modelId) => new OpenAISpeechModel2(modelId, { provider: `${providerName}.speech`, - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch }); @@ -244141,7 +244441,7 @@ function createOpenAI(options4 = {}) { const createResponsesModel = (modelId) => { return new OpenAIResponsesLanguageModel2(modelId, { provider: `${providerName}.responses`, - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch, fileIdPrefixes: ["file-"] @@ -244169,13 +244469,13 @@ function createOpenAI(options4 = {}) { return provider; } var openaiErrorDataSchema2, openaiFailedResponseHandler2, openaiChatResponseSchema2, openaiChatChunkSchema2, openaiLanguageModelChatOptions2, OpenAIChatLanguageModel2 = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.supportedUrls = { "image/*": [/^https?:\/\/.*$/] }; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -244636,11 +244936,11 @@ var openaiErrorDataSchema2, openaiFailedResponseHandler2, openaiChatResponseSche }; } }, openaiCompletionResponseSchema2, openaiCompletionChunkSchema2, openaiLanguageModelCompletionOptions2, OpenAICompletionLanguageModel2 = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.supportedUrls = {}; this.modelId = modelId; - this.config = config4; + this.config = config3; } get providerOptionsName() { return this.config.provider.split(".")[0].trim(); @@ -244849,12 +245149,12 @@ var openaiErrorDataSchema2, openaiFailedResponseHandler2, openaiChatResponseSche }; } }, openaiEmbeddingModelOptions2, openaiTextEmbeddingResponseSchema2, OpenAIEmbeddingModel2 = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.maxEmbeddingsPerCall = 2048; this.supportsParallelCalls = true; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -244909,9 +245209,9 @@ var openaiErrorDataSchema2, openaiFailedResponseHandler2, openaiChatResponseSche }; } }, openaiImageResponseSchema2, modelMaxImagesPerCall3, defaultResponseFormatPrefixes2, OpenAIImageModel2 = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; } get maxImagesPerCall() { @@ -245059,14 +245359,14 @@ var openaiErrorDataSchema2, openaiFailedResponseHandler2, openaiChatResponseSche }, customArgsSchema2, customInputSchema2, customToolFactory2, customTool = (args3) => customToolFactory2(args3), comparisonFilterSchema2, compoundFilterSchema2, fileSearchArgsSchema4, fileSearchOutputSchema2, fileSearch4, imageGenerationArgsSchema2, imageGenerationInputSchema2, imageGenerationOutputSchema2, imageGenerationToolFactory2, imageGeneration2 = (args3 = {}) => { return imageGenerationToolFactory2(args3); }, localShellInputSchema2, localShellOutputSchema2, localShell2, shellInputSchema2, shellOutputSchema2, shellSkillsSchema2, shellArgsSchema2, shell2, toolSearchArgsSchema2, toolSearchInputSchema2, toolSearchOutputSchema2, toolSearchToolFactory2, toolSearch = (args3 = {}) => toolSearchToolFactory2(args3), webSearchArgsSchema2, webSearchInputSchema2, webSearchOutputSchema2, webSearchToolFactory2, webSearch = (args3 = {}) => webSearchToolFactory2(args3), webSearchPreviewArgsSchema2, webSearchPreviewInputSchema2, webSearchPreviewOutputSchema2, webSearchPreview2, jsonValueSchema3, mcpArgsSchema2, mcpInputSchema2, mcpOutputSchema2, mcpToolFactory2, mcp = (args3) => mcpToolFactory2(args3), openaiTools, openaiResponsesReasoningProviderOptionsSchema2, jsonValueSchema23, openaiResponsesChunkSchema2, openaiResponsesResponseSchema2, TOP_LOGPROBS_MAX2 = 20, openaiResponsesReasoningModelIds2, openaiResponsesModelIds2, openaiLanguageModelResponsesOptionsSchema2, OpenAIResponsesLanguageModel2 = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.supportedUrls = { "image/*": [/^https?:\/\/.*$/], "application/pdf": [/^https?:\/\/.*$/] }; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -246615,9 +246915,9 @@ var openaiErrorDataSchema2, openaiFailedResponseHandler2, openaiChatResponseSche }; } }, openaiSpeechModelOptionsSchema2, OpenAISpeechModel2 = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; } get provider() { @@ -246713,9 +247013,9 @@ var openaiErrorDataSchema2, openaiFailedResponseHandler2, openaiChatResponseSche }; } }, openaiTranscriptionResponseSchema2, openAITranscriptionModelOptions2, languageMap2, OpenAITranscriptionModel2 = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; } get provider() { @@ -248911,8 +249211,8 @@ function createOpenAICompatible(options4) { const getHeaders = () => withUserAgentSuffix(headers, `ai-sdk/openai-compatible/${VERSION11}`); const getCommonModelConfig = (modelType) => ({ provider: `${providerName}.${modelType}`, - url: ({ path: path27 }) => { - const url3 = new URL(`${baseURL}${path27}`); + url: ({ path: path28 }) => { + const url3 = new URL(`${baseURL}${path28}`); if (options4.queryParams) { url3.search = new URLSearchParams(options4.queryParams).toString(); } @@ -248948,15 +249248,15 @@ function createOpenAICompatible(options4) { return provider; } var openaiCompatibleErrorDataSchema, defaultOpenAICompatibleErrorStructure, openaiCompatibleLanguageModelChatOptions, OpenAICompatibleChatLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; var _a21, _b16; this.modelId = modelId; - this.config = config4; - const errorStructure = (_a21 = config4.errorStructure) != null ? _a21 : defaultOpenAICompatibleErrorStructure; + this.config = config3; + const errorStructure = (_a21 = config3.errorStructure) != null ? _a21 : defaultOpenAICompatibleErrorStructure; this.chunkSchema = createOpenAICompatibleChatChunkSchema(errorStructure.errorSchema); this.failedResponseHandler = createJsonErrorResponseHandler(errorStructure); - this.supportsStructuredOutputs = (_b16 = config4.supportsStructuredOutputs) != null ? _b16 : false; + this.supportsStructuredOutputs = (_b16 = config3.supportsStructuredOutputs) != null ? _b16 : false; } get provider() { return this.config.provider; @@ -249403,12 +249703,12 @@ var openaiCompatibleErrorDataSchema, defaultOpenAICompatibleErrorStructure, open }; } }, openaiCompatibleTokenUsageSchema, OpenAICompatibleChatResponseSchema, chunkBaseSchema, createOpenAICompatibleChatChunkSchema = (errorSchema) => exports_external.union([chunkBaseSchema, errorSchema]), openaiCompatibleLanguageModelCompletionOptions, OpenAICompatibleCompletionLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; var _a21; this.modelId = modelId; - this.config = config4; - const errorStructure = (_a21 = config4.errorStructure) != null ? _a21 : defaultOpenAICompatibleErrorStructure; + this.config = config3; + const errorStructure = (_a21 = config3.errorStructure) != null ? _a21 : defaultOpenAICompatibleErrorStructure; this.chunkSchema = createOpenAICompatibleCompletionChunkSchema(errorStructure.errorSchema); this.failedResponseHandler = createJsonErrorResponseHandler(errorStructure); } @@ -249625,10 +249925,10 @@ var openaiCompatibleErrorDataSchema, defaultOpenAICompatibleErrorStructure, open }), errorSchema ]), openaiCompatibleEmbeddingModelOptions, OpenAICompatibleEmbeddingModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -249711,9 +250011,9 @@ var openaiCompatibleErrorDataSchema, defaultOpenAICompatibleErrorStructure, open }; } }, openaiTextEmbeddingResponseSchema3, OpenAICompatibleImageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.maxImagesPerCall = 10; } @@ -251813,7 +252113,7 @@ function createOpenRouter(options4 = {}) { }), `ai-sdk/openrouter/${VERSION22}`); const createChatModel = (modelId, settings = {}) => new OpenRouterChatLanguageModel(modelId, settings, { provider: "openrouter.chat", - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, compatibility, fetch: options4.fetch, @@ -251821,7 +252121,7 @@ function createOpenRouter(options4 = {}) { }); const createCompletionModel = (modelId, settings = {}) => new OpenRouterCompletionLanguageModel(modelId, settings, { provider: "openrouter.completion", - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, compatibility, fetch: options4.fetch, @@ -251829,14 +252129,14 @@ function createOpenRouter(options4 = {}) { }); const createEmbeddingModel = (modelId, settings = {}) => new OpenRouterEmbeddingModel(modelId, settings, { provider: "openrouter.embedding", - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch, extraBody: options4.extraBody }); const createImageModel = (modelId, settings = {}) => new OpenRouterImageModel(modelId, settings, { provider: "openrouter.image", - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch, extraBody: options4.extraBody @@ -252323,7 +252623,7 @@ var __defProp3, __defProps, __getOwnPropDescs, __getOwnPropSymbols, __hasOwnProp } } }, OPENROUTER_AUDIO_FORMATS, MIME_TO_FORMAT, IMAGE_EXTENSIONS, ChatCompletionToolChoiceSchema, ImageResponseSchema, ImageResponseWithUnknownSchema, ImageResponseArraySchema, OpenRouterChatCompletionBaseResponseSchema, OpenRouterNonStreamChatCompletionResponseSchema, OpenRouterStreamChatCompletionChunkSchema, OpenRouterChatLanguageModel = class { - constructor(modelId, settings, config4) { + constructor(modelId, settings, config3) { this.specificationVersion = "v3"; this.provider = "openrouter"; this.defaultObjectGenerationMode = "tool"; @@ -252337,7 +252637,7 @@ var __defProp3, __defProps, __getOwnPropDescs, __getOwnPropSymbols, __hasOwnProp }; this.modelId = modelId; this.settings = settings; - this.config = config4; + this.config = config3; } getArgs({ prompt, @@ -253030,7 +253330,7 @@ var __defProp3, __defProps, __getOwnPropDescs, __getOwnPropSymbols, __hasOwnProp }; } }, OpenRouterCompletionChunkSchema, OpenRouterCompletionLanguageModel = class { - constructor(modelId, settings, config4) { + constructor(modelId, settings, config3) { this.specificationVersion = "v3"; this.provider = "openrouter"; this.supportsImageUrls = true; @@ -253045,7 +253345,7 @@ var __defProp3, __defProps, __getOwnPropDescs, __getOwnPropSymbols, __hasOwnProp this.defaultObjectGenerationMode = undefined; this.modelId = modelId; this.settings = settings; - this.config = config4; + this.config = config3; } getArgs({ prompt, @@ -253294,14 +253594,14 @@ var __defProp3, __defProps, __getOwnPropDescs, __getOwnPropSymbols, __hasOwnProp }; } }, openrouterEmbeddingUsageSchema, openrouterEmbeddingDataSchema, OpenRouterEmbeddingResponseSchema, OpenRouterEmbeddingModel = class { - constructor(modelId, settings, config4) { + constructor(modelId, settings, config3) { this.specificationVersion = "v3"; this.provider = "openrouter"; this.maxEmbeddingsPerCall = undefined; this.supportsParallelCalls = true; this.modelId = modelId; this.settings = settings; - this.config = config4; + this.config = config3; } async doEmbed(options4) { var _a162, _b16, _c2, _d, _e2, _f; @@ -253345,13 +253645,13 @@ var __defProp3, __defProps, __getOwnPropDescs, __getOwnPropSymbols, __hasOwnProp }; } }, OpenRouterImageResponseSchema, OpenRouterImageModel = class { - constructor(modelId, settings, config4) { + constructor(modelId, settings, config3) { this.specificationVersion = "v3"; this.provider = "openrouter"; this.maxImagesPerCall = 1; this.modelId = modelId; this.settings = settings; - this.config = config4; + this.config = config3; } async doGenerate(options4) { var _a162; @@ -254477,13 +254777,13 @@ class OpenAICompatibleChatLanguageModel2 { config; failedResponseHandler; chunkSchema; - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; - const errorStructure = config4.errorStructure ?? defaultOpenAICompatibleErrorStructure2; + this.config = config3; + const errorStructure = config3.errorStructure ?? defaultOpenAICompatibleErrorStructure2; this.chunkSchema = createOpenAICompatibleChatChunkSchema2(errorStructure.errorSchema); this.failedResponseHandler = createJsonErrorResponseHandler(errorStructure); - this.supportsStructuredOutputs = config4.supportsStructuredOutputs ?? false; + this.supportsStructuredOutputs = config3.supportsStructuredOutputs ?? false; } get provider() { return this.config.provider; @@ -255695,9 +255995,9 @@ class OpenAIResponsesLanguageModel3 { specificationVersion = "v3"; modelId; config; - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; } supportedUrls = { "image/*": [/^https?:\/\/.*$/], @@ -257095,7 +257395,7 @@ function createOpenaiCompatible(options4 = {}) { return new OpenAICompatibleChatLanguageModel2(modelId, { provider: `${options4.name ?? "openai-compatible"}.chat`, headers: getHeaders, - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, fetch: options4.fetch }); }; @@ -257103,7 +257403,7 @@ function createOpenaiCompatible(options4 = {}) { return new OpenAIResponsesLanguageModel3(modelId, { provider: `${options4.name ?? "openai-compatible"}.responses`, headers: getHeaders, - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, fetch: options4.fetch }); }; @@ -257735,13 +258035,13 @@ function createXai(options4 = {}) { return provider; } var webSourceSchema, xSourceSchema, newsSourceSchema, rssSourceSchema, searchSourceSchema, xaiLanguageModelChatOptions, xaiErrorDataSchema, xaiFailedResponseHandler, XaiChatLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.supportedUrls = { "image/*": [/^https?:\/\/.*$/] }; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -258157,9 +258457,9 @@ var webSourceSchema, xSourceSchema, newsSourceSchema, rssSourceSchema, searchSou }; } }, xaiUsageSchema, xaiChatResponseSchema, xaiChatChunkSchema, xaiStreamErrorSchema, xaiImageModelOptions, XaiImageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.maxImagesPerCall = 3; } @@ -258281,13 +258581,13 @@ var webSourceSchema, xSourceSchema, newsSourceSchema, rssSourceSchema, searchSou return value8; } }, xaiImageResponseSchema, annotationSchema, messageContentPartSchema, reasoningSummaryPartSchema, toolCallSchema, mcpCallSchema, outputItemSchema, xaiResponsesUsageSchema, xaiResponsesResponseSchema, xaiResponsesChunkSchema, xaiLanguageModelResponsesOptions, fileSearchArgsSchema6, fileSearchOutputSchema4, fileSearchToolFactory, fileSearch6 = (args3) => fileSearchToolFactory(args3), mcpServerArgsSchema, mcpServerOutputSchema, mcpServerToolFactory, mcpServer = (args3) => mcpServerToolFactory(args3), webSearchArgsSchema4, webSearchOutputSchema3, webSearchToolFactory4, webSearch2 = (args3 = {}) => webSearchToolFactory4(args3), xSearchArgsSchema, xSearchOutputSchema, xSearchToolFactory, xSearch = (args3 = {}) => xSearchToolFactory(args3), XaiResponsesLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.supportedUrls = { "image/*": [/^https?:\/\/.*$/] }; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -258969,9 +259269,9 @@ var webSourceSchema, xSourceSchema, newsSourceSchema, rssSourceSchema, searchSou }; } }, codeExecutionOutputSchema, codeExecutionToolFactory, codeExecution3 = (args3 = {}) => codeExecutionToolFactory(args3), viewImageOutputSchema, viewImageToolFactory, viewImage = (args3 = {}) => viewImageToolFactory(args3), viewXVideoOutputSchema, viewXVideoToolFactory, viewXVideo = (args3 = {}) => viewXVideoToolFactory(args3), xaiTools, VERSION14 = "3.0.75", xaiVideoModelOptionsSchema, RESOLUTION_MAP, XaiVideoModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.maxVideosPerCall = 1; } @@ -260206,15 +260506,15 @@ function createMistral(options4 = {}) { return provider; } var mistralLanguageModelOptions, mistralErrorDataSchema, mistralFailedResponseHandler, MistralChatLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.supportedUrls = { "application/pdf": [/^https:\/\/.*$/] }; var _a26; this.modelId = modelId; - this.config = config4; - this.generateId = (_a26 = config4.generateId) != null ? _a26 : generateId; + this.config = config3; + this.generateId = (_a26 = config3.generateId) != null ? _a26 : generateId; } get provider() { return this.config.provider; @@ -260510,12 +260810,12 @@ var mistralLanguageModelOptions, mistralErrorDataSchema, mistralFailedResponseHa }; } }, mistralContentSchema, mistralUsageSchema, mistralChatResponseSchema, mistralChatChunkSchema, MistralEmbeddingModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.maxEmbeddingsPerCall = 32; this.supportsParallelCalls = false; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -260937,7 +261237,7 @@ function createGroq(options4 = {}) { }, `ai-sdk/groq/${VERSION16}`); const createChatModel = (modelId) => new GroqChatLanguageModel(modelId, { provider: "groq.chat", - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch }); @@ -260950,7 +261250,7 @@ function createGroq(options4 = {}) { const createTranscriptionModel = (modelId) => { return new GroqTranscriptionModel(modelId, { provider: "groq.transcription", - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch }); @@ -260974,13 +261274,13 @@ function createGroq(options4 = {}) { return provider; } var groqLanguageModelOptions, groqErrorDataSchema, groqFailedResponseHandler, BROWSER_SEARCH_SUPPORTED_MODELS, GroqChatLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.supportedUrls = { "image/*": [/^https?:\/\/.*$/] }; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -261342,9 +261642,9 @@ var groqLanguageModelOptions, groqErrorDataSchema, groqFailedResponseHandler, BR }; } }, groqChatResponseSchema, groqChatChunkSchema, groqTranscriptionModelOptions, GroqTranscriptionModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; } get provider() { @@ -261602,7 +261902,7 @@ function createDeepInfra(options4 = {}) { }, `ai-sdk/deepinfra/${VERSION17}`); const getCommonModelConfig = (modelType) => ({ provider: `deepinfra.${modelType}`, - url: ({ path: path27 }) => `${baseURL}/openai${path27}`, + url: ({ path: path28 }) => `${baseURL}/openai${path28}`, headers: getHeaders, fetch: options4.fetch }); @@ -261627,9 +261927,9 @@ function createDeepInfra(options4 = {}) { return provider; } var DeepInfraImageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.maxImagesPerCall = 1; } @@ -261743,8 +262043,8 @@ var init_dist26 = __esm(() => { data: exports_external.array(exports_external.object({ b64_json: exports_external.string() })) }); DeepInfraChatLanguageModel = class extends OpenAICompatibleChatLanguageModel { - constructor(modelId, config4) { - super(modelId, config4); + constructor(modelId, config3) { + super(modelId, config3); } fixUsageForGeminiModels(usage2) { var _a26, _b16; @@ -261868,7 +262168,7 @@ function createCerebras(options4 = {}) { const createLanguageModel = (modelId) => { return new OpenAICompatibleChatLanguageModel(modelId, { provider: `cerebras.chat`, - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch, errorStructure: cerebrasErrorStructure, @@ -262177,11 +262477,11 @@ function createCohere(options4 = {}) { return provider; } var cohereLanguageModelOptions, cohereErrorDataSchema, cohereFailedResponseHandler, CohereChatLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.supportedUrls = {}; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -262480,12 +262780,12 @@ var cohereLanguageModelOptions, cohereErrorDataSchema, cohereFailedResponseHandl }; } }, cohereChatResponseSchema, cohereChatChunkSchema, cohereEmbeddingModelOptions, CohereEmbeddingModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.maxEmbeddingsPerCall = 96; this.supportsParallelCalls = true; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -262538,10 +262838,10 @@ var cohereLanguageModelOptions, cohereErrorDataSchema, cohereFailedResponseHandl }; } }, cohereTextEmbeddingResponseSchema, cohereRerankingResponseSchema, cohereRerankingModelOptionsSchema, CohereRerankingModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -262845,7 +263145,7 @@ function createTogetherAI(options4 = {}) { }; const getCommonModelConfig = (modelType) => ({ provider: `togetherai.${modelType}`, - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch }); @@ -262876,10 +263176,10 @@ function createTogetherAI(options4 = {}) { return provider; } var togetheraiErrorSchema, togetheraiRerankingResponseSchema, togetheraiRerankingModelOptionsSchema, TogetherAIRerankingModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.modelId = modelId; - this.config = config4; + this.config = config3; } get provider() { return this.config.provider; @@ -262935,9 +263235,9 @@ var togetheraiErrorSchema, togetheraiRerankingResponseSchema, togetheraiRerankin }; } }, TogetherAIImageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.modelId = modelId; - this.config = config4; + this.config = config3; this.specificationVersion = "v3"; this.maxImagesPerCall = 1; } @@ -263227,12 +263527,12 @@ function createPerplexity(options4 = {}) { return provider; } var PerplexityLanguageModel = class { - constructor(modelId, config4) { + constructor(modelId, config3) { this.specificationVersion = "v3"; this.provider = "perplexity"; this.supportedUrls = {}; this.modelId = modelId; - this.config = config4; + this.config = config3; } getArgs({ prompt, @@ -263558,7 +263858,7 @@ function createVercel(options4 = {}) { }, `ai-sdk/vercel/${VERSION23}`); const getCommonModelConfig = (modelType) => ({ provider: `vercel.${modelType}`, - url: ({ path: path27 }) => `${baseURL}${path27}`, + url: ({ path: path28 }) => `${baseURL}${path28}`, headers: getHeaders, fetch: options4.fetch }); @@ -263723,7 +264023,7 @@ function $constructor2(name26, initializer3, params) { Object.defineProperty(_3, "name", { value: name26 }); return _3; } -function config4(newConfig) { +function config3(newConfig) { if (newConfig) Object.assign(globalConfig2, newConfig); return globalConfig2; @@ -263831,10 +264131,10 @@ function mergeDefs2(...defs) { function cloneDef2(schema2) { return mergeDefs2(schema2._zod.def); } -function getElementAtPath2(obj, path27) { - if (!path27) +function getElementAtPath2(obj, path28) { + if (!path28) return obj; - return path27.reduce((acc, key) => acc?.[key], obj); + return path28.reduce((acc, key) => acc?.[key], obj); } function promiseAllObject2(promisesObj) { const keys12 = Object.keys(promisesObj); @@ -264145,11 +264445,11 @@ function aborted2(x3, startIndex = 0) { } return false; } -function prefixIssues2(path27, issues) { +function prefixIssues2(path28, issues) { return issues.map((iss) => { var _a26; (_a26 = iss).path ?? (_a26.path = []); - iss.path.unshift(path27); + iss.path.unshift(path28); return iss; }); } @@ -264308,7 +264608,7 @@ function formatError2(error48, mapper = (issue22) => issue22.message) { } function treeifyError2(error48, mapper = (issue22) => issue22.message) { const result6 = { errors: [] }; - const processError = (error49, path27 = []) => { + const processError = (error49, path28 = []) => { var _a26, _b16; for (const issue22 of error49.issues) { if (issue22.code === "invalid_union" && issue22.errors.length) { @@ -264318,7 +264618,7 @@ function treeifyError2(error48, mapper = (issue22) => issue22.message) { } else if (issue22.code === "invalid_element") { processError({ issues: issue22.issues }, issue22.path); } else { - const fullpath = [...path27, ...issue22.path]; + const fullpath = [...path28, ...issue22.path]; if (fullpath.length === 0) { result6.errors.push(mapper(issue22)); continue; @@ -264350,8 +264650,8 @@ function treeifyError2(error48, mapper = (issue22) => issue22.message) { } function toDotPath2(_path) { const segs = []; - const path27 = _path.map((seg) => typeof seg === "object" ? seg.key : seg); - for (const seg of path27) { + const path28 = _path.map((seg) => typeof seg === "object" ? seg.key : seg); + for (const seg of path28) { if (typeof seg === "number") segs.push(`[${seg}]`); else if (typeof seg === "symbol") @@ -264535,7 +264835,7 @@ function handleUnionResults2(results, final, inst, ctx) { code: "invalid_union", input: final.value, inst, - errors: results.map((result6) => result6.issues.map((iss) => finalizeIssue2(iss, ctx, config4()))) + errors: results.map((result6) => result6.issues.map((iss) => finalizeIssue2(iss, ctx, config3()))) }); return final; } @@ -264550,7 +264850,7 @@ function handleExclusiveUnionResults(results, final, inst, ctx) { code: "invalid_union", input: final.value, inst, - errors: results.map((result6) => result6.issues.map((iss) => finalizeIssue2(iss, ctx, config4()))) + errors: results.map((result6) => result6.issues.map((iss) => finalizeIssue2(iss, ctx, config3()))) }); } else { final.issues.push({ @@ -264662,7 +264962,7 @@ function handleMapResult2(keyResult, valueResult, final, key, input, inst, ctx) origin: "map", input, inst, - issues: keyResult.issues.map((iss) => finalizeIssue2(iss, ctx, config4())) + issues: keyResult.issues.map((iss) => finalizeIssue2(iss, ctx, config3())) }); } } @@ -264676,7 +264976,7 @@ function handleMapResult2(keyResult, valueResult, final, key, input, inst, ctx) input, inst, key, - issues: valueResult.issues.map((iss) => finalizeIssue2(iss, ctx, config4())) + issues: valueResult.issues.map((iss) => finalizeIssue2(iss, ctx, config3())) }); } } @@ -266801,12 +267101,12 @@ function preprocess2(fn3, schema2) { return pipe3(transform6(fn3), schema2); } function setErrorMap2(map210) { - config4({ + config3({ customError: map210 }); } function getErrorMap4() { - return config4().customError; + return config3().customError; } function detectVersion(schema2, defaultTarget) { const $schema = schema2.$schema; @@ -266825,13 +267125,13 @@ function resolveRef(ref, ctx) { if (!ref.startsWith("#")) { throw new Error("External $ref is not supported, only local refs (#/...) are allowed"); } - const path27 = ref.slice(1).split("/").filter(Boolean); - if (path27.length === 0) { + const path28 = ref.slice(1).split("/").filter(Boolean); + if (path28.length === 0) { return ctx.rootSchema; } const defsKey = ctx.version === "draft-2020-12" ? "$defs" : "definitions"; - if (path27[0] === defsKey) { - const key = path27[1]; + if (path28[0] === defsKey) { + const key = path28[1]; if (!key || !ctx.defs[key]) { throw new Error(`Reference not found: ${ref}`); } @@ -267576,8 +267876,8 @@ function createVenice(options4 = {}) { }, `ai-sdk/venice/${VERSION25}`); const getModelConfig = (modelType) => ({ provider: `${providerName}.${modelType}`, - url: ({ path: path27 }) => { - const url22 = new URL(`${baseURL}${path27}`); + url: ({ path: path28 }) => { + const url22 = new URL(`${baseURL}${path28}`); if (options4.queryParams) { url22.search = new URLSearchParams(options4.queryParams).toString(); } @@ -267672,7 +267972,7 @@ var __defProp4, __export3 = (target, all7) => { throw new $ZodAsyncError2; } if (result6.issues.length) { - const e2 = new (_params?.Err ?? _Err)(result6.issues.map((iss) => finalizeIssue2(iss, ctx, config4()))); + const e2 = new (_params?.Err ?? _Err)(result6.issues.map((iss) => finalizeIssue2(iss, ctx, config3()))); captureStackTrace2(e2, _params?.callee); throw e2; } @@ -267683,7 +267983,7 @@ var __defProp4, __export3 = (target, all7) => { if (result6 instanceof Promise) result6 = await result6; if (result6.issues.length) { - const e2 = new (params?.Err ?? _Err)(result6.issues.map((iss) => finalizeIssue2(iss, ctx, config4()))); + const e2 = new (params?.Err ?? _Err)(result6.issues.map((iss) => finalizeIssue2(iss, ctx, config3()))); captureStackTrace2(e2, params?.callee); throw e2; } @@ -267696,7 +267996,7 @@ var __defProp4, __export3 = (target, all7) => { } return result6.issues.length ? { success: false, - error: new (_Err ?? $ZodError2)(result6.issues.map((iss) => finalizeIssue2(iss, ctx, config4()))) + error: new (_Err ?? $ZodError2)(result6.issues.map((iss) => finalizeIssue2(iss, ctx, config3()))) } : { success: true, data: result6.value }; }, safeParse3, _safeParseAsync2 = (_Err) => async (schema2, value8, _ctx) => { const ctx = _ctx ? Object.assign(_ctx, { async: true }) : { async: true }; @@ -267705,7 +268005,7 @@ var __defProp4, __export3 = (target, all7) => { result6 = await result6; return result6.issues.length ? { success: false, - error: new _Err(result6.issues.map((iss) => finalizeIssue2(iss, ctx, config4()))) + error: new _Err(result6.issues.map((iss) => finalizeIssue2(iss, ctx, config3()))) } : { success: true, data: result6.value }; }, safeParseAsync3, _encode2 = (_Err) => (schema2, value8, _ctx) => { const ctx = _ctx ? Object.assign(_ctx, { direction: "backward" }) : { direction: "backward" }; @@ -273926,7 +274226,7 @@ var init_dist32 = __esm(() => { clone: () => clone4, codec: () => codec2, coerce: () => coerce_exports, - config: () => config4, + config: () => config3, core: () => core_exports2, cuid: () => cuid32, cuid2: () => cuid222, @@ -274304,7 +274604,7 @@ var init_dist32 = __esm(() => { _xid: () => _xid2, _xor: () => _xor, clone: () => clone4, - config: () => config4, + config: () => config3, createStandardJSONSchemaMethod: () => createStandardJSONSchemaMethod, createToJSONSchemaMethod: () => createToJSONSchemaMethod, decode: () => decode5, @@ -276178,7 +276478,7 @@ var init_dist32 = __esm(() => { payload.issues.push({ code: "invalid_key", origin: "record", - issues: keyResult.issues.map((iss) => finalizeIssue2(iss, ctx, config4())), + issues: keyResult.issues.map((iss) => finalizeIssue2(iss, ctx, config3())), input: key, path: [key], inst @@ -276474,7 +276774,7 @@ var init_dist32 = __esm(() => { payload.value = def.catchValue({ ...payload, error: { - issues: result22.issues.map((iss) => finalizeIssue2(iss, ctx, config4())) + issues: result22.issues.map((iss) => finalizeIssue2(iss, ctx, config3())) }, input: payload.value }); @@ -276488,7 +276788,7 @@ var init_dist32 = __esm(() => { payload.value = def.catchValue({ ...payload, error: { - issues: result6.issues.map((iss) => finalizeIssue2(iss, ctx, config4())) + issues: result6.issues.map((iss) => finalizeIssue2(iss, ctx, config3())) }, input: payload.value }); @@ -277787,7 +278087,7 @@ var init_dist32 = __esm(() => { number: () => number32, string: () => string32 }); - config4(en_default4()); + config3(en_default4()); veniceErrorDataSchema = external_exports.object({ error: external_exports.object({ message: external_exports.string(), @@ -277929,21 +278229,21 @@ var init_dist32 = __esm(() => { }); // node_modules/@anthropic-ai/sdk/internal/tslib.mjs -function __classPrivateFieldSet3(receiver, state2, value8, kind, f4) { +function __classPrivateFieldSet3(receiver, state, value8, kind, f4) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f4) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state2 === "function" ? receiver !== state2 || !f4 : !state2.has(receiver)) + if (typeof state === "function" ? receiver !== state || !f4 : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return kind === "a" ? f4.call(receiver, value8) : f4 ? f4.value = value8 : state2.set(receiver, value8), value8; + return kind === "a" ? f4.call(receiver, value8) : f4 ? f4.value = value8 : state.set(receiver, value8), value8; } -function __classPrivateFieldGet3(receiver, state2, kind, f4) { +function __classPrivateFieldGet3(receiver, state, kind, f4) { if (kind === "a" && !f4) throw new TypeError("Private accessor was defined without a getter"); - if (typeof state2 === "function" ? receiver !== state2 || !f4 : !state2.has(receiver)) + if (typeof state === "function" ? receiver !== state || !f4 : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f4 : kind === "a" ? f4.call(receiver) : f4 ? f4.value : state2.get(receiver); + return kind === "m" ? f4 : kind === "a" ? f4.call(receiver) : f4 ? f4.value : state.get(receiver); } var init_tslib = () => {}; @@ -279199,12 +279499,12 @@ var init_headers = __esm(() => { function encodeURIPath(str2) { return str2.replace(/[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/g, encodeURIComponent); } -var EMPTY, createPathTagFunction = (pathEncoder = encodeURIPath) => function path27(statics, ...params) { +var EMPTY, createPathTagFunction = (pathEncoder = encodeURIPath) => function path28(statics, ...params) { if (statics.length === 1) return statics[0]; let postPath = false; const invalidSegments = []; - const path28 = statics.reduce((previousValue, currentValue, index3) => { + const path29 = statics.reduce((previousValue, currentValue, index3) => { if (/[?#]/.test(currentValue)) { postPath = true; } @@ -279220,7 +279520,7 @@ var EMPTY, createPathTagFunction = (pathEncoder = encodeURIPath) => function pat } return previousValue + currentValue + (index3 === params.length ? "" : encoded); }, ""); - const pathOnly = path28.split(/[?#]/, 1)[0]; + const pathOnly = path29.split(/[?#]/, 1)[0]; const invalidSegmentPattern = /(?<=^|\/)(?:\.|%2e){1,2}(?=\/|$)/gi; let match17; while ((match17 = invalidSegmentPattern.exec(pathOnly)) !== null) { @@ -279242,15 +279542,15 @@ var EMPTY, createPathTagFunction = (pathEncoder = encodeURIPath) => function pat throw new AnthropicError(`Path parameters result in path with invalid segments: ${invalidSegments.map((e2) => e2.error).join(` `)} -${path28} +${path29} ${underline}`); } - return path28; -}, path27; -var init_path = __esm(() => { + return path29; +}, path28; +var init_path2 = __esm(() => { init_error4(); EMPTY = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.create(null)); - path27 = /* @__PURE__ */ createPathTagFunction(encodeURIPath); + path28 = /* @__PURE__ */ createPathTagFunction(encodeURIPath); }); // node_modules/@anthropic-ai/sdk/resources/beta/files.mjs @@ -279259,7 +279559,7 @@ var init_files = __esm(() => { init_pagination(); init_headers(); init_uploads(); - init_path(); + init_path2(); Files = class Files extends APIResource { list(params = {}, options4) { const { betas, ...query } = params ?? {}; @@ -279274,7 +279574,7 @@ var init_files = __esm(() => { } delete(fileID, params = {}, options4) { const { betas } = params ?? {}; - return this._client.delete(path27`/v1/files/${fileID}`, { + return this._client.delete(path28`/v1/files/${fileID}`, { ...options4, headers: buildHeaders([ { "anthropic-beta": [...betas ?? [], "files-api-2025-04-14"].toString() }, @@ -279284,7 +279584,7 @@ var init_files = __esm(() => { } download(fileID, params = {}, options4) { const { betas } = params ?? {}; - return this._client.get(path27`/v1/files/${fileID}/content`, { + return this._client.get(path28`/v1/files/${fileID}/content`, { ...options4, headers: buildHeaders([ { @@ -279298,7 +279598,7 @@ var init_files = __esm(() => { } retrieveMetadata(fileID, params = {}, options4) { const { betas } = params ?? {}; - return this._client.get(path27`/v1/files/${fileID}`, { + return this._client.get(path28`/v1/files/${fileID}`, { ...options4, headers: buildHeaders([ { "anthropic-beta": [...betas ?? [], "files-api-2025-04-14"].toString() }, @@ -279325,11 +279625,11 @@ var Models; var init_models3 = __esm(() => { init_pagination(); init_headers(); - init_path(); + init_path2(); Models = class Models extends APIResource { retrieve(modelID, params = {}, options4) { const { betas } = params ?? {}; - return this._client.get(path27`/v1/models/${modelID}?beta=true`, { + return this._client.get(path28`/v1/models/${modelID}?beta=true`, { ...options4, headers: buildHeaders([ { ...betas?.toString() != null ? { "anthropic-beta": betas?.toString() } : undefined }, @@ -280012,54 +280312,54 @@ var init_BetaMessageStream = __esm(() => { if (this.ended) { throw new AnthropicError(`stream has ended, this shouldn't happen`); } - const snapshot4 = __classPrivateFieldGet3(this, _BetaMessageStream_currentMessageSnapshot, "f"); - if (!snapshot4) { + const snapshot3 = __classPrivateFieldGet3(this, _BetaMessageStream_currentMessageSnapshot, "f"); + if (!snapshot3) { throw new AnthropicError(`request ended without sending any chunks`); } __classPrivateFieldSet3(this, _BetaMessageStream_currentMessageSnapshot, undefined, "f"); - return maybeParseBetaMessage(snapshot4, __classPrivateFieldGet3(this, _BetaMessageStream_params, "f"), { logger: __classPrivateFieldGet3(this, _BetaMessageStream_logger, "f") }); + return maybeParseBetaMessage(snapshot3, __classPrivateFieldGet3(this, _BetaMessageStream_params, "f"), { logger: __classPrivateFieldGet3(this, _BetaMessageStream_logger, "f") }); }, _BetaMessageStream_accumulateMessage = function _BetaMessageStream_accumulateMessage2(event) { - let snapshot4 = __classPrivateFieldGet3(this, _BetaMessageStream_currentMessageSnapshot, "f"); + let snapshot3 = __classPrivateFieldGet3(this, _BetaMessageStream_currentMessageSnapshot, "f"); if (event.type === "message_start") { - if (snapshot4) { + if (snapshot3) { throw new AnthropicError(`Unexpected event order, got ${event.type} before receiving "message_stop"`); } return event.message; } - if (!snapshot4) { + if (!snapshot3) { throw new AnthropicError(`Unexpected event order, got ${event.type} before "message_start"`); } switch (event.type) { case "message_stop": - return snapshot4; + return snapshot3; case "message_delta": - snapshot4.container = event.delta.container; - snapshot4.stop_reason = event.delta.stop_reason; - snapshot4.stop_sequence = event.delta.stop_sequence; - snapshot4.usage.output_tokens = event.usage.output_tokens; - snapshot4.context_management = event.context_management; + snapshot3.container = event.delta.container; + snapshot3.stop_reason = event.delta.stop_reason; + snapshot3.stop_sequence = event.delta.stop_sequence; + snapshot3.usage.output_tokens = event.usage.output_tokens; + snapshot3.context_management = event.context_management; if (event.usage.input_tokens != null) { - snapshot4.usage.input_tokens = event.usage.input_tokens; + snapshot3.usage.input_tokens = event.usage.input_tokens; } if (event.usage.cache_creation_input_tokens != null) { - snapshot4.usage.cache_creation_input_tokens = event.usage.cache_creation_input_tokens; + snapshot3.usage.cache_creation_input_tokens = event.usage.cache_creation_input_tokens; } if (event.usage.cache_read_input_tokens != null) { - snapshot4.usage.cache_read_input_tokens = event.usage.cache_read_input_tokens; + snapshot3.usage.cache_read_input_tokens = event.usage.cache_read_input_tokens; } if (event.usage.server_tool_use != null) { - snapshot4.usage.server_tool_use = event.usage.server_tool_use; + snapshot3.usage.server_tool_use = event.usage.server_tool_use; } - return snapshot4; + return snapshot3; case "content_block_start": - snapshot4.content.push(event.content_block); - return snapshot4; + snapshot3.content.push(event.content_block); + return snapshot3; case "content_block_delta": { - const snapshotContent = snapshot4.content.at(event.index); + const snapshotContent = snapshot3.content.at(event.index); switch (event.delta.type) { case "text_delta": { if (snapshotContent?.type === "text") { - snapshot4.content[event.index] = { + snapshot3.content[event.index] = { ...snapshotContent, text: (snapshotContent.text || "") + event.delta.text }; @@ -280068,7 +280368,7 @@ var init_BetaMessageStream = __esm(() => { } case "citations_delta": { if (snapshotContent?.type === "text") { - snapshot4.content[event.index] = { + snapshot3.content[event.index] = { ...snapshotContent, citations: [...snapshotContent.citations ?? [], event.delta.citation] }; @@ -280093,13 +280393,13 @@ var init_BetaMessageStream = __esm(() => { __classPrivateFieldGet3(this, _BetaMessageStream_handleError, "f").call(this, error49); } } - snapshot4.content[event.index] = newContent; + snapshot3.content[event.index] = newContent; } break; } case "thinking_delta": { if (snapshotContent?.type === "thinking") { - snapshot4.content[event.index] = { + snapshot3.content[event.index] = { ...snapshotContent, thinking: snapshotContent.thinking + event.delta.thinking }; @@ -280108,7 +280408,7 @@ var init_BetaMessageStream = __esm(() => { } case "signature_delta": { if (snapshotContent?.type === "thinking") { - snapshot4.content[event.index] = { + snapshot3.content[event.index] = { ...snapshotContent, signature: event.delta.signature }; @@ -280118,10 +280418,10 @@ var init_BetaMessageStream = __esm(() => { default: checkNever(event.delta); } - return snapshot4; + return snapshot3; } case "content_block_stop": - return snapshot4; + return snapshot3; } }, Symbol.asyncIterator)]() { const pushQueue = []; @@ -280499,7 +280799,7 @@ var init_batches = __esm(() => { init_headers(); init_jsonl(); init_error5(); - init_path(); + init_path2(); Batches = class Batches extends APIResource { create(params, options4) { const { betas, ...body3 } = params; @@ -280514,7 +280814,7 @@ var init_batches = __esm(() => { } retrieve(messageBatchID, params = {}, options4) { const { betas } = params ?? {}; - return this._client.get(path27`/v1/messages/batches/${messageBatchID}?beta=true`, { + return this._client.get(path28`/v1/messages/batches/${messageBatchID}?beta=true`, { ...options4, headers: buildHeaders([ { "anthropic-beta": [...betas ?? [], "message-batches-2024-09-24"].toString() }, @@ -280535,7 +280835,7 @@ var init_batches = __esm(() => { } delete(messageBatchID, params = {}, options4) { const { betas } = params ?? {}; - return this._client.delete(path27`/v1/messages/batches/${messageBatchID}?beta=true`, { + return this._client.delete(path28`/v1/messages/batches/${messageBatchID}?beta=true`, { ...options4, headers: buildHeaders([ { "anthropic-beta": [...betas ?? [], "message-batches-2024-09-24"].toString() }, @@ -280545,7 +280845,7 @@ var init_batches = __esm(() => { } cancel(messageBatchID, params = {}, options4) { const { betas } = params ?? {}; - return this._client.post(path27`/v1/messages/batches/${messageBatchID}/cancel?beta=true`, { + return this._client.post(path28`/v1/messages/batches/${messageBatchID}/cancel?beta=true`, { ...options4, headers: buildHeaders([ { "anthropic-beta": [...betas ?? [], "message-batches-2024-09-24"].toString() }, @@ -280664,11 +280964,11 @@ var init_versions2 = __esm(() => { init_pagination(); init_headers(); init_uploads(); - init_path(); + init_path2(); Versions = class Versions extends APIResource { create(skillID, params = {}, options4) { const { betas, ...body3 } = params ?? {}; - return this._client.post(path27`/v1/skills/${skillID}/versions?beta=true`, multipartFormRequestOptions({ + return this._client.post(path28`/v1/skills/${skillID}/versions?beta=true`, multipartFormRequestOptions({ body: body3, ...options4, headers: buildHeaders([ @@ -280679,7 +280979,7 @@ var init_versions2 = __esm(() => { } retrieve(version5, params, options4) { const { skill_id, betas } = params; - return this._client.get(path27`/v1/skills/${skill_id}/versions/${version5}?beta=true`, { + return this._client.get(path28`/v1/skills/${skill_id}/versions/${version5}?beta=true`, { ...options4, headers: buildHeaders([ { "anthropic-beta": [...betas ?? [], "skills-2025-10-02"].toString() }, @@ -280689,7 +280989,7 @@ var init_versions2 = __esm(() => { } list(skillID, params = {}, options4) { const { betas, ...query } = params ?? {}; - return this._client.getAPIList(path27`/v1/skills/${skillID}/versions?beta=true`, PageCursor, { + return this._client.getAPIList(path28`/v1/skills/${skillID}/versions?beta=true`, PageCursor, { query, ...options4, headers: buildHeaders([ @@ -280700,7 +281000,7 @@ var init_versions2 = __esm(() => { } delete(version5, params, options4) { const { skill_id, betas } = params; - return this._client.delete(path27`/v1/skills/${skill_id}/versions/${version5}?beta=true`, { + return this._client.delete(path28`/v1/skills/${skill_id}/versions/${version5}?beta=true`, { ...options4, headers: buildHeaders([ { "anthropic-beta": [...betas ?? [], "skills-2025-10-02"].toString() }, @@ -280719,7 +281019,7 @@ var init_skills = __esm(() => { init_pagination(); init_headers(); init_uploads(); - init_path(); + init_path2(); Skills2 = class Skills2 extends APIResource { constructor() { super(...arguments); @@ -280738,7 +281038,7 @@ var init_skills = __esm(() => { } retrieve(skillID, params = {}, options4) { const { betas } = params ?? {}; - return this._client.get(path27`/v1/skills/${skillID}?beta=true`, { + return this._client.get(path28`/v1/skills/${skillID}?beta=true`, { ...options4, headers: buildHeaders([ { "anthropic-beta": [...betas ?? [], "skills-2025-10-02"].toString() }, @@ -280759,7 +281059,7 @@ var init_skills = __esm(() => { } delete(skillID, params = {}, options4) { const { betas } = params ?? {}; - return this._client.delete(path27`/v1/skills/${skillID}?beta=true`, { + return this._client.delete(path28`/v1/skills/${skillID}?beta=true`, { ...options4, headers: buildHeaders([ { "anthropic-beta": [...betas ?? [], "skills-2025-10-02"].toString() }, @@ -281160,52 +281460,52 @@ var init_MessageStream = __esm(() => { if (this.ended) { throw new AnthropicError(`stream has ended, this shouldn't happen`); } - const snapshot4 = __classPrivateFieldGet3(this, _MessageStream_currentMessageSnapshot, "f"); - if (!snapshot4) { + const snapshot3 = __classPrivateFieldGet3(this, _MessageStream_currentMessageSnapshot, "f"); + if (!snapshot3) { throw new AnthropicError(`request ended without sending any chunks`); } __classPrivateFieldSet3(this, _MessageStream_currentMessageSnapshot, undefined, "f"); - return snapshot4; + return snapshot3; }, _MessageStream_accumulateMessage = function _MessageStream_accumulateMessage2(event) { - let snapshot4 = __classPrivateFieldGet3(this, _MessageStream_currentMessageSnapshot, "f"); + let snapshot3 = __classPrivateFieldGet3(this, _MessageStream_currentMessageSnapshot, "f"); if (event.type === "message_start") { - if (snapshot4) { + if (snapshot3) { throw new AnthropicError(`Unexpected event order, got ${event.type} before receiving "message_stop"`); } return event.message; } - if (!snapshot4) { + if (!snapshot3) { throw new AnthropicError(`Unexpected event order, got ${event.type} before "message_start"`); } switch (event.type) { case "message_stop": - return snapshot4; + return snapshot3; case "message_delta": - snapshot4.stop_reason = event.delta.stop_reason; - snapshot4.stop_sequence = event.delta.stop_sequence; - snapshot4.usage.output_tokens = event.usage.output_tokens; + snapshot3.stop_reason = event.delta.stop_reason; + snapshot3.stop_sequence = event.delta.stop_sequence; + snapshot3.usage.output_tokens = event.usage.output_tokens; if (event.usage.input_tokens != null) { - snapshot4.usage.input_tokens = event.usage.input_tokens; + snapshot3.usage.input_tokens = event.usage.input_tokens; } if (event.usage.cache_creation_input_tokens != null) { - snapshot4.usage.cache_creation_input_tokens = event.usage.cache_creation_input_tokens; + snapshot3.usage.cache_creation_input_tokens = event.usage.cache_creation_input_tokens; } if (event.usage.cache_read_input_tokens != null) { - snapshot4.usage.cache_read_input_tokens = event.usage.cache_read_input_tokens; + snapshot3.usage.cache_read_input_tokens = event.usage.cache_read_input_tokens; } if (event.usage.server_tool_use != null) { - snapshot4.usage.server_tool_use = event.usage.server_tool_use; + snapshot3.usage.server_tool_use = event.usage.server_tool_use; } - return snapshot4; + return snapshot3; case "content_block_start": - snapshot4.content.push({ ...event.content_block }); - return snapshot4; + snapshot3.content.push({ ...event.content_block }); + return snapshot3; case "content_block_delta": { - const snapshotContent = snapshot4.content.at(event.index); + const snapshotContent = snapshot3.content.at(event.index); switch (event.delta.type) { case "text_delta": { if (snapshotContent?.type === "text") { - snapshot4.content[event.index] = { + snapshot3.content[event.index] = { ...snapshotContent, text: (snapshotContent.text || "") + event.delta.text }; @@ -281214,7 +281514,7 @@ var init_MessageStream = __esm(() => { } case "citations_delta": { if (snapshotContent?.type === "text") { - snapshot4.content[event.index] = { + snapshot3.content[event.index] = { ...snapshotContent, citations: [...snapshotContent.citations ?? [], event.delta.citation] }; @@ -281234,13 +281534,13 @@ var init_MessageStream = __esm(() => { if (jsonBuf) { newContent.input = partialParse(jsonBuf); } - snapshot4.content[event.index] = newContent; + snapshot3.content[event.index] = newContent; } break; } case "thinking_delta": { if (snapshotContent?.type === "thinking") { - snapshot4.content[event.index] = { + snapshot3.content[event.index] = { ...snapshotContent, thinking: snapshotContent.thinking + event.delta.thinking }; @@ -281249,7 +281549,7 @@ var init_MessageStream = __esm(() => { } case "signature_delta": { if (snapshotContent?.type === "thinking") { - snapshot4.content[event.index] = { + snapshot3.content[event.index] = { ...snapshotContent, signature: event.delta.signature }; @@ -281259,10 +281559,10 @@ var init_MessageStream = __esm(() => { default: checkNever2(event.delta); } - return snapshot4; + return snapshot3; } case "content_block_stop": - return snapshot4; + return snapshot3; } }, Symbol.asyncIterator)]() { const pushQueue = []; @@ -281328,22 +281628,22 @@ var init_batches2 = __esm(() => { init_headers(); init_jsonl(); init_error5(); - init_path(); + init_path2(); Batches2 = class Batches2 extends APIResource { create(body3, options4) { return this._client.post("/v1/messages/batches", { body: body3, ...options4 }); } retrieve(messageBatchID, options4) { - return this._client.get(path27`/v1/messages/batches/${messageBatchID}`, options4); + return this._client.get(path28`/v1/messages/batches/${messageBatchID}`, options4); } list(query = {}, options4) { return this._client.getAPIList("/v1/messages/batches", Page, { query, ...options4 }); } delete(messageBatchID, options4) { - return this._client.delete(path27`/v1/messages/batches/${messageBatchID}`, options4); + return this._client.delete(path28`/v1/messages/batches/${messageBatchID}`, options4); } cancel(messageBatchID, options4) { - return this._client.post(path27`/v1/messages/batches/${messageBatchID}/cancel`, options4); + return this._client.post(path28`/v1/messages/batches/${messageBatchID}/cancel`, options4); } async results(messageBatchID, options4) { const batch = await this.retrieve(messageBatchID); @@ -281417,11 +281717,11 @@ var Models2; var init_models4 = __esm(() => { init_pagination(); init_headers(); - init_path(); + init_path2(); Models2 = class Models2 extends APIResource { retrieve(modelID, params = {}, options4) { const { betas } = params ?? {}; - return this._client.get(path27`/v1/models/${modelID}`, { + return this._client.get(path28`/v1/models/${modelID}`, { ...options4, headers: buildHeaders([ { ...betas?.toString() != null ? { "anthropic-beta": betas?.toString() } : undefined }, @@ -281570,9 +281870,9 @@ new Anthropic({ apiKey, dangerouslyAllowBrowser: true }); makeStatusError(status, error49, message, headers) { return APIError.generate(status, error49, message, headers); } - buildURL(path28, query, defaultBaseURL) { + buildURL(path29, query, defaultBaseURL) { const baseURL = !__classPrivateFieldGet3(this, _BaseAnthropic_instances, "m", _BaseAnthropic_baseURLOverridden).call(this) && defaultBaseURL || this.baseURL; - const url4 = isAbsoluteURL(path28) ? new URL(path28) : new URL(baseURL + (baseURL.endsWith("/") && path28.startsWith("/") ? path28.slice(1) : path28)); + const url4 = isAbsoluteURL(path29) ? new URL(path29) : new URL(baseURL + (baseURL.endsWith("/") && path29.startsWith("/") ? path29.slice(1) : path29)); const defaultQuery = this.defaultQuery(); if (!isEmptyObj(defaultQuery)) { query = { ...defaultQuery, ...query }; @@ -281592,24 +281892,24 @@ new Anthropic({ apiKey, dangerouslyAllowBrowser: true }); } async prepareOptions(options4) {} async prepareRequest(request3, { url: url4, options: options4 }) {} - get(path28, opts) { - return this.methodRequest("get", path28, opts); + get(path29, opts) { + return this.methodRequest("get", path29, opts); } - post(path28, opts) { - return this.methodRequest("post", path28, opts); + post(path29, opts) { + return this.methodRequest("post", path29, opts); } - patch(path28, opts) { - return this.methodRequest("patch", path28, opts); + patch(path29, opts) { + return this.methodRequest("patch", path29, opts); } - put(path28, opts) { - return this.methodRequest("put", path28, opts); + put(path29, opts) { + return this.methodRequest("put", path29, opts); } - delete(path28, opts) { - return this.methodRequest("delete", path28, opts); + delete(path29, opts) { + return this.methodRequest("delete", path29, opts); } - methodRequest(method, path28, opts) { + methodRequest(method, path29, opts) { return this.request(Promise.resolve(opts).then((opts2) => { - return { method, path: path28, ...opts2 }; + return { method, path: path29, ...opts2 }; })); } request(options4, remainingRetries = null) { @@ -281713,8 +282013,8 @@ new Anthropic({ apiKey, dangerouslyAllowBrowser: true }); })); return { response, options: options4, controller, requestLogID, retryOfRequestLogID, startTime }; } - getAPIList(path28, Page2, opts) { - return this.requestAPIList(Page2, { method: "get", path: path28, ...opts }); + getAPIList(path29, Page2, opts) { + return this.requestAPIList(Page2, { method: "get", path: path29, ...opts }); } requestAPIList(Page2, options4) { const request3 = this.makeRequest(options4, null, undefined); @@ -281801,8 +282101,8 @@ new Anthropic({ apiKey, dangerouslyAllowBrowser: true }); } async buildRequest(inputOptions, { retryCount = 0 } = {}) { const options4 = { ...inputOptions }; - const { method, path: path28, query, defaultBaseURL } = options4; - const url4 = this.buildURL(path28, query, defaultBaseURL); + const { method, path: path29, query, defaultBaseURL } = options4; + const url4 = this.buildURL(path29, query, defaultBaseURL); if ("timeout" in options4) validatePositiveInteger("timeout", options4.timeout); options4.timeout = options4.timeout ?? this.timeout; @@ -282367,8 +282667,8 @@ class ParseStatus3 { } } var makeIssue3 = (params) => { - const { data: data2, path: path28, errorMaps, issueData } = params; - const fullPath = [...path28, ...issueData.path || []]; + const { data: data2, path: path29, errorMaps, issueData } = params; + const fullPath = [...path29, ...issueData.path || []]; const fullIssue = { ...issueData, path: fullPath @@ -282414,11 +282714,11 @@ var init_errorUtil3 = __esm(() => { // node_modules/gitlab-ai-provider/node_modules/zod/v3/types.js class ParseInputLazyPath3 { - constructor(parent, value8, path28, key) { + constructor(parent, value8, path29, key) { this._cachedPath = []; this.parent = parent; this.data = value8; - this._path = path28; + this._path = path29; this._key = key; } get path() { @@ -285890,21 +286190,21 @@ var init_zod3 = __esm(() => { }); // node_modules/gitlab-ai-provider/node_modules/openai/internal/tslib.mjs -function __classPrivateFieldSet4(receiver, state2, value8, kind, f4) { +function __classPrivateFieldSet4(receiver, state, value8, kind, f4) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f4) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state2 === "function" ? receiver !== state2 || !f4 : !state2.has(receiver)) + if (typeof state === "function" ? receiver !== state || !f4 : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return kind === "a" ? f4.call(receiver, value8) : f4 ? f4.value = value8 : state2.set(receiver, value8), value8; + return kind === "a" ? f4.call(receiver, value8) : f4 ? f4.value = value8 : state.set(receiver, value8), value8; } -function __classPrivateFieldGet4(receiver, state2, kind, f4) { +function __classPrivateFieldGet4(receiver, state, kind, f4) { if (kind === "a" && !f4) throw new TypeError("Private accessor was defined without a getter"); - if (typeof state2 === "function" ? receiver !== state2 || !f4 : !state2.has(receiver)) + if (typeof state === "function" ? receiver !== state || !f4 : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f4 : kind === "a" ? f4.call(receiver) : f4 ? f4.value : state2.get(receiver); + return kind === "m" ? f4 : kind === "a" ? f4.call(receiver) : f4 ? f4.value : state.get(receiver); } var init_tslib2 = () => {}; @@ -287388,11 +287688,11 @@ var init_pagination2 = __esm(() => { // node_modules/gitlab-ai-provider/node_modules/openai/auth/workload-identity-auth.mjs class WorkloadIdentityAuth { - constructor(config5, fetch3) { + constructor(config4, fetch3) { this.cachedToken = null; this.refreshPromise = null; this.tokenExchangeUrl = "https://auth.openai.com/oauth/token"; - this.config = config5; + this.config = config4; this.fetch = fetch3 ?? getDefaultFetch2(); } async getToken() { @@ -287845,12 +288145,12 @@ class APIResource2 { function encodeURIPath2(str2) { return str2.replace(/[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/g, encodeURIComponent); } -var EMPTY2, createPathTagFunction2 = (pathEncoder = encodeURIPath2) => function path28(statics, ...params) { +var EMPTY2, createPathTagFunction2 = (pathEncoder = encodeURIPath2) => function path29(statics, ...params) { if (statics.length === 1) return statics[0]; let postPath = false; const invalidSegments = []; - const path29 = statics.reduce((previousValue, currentValue, index3) => { + const path30 = statics.reduce((previousValue, currentValue, index3) => { if (/[?#]/.test(currentValue)) { postPath = true; } @@ -287866,7 +288166,7 @@ var EMPTY2, createPathTagFunction2 = (pathEncoder = encodeURIPath2) => function } return previousValue + currentValue + (index3 === params.length ? "" : encoded); }, ""); - const pathOnly = path29.split(/[?#]/, 1)[0]; + const pathOnly = path30.split(/[?#]/, 1)[0]; const invalidSegmentPattern = /(?<=^|\/)(?:\.|%2e){1,2}(?=\/|$)/gi; let match17; while ((match17 = invalidSegmentPattern.exec(pathOnly)) !== null) { @@ -287888,25 +288188,25 @@ var EMPTY2, createPathTagFunction2 = (pathEncoder = encodeURIPath2) => function throw new OpenAIError(`Path parameters result in path with invalid segments: ${invalidSegments.map((e2) => e2.error).join(` `)} -${path29} +${path30} ${underline}`); } - return path29; -}, path28; -var init_path2 = __esm(() => { + return path30; +}, path29; +var init_path3 = __esm(() => { init_error6(); EMPTY2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.create(null)); - path28 = /* @__PURE__ */ createPathTagFunction2(encodeURIPath2); + path29 = /* @__PURE__ */ createPathTagFunction2(encodeURIPath2); }); // node_modules/gitlab-ai-provider/node_modules/openai/resources/chat/completions/messages.mjs var Messages3; var init_messages3 = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Messages3 = class Messages3 extends APIResource2 { list(completionID, query = {}, options4) { - return this._client.getAPIList(path28`/chat/completions/${completionID}/messages`, CursorPage, { query, ...options4, __security: { bearerAuth: true } }); + return this._client.getAPIList(path29`/chat/completions/${completionID}/messages`, CursorPage, { query, ...options4, __security: { bearerAuth: true } }); } }; }); @@ -288869,8 +289169,8 @@ function getChatCompletionReadableStreamMessage(item) { } return JSON.parse(item.object.slice(CHAT_COMPLETION_READABLE_STREAM_MESSAGE_PREFIX.length)); } -function finalizeChatCompletion(snapshot4, params, audioDoneChoiceIndexes) { - const { id: id2, choices, created, model, system_fingerprint, ...rest } = snapshot4; +function finalizeChatCompletion(snapshot3, params, audioDoneChoiceIndexes) { + const { id: id2, choices, created, model, system_fingerprint, ...rest } = snapshot3; const completion2 = { ...rest, id: id2, @@ -288924,15 +289224,15 @@ function finalizeChatCompletion(snapshot4, params, audioDoneChoiceIndexes) { const { arguments: args3, name: name26, ...fnRest } = fn3 || {}; if (type3 == null) { throw new OpenAIError(`missing choices[${index3}].tool_calls[${i6}].type -${str2(snapshot4)}`); +${str2(snapshot3)}`); } if (name26 == null) { throw new OpenAIError(`missing choices[${index3}].tool_calls[${i6}].function.name -${str2(snapshot4)}`); +${str2(snapshot3)}`); } if (args3 == null) { throw new OpenAIError(`missing choices[${index3}].tool_calls[${i6}].function.arguments -${str2(snapshot4)}`); +${str2(snapshot3)}`); } return { ...toolRest, @@ -289065,11 +289365,11 @@ var init_ChatCompletionStream = __esm(() => { __classPrivateFieldSet4(this, _ChatCompletionStream_audioDoneChoiceIndexes, new Set, "f"); __classPrivateFieldSet4(this, _ChatCompletionStream_currentChatCompletionSnapshot, undefined, "f"); }, _ChatCompletionStream_getChoiceEventState = function _ChatCompletionStream_getChoiceEventState2(choice2) { - let state2 = __classPrivateFieldGet4(this, _ChatCompletionStream_choiceEventStates, "f")[choice2.index]; - if (state2) { - return state2; + let state = __classPrivateFieldGet4(this, _ChatCompletionStream_choiceEventStates, "f")[choice2.index]; + if (state) { + return state; } - state2 = { + state = { content_done: false, refusal_done: false, logprobs_content_done: false, @@ -289077,8 +289377,8 @@ var init_ChatCompletionStream = __esm(() => { done_tool_calls: new Set, current_tool_call_index: null }; - __classPrivateFieldGet4(this, _ChatCompletionStream_choiceEventStates, "f")[choice2.index] = state2; - return state2; + __classPrivateFieldGet4(this, _ChatCompletionStream_choiceEventStates, "f")[choice2.index] = state; + return state; }, _ChatCompletionStream_addChunk = function _ChatCompletionStream_addChunk2(chunk) { if (this.ended) return; @@ -289113,21 +289413,21 @@ var init_ChatCompletionStream = __esm(() => { snapshot: choiceSnapshot.logprobs?.refusal ?? [] }); } - const state2 = __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_getChoiceEventState).call(this, choiceSnapshot); + const state = __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_getChoiceEventState).call(this, choiceSnapshot); if (choiceSnapshot.finish_reason) { __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_emitContentDoneEvents).call(this, choiceSnapshot); - if (state2.current_tool_call_index != null) { - __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_emitToolCallDoneEvent).call(this, choiceSnapshot, state2.current_tool_call_index); + if (state.current_tool_call_index != null) { + __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_emitToolCallDoneEvent).call(this, choiceSnapshot, state.current_tool_call_index); } } for (const toolCall of delta?.tool_calls ?? []) { - if (state2.current_tool_call_index !== toolCall.index) { + if (state.current_tool_call_index !== toolCall.index) { __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_emitContentDoneEvents).call(this, choiceSnapshot); - if (state2.current_tool_call_index != null) { - __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_emitToolCallDoneEvent).call(this, choiceSnapshot, state2.current_tool_call_index); + if (state.current_tool_call_index != null) { + __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_emitToolCallDoneEvent).call(this, choiceSnapshot, state.current_tool_call_index); } } - state2.current_tool_call_index = toolCall.index; + state.current_tool_call_index = toolCall.index; } for (const toolCallDelta of delta?.tool_calls ?? []) { const toolCallSnapshot = choiceSnapshot.message.tool_calls?.[toolCallDelta.index]; @@ -289148,8 +289448,8 @@ var init_ChatCompletionStream = __esm(() => { } } }, _ChatCompletionStream_emitToolCallDoneEvent = function _ChatCompletionStream_emitToolCallDoneEvent2(choiceSnapshot, toolCallIndex) { - const state2 = __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_getChoiceEventState).call(this, choiceSnapshot); - if (state2.done_tool_calls.has(toolCallIndex)) { + const state = __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_getChoiceEventState).call(this, choiceSnapshot); + if (state.done_tool_calls.has(toolCallIndex)) { return; } const toolCallSnapshot = choiceSnapshot.message.tool_calls?.[toolCallIndex]; @@ -289171,40 +289471,40 @@ var init_ChatCompletionStream = __esm(() => { assertNever3(toolCallSnapshot.type); } }, _ChatCompletionStream_emitContentDoneEvents = function _ChatCompletionStream_emitContentDoneEvents2(choiceSnapshot) { - const state2 = __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_getChoiceEventState).call(this, choiceSnapshot); - if (choiceSnapshot.message.content && !state2.content_done) { - state2.content_done = true; + const state = __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_getChoiceEventState).call(this, choiceSnapshot); + if (choiceSnapshot.message.content && !state.content_done) { + state.content_done = true; const responseFormat = __classPrivateFieldGet4(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_getAutoParseableResponseFormat).call(this); this._emit("content.done", { content: choiceSnapshot.message.content, parsed: responseFormat ? responseFormat.$parseRaw(choiceSnapshot.message.content) : null }); } - if (choiceSnapshot.message.refusal && !state2.refusal_done) { - state2.refusal_done = true; + if (choiceSnapshot.message.refusal && !state.refusal_done) { + state.refusal_done = true; this._emit("refusal.done", { refusal: choiceSnapshot.message.refusal }); } - if (choiceSnapshot.logprobs?.content && !state2.logprobs_content_done) { - state2.logprobs_content_done = true; + if (choiceSnapshot.logprobs?.content && !state.logprobs_content_done) { + state.logprobs_content_done = true; this._emit("logprobs.content.done", { content: choiceSnapshot.logprobs.content }); } - if (choiceSnapshot.logprobs?.refusal && !state2.logprobs_refusal_done) { - state2.logprobs_refusal_done = true; + if (choiceSnapshot.logprobs?.refusal && !state.logprobs_refusal_done) { + state.logprobs_refusal_done = true; this._emit("logprobs.refusal.done", { refusal: choiceSnapshot.logprobs.refusal }); } }, _ChatCompletionStream_endRequest = function _ChatCompletionStream_endRequest2() { if (this.ended) { throw new OpenAIError(`stream has ended, this shouldn't happen`); } - const snapshot4 = __classPrivateFieldGet4(this, _ChatCompletionStream_currentChatCompletionSnapshot, "f"); - if (!snapshot4) { + const snapshot3 = __classPrivateFieldGet4(this, _ChatCompletionStream_currentChatCompletionSnapshot, "f"); + if (!snapshot3) { throw new OpenAIError(`request ended without sending any chunks`); } const audioDoneChoiceIndexes = __classPrivateFieldGet4(this, _ChatCompletionStream_audioDoneChoiceIndexes, "f"); __classPrivateFieldSet4(this, _ChatCompletionStream_audioDoneChoiceIndexes, new Set, "f"); __classPrivateFieldSet4(this, _ChatCompletionStream_currentChatCompletionSnapshot, undefined, "f"); __classPrivateFieldSet4(this, _ChatCompletionStream_choiceEventStates, [], "f"); - return finalizeChatCompletion(snapshot4, __classPrivateFieldGet4(this, _ChatCompletionStream_params, "f"), audioDoneChoiceIndexes); + return finalizeChatCompletion(snapshot3, __classPrivateFieldGet4(this, _ChatCompletionStream_params, "f"), audioDoneChoiceIndexes); }, _ChatCompletionStream_getAutoParseableResponseFormat = function _ChatCompletionStream_getAutoParseableResponseFormat2() { const responseFormat = __classPrivateFieldGet4(this, _ChatCompletionStream_params, "f")?.response_format; if (isAutoParsableResponseFormat(responseFormat)) { @@ -289213,20 +289513,20 @@ var init_ChatCompletionStream = __esm(() => { return null; }, _ChatCompletionStream_accumulateChatCompletion = function _ChatCompletionStream_accumulateChatCompletion2(chunk) { var _a27, _b16, _c2, _d, _e2; - let snapshot4 = __classPrivateFieldGet4(this, _ChatCompletionStream_currentChatCompletionSnapshot, "f"); + let snapshot3 = __classPrivateFieldGet4(this, _ChatCompletionStream_currentChatCompletionSnapshot, "f"); const { choices, ...rest } = chunk; - if (!snapshot4) { - snapshot4 = __classPrivateFieldSet4(this, _ChatCompletionStream_currentChatCompletionSnapshot, { + if (!snapshot3) { + snapshot3 = __classPrivateFieldSet4(this, _ChatCompletionStream_currentChatCompletionSnapshot, { ...rest, choices: [] }, "f"); } else if (chunk.id) { - Object.assign(snapshot4, rest); + Object.assign(snapshot3, rest); } for (const { delta, finish_reason, index: index3, logprobs = null, ...other } of chunk.choices) { - let choice2 = snapshot4.choices[index3]; + let choice2 = snapshot3.choices[index3]; if (!choice2) { - choice2 = snapshot4.choices[index3] = { finish_reason, index: index3, message: {}, logprobs, ...other }; + choice2 = snapshot3.choices[index3] = { finish_reason, index: index3, message: {}, logprobs, ...other }; } if (logprobs) { if (!choice2.logprobs) { @@ -289324,7 +289624,7 @@ var init_ChatCompletionStream = __esm(() => { } } } - return snapshot4; + return snapshot3; }, Symbol.asyncIterator)]() { const pushQueue = []; const readQueue = []; @@ -289485,7 +289785,7 @@ var init_completions2 = __esm(() => { init_messages3(); init_messages3(); init_pagination2(); - init_path2(); + init_path3(); init_ChatCompletionRunner(); init_ChatCompletionStreamingRunner(); init_ChatCompletionStream(); @@ -289507,13 +289807,13 @@ var init_completions2 = __esm(() => { }); } retrieve(completionID, options4) { - return this._client.get(path28`/chat/completions/${completionID}`, { + return this._client.get(path29`/chat/completions/${completionID}`, { ...options4, __security: { bearerAuth: true } }); } update(completionID, body3, options4) { - return this._client.post(path28`/chat/completions/${completionID}`, { + return this._client.post(path29`/chat/completions/${completionID}`, { body: body3, ...options4, __security: { bearerAuth: true } @@ -289527,7 +289827,7 @@ var init_completions2 = __esm(() => { }); } delete(completionID, options4) { - return this._client.delete(path28`/chat/completions/${completionID}`, { + return this._client.delete(path29`/chat/completions/${completionID}`, { ...options4, __security: { bearerAuth: true } }); @@ -289589,7 +289889,7 @@ var init_shared3 = () => {}; var AdminAPIKeys; var init_admin_api_keys = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); AdminAPIKeys = class AdminAPIKeys extends APIResource2 { create(body3, options4) { return this._client.post("/organization/admin_api_keys", { @@ -289599,7 +289899,7 @@ var init_admin_api_keys = __esm(() => { }); } retrieve(keyID, options4) { - return this._client.get(path28`/organization/admin_api_keys/${keyID}`, { + return this._client.get(path29`/organization/admin_api_keys/${keyID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -289612,7 +289912,7 @@ var init_admin_api_keys = __esm(() => { }); } delete(keyID, options4) { - return this._client.delete(path28`/organization/admin_api_keys/${keyID}`, { + return this._client.delete(path29`/organization/admin_api_keys/${keyID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -289639,7 +289939,7 @@ var init_audit_logs = __esm(() => { var Certificates; var init_certificates = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Certificates = class Certificates extends APIResource2 { create(body3, options4) { return this._client.post("/organization/certificates", { @@ -289649,14 +289949,14 @@ var init_certificates = __esm(() => { }); } retrieve(certificateID, query = {}, options4) { - return this._client.get(path28`/organization/certificates/${certificateID}`, { + return this._client.get(path29`/organization/certificates/${certificateID}`, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } update(certificateID, body3, options4) { - return this._client.post(path28`/organization/certificates/${certificateID}`, { + return this._client.post(path29`/organization/certificates/${certificateID}`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -289666,7 +289966,7 @@ var init_certificates = __esm(() => { return this._client.getAPIList("/organization/certificates", ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(certificateID, options4) { - return this._client.delete(path28`/organization/certificates/${certificateID}`, { + return this._client.delete(path29`/organization/certificates/${certificateID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -289709,7 +290009,7 @@ var init_data_retention = __esm(() => { var Invites; var init_invites = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Invites = class Invites extends APIResource2 { create(body3, options4) { return this._client.post("/organization/invites", { @@ -289719,7 +290019,7 @@ var init_invites = __esm(() => { }); } retrieve(inviteID, options4) { - return this._client.get(path28`/organization/invites/${inviteID}`, { + return this._client.get(path29`/organization/invites/${inviteID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -289732,7 +290032,7 @@ var init_invites = __esm(() => { }); } delete(inviteID, options4) { - return this._client.delete(path28`/organization/invites/${inviteID}`, { + return this._client.delete(path29`/organization/invites/${inviteID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -289744,7 +290044,7 @@ var init_invites = __esm(() => { var Roles; var init_roles = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Roles = class Roles extends APIResource2 { create(body3, options4) { return this._client.post("/organization/roles", { @@ -289754,13 +290054,13 @@ var init_roles = __esm(() => { }); } retrieve(roleID, options4) { - return this._client.get(path28`/organization/roles/${roleID}`, { + return this._client.get(path29`/organization/roles/${roleID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(roleID, body3, options4) { - return this._client.post(path28`/organization/roles/${roleID}`, { + return this._client.post(path29`/organization/roles/${roleID}`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -289774,7 +290074,7 @@ var init_roles = __esm(() => { }); } delete(roleID, options4) { - return this._client.delete(path28`/organization/roles/${roleID}`, { + return this._client.delete(path29`/organization/roles/${roleID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -289786,7 +290086,7 @@ var init_roles = __esm(() => { var SpendAlerts; var init_spend_alerts = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); SpendAlerts = class SpendAlerts extends APIResource2 { create(body3, options4) { return this._client.post("/organization/spend_alerts", { @@ -289796,13 +290096,13 @@ var init_spend_alerts = __esm(() => { }); } retrieve(alertID, options4) { - return this._client.get(path28`/organization/spend_alerts/${alertID}`, { + return this._client.get(path29`/organization/spend_alerts/${alertID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(alertID, body3, options4) { - return this._client.post(path28`/organization/spend_alerts/${alertID}`, { + return this._client.post(path29`/organization/spend_alerts/${alertID}`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -289812,7 +290112,7 @@ var init_spend_alerts = __esm(() => { return this._client.getAPIList("/organization/spend_alerts", ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(alertID, options4) { - return this._client.delete(path28`/organization/spend_alerts/${alertID}`, { + return this._client.delete(path29`/organization/spend_alerts/${alertID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -289934,10 +290234,10 @@ var init_usage = __esm(() => { var Roles2; var init_roles2 = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Roles2 = class Roles2 extends APIResource2 { create(groupID, body3, options4) { - return this._client.post(path28`/organization/groups/${groupID}/roles`, { + return this._client.post(path29`/organization/groups/${groupID}/roles`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -289945,17 +290245,17 @@ var init_roles2 = __esm(() => { } retrieve(roleID, params, options4) { const { group_id } = params; - return this._client.get(path28`/organization/groups/${group_id}/roles/${roleID}`, { + return this._client.get(path29`/organization/groups/${group_id}/roles/${roleID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } list(groupID, query = {}, options4) { - return this._client.getAPIList(path28`/organization/groups/${groupID}/roles`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/organization/groups/${groupID}/roles`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(roleID, params, options4) { const { group_id } = params; - return this._client.delete(path28`/organization/groups/${group_id}/roles/${roleID}`, { + return this._client.delete(path29`/organization/groups/${group_id}/roles/${roleID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -289967,10 +290267,10 @@ var init_roles2 = __esm(() => { var Users; var init_users = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Users = class Users extends APIResource2 { create(groupID, body3, options4) { - return this._client.post(path28`/organization/groups/${groupID}/users`, { + return this._client.post(path29`/organization/groups/${groupID}/users`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -289978,17 +290278,17 @@ var init_users = __esm(() => { } retrieve(userID, params, options4) { const { group_id } = params; - return this._client.get(path28`/organization/groups/${group_id}/users/${userID}`, { + return this._client.get(path29`/organization/groups/${group_id}/users/${userID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } list(groupID, query = {}, options4) { - return this._client.getAPIList(path28`/organization/groups/${groupID}/users`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/organization/groups/${groupID}/users`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(userID, params, options4) { const { group_id } = params; - return this._client.delete(path28`/organization/groups/${group_id}/users/${userID}`, { + return this._client.delete(path29`/organization/groups/${group_id}/users/${userID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290004,7 +290304,7 @@ var init_groups = __esm(() => { init_users(); init_users(); init_pagination2(); - init_path2(); + init_path3(); Groups = class Groups extends APIResource2 { constructor() { super(...arguments); @@ -290019,13 +290319,13 @@ var init_groups = __esm(() => { }); } retrieve(groupID, options4) { - return this._client.get(path28`/organization/groups/${groupID}`, { + return this._client.get(path29`/organization/groups/${groupID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(groupID, body3, options4) { - return this._client.post(path28`/organization/groups/${groupID}`, { + return this._client.post(path29`/organization/groups/${groupID}`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290039,7 +290339,7 @@ var init_groups = __esm(() => { }); } delete(groupID, options4) { - return this._client.delete(path28`/organization/groups/${groupID}`, { + return this._client.delete(path29`/organization/groups/${groupID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290053,21 +290353,21 @@ var init_groups = __esm(() => { var APIKeys; var init_api_keys = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); APIKeys = class APIKeys extends APIResource2 { retrieve(apiKeyID, params, options4) { const { project_id } = params; - return this._client.get(path28`/organization/projects/${project_id}/api_keys/${apiKeyID}`, { + return this._client.get(path29`/organization/projects/${project_id}/api_keys/${apiKeyID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } list(projectID, query = {}, options4) { - return this._client.getAPIList(path28`/organization/projects/${projectID}/api_keys`, ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/organization/projects/${projectID}/api_keys`, ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(apiKeyID, params, options4) { const { project_id } = params; - return this._client.delete(path28`/organization/projects/${project_id}/api_keys/${apiKeyID}`, { + return this._client.delete(path29`/organization/projects/${project_id}/api_keys/${apiKeyID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290079,16 +290379,16 @@ var init_api_keys = __esm(() => { var Certificates2; var init_certificates2 = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Certificates2 = class Certificates2 extends APIResource2 { list(projectID, query = {}, options4) { - return this._client.getAPIList(path28`/organization/projects/${projectID}/certificates`, ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/organization/projects/${projectID}/certificates`, ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } activate(projectID, body3, options4) { - return this._client.getAPIList(path28`/organization/projects/${projectID}/certificates/activate`, Page2, { body: body3, method: "post", ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/organization/projects/${projectID}/certificates/activate`, Page2, { body: body3, method: "post", ...options4, __security: { adminAPIKeyAuth: true } }); } deactivate(projectID, body3, options4) { - return this._client.getAPIList(path28`/organization/projects/${projectID}/certificates/deactivate`, Page2, { body: body3, method: "post", ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/organization/projects/${projectID}/certificates/deactivate`, Page2, { body: body3, method: "post", ...options4, __security: { adminAPIKeyAuth: true } }); } }; }); @@ -290096,16 +290396,16 @@ var init_certificates2 = __esm(() => { // node_modules/gitlab-ai-provider/node_modules/openai/resources/admin/organization/projects/data-retention.mjs var DataRetention2; var init_data_retention2 = __esm(() => { - init_path2(); + init_path3(); DataRetention2 = class DataRetention2 extends APIResource2 { retrieve(projectID, options4) { - return this._client.get(path28`/organization/projects/${projectID}/data_retention`, { + return this._client.get(path29`/organization/projects/${projectID}/data_retention`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(projectID, body3, options4) { - return this._client.post(path28`/organization/projects/${projectID}/data_retention`, { + return this._client.post(path29`/organization/projects/${projectID}/data_retention`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290117,16 +290417,16 @@ var init_data_retention2 = __esm(() => { // node_modules/gitlab-ai-provider/node_modules/openai/resources/admin/organization/projects/hosted-tool-permissions.mjs var HostedToolPermissions; var init_hosted_tool_permissions = __esm(() => { - init_path2(); + init_path3(); HostedToolPermissions = class HostedToolPermissions extends APIResource2 { retrieve(projectID, options4) { - return this._client.get(path28`/organization/projects/${projectID}/hosted_tool_permissions`, { + return this._client.get(path29`/organization/projects/${projectID}/hosted_tool_permissions`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(projectID, body3, options4) { - return this._client.post(path28`/organization/projects/${projectID}/hosted_tool_permissions`, { + return this._client.post(path29`/organization/projects/${projectID}/hosted_tool_permissions`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290138,23 +290438,23 @@ var init_hosted_tool_permissions = __esm(() => { // node_modules/gitlab-ai-provider/node_modules/openai/resources/admin/organization/projects/model-permissions.mjs var ModelPermissions; var init_model_permissions = __esm(() => { - init_path2(); + init_path3(); ModelPermissions = class ModelPermissions extends APIResource2 { retrieve(projectID, options4) { - return this._client.get(path28`/organization/projects/${projectID}/model_permissions`, { + return this._client.get(path29`/organization/projects/${projectID}/model_permissions`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(projectID, body3, options4) { - return this._client.post(path28`/organization/projects/${projectID}/model_permissions`, { + return this._client.post(path29`/organization/projects/${projectID}/model_permissions`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(projectID, options4) { - return this._client.delete(path28`/organization/projects/${projectID}/model_permissions`, { + return this._client.delete(path29`/organization/projects/${projectID}/model_permissions`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290166,14 +290466,14 @@ var init_model_permissions = __esm(() => { var RateLimits; var init_rate_limits = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); RateLimits = class RateLimits extends APIResource2 { listRateLimits(projectID, query = {}, options4) { - return this._client.getAPIList(path28`/organization/projects/${projectID}/rate_limits`, ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/organization/projects/${projectID}/rate_limits`, ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } updateRateLimit(rateLimitID, params, options4) { const { project_id, ...body3 } = params; - return this._client.post(path28`/organization/projects/${project_id}/rate_limits/${rateLimitID}`, { + return this._client.post(path29`/organization/projects/${project_id}/rate_limits/${rateLimitID}`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290186,10 +290486,10 @@ var init_rate_limits = __esm(() => { var Roles3; var init_roles3 = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Roles3 = class Roles3 extends APIResource2 { create(projectID, body3, options4) { - return this._client.post(path28`/projects/${projectID}/roles`, { + return this._client.post(path29`/projects/${projectID}/roles`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290197,21 +290497,21 @@ var init_roles3 = __esm(() => { } retrieve(roleID, params, options4) { const { project_id } = params; - return this._client.get(path28`/projects/${project_id}/roles/${roleID}`, { + return this._client.get(path29`/projects/${project_id}/roles/${roleID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(roleID, params, options4) { const { project_id, ...body3 } = params; - return this._client.post(path28`/projects/${project_id}/roles/${roleID}`, { + return this._client.post(path29`/projects/${project_id}/roles/${roleID}`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } }); } list(projectID, query = {}, options4) { - return this._client.getAPIList(path28`/projects/${projectID}/roles`, NextCursorPage, { + return this._client.getAPIList(path29`/projects/${projectID}/roles`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } @@ -290219,7 +290519,7 @@ var init_roles3 = __esm(() => { } delete(roleID, params, options4) { const { project_id } = params; - return this._client.delete(path28`/projects/${project_id}/roles/${roleID}`, { + return this._client.delete(path29`/projects/${project_id}/roles/${roleID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290231,10 +290531,10 @@ var init_roles3 = __esm(() => { var SpendAlerts2; var init_spend_alerts2 = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); SpendAlerts2 = class SpendAlerts2 extends APIResource2 { create(projectID, body3, options4) { - return this._client.post(path28`/organization/projects/${projectID}/spend_alerts`, { + return this._client.post(path29`/organization/projects/${projectID}/spend_alerts`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290242,25 +290542,25 @@ var init_spend_alerts2 = __esm(() => { } retrieve(alertID, params, options4) { const { project_id } = params; - return this._client.get(path28`/organization/projects/${project_id}/spend_alerts/${alertID}`, { + return this._client.get(path29`/organization/projects/${project_id}/spend_alerts/${alertID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(alertID, params, options4) { const { project_id, ...body3 } = params; - return this._client.post(path28`/organization/projects/${project_id}/spend_alerts/${alertID}`, { + return this._client.post(path29`/organization/projects/${project_id}/spend_alerts/${alertID}`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } }); } list(projectID, query = {}, options4) { - return this._client.getAPIList(path28`/organization/projects/${projectID}/spend_alerts`, ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/organization/projects/${projectID}/spend_alerts`, ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(alertID, params, options4) { const { project_id } = params; - return this._client.delete(path28`/organization/projects/${project_id}/spend_alerts/${alertID}`, { + return this._client.delete(path29`/organization/projects/${project_id}/spend_alerts/${alertID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290271,23 +290571,23 @@ var init_spend_alerts2 = __esm(() => { // node_modules/gitlab-ai-provider/node_modules/openai/resources/admin/organization/projects/spend-limit.mjs var SpendLimit2; var init_spend_limit2 = __esm(() => { - init_path2(); + init_path3(); SpendLimit2 = class SpendLimit2 extends APIResource2 { retrieve(projectID, options4) { - return this._client.get(path28`/organization/projects/${projectID}/spend_limit`, { + return this._client.get(path29`/organization/projects/${projectID}/spend_limit`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(projectID, body3, options4) { - return this._client.post(path28`/organization/projects/${projectID}/spend_limit`, { + return this._client.post(path29`/organization/projects/${projectID}/spend_limit`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(projectID, options4) { - return this._client.delete(path28`/organization/projects/${projectID}/spend_limit`, { + return this._client.delete(path29`/organization/projects/${projectID}/spend_limit`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290299,11 +290599,11 @@ var init_spend_limit2 = __esm(() => { var Roles4; var init_roles4 = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Roles4 = class Roles4 extends APIResource2 { create(groupID, params, options4) { const { project_id, ...body3 } = params; - return this._client.post(path28`/projects/${project_id}/groups/${groupID}/roles`, { + return this._client.post(path29`/projects/${project_id}/groups/${groupID}/roles`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290311,18 +290611,18 @@ var init_roles4 = __esm(() => { } retrieve(roleID, params, options4) { const { project_id, group_id } = params; - return this._client.get(path28`/projects/${project_id}/groups/${group_id}/roles/${roleID}`, { + return this._client.get(path29`/projects/${project_id}/groups/${group_id}/roles/${roleID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } list(groupID, params, options4) { const { project_id, ...query } = params; - return this._client.getAPIList(path28`/projects/${project_id}/groups/${groupID}/roles`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/projects/${project_id}/groups/${groupID}/roles`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(roleID, params, options4) { const { project_id, group_id } = params; - return this._client.delete(path28`/projects/${project_id}/groups/${group_id}/roles/${roleID}`, { + return this._client.delete(path29`/projects/${project_id}/groups/${group_id}/roles/${roleID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290336,14 +290636,14 @@ var init_groups2 = __esm(() => { init_roles4(); init_roles4(); init_pagination2(); - init_path2(); + init_path3(); Groups2 = class Groups2 extends APIResource2 { constructor() { super(...arguments); this.roles = new Roles4(this._client); } create(projectID, body3, options4) { - return this._client.post(path28`/organization/projects/${projectID}/groups`, { + return this._client.post(path29`/organization/projects/${projectID}/groups`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290351,18 +290651,18 @@ var init_groups2 = __esm(() => { } retrieve(groupID, params, options4) { const { project_id, ...query } = params; - return this._client.get(path28`/organization/projects/${project_id}/groups/${groupID}`, { + return this._client.get(path29`/organization/projects/${project_id}/groups/${groupID}`, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } list(projectID, query = {}, options4) { - return this._client.getAPIList(path28`/organization/projects/${projectID}/groups`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/organization/projects/${projectID}/groups`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(groupID, params, options4) { const { project_id } = params; - return this._client.delete(path28`/organization/projects/${project_id}/groups/${groupID}`, { + return this._client.delete(path29`/organization/projects/${project_id}/groups/${groupID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290374,11 +290674,11 @@ var init_groups2 = __esm(() => { // node_modules/gitlab-ai-provider/node_modules/openai/resources/admin/organization/projects/service-accounts/api-keys.mjs var APIKeys2; var init_api_keys2 = __esm(() => { - init_path2(); + init_path3(); APIKeys2 = class APIKeys2 extends APIResource2 { create(serviceAccountID, params, options4) { const { project_id, ...body3 } = params; - return this._client.post(path28`/organization/projects/${project_id}/service_accounts/${serviceAccountID}/api_keys`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.post(path29`/organization/projects/${project_id}/service_accounts/${serviceAccountID}/api_keys`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } }); } }; }); @@ -290389,14 +290689,14 @@ var init_service_accounts = __esm(() => { init_api_keys2(); init_api_keys2(); init_pagination2(); - init_path2(); + init_path3(); ServiceAccounts = class ServiceAccounts extends APIResource2 { constructor() { super(...arguments); this.apiKeys = new APIKeys2(this._client); } create(projectID, body3, options4) { - return this._client.post(path28`/organization/projects/${projectID}/service_accounts`, { + return this._client.post(path29`/organization/projects/${projectID}/service_accounts`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290404,21 +290704,21 @@ var init_service_accounts = __esm(() => { } retrieve(serviceAccountID, params, options4) { const { project_id } = params; - return this._client.get(path28`/organization/projects/${project_id}/service_accounts/${serviceAccountID}`, { + return this._client.get(path29`/organization/projects/${project_id}/service_accounts/${serviceAccountID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(serviceAccountID, params, options4) { const { project_id, ...body3 } = params; - return this._client.post(path28`/organization/projects/${project_id}/service_accounts/${serviceAccountID}`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.post(path29`/organization/projects/${project_id}/service_accounts/${serviceAccountID}`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } }); } list(projectID, query = {}, options4) { - return this._client.getAPIList(path28`/organization/projects/${projectID}/service_accounts`, ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/organization/projects/${projectID}/service_accounts`, ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(serviceAccountID, params, options4) { const { project_id } = params; - return this._client.delete(path28`/organization/projects/${project_id}/service_accounts/${serviceAccountID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.delete(path29`/organization/projects/${project_id}/service_accounts/${serviceAccountID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } }; ServiceAccounts.APIKeys = APIKeys2; @@ -290428,11 +290728,11 @@ var init_service_accounts = __esm(() => { var Roles5; var init_roles5 = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Roles5 = class Roles5 extends APIResource2 { create(userID, params, options4) { const { project_id, ...body3 } = params; - return this._client.post(path28`/projects/${project_id}/users/${userID}/roles`, { + return this._client.post(path29`/projects/${project_id}/users/${userID}/roles`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290440,18 +290740,18 @@ var init_roles5 = __esm(() => { } retrieve(roleID, params, options4) { const { project_id, user_id } = params; - return this._client.get(path28`/projects/${project_id}/users/${user_id}/roles/${roleID}`, { + return this._client.get(path29`/projects/${project_id}/users/${user_id}/roles/${roleID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } list(userID, params, options4) { const { project_id, ...query } = params; - return this._client.getAPIList(path28`/projects/${project_id}/users/${userID}/roles`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/projects/${project_id}/users/${userID}/roles`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(roleID, params, options4) { const { project_id, user_id } = params; - return this._client.delete(path28`/projects/${project_id}/users/${user_id}/roles/${roleID}`, { + return this._client.delete(path29`/projects/${project_id}/users/${user_id}/roles/${roleID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290465,14 +290765,14 @@ var init_users2 = __esm(() => { init_roles5(); init_roles5(); init_pagination2(); - init_path2(); + init_path3(); Users2 = class Users2 extends APIResource2 { constructor() { super(...arguments); this.roles = new Roles5(this._client); } create(projectID, body3, options4) { - return this._client.post(path28`/organization/projects/${projectID}/users`, { + return this._client.post(path29`/organization/projects/${projectID}/users`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290480,25 +290780,25 @@ var init_users2 = __esm(() => { } retrieve(userID, params, options4) { const { project_id } = params; - return this._client.get(path28`/organization/projects/${project_id}/users/${userID}`, { + return this._client.get(path29`/organization/projects/${project_id}/users/${userID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(userID, params, options4) { const { project_id, ...body3 } = params; - return this._client.post(path28`/organization/projects/${project_id}/users/${userID}`, { + return this._client.post(path29`/organization/projects/${project_id}/users/${userID}`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } }); } list(projectID, query = {}, options4) { - return this._client.getAPIList(path28`/organization/projects/${projectID}/users`, ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/organization/projects/${projectID}/users`, ConversationCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(userID, params, options4) { const { project_id } = params; - return this._client.delete(path28`/organization/projects/${project_id}/users/${userID}`, { + return this._client.delete(path29`/organization/projects/${project_id}/users/${userID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290535,7 +290835,7 @@ var init_projects = __esm(() => { init_users2(); init_users2(); init_pagination2(); - init_path2(); + init_path3(); Projects = class Projects extends APIResource2 { constructor() { super(...arguments); @@ -290560,13 +290860,13 @@ var init_projects = __esm(() => { }); } retrieve(projectID, options4) { - return this._client.get(path28`/organization/projects/${projectID}`, { + return this._client.get(path29`/organization/projects/${projectID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(projectID, body3, options4) { - return this._client.post(path28`/organization/projects/${projectID}`, { + return this._client.post(path29`/organization/projects/${projectID}`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290580,7 +290880,7 @@ var init_projects = __esm(() => { }); } archive(projectID, options4) { - return this._client.post(path28`/organization/projects/${projectID}/archive`, { + return this._client.post(path29`/organization/projects/${projectID}/archive`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290604,10 +290904,10 @@ var init_projects = __esm(() => { var Roles6; var init_roles6 = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Roles6 = class Roles6 extends APIResource2 { create(userID, body3, options4) { - return this._client.post(path28`/organization/users/${userID}/roles`, { + return this._client.post(path29`/organization/users/${userID}/roles`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290615,17 +290915,17 @@ var init_roles6 = __esm(() => { } retrieve(roleID, params, options4) { const { user_id } = params; - return this._client.get(path28`/organization/users/${user_id}/roles/${roleID}`, { + return this._client.get(path29`/organization/users/${user_id}/roles/${roleID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } list(userID, query = {}, options4) { - return this._client.getAPIList(path28`/organization/users/${userID}/roles`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/organization/users/${userID}/roles`, NextCursorPage, { query, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(roleID, params, options4) { const { user_id } = params; - return this._client.delete(path28`/organization/users/${user_id}/roles/${roleID}`, { + return this._client.delete(path29`/organization/users/${user_id}/roles/${roleID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290639,20 +290939,20 @@ var init_users3 = __esm(() => { init_roles6(); init_roles6(); init_pagination2(); - init_path2(); + init_path3(); Users3 = class Users3 extends APIResource2 { constructor() { super(...arguments); this.roles = new Roles6(this._client); } retrieve(userID, options4) { - return this._client.get(path28`/organization/users/${userID}`, { + return this._client.get(path29`/organization/users/${userID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } update(userID, body3, options4) { - return this._client.post(path28`/organization/users/${userID}`, { + return this._client.post(path29`/organization/users/${userID}`, { body: body3, ...options4, __security: { adminAPIKeyAuth: true } @@ -290666,7 +290966,7 @@ var init_users3 = __esm(() => { }); } delete(userID, options4) { - return this._client.delete(path28`/organization/users/${userID}`, { + return this._client.delete(path29`/organization/users/${userID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); @@ -290818,13 +291118,13 @@ var init_audio = __esm(() => { var Batches3; var init_batches3 = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Batches3 = class Batches3 extends APIResource2 { create(body3, options4) { return this._client.post("/batches", { body: body3, ...options4, __security: { bearerAuth: true } }); } retrieve(batchID, options4) { - return this._client.get(path28`/batches/${batchID}`, { ...options4, __security: { bearerAuth: true } }); + return this._client.get(path29`/batches/${batchID}`, { ...options4, __security: { bearerAuth: true } }); } list(query = {}, options4) { return this._client.getAPIList("/batches", CursorPage, { @@ -290834,7 +291134,7 @@ var init_batches3 = __esm(() => { }); } cancel(batchID, options4) { - return this._client.post(path28`/batches/${batchID}/cancel`, { + return this._client.post(path29`/batches/${batchID}/cancel`, { ...options4, __security: { bearerAuth: true } }); @@ -290847,7 +291147,7 @@ var Assistants; var init_assistants = __esm(() => { init_pagination2(); init_headers2(); - init_path2(); + init_path3(); Assistants = class Assistants extends APIResource2 { create(body3, options4) { return this._client.post("/assistants", { @@ -290858,14 +291158,14 @@ var init_assistants = __esm(() => { }); } retrieve(assistantID, options4) { - return this._client.get(path28`/assistants/${assistantID}`, { + return this._client.get(path29`/assistants/${assistantID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } }); } update(assistantID, body3, options4) { - return this._client.post(path28`/assistants/${assistantID}`, { + return this._client.post(path29`/assistants/${assistantID}`, { body: body3, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -290881,7 +291181,7 @@ var init_assistants = __esm(() => { }); } delete(assistantID, options4) { - return this._client.delete(path28`/assistants/${assistantID}`, { + return this._client.delete(path29`/assistants/${assistantID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } @@ -290944,7 +291244,7 @@ var init_realtime = __esm(() => { var Sessions2; var init_sessions2 = __esm(() => { init_headers2(); - init_path2(); + init_path3(); Sessions2 = class Sessions2 extends APIResource2 { create(body3, options4) { return this._client.post("/chatkit/sessions", { @@ -290955,7 +291255,7 @@ var init_sessions2 = __esm(() => { }); } cancel(sessionID, options4) { - return this._client.post(path28`/chatkit/sessions/${sessionID}/cancel`, { + return this._client.post(path29`/chatkit/sessions/${sessionID}/cancel`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "chatkit_beta=v1" }, options4?.headers]), __security: { bearerAuth: true } @@ -290969,10 +291269,10 @@ var Threads; var init_threads = __esm(() => { init_pagination2(); init_headers2(); - init_path2(); + init_path3(); Threads = class Threads extends APIResource2 { retrieve(threadID, options4) { - return this._client.get(path28`/chatkit/threads/${threadID}`, { + return this._client.get(path29`/chatkit/threads/${threadID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "chatkit_beta=v1" }, options4?.headers]), __security: { bearerAuth: true } @@ -290987,14 +291287,14 @@ var init_threads = __esm(() => { }); } delete(threadID, options4) { - return this._client.delete(path28`/chatkit/threads/${threadID}`, { + return this._client.delete(path29`/chatkit/threads/${threadID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "chatkit_beta=v1" }, options4?.headers]), __security: { bearerAuth: true } }); } listItems(threadID, query = {}, options4) { - return this._client.getAPIList(path28`/chatkit/threads/${threadID}/items`, ConversationCursorPage, { + return this._client.getAPIList(path29`/chatkit/threads/${threadID}/items`, ConversationCursorPage, { query, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "chatkit_beta=v1" }, options4?.headers]), @@ -291027,11 +291327,11 @@ var InputItems; var init_input_items = __esm(() => { init_pagination2(); init_headers2(); - init_path2(); + init_path3(); InputItems = class InputItems extends APIResource2 { list(responseID, params = {}, options4) { const { betas, ...query } = params ?? {}; - return this._client.getAPIList(path28`/responses/${responseID}/input_items?beta=true`, CursorPage, { + return this._client.getAPIList(path29`/responses/${responseID}/input_items?beta=true`, CursorPage, { query, ...options4, headers: buildHeaders2([ @@ -291072,7 +291372,7 @@ var init_responses = __esm(() => { init_input_tokens(); init_input_tokens(); init_headers2(); - init_path2(); + init_path3(); Responses = class Responses extends APIResource2 { constructor() { super(...arguments); @@ -291094,7 +291394,7 @@ var init_responses = __esm(() => { } retrieve(responseID, params = {}, options4) { const { betas, ...query } = params ?? {}; - return this._client.get(path28`/responses/${responseID}?beta=true`, { + return this._client.get(path29`/responses/${responseID}?beta=true`, { query, ...options4, headers: buildHeaders2([ @@ -291107,7 +291407,7 @@ var init_responses = __esm(() => { } delete(responseID, params = {}, options4) { const { betas } = params ?? {}; - return this._client.delete(path28`/responses/${responseID}?beta=true`, { + return this._client.delete(path29`/responses/${responseID}?beta=true`, { ...options4, headers: buildHeaders2([ { Accept: "*/*", ...betas?.toString() != null ? { "openai-beta": betas?.toString() } : undefined }, @@ -291118,7 +291418,7 @@ var init_responses = __esm(() => { } cancel(responseID, params = {}, options4) { const { betas } = params ?? {}; - return this._client.post(path28`/responses/${responseID}/cancel?beta=true`, { + return this._client.post(path29`/responses/${responseID}/cancel?beta=true`, { ...options4, headers: buildHeaders2([ { ...betas?.toString() != null ? { "openai-beta": betas?.toString() } : undefined }, @@ -291149,10 +291449,10 @@ var Messages4; var init_messages4 = __esm(() => { init_pagination2(); init_headers2(); - init_path2(); + init_path3(); Messages4 = class Messages4 extends APIResource2 { create(threadID, body3, options4) { - return this._client.post(path28`/threads/${threadID}/messages`, { + return this._client.post(path29`/threads/${threadID}/messages`, { body: body3, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -291161,7 +291461,7 @@ var init_messages4 = __esm(() => { } retrieve(messageID, params, options4) { const { thread_id } = params; - return this._client.get(path28`/threads/${thread_id}/messages/${messageID}`, { + return this._client.get(path29`/threads/${thread_id}/messages/${messageID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } @@ -291169,7 +291469,7 @@ var init_messages4 = __esm(() => { } update(messageID, params, options4) { const { thread_id, ...body3 } = params; - return this._client.post(path28`/threads/${thread_id}/messages/${messageID}`, { + return this._client.post(path29`/threads/${thread_id}/messages/${messageID}`, { body: body3, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -291177,7 +291477,7 @@ var init_messages4 = __esm(() => { }); } list(threadID, query = {}, options4) { - return this._client.getAPIList(path28`/threads/${threadID}/messages`, CursorPage, { + return this._client.getAPIList(path29`/threads/${threadID}/messages`, CursorPage, { query, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -291186,7 +291486,7 @@ var init_messages4 = __esm(() => { } delete(messageID, params, options4) { const { thread_id } = params; - return this._client.delete(path28`/threads/${thread_id}/messages/${messageID}`, { + return this._client.delete(path29`/threads/${thread_id}/messages/${messageID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } @@ -291200,11 +291500,11 @@ var Steps; var init_steps = __esm(() => { init_pagination2(); init_headers2(); - init_path2(); + init_path3(); Steps = class Steps extends APIResource2 { retrieve(stepID, params, options4) { const { thread_id, run_id, ...query } = params; - return this._client.get(path28`/threads/${thread_id}/runs/${run_id}/steps/${stepID}`, { + return this._client.get(path29`/threads/${thread_id}/runs/${run_id}/steps/${stepID}`, { query, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -291213,7 +291513,7 @@ var init_steps = __esm(() => { } list(runID, params, options4) { const { thread_id, ...query } = params; - return this._client.getAPIList(path28`/threads/${thread_id}/runs/${runID}/steps`, CursorPage, { + return this._client.getAPIList(path29`/threads/${thread_id}/runs/${runID}/steps`, CursorPage, { query, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -291587,9 +291887,9 @@ var init_AssistantStream = __esm(() => { for (const content of event.data.delta.content) { if (content.type == "text" && content.text) { let textDelta = content.text; - let snapshot4 = accumulatedMessage.content[content.index]; - if (snapshot4 && snapshot4.type == "text") { - this._emit("textDelta", textDelta, snapshot4.text); + let snapshot3 = accumulatedMessage.content[content.index]; + if (snapshot3 && snapshot3.type == "text") { + this._emit("textDelta", textDelta, snapshot3.text); } else { throw Error("The snapshot associated with this text delta is not text or missing"); } @@ -291683,13 +291983,13 @@ var init_AssistantStream = __esm(() => { __classPrivateFieldGet4(this, _AssistantStream_runStepSnapshots, "f")[event.data.id] = event.data; return event.data; case "thread.run.step.delta": - let snapshot4 = __classPrivateFieldGet4(this, _AssistantStream_runStepSnapshots, "f")[event.data.id]; - if (!snapshot4) { + let snapshot3 = __classPrivateFieldGet4(this, _AssistantStream_runStepSnapshots, "f")[event.data.id]; + if (!snapshot3) { throw Error("Received a RunStepDelta before creation of a snapshot"); } let data2 = event.data; if (data2.delta) { - const accumulated = _a29.accumulateDelta(snapshot4, data2.delta); + const accumulated = _a29.accumulateDelta(snapshot3, data2.delta); __classPrivateFieldGet4(this, _AssistantStream_runStepSnapshots, "f")[event.data.id] = accumulated; } return __classPrivateFieldGet4(this, _AssistantStream_runStepSnapshots, "f")[event.data.id]; @@ -291704,33 +292004,33 @@ var init_AssistantStream = __esm(() => { if (__classPrivateFieldGet4(this, _AssistantStream_runStepSnapshots, "f")[event.data.id]) return __classPrivateFieldGet4(this, _AssistantStream_runStepSnapshots, "f")[event.data.id]; throw new Error("No snapshot available"); - }, _AssistantStream_accumulateMessage = function _AssistantStream_accumulateMessage2(event, snapshot4) { + }, _AssistantStream_accumulateMessage = function _AssistantStream_accumulateMessage2(event, snapshot3) { let newContent = []; switch (event.event) { case "thread.message.created": return [event.data, newContent]; case "thread.message.delta": - if (!snapshot4) { + if (!snapshot3) { throw Error("Received a delta with no existing snapshot (there should be one from message creation)"); } let data2 = event.data; if (data2.delta.content) { for (const contentElement of data2.delta.content) { - if (contentElement.index in snapshot4.content) { - let currentContent = snapshot4.content[contentElement.index]; - snapshot4.content[contentElement.index] = __classPrivateFieldGet4(this, _AssistantStream_instances, "m", _AssistantStream_accumulateContent).call(this, contentElement, currentContent); + if (contentElement.index in snapshot3.content) { + let currentContent = snapshot3.content[contentElement.index]; + snapshot3.content[contentElement.index] = __classPrivateFieldGet4(this, _AssistantStream_instances, "m", _AssistantStream_accumulateContent).call(this, contentElement, currentContent); } else { - snapshot4.content[contentElement.index] = contentElement; + snapshot3.content[contentElement.index] = contentElement; newContent.push(contentElement); } } } - return [snapshot4, newContent]; + return [snapshot3, newContent]; case "thread.message.in_progress": case "thread.message.completed": case "thread.message.incomplete": - if (snapshot4) { - return [snapshot4, newContent]; + if (snapshot3) { + return [snapshot3, newContent]; } else { throw Error("Received thread message event with no existing snapshot"); } @@ -291773,7 +292073,7 @@ var init_runs = __esm(() => { init_pagination2(); init_headers2(); init_AssistantStream(); - init_path2(); + init_path3(); Runs = class Runs extends APIResource2 { constructor() { super(...arguments); @@ -291781,7 +292081,7 @@ var init_runs = __esm(() => { } create(threadID, params, options4) { const { include, ...body3 } = params; - return this._client.post(path28`/threads/${threadID}/runs`, { + return this._client.post(path29`/threads/${threadID}/runs`, { query: { include }, body: body3, ...options4, @@ -291793,7 +292093,7 @@ var init_runs = __esm(() => { } retrieve(runID, params, options4) { const { thread_id } = params; - return this._client.get(path28`/threads/${thread_id}/runs/${runID}`, { + return this._client.get(path29`/threads/${thread_id}/runs/${runID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } @@ -291801,7 +292101,7 @@ var init_runs = __esm(() => { } update(runID, params, options4) { const { thread_id, ...body3 } = params; - return this._client.post(path28`/threads/${thread_id}/runs/${runID}`, { + return this._client.post(path29`/threads/${thread_id}/runs/${runID}`, { body: body3, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -291809,7 +292109,7 @@ var init_runs = __esm(() => { }); } list(threadID, query2 = {}, options4) { - return this._client.getAPIList(path28`/threads/${threadID}/runs`, CursorPage, { + return this._client.getAPIList(path29`/threads/${threadID}/runs`, CursorPage, { query: query2, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -291818,7 +292118,7 @@ var init_runs = __esm(() => { } cancel(runID, params, options4) { const { thread_id } = params; - return this._client.post(path28`/threads/${thread_id}/runs/${runID}/cancel`, { + return this._client.post(path29`/threads/${thread_id}/runs/${runID}/cancel`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } @@ -291877,7 +292177,7 @@ var init_runs = __esm(() => { } submitToolOutputs(runID, params, options4) { const { thread_id, ...body3 } = params; - return this._client.post(path28`/threads/${thread_id}/runs/${runID}/submit_tool_outputs`, { + return this._client.post(path29`/threads/${thread_id}/runs/${runID}/submit_tool_outputs`, { body: body3, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -291906,7 +292206,7 @@ var init_threads2 = __esm(() => { init_runs(); init_headers2(); init_AssistantStream(); - init_path2(); + init_path3(); Threads2 = class Threads2 extends APIResource2 { constructor() { super(...arguments); @@ -291922,14 +292222,14 @@ var init_threads2 = __esm(() => { }); } retrieve(threadID, options4) { - return this._client.get(path28`/threads/${threadID}`, { + return this._client.get(path29`/threads/${threadID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } }); } update(threadID, body3, options4) { - return this._client.post(path28`/threads/${threadID}`, { + return this._client.post(path29`/threads/${threadID}`, { body: body3, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -291937,7 +292237,7 @@ var init_threads2 = __esm(() => { }); } delete(threadID, options4) { - return this._client.delete(path28`/threads/${threadID}`, { + return this._client.delete(path29`/threads/${threadID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } @@ -292014,11 +292314,11 @@ var init_completions4 = __esm(() => { var Content; var init_content = __esm(() => { init_headers2(); - init_path2(); + init_path3(); Content = class Content extends APIResource2 { retrieve(fileID, params, options4) { const { container_id } = params; - return this._client.get(path28`/containers/${container_id}/files/${fileID}/content`, { + return this._client.get(path29`/containers/${container_id}/files/${fileID}/content`, { ...options4, headers: buildHeaders2([{ Accept: "application/binary" }, options4?.headers]), __security: { bearerAuth: true }, @@ -292036,24 +292336,24 @@ var init_files2 = __esm(() => { init_pagination2(); init_headers2(); init_uploads3(); - init_path2(); + init_path3(); Files2 = class Files2 extends APIResource2 { constructor() { super(...arguments); this.content = new Content(this._client); } create(containerID, body3, options4) { - return this._client.post(path28`/containers/${containerID}/files`, maybeMultipartFormRequestOptions({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); + return this._client.post(path29`/containers/${containerID}/files`, maybeMultipartFormRequestOptions({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); } retrieve(fileID, params, options4) { const { container_id } = params; - return this._client.get(path28`/containers/${container_id}/files/${fileID}`, { + return this._client.get(path29`/containers/${container_id}/files/${fileID}`, { ...options4, __security: { bearerAuth: true } }); } list(containerID, query2 = {}, options4) { - return this._client.getAPIList(path28`/containers/${containerID}/files`, CursorPage, { + return this._client.getAPIList(path29`/containers/${containerID}/files`, CursorPage, { query: query2, ...options4, __security: { bearerAuth: true } @@ -292061,7 +292361,7 @@ var init_files2 = __esm(() => { } delete(fileID, params, options4) { const { container_id } = params; - return this._client.delete(path28`/containers/${container_id}/files/${fileID}`, { + return this._client.delete(path29`/containers/${container_id}/files/${fileID}`, { ...options4, headers: buildHeaders2([{ Accept: "*/*" }, options4?.headers]), __security: { bearerAuth: true } @@ -292078,7 +292378,7 @@ var init_containers = __esm(() => { init_files2(); init_pagination2(); init_headers2(); - init_path2(); + init_path3(); Containers = class Containers extends APIResource2 { constructor() { super(...arguments); @@ -292088,7 +292388,7 @@ var init_containers = __esm(() => { return this._client.post("/containers", { body: body3, ...options4, __security: { bearerAuth: true } }); } retrieve(containerID, options4) { - return this._client.get(path28`/containers/${containerID}`, { + return this._client.get(path29`/containers/${containerID}`, { ...options4, __security: { bearerAuth: true } }); @@ -292101,7 +292401,7 @@ var init_containers = __esm(() => { }); } delete(containerID, options4) { - return this._client.delete(path28`/containers/${containerID}`, { + return this._client.delete(path29`/containers/${containerID}`, { ...options4, headers: buildHeaders2([{ Accept: "*/*" }, options4?.headers]), __security: { bearerAuth: true } @@ -292115,11 +292415,11 @@ var init_containers = __esm(() => { var Items; var init_items = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Items = class Items extends APIResource2 { create(conversationID, params, options4) { const { include, ...body3 } = params; - return this._client.post(path28`/conversations/${conversationID}/items`, { + return this._client.post(path29`/conversations/${conversationID}/items`, { query: { include }, body: body3, ...options4, @@ -292128,18 +292428,18 @@ var init_items = __esm(() => { } retrieve(itemID, params, options4) { const { conversation_id, ...query2 } = params; - return this._client.get(path28`/conversations/${conversation_id}/items/${itemID}`, { + return this._client.get(path29`/conversations/${conversation_id}/items/${itemID}`, { query: query2, ...options4, __security: { bearerAuth: true } }); } list(conversationID, query2 = {}, options4) { - return this._client.getAPIList(path28`/conversations/${conversationID}/items`, ConversationCursorPage, { query: query2, ...options4, __security: { bearerAuth: true } }); + return this._client.getAPIList(path29`/conversations/${conversationID}/items`, ConversationCursorPage, { query: query2, ...options4, __security: { bearerAuth: true } }); } delete(itemID, params, options4) { const { conversation_id } = params; - return this._client.delete(path28`/conversations/${conversation_id}/items/${itemID}`, { + return this._client.delete(path29`/conversations/${conversation_id}/items/${itemID}`, { ...options4, __security: { bearerAuth: true } }); @@ -292152,7 +292452,7 @@ var Conversations; var init_conversations = __esm(() => { init_items(); init_items(); - init_path2(); + init_path3(); Conversations = class Conversations extends APIResource2 { constructor() { super(...arguments); @@ -292162,20 +292462,20 @@ var init_conversations = __esm(() => { return this._client.post("/conversations", { body: body3, ...options4, __security: { bearerAuth: true } }); } retrieve(conversationID, options4) { - return this._client.get(path28`/conversations/${conversationID}`, { + return this._client.get(path29`/conversations/${conversationID}`, { ...options4, __security: { bearerAuth: true } }); } update(conversationID, body3, options4) { - return this._client.post(path28`/conversations/${conversationID}`, { + return this._client.post(path29`/conversations/${conversationID}`, { body: body3, ...options4, __security: { bearerAuth: true } }); } delete(conversationID, options4) { - return this._client.delete(path28`/conversations/${conversationID}`, { + return this._client.delete(path29`/conversations/${conversationID}`, { ...options4, __security: { bearerAuth: true } }); @@ -292224,18 +292524,18 @@ var init_embeddings = __esm(() => { var OutputItems; var init_output_items = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); OutputItems = class OutputItems extends APIResource2 { retrieve(outputItemID, params, options4) { const { eval_id, run_id } = params; - return this._client.get(path28`/evals/${eval_id}/runs/${run_id}/output_items/${outputItemID}`, { + return this._client.get(path29`/evals/${eval_id}/runs/${run_id}/output_items/${outputItemID}`, { ...options4, __security: { bearerAuth: true } }); } list(runID, params, options4) { const { eval_id, ...query2 } = params; - return this._client.getAPIList(path28`/evals/${eval_id}/runs/${runID}/output_items`, CursorPage, { query: query2, ...options4, __security: { bearerAuth: true } }); + return this._client.getAPIList(path29`/evals/${eval_id}/runs/${runID}/output_items`, CursorPage, { query: query2, ...options4, __security: { bearerAuth: true } }); } }; }); @@ -292246,14 +292546,14 @@ var init_runs2 = __esm(() => { init_output_items(); init_output_items(); init_pagination2(); - init_path2(); + init_path3(); Runs2 = class Runs2 extends APIResource2 { constructor() { super(...arguments); this.outputItems = new OutputItems(this._client); } create(evalID, body3, options4) { - return this._client.post(path28`/evals/${evalID}/runs`, { + return this._client.post(path29`/evals/${evalID}/runs`, { body: body3, ...options4, __security: { bearerAuth: true } @@ -292261,13 +292561,13 @@ var init_runs2 = __esm(() => { } retrieve(runID, params, options4) { const { eval_id } = params; - return this._client.get(path28`/evals/${eval_id}/runs/${runID}`, { + return this._client.get(path29`/evals/${eval_id}/runs/${runID}`, { ...options4, __security: { bearerAuth: true } }); } list(evalID, query2 = {}, options4) { - return this._client.getAPIList(path28`/evals/${evalID}/runs`, CursorPage, { + return this._client.getAPIList(path29`/evals/${evalID}/runs`, CursorPage, { query: query2, ...options4, __security: { bearerAuth: true } @@ -292275,14 +292575,14 @@ var init_runs2 = __esm(() => { } delete(runID, params, options4) { const { eval_id } = params; - return this._client.delete(path28`/evals/${eval_id}/runs/${runID}`, { + return this._client.delete(path29`/evals/${eval_id}/runs/${runID}`, { ...options4, __security: { bearerAuth: true } }); } cancel(runID, params, options4) { const { eval_id } = params; - return this._client.post(path28`/evals/${eval_id}/runs/${runID}`, { + return this._client.post(path29`/evals/${eval_id}/runs/${runID}`, { ...options4, __security: { bearerAuth: true } }); @@ -292297,7 +292597,7 @@ var init_evals = __esm(() => { init_runs2(); init_runs2(); init_pagination2(); - init_path2(); + init_path3(); Evals = class Evals extends APIResource2 { constructor() { super(...arguments); @@ -292307,10 +292607,10 @@ var init_evals = __esm(() => { return this._client.post("/evals", { body: body3, ...options4, __security: { bearerAuth: true } }); } retrieve(evalID, options4) { - return this._client.get(path28`/evals/${evalID}`, { ...options4, __security: { bearerAuth: true } }); + return this._client.get(path29`/evals/${evalID}`, { ...options4, __security: { bearerAuth: true } }); } update(evalID, body3, options4) { - return this._client.post(path28`/evals/${evalID}`, { body: body3, ...options4, __security: { bearerAuth: true } }); + return this._client.post(path29`/evals/${evalID}`, { body: body3, ...options4, __security: { bearerAuth: true } }); } list(query2 = {}, options4) { return this._client.getAPIList("/evals", CursorPage, { @@ -292320,7 +292620,7 @@ var init_evals = __esm(() => { }); } delete(evalID, options4) { - return this._client.delete(path28`/evals/${evalID}`, { ...options4, __security: { bearerAuth: true } }); + return this._client.delete(path29`/evals/${evalID}`, { ...options4, __security: { bearerAuth: true } }); } }; Evals.Runs = Runs2; @@ -292333,13 +292633,13 @@ var init_files3 = __esm(() => { init_headers2(); init_error7(); init_uploads3(); - init_path2(); + init_path3(); Files3 = class Files3 extends APIResource2 { create(body3, options4) { return this._client.post("/files", multipartFormRequestOptions2({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); } retrieve(fileID, options4) { - return this._client.get(path28`/files/${fileID}`, { ...options4, __security: { bearerAuth: true } }); + return this._client.get(path29`/files/${fileID}`, { ...options4, __security: { bearerAuth: true } }); } list(query2 = {}, options4) { return this._client.getAPIList("/files", CursorPage, { @@ -292349,10 +292649,10 @@ var init_files3 = __esm(() => { }); } delete(fileID, options4) { - return this._client.delete(path28`/files/${fileID}`, { ...options4, __security: { bearerAuth: true } }); + return this._client.delete(path29`/files/${fileID}`, { ...options4, __security: { bearerAuth: true } }); } content(fileID, options4) { - return this._client.get(path28`/files/${fileID}/content`, { + return this._client.get(path29`/files/${fileID}/content`, { ...options4, headers: buildHeaders2([{ Accept: "application/binary" }, options4?.headers]), __security: { bearerAuth: true }, @@ -292423,24 +292723,24 @@ var init_alpha = __esm(() => { var Permissions; var init_permissions = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Permissions = class Permissions extends APIResource2 { create(fineTunedModelCheckpoint, body3, options4) { - return this._client.getAPIList(path28`/fine_tuning/checkpoints/${fineTunedModelCheckpoint}/permissions`, Page2, { body: body3, method: "post", ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/fine_tuning/checkpoints/${fineTunedModelCheckpoint}/permissions`, Page2, { body: body3, method: "post", ...options4, __security: { adminAPIKeyAuth: true } }); } retrieve(fineTunedModelCheckpoint, query2 = {}, options4) { - return this._client.get(path28`/fine_tuning/checkpoints/${fineTunedModelCheckpoint}/permissions`, { + return this._client.get(path29`/fine_tuning/checkpoints/${fineTunedModelCheckpoint}/permissions`, { query: query2, ...options4, __security: { adminAPIKeyAuth: true } }); } list(fineTunedModelCheckpoint, query2 = {}, options4) { - return this._client.getAPIList(path28`/fine_tuning/checkpoints/${fineTunedModelCheckpoint}/permissions`, ConversationCursorPage, { query: query2, ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.getAPIList(path29`/fine_tuning/checkpoints/${fineTunedModelCheckpoint}/permissions`, ConversationCursorPage, { query: query2, ...options4, __security: { adminAPIKeyAuth: true } }); } delete(permissionID, params, options4) { const { fine_tuned_model_checkpoint } = params; - return this._client.delete(path28`/fine_tuning/checkpoints/${fine_tuned_model_checkpoint}/permissions/${permissionID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); + return this._client.delete(path29`/fine_tuning/checkpoints/${fine_tuned_model_checkpoint}/permissions/${permissionID}`, { ...options4, __security: { adminAPIKeyAuth: true } }); } }; }); @@ -292463,10 +292763,10 @@ var init_checkpoints = __esm(() => { var Checkpoints2; var init_checkpoints2 = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Checkpoints2 = class Checkpoints2 extends APIResource2 { list(fineTuningJobID, query2 = {}, options4) { - return this._client.getAPIList(path28`/fine_tuning/jobs/${fineTuningJobID}/checkpoints`, CursorPage, { query: query2, ...options4, __security: { bearerAuth: true } }); + return this._client.getAPIList(path29`/fine_tuning/jobs/${fineTuningJobID}/checkpoints`, CursorPage, { query: query2, ...options4, __security: { bearerAuth: true } }); } }; }); @@ -292477,7 +292777,7 @@ var init_jobs = __esm(() => { init_checkpoints2(); init_checkpoints2(); init_pagination2(); - init_path2(); + init_path3(); Jobs = class Jobs extends APIResource2 { constructor() { super(...arguments); @@ -292487,7 +292787,7 @@ var init_jobs = __esm(() => { return this._client.post("/fine_tuning/jobs", { body: body3, ...options4, __security: { bearerAuth: true } }); } retrieve(fineTuningJobID, options4) { - return this._client.get(path28`/fine_tuning/jobs/${fineTuningJobID}`, { + return this._client.get(path29`/fine_tuning/jobs/${fineTuningJobID}`, { ...options4, __security: { bearerAuth: true } }); @@ -292500,22 +292800,22 @@ var init_jobs = __esm(() => { }); } cancel(fineTuningJobID, options4) { - return this._client.post(path28`/fine_tuning/jobs/${fineTuningJobID}/cancel`, { + return this._client.post(path29`/fine_tuning/jobs/${fineTuningJobID}/cancel`, { ...options4, __security: { bearerAuth: true } }); } listEvents(fineTuningJobID, query2 = {}, options4) { - return this._client.getAPIList(path28`/fine_tuning/jobs/${fineTuningJobID}/events`, CursorPage, { query: query2, ...options4, __security: { bearerAuth: true } }); + return this._client.getAPIList(path29`/fine_tuning/jobs/${fineTuningJobID}/events`, CursorPage, { query: query2, ...options4, __security: { bearerAuth: true } }); } pause(fineTuningJobID, options4) { - return this._client.post(path28`/fine_tuning/jobs/${fineTuningJobID}/pause`, { + return this._client.post(path29`/fine_tuning/jobs/${fineTuningJobID}/pause`, { ...options4, __security: { bearerAuth: true } }); } resume(fineTuningJobID, options4) { - return this._client.post(path28`/fine_tuning/jobs/${fineTuningJobID}/resume`, { + return this._client.post(path29`/fine_tuning/jobs/${fineTuningJobID}/resume`, { ...options4, __security: { bearerAuth: true } }); @@ -292597,16 +292897,16 @@ var init_images = __esm(() => { var Models3; var init_models5 = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); Models3 = class Models3 extends APIResource2 { retrieve(model, options4) { - return this._client.get(path28`/models/${model}`, { ...options4, __security: { bearerAuth: true } }); + return this._client.get(path29`/models/${model}`, { ...options4, __security: { bearerAuth: true } }); } list(options4) { return this._client.getAPIList("/models", Page2, { ...options4, __security: { bearerAuth: true } }); } delete(model, options4) { - return this._client.delete(path28`/models/${model}`, { ...options4, __security: { bearerAuth: true } }); + return this._client.delete(path29`/models/${model}`, { ...options4, __security: { bearerAuth: true } }); } }; }); @@ -292625,10 +292925,10 @@ var init_moderations = __esm(() => { var Calls; var init_calls = __esm(() => { init_headers2(); - init_path2(); + init_path3(); Calls = class Calls extends APIResource2 { accept(callID, body3, options4) { - return this._client.post(path28`/realtime/calls/${callID}/accept`, { + return this._client.post(path29`/realtime/calls/${callID}/accept`, { body: body3, ...options4, headers: buildHeaders2([{ Accept: "*/*" }, options4?.headers]), @@ -292636,14 +292936,14 @@ var init_calls = __esm(() => { }); } hangup(callID, options4) { - return this._client.post(path28`/realtime/calls/${callID}/hangup`, { + return this._client.post(path29`/realtime/calls/${callID}/hangup`, { ...options4, headers: buildHeaders2([{ Accept: "*/*" }, options4?.headers]), __security: { bearerAuth: true } }); } refer(callID, body3, options4) { - return this._client.post(path28`/realtime/calls/${callID}/refer`, { + return this._client.post(path29`/realtime/calls/${callID}/refer`, { body: body3, ...options4, headers: buildHeaders2([{ Accept: "*/*" }, options4?.headers]), @@ -292651,7 +292951,7 @@ var init_calls = __esm(() => { }); } reject(callID, body3 = {}, options4) { - return this._client.post(path28`/realtime/calls/${callID}/reject`, { + return this._client.post(path29`/realtime/calls/${callID}/reject`, { body: body3, ...options4, headers: buildHeaders2([{ Accept: "*/*" }, options4?.headers]), @@ -292824,8 +293124,8 @@ var init_ResponsesParser = __esm(() => { }); // node_modules/gitlab-ai-provider/node_modules/openai/lib/responses/ResponseAccumulator.mjs -function accumulateResponse(event, snapshot4) { - if (!snapshot4) { +function accumulateResponse(event, snapshot3) { + if (!snapshot3) { if (event.type !== "response.created") { throw new OpenAIError(`When snapshot hasn't been set yet, expected 'response.created' event, got ${event.type}`); } @@ -292833,28 +293133,28 @@ function accumulateResponse(event, snapshot4) { } switch (event.type) { case "response.output_item.added": { - snapshot4.output.push(structuredClone(event.item)); + snapshot3.output.push(structuredClone(event.item)); if (event.item.type === "message") { - addOutputText(snapshot4); + addOutputText(snapshot3); } break; } case "response.output_item.done": { - getOutput(snapshot4, event.output_index); - snapshot4.output[event.output_index] = structuredClone(event.item); + getOutput(snapshot3, event.output_index); + snapshot3.output[event.output_index] = structuredClone(event.item); if (event.item.type === "message") { - addOutputText(snapshot4); + addOutputText(snapshot3); } break; } case "response.content_part.added": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); const type3 = output2.type; const part = event.part; if (type3 === "message" && part.type !== "reasoning_text") { output2.content.push(structuredClone(part)); if (part.type === "output_text") { - addOutputText(snapshot4); + addOutputText(snapshot3); } } else if (type3 === "reasoning" && part.type === "reasoning_text") { if (!output2.content) { @@ -292865,13 +293165,13 @@ function accumulateResponse(event, snapshot4) { break; } case "response.content_part.done": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); const part = event.part; if (output2.type === "message" && part.type !== "reasoning_text") { getContent(output2.content, event.content_index); output2.content[event.content_index] = structuredClone(part); if (part.type === "output_text") { - addOutputText(snapshot4); + addOutputText(snapshot3); } } else if (output2.type === "reasoning" && part.type === "reasoning_text") { const content = output2.content; @@ -292884,31 +293184,31 @@ function accumulateResponse(event, snapshot4) { break; } case "response.output_text.delta": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "message") { const content = getContent(output2.content, event.content_index); if (content.type !== "output_text") { throw new OpenAIError(`expected content to be 'output_text', got ${content.type}`); } content.text += event.delta; - snapshot4.output_text += event.delta; + snapshot3.output_text += event.delta; } break; } case "response.output_text.done": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "message") { const content = getContent(output2.content, event.content_index); if (content.type !== "output_text") { throw new OpenAIError(`expected content to be 'output_text', got ${content.type}`); } content.text = event.text; - addOutputText(snapshot4); + addOutputText(snapshot3); } break; } case "response.output_text.annotation.added": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "message") { const content = getContent(output2.content, event.content_index); if (content.type !== "output_text") { @@ -292919,7 +293219,7 @@ function accumulateResponse(event, snapshot4) { break; } case "response.refusal.delta": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "message") { const content = getContent(output2.content, event.content_index); if (content.type !== "refusal") { @@ -292930,7 +293230,7 @@ function accumulateResponse(event, snapshot4) { break; } case "response.refusal.done": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "message") { const content = getContent(output2.content, event.content_index); if (content.type !== "refusal") { @@ -292941,21 +293241,21 @@ function accumulateResponse(event, snapshot4) { break; } case "response.function_call_arguments.delta": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "function_call") { output2.arguments += event.delta; } break; } case "response.function_call_arguments.done": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "function_call") { output2.arguments = event.arguments; } break; } case "response.reasoning_text.delta": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "reasoning") { if (!output2.content) { throw new OpenAIError(`missing content at index ${event.content_index}`); @@ -292969,7 +293269,7 @@ function accumulateResponse(event, snapshot4) { break; } case "response.reasoning_text.done": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "reasoning") { if (!output2.content) { throw new OpenAIError(`missing content at index ${event.content_index}`); @@ -292983,14 +293283,14 @@ function accumulateResponse(event, snapshot4) { break; } case "response.reasoning_summary_part.added": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "reasoning") { output2.summary.push(structuredClone(event.part)); } break; } case "response.reasoning_summary_part.done": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "reasoning") { getContent(output2.summary, event.summary_index); output2.summary[event.summary_index] = structuredClone(event.part); @@ -292998,7 +293298,7 @@ function accumulateResponse(event, snapshot4) { break; } case "response.reasoning_summary_text.delta": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "reasoning") { const part = getContent(output2.summary, event.summary_index); part.text += event.delta; @@ -293006,7 +293306,7 @@ function accumulateResponse(event, snapshot4) { break; } case "response.reasoning_summary_text.done": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "reasoning") { const part = getContent(output2.summary, event.summary_index); part.text = event.text; @@ -293014,147 +293314,147 @@ function accumulateResponse(event, snapshot4) { break; } case "response.custom_tool_call_input.delta": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "custom_tool_call") { output2.input += event.delta; } break; } case "response.custom_tool_call_input.done": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "custom_tool_call") { output2.input = event.input; } break; } case "response.mcp_call_arguments.delta": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "mcp_call") { output2.arguments += event.delta; } break; } case "response.mcp_call_arguments.done": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "mcp_call") { output2.arguments = event.arguments; } break; } case "response.code_interpreter_call_code.delta": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "code_interpreter_call") { output2.code = (output2.code ?? "") + event.delta; } break; } case "response.code_interpreter_call_code.done": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "code_interpreter_call") { output2.code = event.code; } break; } case "response.code_interpreter_call.in_progress": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "code_interpreter_call") { output2.status = "in_progress"; } break; } case "response.code_interpreter_call.interpreting": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "code_interpreter_call") { output2.status = "interpreting"; } break; } case "response.code_interpreter_call.completed": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "code_interpreter_call") { output2.status = "completed"; } break; } case "response.file_search_call.in_progress": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "file_search_call") { output2.status = "in_progress"; } break; } case "response.file_search_call.searching": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "file_search_call") { output2.status = "searching"; } break; } case "response.file_search_call.completed": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "file_search_call") { output2.status = "completed"; } break; } case "response.web_search_call.in_progress": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "web_search_call") { output2.status = "in_progress"; } break; } case "response.web_search_call.searching": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "web_search_call") { output2.status = "searching"; } break; } case "response.web_search_call.completed": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "web_search_call") { output2.status = "completed"; } break; } case "response.image_generation_call.in_progress": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "image_generation_call") { output2.status = "in_progress"; } break; } case "response.image_generation_call.generating": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "image_generation_call") { output2.status = "generating"; } break; } case "response.image_generation_call.completed": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "image_generation_call") { output2.status = "completed"; } break; } case "response.mcp_call.in_progress": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "mcp_call") { output2.status = "in_progress"; } break; } case "response.mcp_call.completed": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "mcp_call") { output2.status = "completed"; } break; } case "response.mcp_call.failed": { - const output2 = getOutput(snapshot4, event.output_index); + const output2 = getOutput(snapshot3, event.output_index); if (output2.type === "mcp_call") { output2.status = "failed"; } @@ -293166,7 +293466,7 @@ function accumulateResponse(event, snapshot4) { case "response.completed": case "response.failed": case "response.incomplete": { - snapshot4 = cloneResponse(event.response); + snapshot3 = cloneResponse(event.response); break; } case "response.audio.delta": @@ -293185,17 +293485,17 @@ function accumulateResponse(event, snapshot4) { assertNever5(event); } } - return snapshot4; + return snapshot3; } function cloneResponse(response) { - const snapshot4 = structuredClone(response); - if (!Object.getOwnPropertyDescriptor(snapshot4, "output_text") || snapshot4.output_text == null) { - addOutputText(snapshot4); + const snapshot3 = structuredClone(response); + if (!Object.getOwnPropertyDescriptor(snapshot3, "output_text") || snapshot3.output_text == null) { + addOutputText(snapshot3); } - return snapshot4; + return snapshot3; } -function getOutput(snapshot4, outputIndex) { - const output2 = snapshot4.output[outputIndex]; +function getOutput(snapshot3, outputIndex) { + const output2 = snapshot3.output[outputIndex]; if (!output2) { throw new OpenAIError(`missing output at index ${outputIndex}`); } @@ -293217,8 +293517,8 @@ var init_ResponseAccumulator = __esm(() => { }); // node_modules/gitlab-ai-provider/node_modules/openai/lib/responses/ResponseStream.mjs -function finalizeResponse(snapshot4, params) { - return maybeParseResponse(snapshot4, params); +function finalizeResponse(snapshot3, params) { + return maybeParseResponse(snapshot3, params); } var _ResponseStream_instances, _ResponseStream_params, _ResponseStream_currentResponseSnapshot, _ResponseStream_finalResponse, _ResponseStream_beginRequest, _ResponseStream_addEvent, _ResponseStream_endRequest, ResponseStream; var init_ResponseStream = __esm(() => { @@ -293340,12 +293640,12 @@ var init_ResponseStream = __esm(() => { if (this.ended) { throw new OpenAIError(`stream has ended, this shouldn't happen`); } - const snapshot4 = __classPrivateFieldGet4(this, _ResponseStream_currentResponseSnapshot, "f"); - if (!snapshot4) { + const snapshot3 = __classPrivateFieldGet4(this, _ResponseStream_currentResponseSnapshot, "f"); + if (!snapshot3) { throw new OpenAIError(`request ended without sending any events`); } __classPrivateFieldSet4(this, _ResponseStream_currentResponseSnapshot, undefined, "f"); - const parsedResponse = finalizeResponse(snapshot4, __classPrivateFieldGet4(this, _ResponseStream_params, "f")); + const parsedResponse = finalizeResponse(snapshot3, __classPrivateFieldGet4(this, _ResponseStream_params, "f")); __classPrivateFieldSet4(this, _ResponseStream_finalResponse, parsedResponse, "f"); return parsedResponse; }, Symbol.asyncIterator)]() { @@ -293412,10 +293712,10 @@ var init_ResponseStream = __esm(() => { var InputItems2; var init_input_items2 = __esm(() => { init_pagination2(); - init_path2(); + init_path3(); InputItems2 = class InputItems2 extends APIResource2 { list(responseID, query2 = {}, options4) { - return this._client.getAPIList(path28`/responses/${responseID}/input_items`, CursorPage, { query: query2, ...options4, __security: { bearerAuth: true } }); + return this._client.getAPIList(path29`/responses/${responseID}/input_items`, CursorPage, { query: query2, ...options4, __security: { bearerAuth: true } }); } }; }); @@ -293444,7 +293744,7 @@ var init_responses2 = __esm(() => { init_input_tokens2(); init_input_tokens2(); init_headers2(); - init_path2(); + init_path3(); Responses2 = class Responses2 extends APIResource2 { constructor() { super(...arguments); @@ -293465,7 +293765,7 @@ var init_responses2 = __esm(() => { }); } retrieve(responseID, query2 = {}, options4) { - return this._client.get(path28`/responses/${responseID}`, { + return this._client.get(path29`/responses/${responseID}`, { query: query2, ...options4, stream: query2?.stream ?? false, @@ -293478,7 +293778,7 @@ var init_responses2 = __esm(() => { }); } delete(responseID, options4) { - return this._client.delete(path28`/responses/${responseID}`, { + return this._client.delete(path29`/responses/${responseID}`, { ...options4, headers: buildHeaders2([{ Accept: "*/*" }, options4?.headers]), __security: { bearerAuth: true } @@ -293491,7 +293791,7 @@ var init_responses2 = __esm(() => { return ResponseStream.createResponse(this._client, body3, options4); } cancel(responseID, options4) { - return this._client.post(path28`/responses/${responseID}/cancel`, { + return this._client.post(path29`/responses/${responseID}/cancel`, { ...options4, __security: { bearerAuth: true } }); @@ -293508,10 +293808,10 @@ var init_responses2 = __esm(() => { var Content2; var init_content2 = __esm(() => { init_headers2(); - init_path2(); + init_path3(); Content2 = class Content2 extends APIResource2 { retrieve(skillID, options4) { - return this._client.get(path28`/skills/${skillID}/content`, { + return this._client.get(path29`/skills/${skillID}/content`, { ...options4, headers: buildHeaders2([{ Accept: "application/binary" }, options4?.headers]), __security: { bearerAuth: true }, @@ -293525,11 +293825,11 @@ var init_content2 = __esm(() => { var Content3; var init_content3 = __esm(() => { init_headers2(); - init_path2(); + init_path3(); Content3 = class Content3 extends APIResource2 { retrieve(version5, params, options4) { const { skill_id } = params; - return this._client.get(path28`/skills/${skill_id}/versions/${version5}/content`, { + return this._client.get(path29`/skills/${skill_id}/versions/${version5}/content`, { ...options4, headers: buildHeaders2([{ Accept: "application/binary" }, options4?.headers]), __security: { bearerAuth: true }, @@ -293546,24 +293846,24 @@ var init_versions3 = __esm(() => { init_content3(); init_pagination2(); init_uploads3(); - init_path2(); + init_path3(); Versions2 = class Versions2 extends APIResource2 { constructor() { super(...arguments); this.content = new Content3(this._client); } create(skillID, body3 = {}, options4) { - return this._client.post(path28`/skills/${skillID}/versions`, maybeMultipartFormRequestOptions({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); + return this._client.post(path29`/skills/${skillID}/versions`, maybeMultipartFormRequestOptions({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); } retrieve(version5, params, options4) { const { skill_id } = params; - return this._client.get(path28`/skills/${skill_id}/versions/${version5}`, { + return this._client.get(path29`/skills/${skill_id}/versions/${version5}`, { ...options4, __security: { bearerAuth: true } }); } list(skillID, query2 = {}, options4) { - return this._client.getAPIList(path28`/skills/${skillID}/versions`, CursorPage, { + return this._client.getAPIList(path29`/skills/${skillID}/versions`, CursorPage, { query: query2, ...options4, __security: { bearerAuth: true } @@ -293571,7 +293871,7 @@ var init_versions3 = __esm(() => { } delete(version5, params, options4) { const { skill_id } = params; - return this._client.delete(path28`/skills/${skill_id}/versions/${version5}`, { + return this._client.delete(path29`/skills/${skill_id}/versions/${version5}`, { ...options4, __security: { bearerAuth: true } }); @@ -293589,7 +293889,7 @@ var init_skills2 = __esm(() => { init_versions3(); init_pagination2(); init_uploads3(); - init_path2(); + init_path3(); Skills3 = class Skills3 extends APIResource2 { constructor() { super(...arguments); @@ -293600,10 +293900,10 @@ var init_skills2 = __esm(() => { return this._client.post("/skills", maybeMultipartFormRequestOptions({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); } retrieve(skillID, options4) { - return this._client.get(path28`/skills/${skillID}`, { ...options4, __security: { bearerAuth: true } }); + return this._client.get(path29`/skills/${skillID}`, { ...options4, __security: { bearerAuth: true } }); } update(skillID, body3, options4) { - return this._client.post(path28`/skills/${skillID}`, { + return this._client.post(path29`/skills/${skillID}`, { body: body3, ...options4, __security: { bearerAuth: true } @@ -293617,7 +293917,7 @@ var init_skills2 = __esm(() => { }); } delete(skillID, options4) { - return this._client.delete(path28`/skills/${skillID}`, { ...options4, __security: { bearerAuth: true } }); + return this._client.delete(path29`/skills/${skillID}`, { ...options4, __security: { bearerAuth: true } }); } }; Skills3.Content = Content2; @@ -293628,10 +293928,10 @@ var init_skills2 = __esm(() => { var Parts; var init_parts = __esm(() => { init_uploads3(); - init_path2(); + init_path3(); Parts = class Parts extends APIResource2 { create(uploadID, body3, options4) { - return this._client.post(path28`/uploads/${uploadID}/parts`, multipartFormRequestOptions2({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); + return this._client.post(path29`/uploads/${uploadID}/parts`, multipartFormRequestOptions2({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); } }; }); @@ -293641,7 +293941,7 @@ var Uploads; var init_uploads5 = __esm(() => { init_parts(); init_parts(); - init_path2(); + init_path3(); Uploads = class Uploads extends APIResource2 { constructor() { super(...arguments); @@ -293651,13 +293951,13 @@ var init_uploads5 = __esm(() => { return this._client.post("/uploads", { body: body3, ...options4, __security: { bearerAuth: true } }); } cancel(uploadID, options4) { - return this._client.post(path28`/uploads/${uploadID}/cancel`, { + return this._client.post(path29`/uploads/${uploadID}/cancel`, { ...options4, __security: { bearerAuth: true } }); } complete(uploadID, body3, options4) { - return this._client.post(path28`/uploads/${uploadID}/complete`, { + return this._client.post(path29`/uploads/${uploadID}/complete`, { body: body3, ...options4, __security: { bearerAuth: true } @@ -293691,10 +293991,10 @@ var FileBatches; var init_file_batches = __esm(() => { init_pagination2(); init_headers2(); - init_path2(); + init_path3(); FileBatches = class FileBatches extends APIResource2 { create(vectorStoreID, body3, options4) { - return this._client.post(path28`/vector_stores/${vectorStoreID}/file_batches`, { + return this._client.post(path29`/vector_stores/${vectorStoreID}/file_batches`, { body: body3, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -293703,7 +294003,7 @@ var init_file_batches = __esm(() => { } retrieve(batchID, params, options4) { const { vector_store_id } = params; - return this._client.get(path28`/vector_stores/${vector_store_id}/file_batches/${batchID}`, { + return this._client.get(path29`/vector_stores/${vector_store_id}/file_batches/${batchID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } @@ -293711,7 +294011,7 @@ var init_file_batches = __esm(() => { } cancel(batchID, params, options4) { const { vector_store_id } = params; - return this._client.post(path28`/vector_stores/${vector_store_id}/file_batches/${batchID}/cancel`, { + return this._client.post(path29`/vector_stores/${vector_store_id}/file_batches/${batchID}/cancel`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } @@ -293723,7 +294023,7 @@ var init_file_batches = __esm(() => { } listFiles(batchID, params, options4) { const { vector_store_id, ...query2 } = params; - return this._client.getAPIList(path28`/vector_stores/${vector_store_id}/file_batches/${batchID}/files`, CursorPage, { + return this._client.getAPIList(path29`/vector_stores/${vector_store_id}/file_batches/${batchID}/files`, CursorPage, { query: query2, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -293796,10 +294096,10 @@ var init_files4 = __esm(() => { init_pagination2(); init_headers2(); init_utils6(); - init_path2(); + init_path3(); Files4 = class Files4 extends APIResource2 { create(vectorStoreID, body3, options4) { - return this._client.post(path28`/vector_stores/${vectorStoreID}/files`, { + return this._client.post(path29`/vector_stores/${vectorStoreID}/files`, { body: body3, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -293808,7 +294108,7 @@ var init_files4 = __esm(() => { } retrieve(fileID, params, options4) { const { vector_store_id } = params; - return this._client.get(path28`/vector_stores/${vector_store_id}/files/${fileID}`, { + return this._client.get(path29`/vector_stores/${vector_store_id}/files/${fileID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } @@ -293816,7 +294116,7 @@ var init_files4 = __esm(() => { } update(fileID, params, options4) { const { vector_store_id, ...body3 } = params; - return this._client.post(path28`/vector_stores/${vector_store_id}/files/${fileID}`, { + return this._client.post(path29`/vector_stores/${vector_store_id}/files/${fileID}`, { body: body3, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -293824,7 +294124,7 @@ var init_files4 = __esm(() => { }); } list(vectorStoreID, query2 = {}, options4) { - return this._client.getAPIList(path28`/vector_stores/${vectorStoreID}/files`, CursorPage, { + return this._client.getAPIList(path29`/vector_stores/${vectorStoreID}/files`, CursorPage, { query: query2, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -293833,7 +294133,7 @@ var init_files4 = __esm(() => { } delete(fileID, params, options4) { const { vector_store_id } = params; - return this._client.delete(path28`/vector_stores/${vector_store_id}/files/${fileID}`, { + return this._client.delete(path29`/vector_stores/${vector_store_id}/files/${fileID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } @@ -293888,7 +294188,7 @@ var init_files4 = __esm(() => { } content(fileID, params, options4) { const { vector_store_id } = params; - return this._client.getAPIList(path28`/vector_stores/${vector_store_id}/files/${fileID}/content`, Page2, { + return this._client.getAPIList(path29`/vector_stores/${vector_store_id}/files/${fileID}/content`, Page2, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } @@ -293906,7 +294206,7 @@ var init_vector_stores = __esm(() => { init_files4(); init_pagination2(); init_headers2(); - init_path2(); + init_path3(); VectorStores = class VectorStores extends APIResource2 { constructor() { super(...arguments); @@ -293922,14 +294222,14 @@ var init_vector_stores = __esm(() => { }); } retrieve(vectorStoreID, options4) { - return this._client.get(path28`/vector_stores/${vectorStoreID}`, { + return this._client.get(path29`/vector_stores/${vectorStoreID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } }); } update(vectorStoreID, body3, options4) { - return this._client.post(path28`/vector_stores/${vectorStoreID}`, { + return this._client.post(path29`/vector_stores/${vectorStoreID}`, { body: body3, ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), @@ -293945,14 +294245,14 @@ var init_vector_stores = __esm(() => { }); } delete(vectorStoreID, options4) { - return this._client.delete(path28`/vector_stores/${vectorStoreID}`, { + return this._client.delete(path29`/vector_stores/${vectorStoreID}`, { ...options4, headers: buildHeaders2([{ "OpenAI-Beta": "assistants=v2" }, options4?.headers]), __security: { bearerAuth: true } }); } search(vectorStoreID, body3, options4) { - return this._client.getAPIList(path28`/vector_stores/${vectorStoreID}/search`, Page2, { + return this._client.getAPIList(path29`/vector_stores/${vectorStoreID}/search`, Page2, { body: body3, method: "post", ...options4, @@ -293971,13 +294271,13 @@ var init_videos = __esm(() => { init_pagination2(); init_headers2(); init_uploads3(); - init_path2(); + init_path3(); Videos = class Videos extends APIResource2 { create(body3, options4) { return this._client.post("/videos", multipartFormRequestOptions2({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); } retrieve(videoID, options4) { - return this._client.get(path28`/videos/${videoID}`, { ...options4, __security: { bearerAuth: true } }); + return this._client.get(path29`/videos/${videoID}`, { ...options4, __security: { bearerAuth: true } }); } list(query2 = {}, options4) { return this._client.getAPIList("/videos", ConversationCursorPage, { @@ -293987,13 +294287,13 @@ var init_videos = __esm(() => { }); } delete(videoID, options4) { - return this._client.delete(path28`/videos/${videoID}`, { ...options4, __security: { bearerAuth: true } }); + return this._client.delete(path29`/videos/${videoID}`, { ...options4, __security: { bearerAuth: true } }); } createCharacter(body3, options4) { return this._client.post("/videos/characters", multipartFormRequestOptions2({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); } downloadContent(videoID, query2 = {}, options4) { - return this._client.get(path28`/videos/${videoID}/content`, { + return this._client.get(path29`/videos/${videoID}/content`, { query: query2, ...options4, headers: buildHeaders2([{ Accept: "application/binary" }, options4?.headers]), @@ -294008,13 +294308,13 @@ var init_videos = __esm(() => { return this._client.post("/videos/extensions", multipartFormRequestOptions2({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); } getCharacter(characterID, options4) { - return this._client.get(path28`/videos/characters/${characterID}`, { + return this._client.get(path29`/videos/characters/${characterID}`, { ...options4, __security: { bearerAuth: true } }); } remix(videoID, body3, options4) { - return this._client.post(path28`/videos/${videoID}/remix`, maybeMultipartFormRequestOptions({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); + return this._client.post(path29`/videos/${videoID}/remix`, maybeMultipartFormRequestOptions({ body: body3, ...options4, __security: { bearerAuth: true } }, this._client)); } }; }); @@ -294355,9 +294655,9 @@ https://help.openai.com/en/articles/5112595-best-practices-for-api-key-safety this.apiKey = token; return true; } - buildURL(path29, query2, defaultBaseURL) { + buildURL(path30, query2, defaultBaseURL) { const baseURL = !__classPrivateFieldGet4(this, _OpenAI_instances, "m", _OpenAI_baseURLOverridden).call(this) && defaultBaseURL || this.baseURL; - const url4 = isAbsoluteURL2(path29) ? new URL(path29) : new URL(baseURL + (baseURL.endsWith("/") && path29.startsWith("/") ? path29.slice(1) : path29)); + const url4 = isAbsoluteURL2(path30) ? new URL(path30) : new URL(baseURL + (baseURL.endsWith("/") && path30.startsWith("/") ? path30.slice(1) : path30)); const defaultQuery = this.defaultQuery(); const pathQuery = Object.fromEntries(url4.searchParams); if (!isEmptyObj2(defaultQuery) || !isEmptyObj2(pathQuery)) { @@ -294377,24 +294677,24 @@ https://help.openai.com/en/articles/5112595-best-practices-for-api-key-safety } } async prepareRequest(request3, { url: url4, options: options4 }) {} - get(path29, opts) { - return this.methodRequest("get", path29, opts); + get(path30, opts) { + return this.methodRequest("get", path30, opts); } - post(path29, opts) { - return this.methodRequest("post", path29, opts); + post(path30, opts) { + return this.methodRequest("post", path30, opts); } - patch(path29, opts) { - return this.methodRequest("patch", path29, opts); + patch(path30, opts) { + return this.methodRequest("patch", path30, opts); } - put(path29, opts) { - return this.methodRequest("put", path29, opts); + put(path30, opts) { + return this.methodRequest("put", path30, opts); } - delete(path29, opts) { - return this.methodRequest("delete", path29, opts); + delete(path30, opts) { + return this.methodRequest("delete", path30, opts); } - methodRequest(method, path29, opts) { + methodRequest(method, path30, opts) { return this.request(Promise.resolve(opts).then((opts2) => { - return { method, path: path29, ...opts2 }; + return { method, path: path30, ...opts2 }; })); } request(options4, remainingRetries = null) { @@ -294519,8 +294819,8 @@ https://help.openai.com/en/articles/5112595-best-practices-for-api-key-safety })); return { response, options: options4, controller, requestLogID, retryOfRequestLogID, startTime }; } - getAPIList(path29, Page3, opts) { - return this.requestAPIList(Page3, opts && "then" in opts ? opts.then((opts2) => ({ method: "get", path: path29, ...opts2 })) : { method: "get", path: path29, ...opts }); + getAPIList(path30, Page3, opts) { + return this.requestAPIList(Page3, opts && "then" in opts ? opts.then((opts2) => ({ method: "get", path: path30, ...opts2 })) : { method: "get", path: path30, ...opts }); } requestAPIList(Page3, options4) { const request3 = this.makeRequest(options4, null, undefined); @@ -294614,8 +294914,8 @@ https://help.openai.com/en/articles/5112595-best-practices-for-api-key-safety } async buildRequest(inputOptions, { retryCount = 0 } = {}) { const options4 = { ...inputOptions }; - const { method, path: path29, query: query2, defaultBaseURL } = options4; - const url4 = this.buildURL(path29, query2, defaultBaseURL); + const { method, path: path30, query: query2, defaultBaseURL } = options4; + const url4 = this.buildURL(path30, query2, defaultBaseURL); if ("timeout" in options4) validatePositiveInteger2("timeout", options4.timeout); options4.timeout = options4.timeout ?? this.timeout; @@ -294848,7 +295148,7 @@ var init_openai = __esm(() => { // node_modules/gitlab-ai-provider/dist/index.mjs import WebSocket from "ws" with { type: "jsx" }; import { spawn as spawn2 } from "child_process"; -import * as path29 from "path"; +import * as path30 from "path"; import * as fs12 from "fs"; import * as path210 from "path"; import * as os9 from "os"; @@ -295577,16 +295877,16 @@ async function buildModels(discovered, project) { } return { models, project }; } -async function discoverWorkflowModels(config5, options4) { - const cache4 = new GitLabModelCache(options4.workingDirectory, config5.instanceUrl); +async function discoverWorkflowModels(config4, options4) { + const cache4 = new GitLabModelCache(options4.workingDirectory, config4.instanceUrl); if (!cache4.isDiscoveryExpired()) { const entry = cache4.load(); return buildModels(entry.discovery, entry.project); } const detector = new GitLabProjectDetector({ - instanceUrl: config5.instanceUrl, - getHeaders: config5.getHeaders, - fetch: config5.fetch + instanceUrl: config4.instanceUrl, + getHeaders: config4.getHeaders, + fetch: config4.fetch }); let project = null; try { @@ -295598,9 +295898,9 @@ async function discoverWorkflowModels(config5, options4) { if (!namespaceId) return { models: [], project }; const discovery = new GitLabModelDiscovery({ - instanceUrl: config5.instanceUrl, - getHeaders: config5.getHeaders, - fetch: config5.fetch + instanceUrl: config4.instanceUrl, + getHeaders: config4.getHeaders, + fetch: config4.fetch }); const discovered = await discovery.discover(`gid://gitlab/Group/${namespaceId}`); cache4.saveDiscovery(discovered, project); @@ -295617,10 +295917,10 @@ var __require2, GitLabError, directAccessTokenSchema, DEFAULT_AI_GATEWAY_URL = " aiGatewayUrl; cachedToken = null; tokenExpiresAt = 0; - constructor(config5) { - this.config = config5; - this.fetchFn = config5.fetch ?? fetch; - this.aiGatewayUrl = config5.aiGatewayUrl || process.env["GITLAB_AI_GATEWAY_URL"] || DEFAULT_AI_GATEWAY_URL; + constructor(config4) { + this.config = config4; + this.fetchFn = config4.fetch ?? fetch; + this.aiGatewayUrl = config4.aiGatewayUrl || process.env["GITLAB_AI_GATEWAY_URL"] || DEFAULT_AI_GATEWAY_URL; } async getDirectAccessToken(forceRefresh = false) { const now4 = Date.now(); @@ -295705,16 +296005,16 @@ var __require2, GitLabError, directAccessTokenSchema, DEFAULT_AI_GATEWAY_URL = " config; directAccessClient; anthropicClient = null; - constructor(modelId, config5) { + constructor(modelId, config4) { this.modelId = modelId; - this.config = config5; + this.config = config4; this.directAccessClient = new GitLabDirectAccessClient({ - instanceUrl: config5.instanceUrl, - getHeaders: config5.getHeaders, - refreshApiKey: config5.refreshApiKey, - fetch: config5.fetch, - featureFlags: config5.featureFlags, - aiGatewayUrl: config5.aiGatewayUrl + instanceUrl: config4.instanceUrl, + getHeaders: config4.getHeaders, + refreshApiKey: config4.refreshApiKey, + fetch: config4.fetch, + featureFlags: config4.featureFlags, + aiGatewayUrl: config4.aiGatewayUrl }); } get provider() { @@ -296218,17 +296518,17 @@ ${message.content}` : message.content; directAccessClient; useResponsesApi; openaiClient = null; - constructor(modelId, config5) { + constructor(modelId, config4) { this.modelId = modelId; - this.config = config5; - this.useResponsesApi = config5.useResponsesApi ?? isResponsesApiModel(modelId); + this.config = config4; + this.useResponsesApi = config4.useResponsesApi ?? isResponsesApiModel(modelId); this.directAccessClient = new GitLabDirectAccessClient({ - instanceUrl: config5.instanceUrl, - getHeaders: config5.getHeaders, - refreshApiKey: config5.refreshApiKey, - fetch: config5.fetch, - featureFlags: config5.featureFlags, - aiGatewayUrl: config5.aiGatewayUrl + instanceUrl: config4.instanceUrl, + getHeaders: config4.getHeaders, + refreshApiKey: config4.refreshApiKey, + fetch: config4.fetch, + featureFlags: config4.featureFlags, + aiGatewayUrl: config4.aiGatewayUrl }); } get provider() { @@ -297224,9 +297524,9 @@ ${message.content}` : message.content; config; fetchFn; tokenCache = /* @__PURE__ */ new Map; - constructor(config5) { - this.config = config5; - this.fetchFn = config5.fetch ?? fetch; + constructor(config4) { + this.config = config4; + this.fetchFn = config4.fetch ?? fetch; } getCacheKey(workflowDefinition, rootNamespaceId) { const base3 = workflowDefinition === "chat" ? CHAT_SHARED_TOKEN_KEY : workflowDefinition; @@ -297404,16 +297704,16 @@ ${message.content}` : message.content; config; fetchFn; cache; - constructor(config5) { + constructor(config4) { this.config = { gitTimeout: 5000, - ...config5 + ...config4 }; - this.fetchFn = config5.fetch ?? fetch; - this.cache = config5.cache ?? new GitLabProjectCache; + this.fetchFn = config4.fetch ?? fetch; + this.cache = config4.cache ?? new GitLabProjectCache; } async detectProject(workingDirectory, remoteName = "origin") { - const cacheKey = path29.resolve(workingDirectory); + const cacheKey = path30.resolve(workingDirectory); const cached6 = this.cache.get(cacheKey); if (cached6) { return cached6; @@ -297554,9 +297854,9 @@ ${message.content}` : message.content; config; fetchFn; cache = /* @__PURE__ */ new Map; - constructor(config5) { - this.config = config5; - this.fetchFn = config5.fetch ?? fetch; + constructor(config4) { + this.config = config4; + this.fetchFn = config4.fetch ?? fetch; } async discover(rootNamespaceId) { const cached6 = this.cache.get(rootNamespaceId); @@ -298077,12 +298377,12 @@ var init_dist33 = __esm(() => { this._toolExecutor = null; } } - constructor(modelId, config5, workflowOptions = {}) { + constructor(modelId, config4, workflowOptions = {}) { this.modelId = modelId; - this.config = config5; + this.config = config4; this.workflowOptions = workflowOptions; const workDir = workflowOptions.workingDirectory ?? process.cwd(); - this.modelCache = new GitLabModelCache(workDir, config5.instanceUrl); + this.modelCache = new GitLabModelCache(workDir, config4.instanceUrl); const cached6 = this.modelCache.load(); if (cached6?.selectedModelRef) { this._selectedModelRef = cached6.selectedModelRef; @@ -298091,21 +298391,21 @@ var init_dist33 = __esm(() => { this._selectedModelName = cached6.selectedModelName; } this.tokenClient = new GitLabWorkflowTokenClient({ - instanceUrl: config5.instanceUrl, - getHeaders: config5.getHeaders, - refreshApiKey: config5.refreshApiKey, - fetch: config5.fetch, - featureFlags: config5.featureFlags + instanceUrl: config4.instanceUrl, + getHeaders: config4.getHeaders, + refreshApiKey: config4.refreshApiKey, + fetch: config4.fetch, + featureFlags: config4.featureFlags }); this.projectDetector = new GitLabProjectDetector({ - instanceUrl: config5.instanceUrl, - getHeaders: config5.getHeaders, - fetch: config5.fetch + instanceUrl: config4.instanceUrl, + getHeaders: config4.getHeaders, + fetch: config4.fetch }); this.modelDiscovery = new GitLabModelDiscovery({ - instanceUrl: config5.instanceUrl, - getHeaders: config5.getHeaders, - fetch: config5.fetch + instanceUrl: config4.instanceUrl, + getHeaders: config4.getHeaders, + fetch: config4.fetch }); } get provider() { @@ -300272,7 +300572,7 @@ var require_checksum = __commonJS((exports) => { } } async digest() { - const state2 = Uint32Array.from(this.state); + const state = Uint32Array.from(this.state); const buf = new DataView(this.writeBuffer.buffer.slice(0)); let bufLen = this.bufferLength; const bits = this.bytesHashed * 8; @@ -300281,7 +300581,7 @@ var require_checksum = __commonJS((exports) => { for (let i6 = bufLen;i6 < 64; ++i6) { buf.setUint8(i6, 0); } - compress2(state2, buf); + compress2(state, buf); bufLen = 0; } for (let i6 = bufLen;i6 < 56; ++i6) { @@ -300289,11 +300589,11 @@ var require_checksum = __commonJS((exports) => { } buf.setUint32(56, bits >>> 0, true); buf.setUint32(60, Math.floor(bits / 2 ** 32), true); - compress2(state2, buf); + compress2(state, buf); const out2 = new Uint8Array(16); const view2 = new DataView(out2.buffer); for (let i6 = 0;i6 < 4; ++i6) { - view2.setUint32(i6 * 4, state2[i6], true); + view2.setUint32(i6 * 4, state[i6], true); } return out2; } @@ -300308,8 +300608,8 @@ var require_checksum = __commonJS((exports) => { var M4 = 4294967295; var S3 = Uint8Array.of(7, 12, 17, 22, 5, 9, 14, 20, 4, 11, 16, 23, 6, 10, 15, 21); var T5 = Array.from({ length: 64 }, (_3, i6) => Math.abs(Math.sin(i6 + 1)) * 2 ** 32 >>> 0); - function compress2(state2, block) { - let a4 = state2[0], b2 = state2[1], c2 = state2[2], d4 = state2[3]; + function compress2(state, block) { + let a4 = state[0], b2 = state[1], c2 = state[2], d4 = state[3]; for (let i6 = 0;i6 < 64; ++i6) { let f4, g2; if (i6 < 16) { @@ -300334,10 +300634,10 @@ var require_checksum = __commonJS((exports) => { b2 = b2 + ((sum9 << s5 | sum9 >>> 32 - s5) >>> 0) & M4; a4 = tmp; } - state2[0] = state2[0] + a4 & M4; - state2[1] = state2[1] + b2 & M4; - state2[2] = state2[2] + c2 & M4; - state2[3] = state2[3] + d4 & M4; + state[0] = state[0] + a4 & M4; + state[1] = state[1] + b2 & M4; + state[2] = state[2] + c2 & M4; + state[3] = state[3] + d4 & M4; } var hasNativeCrypto$1 = (() => { try { @@ -300490,7 +300790,7 @@ var require_checksum = __commonJS((exports) => { this.bytesHashed = 0; } digestSync() { - const state2 = this.state.slice(); + const state = this.state.slice(); const buffer4 = this.buffer.slice(); let bufferLength = this.bufferLength; const bitsHashed = this.bytesHashed * 8; @@ -300500,7 +300800,7 @@ var require_checksum = __commonJS((exports) => { for (let i6 = bufferLength;i6 < BLOCK; ++i6) { bufferView.setUint8(i6, 0); } - this.hashBufferWith(state2, buffer4); + this.hashBufferWith(state, buffer4); bufferLength = 0; } for (let i6 = bufferLength;i6 < BLOCK - 8; ++i6) { @@ -300508,13 +300808,13 @@ var require_checksum = __commonJS((exports) => { } bufferView.setUint32(BLOCK - 8, Math.floor(bitsHashed / 4294967296), false); bufferView.setUint32(BLOCK - 4, bitsHashed, false); - this.hashBufferWith(state2, buffer4); + this.hashBufferWith(state, buffer4); const out2 = new Uint8Array(DIGEST_LENGTH); for (let i6 = 0;i6 < 8; ++i6) { - out2[i6 * 4] = state2[i6] >>> 24 & 255; - out2[i6 * 4 + 1] = state2[i6] >>> 16 & 255; - out2[i6 * 4 + 2] = state2[i6] >>> 8 & 255; - out2[i6 * 4 + 3] = state2[i6] >>> 0 & 255; + out2[i6 * 4] = state[i6] >>> 24 & 255; + out2[i6 * 4 + 1] = state[i6] >>> 16 & 255; + out2[i6 * 4 + 2] = state[i6] >>> 8 & 255; + out2[i6 * 4 + 3] = state[i6] >>> 0 & 255; } return out2; } @@ -300538,9 +300838,9 @@ var require_checksum = __commonJS((exports) => { hashBuffer() { this.hashBufferWith(this.state, this.buffer); } - hashBufferWith(state2, buffer4) { + hashBufferWith(state, buffer4) { const w2 = this.w ??= new Int32Array(64); - let s0 = state2[0], s1 = state2[1], s22 = state2[2], s32 = state2[3], s42 = state2[4], s5 = state2[5], s6 = state2[6], s7 = state2[7]; + let s0 = state[0], s1 = state[1], s22 = state[2], s32 = state[3], s42 = state[4], s5 = state[5], s6 = state[6], s7 = state[7]; for (let i6 = 0;i6 < BLOCK; ++i6) { if (i6 < 16) { w2[i6] = (buffer4[i6 * 4] & 255) << 24 | (buffer4[i6 * 4 + 1] & 255) << 16 | (buffer4[i6 * 4 + 2] & 255) << 8 | buffer4[i6 * 4 + 3] & 255; @@ -300562,14 +300862,14 @@ var require_checksum = __commonJS((exports) => { s1 = s0; s0 = t1 + t2 | 0; } - state2[0] += s0; - state2[1] += s1; - state2[2] += s22; - state2[3] += s32; - state2[4] += s42; - state2[5] += s5; - state2[6] += s6; - state2[7] += s7; + state[0] += s0; + state[1] += s1; + state[2] += s22; + state[3] += s32; + state[4] += s42; + state[5] += s5; + state[6] += s6; + state[7] += s7; } } var INIT = new Int32Array([ @@ -301879,11 +302179,11 @@ var require_protocols = __commonJS((exports) => { const opTraits = translateTraits(operationSchema.traits); if (opTraits.http) { request3.method = opTraits.http[0]; - const [path30, search2] = opTraits.http[1].split("?"); + const [path31, search2] = opTraits.http[1].split("?"); if (request3.path == "/") { - request3.path = path30; + request3.path = path31; } else { - request3.path += path30; + request3.path += path31; } const traitSearchParams = new URLSearchParams(search2 ?? ""); for (const [key, value8] of traitSearchParams) { @@ -302258,8 +302558,8 @@ var require_protocols = __commonJS((exports) => { return this; } p(memberName, labelValueProvider, uriLabel, isGreedyLabel) { - this.resolvePathStack.push((path30) => { - this.path = resolvedPath(path30, this.input, memberName, labelValueProvider, uriLabel, isGreedyLabel); + this.resolvePathStack.push((path31) => { + this.path = resolvedPath(path31, this.input, memberName, labelValueProvider, uriLabel, isGreedyLabel); }); return this; } @@ -303868,11 +304168,11 @@ var require_dist_cjs4 = __commonJS((exports) => { } return map33; } - var httpAuthSchemeMiddleware = (config5, mwOptions) => (next3, context4) => async (args3) => { - const options4 = config5.httpAuthSchemeProvider(await mwOptions.httpAuthSchemeParametersProvider(config5, context4, args3.input)); - const authSchemePreference = config5.authSchemePreference ? await config5.authSchemePreference() : []; + var httpAuthSchemeMiddleware = (config4, mwOptions) => (next3, context4) => async (args3) => { + const options4 = config4.httpAuthSchemeProvider(await mwOptions.httpAuthSchemeParametersProvider(config4, context4, args3.input)); + const authSchemePreference = config4.authSchemePreference ? await config4.authSchemePreference() : []; const resolvedOptions = resolveAuthOptions(options4, authSchemePreference); - const authSchemes = convertHttpAuthSchemesToMap(config5.httpAuthSchemes); + const authSchemes = convertHttpAuthSchemesToMap(config4.httpAuthSchemes); const smithyContext = getSmithyContext(context4); const failureReasons = []; for (const option7 of resolvedOptions) { @@ -303881,12 +304181,12 @@ var require_dist_cjs4 = __commonJS((exports) => { failureReasons.push(`HttpAuthScheme \`${option7.schemeId}\` was not enabled for this service.`); continue; } - const identityProvider = scheme.identityProvider(await mwOptions.identityProviderConfigProvider(config5)); + const identityProvider = scheme.identityProvider(await mwOptions.identityProviderConfigProvider(config4)); if (!identityProvider) { failureReasons.push(`HttpAuthScheme \`${option7.schemeId}\` did not have an IdentityProvider configured.`); continue; } - const { identityProperties = {}, signingProperties = {} } = option7.propertiesExtractor?.(config5, context4) || {}; + const { identityProperties = {}, signingProperties = {} } = option7.propertiesExtractor?.(config4, context4) || {}; option7.identityProperties = Object.assign(option7.identityProperties || {}, identityProperties); option7.signingProperties = Object.assign(option7.signingProperties || {}, signingProperties); smithyContext.selectedHttpAuthScheme = { @@ -303910,9 +304210,9 @@ var require_dist_cjs4 = __commonJS((exports) => { relation: "before", toMiddleware: "endpointV2Middleware" }; - var getHttpAuthSchemeEndpointRuleSetPlugin = (config5, { httpAuthSchemeParametersProvider, identityProviderConfigProvider }) => ({ + var getHttpAuthSchemeEndpointRuleSetPlugin = (config4, { httpAuthSchemeParametersProvider, identityProviderConfigProvider }) => ({ applyToStack: (clientStack) => { - clientStack.addRelativeTo(httpAuthSchemeMiddleware(config5, { + clientStack.addRelativeTo(httpAuthSchemeMiddleware(config4, { httpAuthSchemeParametersProvider, identityProviderConfigProvider }), httpAuthSchemeEndpointRuleSetMiddlewareOptions); @@ -303926,9 +304226,9 @@ var require_dist_cjs4 = __commonJS((exports) => { relation: "before", toMiddleware: "serializerMiddleware" }; - var getHttpAuthSchemePlugin = (config5, { httpAuthSchemeParametersProvider, identityProviderConfigProvider }) => ({ + var getHttpAuthSchemePlugin = (config4, { httpAuthSchemeParametersProvider, identityProviderConfigProvider }) => ({ applyToStack: (clientStack) => { - clientStack.addRelativeTo(httpAuthSchemeMiddleware(config5, { + clientStack.addRelativeTo(httpAuthSchemeMiddleware(config4, { httpAuthSchemeParametersProvider, identityProviderConfigProvider }), httpAuthSchemeMiddlewareOptions); @@ -303938,7 +304238,7 @@ var require_dist_cjs4 = __commonJS((exports) => { throw error49; }; var defaultSuccessHandler = (httpResponse, signingProperties) => {}; - var httpSigningMiddleware = (config5) => (next3, context4) => async (args3) => { + var httpSigningMiddleware = (config4) => (next3, context4) => async (args3) => { if (!HttpRequest.isInstance(args3.request)) { return next3(args3); } @@ -303964,7 +304264,7 @@ var require_dist_cjs4 = __commonJS((exports) => { relation: "after", toMiddleware: "retryMiddleware" }; - var getHttpSigningPlugin = (config5) => ({ + var getHttpSigningPlugin = (config4) => ({ applyToStack: (clientStack) => { clientStack.addRelativeTo(httpSigningMiddleware(), httpSigningMiddlewareOptions); } @@ -303981,32 +304281,32 @@ var require_dist_cjs4 = __commonJS((exports) => { return await client3.send(command2, ...args3); }; function createPaginator(ClientCtor, CommandCtor, inputTokenName, outputTokenName, pageSizeTokenName) { - return async function* paginateOperation(config5, input, ...additionalArguments) { + return async function* paginateOperation(config4, input, ...additionalArguments) { const _input = input; - let token = config5.startingToken ?? _input[inputTokenName]; + let token = config4.startingToken ?? _input[inputTokenName]; let hasNext = true; let page; while (hasNext) { _input[inputTokenName] = token; if (pageSizeTokenName) { - _input[pageSizeTokenName] = _input[pageSizeTokenName] ?? config5.pageSize; + _input[pageSizeTokenName] = _input[pageSizeTokenName] ?? config4.pageSize; } - if (config5.client instanceof ClientCtor) { - page = await makePagedClientRequest(CommandCtor, config5.client, input, config5.withCommand, ...additionalArguments); + if (config4.client instanceof ClientCtor) { + page = await makePagedClientRequest(CommandCtor, config4.client, input, config4.withCommand, ...additionalArguments); } else { throw new Error(`Invalid client, expected instance of ${ClientCtor.name}`); } yield page; const prevToken = token; token = get34(page, outputTokenName); - hasNext = !!(token && (!config5.stopOnSameToken || token !== prevToken)); + hasNext = !!(token && (!config4.stopOnSameToken || token !== prevToken)); } return; }; } - var get34 = (fromObject2, path30) => { + var get34 = (fromObject2, path31) => { let cursor = fromObject2; - const pathComponents = path30.split("."); + const pathComponents = path31.split("."); for (const step of pathComponents) { if (!cursor || typeof cursor !== "object") { return; @@ -304028,9 +304328,9 @@ var require_dist_cjs4 = __commonJS((exports) => { class DefaultIdentityProviderConfig { authSchemes = new Map; - constructor(config5) { - for (const key in config5) { - const value8 = config5[key]; + constructor(config4) { + for (const key in config4) { + const value8 = config4[key]; if (value8 !== undefined) { this.authSchemes.set(key, value8); } @@ -305566,19 +305866,19 @@ var require_client6 = __commonJS((exports) => { exports.REGION_ENV_NAME = REGION_ENV_NAME2; exports.REGION_INI_NAME = REGION_INI_NAME2; exports.resolveRegionConfig = resolveRegionConfig2; - var state2 = { + var state = { warningEmitted: false }; var emitWarningIfUnsupportedVersion = (version5) => { - if (version5 && !state2.warningEmitted) { + if (version5 && !state.warningEmitted) { if (process.env.AWS_SDK_JS_NODE_VERSION_SUPPORT_WARNING_DISABLED === "true") { - state2.warningEmitted = true; + state.warningEmitted = true; return; } const userMajorVersion = parseInt(version5.substring(1, version5.indexOf("."))); const vv = 22; if (userMajorVersion < vv) { - state2.warningEmitted = true; + state.warningEmitted = true; process.emitWarning(`NodeVersionSupportWarning: The AWS SDK for JavaScript (v3) versions published after the first week of January 2027 will require node >=${vv}. You are running node ${version5}. @@ -306111,13 +306411,13 @@ More information can be found at: https://a.co/c895JFp`); }; var getUserAgentPrefix = () => selectedUserAgentPrefix; var ACCOUNT_ID_ENDPOINT_REGEX = /\d{12}\.ddb/; - async function checkFeatures(context4, config5, args3) { + async function checkFeatures(context4, config4, args3) { const request3 = args3.request; if (request3?.headers?.["smithy-protocol"] === "rpc-v2-cbor") { setFeature(context4, "PROTOCOL_RPC_V2_CBOR", "M"); } - if (typeof config5.retryStrategy === "function") { - const retryStrategy = await config5.retryStrategy(); + if (typeof config4.retryStrategy === "function") { + const retryStrategy = await config4.retryStrategy(); if (typeof retryStrategy.mode === "string") { switch (retryStrategy.mode) { case RETRY_MODES2.ADAPTIVE: @@ -306129,12 +306429,12 @@ More information can be found at: https://a.co/c895JFp`); } } } - if (typeof config5.accountIdEndpointMode === "function") { + if (typeof config4.accountIdEndpointMode === "function") { const endpointV2 = context4.endpointV2; if (String(endpointV2?.url?.hostname).match(ACCOUNT_ID_ENDPOINT_REGEX)) { setFeature(context4, "ACCOUNT_ID_ENDPOINT", "O"); } - switch (await config5.accountIdEndpointMode?.()) { + switch (await config4.accountIdEndpointMode?.()) { case "disabled": setFeature(context4, "ACCOUNT_ID_MODE_DISABLED", "Q"); break; @@ -306243,9 +306543,9 @@ More information can be found at: https://a.co/c895JFp`); tags: ["SET_USER_AGENT", "USER_AGENT"], override: true }; - var getUserAgentPlugin = (config5) => ({ + var getUserAgentPlugin = (config4) => ({ applyToStack: (clientStack) => { - clientStack.add(userAgentMiddleware(config5), getUserAgentMiddlewareOptions); + clientStack.add(userAgentMiddleware(config4), getUserAgentMiddlewareOptions); } }); var getRuntimeUserAgentPair = () => { @@ -306268,7 +306568,7 @@ More information can be found at: https://a.co/c895JFp`); }; var createDefaultUserAgentProvider = ({ serviceId, clientVersion }) => { const runtimeUserAgentPair = getRuntimeUserAgentPair(); - return async (config5) => { + return async (config4) => { const sections = [ ["aws-sdk-js", clientVersion], ["ua", "2.1"], @@ -306286,7 +306586,7 @@ More information can be found at: https://a.co/c895JFp`); if (env5.AWS_EXECUTION_ENV) { sections.push([`exec-env/${env5.AWS_EXECUTION_ENV}`]); } - const appId = await config5?.userAgentAppId?.(); + const appId = await config4?.userAgentAppId?.(); const resolvedUserAgent = appId ? [...sections, [`app/${appId}`]] : [...sections]; return resolvedUserAgent; }; @@ -306300,7 +306600,7 @@ More information can be found at: https://a.co/c895JFp`); configFileSelector: (profile) => profile[UA_APP_ID_INI_NAME] ?? profile[UA_APP_ID_INI_NAME_DEPRECATED], default: DEFAULT_UA_APP_ID }; - var createUserAgentStringParsingProvider = ({ serviceId, clientVersion }) => async (config5) => { + var createUserAgentStringParsingProvider = ({ serviceId, clientVersion }) => async (config4) => { const module3 = require_es5(); const parse12 = module3.parse ?? module3.default.parse ?? (() => ""); const parsedUA = typeof window !== "undefined" && window?.navigator?.userAgent ? parse12(window.navigator.userAgent) : undefined; @@ -306314,7 +306614,7 @@ More information can be found at: https://a.co/c895JFp`); if (serviceId) { sections.push([`api/${serviceId}`, clientVersion]); } - const appId = await config5?.userAgentAppId?.(); + const appId = await config4?.userAgentAppId?.(); if (appId) { sections.push([`app/${appId}`]); } @@ -306476,7 +306776,7 @@ More information can be found at: https://a.co/c895JFp`); exports.setFeature = setFeature; exports.setPartitionInfo = setPartitionInfo; exports.setTokenFeature = setTokenFeature; - exports.state = state2; + exports.state = state; exports.stsRegionDefaultResolver = stsRegionDefaultResolver; exports.stsRegionWarning = warning; exports.toEndpointV1 = toEndpointV1; @@ -307231,7 +307531,7 @@ or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler conf if (!this.config) { this.config = await this.configProvider; } - const config5 = this.config; + const config4 = this.config; const isSSL = request3.protocol === "https:"; if (!isSSL && !this.config.httpAgent) { this.config.httpAgent = await this.config.httpAgentProvider(); @@ -307267,7 +307567,7 @@ or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler conf } const headers = request3.headers; const expectContinue = headers ? (headers.Expect ?? headers.expect) === "100-continue" : false; - let agent = isSSL ? config5.httpsAgent : config5.httpAgent; + let agent = isSSL ? config4.httpsAgent : config4.httpAgent; if (expectContinue && !this.externalAgent) { agent = new (isSSL ? node_https.Agent : hAgent)({ keepAlive: false, @@ -307275,8 +307575,8 @@ or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler conf }); } socketWarningTimeoutId = timing.setTimeout(() => { - this.socketWarningTimestamp = NodeHttpHandler.checkSocketUsage(agent, this.socketWarningTimestamp, config5.logger); - }, config5.socketAcquisitionWarningTimeout ?? (config5.requestTimeout ?? 2000) + (config5.connectionTimeout ?? 1000)); + this.socketWarningTimestamp = NodeHttpHandler.checkSocketUsage(agent, this.socketWarningTimestamp, config4.logger); + }, config4.socketAcquisitionWarningTimeout ?? (config4.requestTimeout ?? 2000) + (config4.connectionTimeout ?? 1000)); const queryString = request3.query ? buildQueryString(request3.query) : ""; let auth = undefined; if (request3.username != null || request3.password != null) { @@ -307284,12 +307584,12 @@ or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler conf const password = request3.password ?? ""; auth = `${username}:${password}`; } - let path30 = request3.path; + let path31 = request3.path; if (queryString) { - path30 += `?${queryString}`; + path31 += `?${queryString}`; } if (request3.fragment) { - path30 += `#${request3.fragment}`; + path31 += `#${request3.fragment}`; } let hostname4 = request3.hostname ?? ""; if (hostname4[0] === "[" && hostname4.endsWith("]")) { @@ -307301,7 +307601,7 @@ or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler conf headers: request3.headers, host: hostname4, method: request3.method, - path: path30, + path: path31, port: request3.port, agent, auth @@ -307337,10 +307637,10 @@ or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler conf abortSignal.onabort = onAbort; } } - const effectiveRequestTimeout = requestTimeout ?? config5.requestTimeout; - connectionTimeoutId = setConnectionTimeout(req, reject, config5.connectionTimeout); - requestTimeoutId = setRequestTimeout(req, reject, effectiveRequestTimeout, config5.throwOnRequestTimeout, config5.logger ?? console); - socketTimeoutId = setSocketTimeout(req, reject, config5.socketTimeout); + const effectiveRequestTimeout = requestTimeout ?? config4.requestTimeout; + connectionTimeoutId = setConnectionTimeout(req, reject, config4.connectionTimeout); + requestTimeoutId = setRequestTimeout(req, reject, effectiveRequestTimeout, config4.throwOnRequestTimeout, config4.logger ?? console); + socketTimeoutId = setSocketTimeout(req, reject, config4.socketTimeout); const httpAgent = nodeHttpsOptions.agent; if (typeof httpAgent === "object" && "keepAlive" in httpAgent) { keepAliveTimeoutId = setSocketKeepAlive(req, { @@ -307356,9 +307656,9 @@ or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler conf } updateHttpClientConfig(key, value8) { this.config = undefined; - this.configProvider = this.configProvider.then((config5) => { + this.configProvider = this.configProvider.then((config4) => { return { - ...config5, + ...config4, [key]: value8 }; }); @@ -307500,8 +307800,8 @@ or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler conf config; connectOptions; connectionPools = new Map; - constructor(config5) { - this.config = config5; + constructor(config4) { + this.config = config4; if (this.config.maxConcurrency && this.config.maxConcurrency <= 0) { throw new RangeError("maxConcurrency must be greater than zero."); } @@ -307708,16 +308008,16 @@ or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler conf reject(err2); }; const queryString = query2 ? buildQueryString(query2) : ""; - let path30 = request3.path; + let path31 = request3.path; if (queryString) { - path30 += `?${queryString}`; + path31 += `?${queryString}`; } if (request3.fragment) { - path30 += `#${request3.fragment}`; + path31 += `#${request3.fragment}`; } const clientHttp2Stream = session.request({ ...request3.headers, - [constants2.HTTP2_HEADER_PATH]: path30, + [constants2.HTTP2_HEADER_PATH]: path31, [constants2.HTTP2_HEADER_METHOD]: method }); if (effectiveRequestTimeout) { @@ -307776,9 +308076,9 @@ or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler conf } updateHttpClientConfig(key, value8) { this.config = undefined; - this.configProvider = this.configProvider.then((config5) => { + this.configProvider = this.configProvider.then((config4) => { return { - ...config5, + ...config4, [key]: value8 }; }); @@ -308236,10 +308536,10 @@ ${longDate} ${credentialScope} ${toHex2(hashedRequest)}`; } - getCanonicalPath({ path: path30 }) { + getCanonicalPath({ path: path31 }) { if (this.uriEscapePath) { const normalizedPathSegments = []; - for (const pathSegment of path30.split("/")) { + for (const pathSegment of path31.split("/")) { if (pathSegment?.length === 0) continue; if (pathSegment === ".") @@ -308250,11 +308550,11 @@ ${toHex2(hashedRequest)}`; normalizedPathSegments.push(pathSegment); } } - const normalizedPath = `${path30?.startsWith("/") ? "/" : ""}${normalizedPathSegments.join("/")}${normalizedPathSegments.length > 0 && path30?.endsWith("/") ? "/" : ""}`; + const normalizedPath = `${path31?.startsWith("/") ? "/" : ""}${normalizedPathSegments.join("/")}${normalizedPathSegments.length > 0 && path31?.endsWith("/") ? "/" : ""}`; const doubleEncoded = escapeUri(normalizedPath); return doubleEncoded.replace(/%2F/g, "/"); } - return path30; + return path31; } validateResolvedCredentials(credentials) { if (typeof credentials !== "object" || typeof credentials.accessKeyId !== "string" || typeof credentials.secretAccessKey !== "string") { @@ -308565,15 +308865,15 @@ var require_httpAuthSchemes = __commonJS((exports) => { }; var validateSigningProperties = async (signingProperties) => { const context4 = throwSigningPropertyError("context", signingProperties.context); - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const authScheme = context4.endpointV2?.properties?.authSchemes?.[0]; - const signerFunction = throwSigningPropertyError("signer", config5.signer); + const signerFunction = throwSigningPropertyError("signer", config4.signer); const signer = await signerFunction(authScheme); const signingRegion = signingProperties?.signingRegion; const signingRegionSet = signingProperties?.signingRegionSet; const signingName = signingProperties?.signingName; return { - config: config5, + config: config4, signer, signingRegion, signingRegionSet, @@ -308587,7 +308887,7 @@ var require_httpAuthSchemes = __commonJS((exports) => { throw new Error("The request is not an instance of `HttpRequest` and cannot be signed"); } const validatedProps = await validateSigningProperties(signingProperties); - const { config: config5, signer } = validatedProps; + const { config: config4, signer } = validatedProps; let { signingRegion, signingName } = validatedProps; const handlerExecutionContext = signingProperties.context; if (handlerExecutionContext?.authSchemes?.length ?? 0 > 1) { @@ -308597,14 +308897,14 @@ var require_httpAuthSchemes = __commonJS((exports) => { signingName = second?.signingName ?? signingName; } } - const noSkewCorrection = await config5.disableClockSkewCorrection?.() === true; + const noSkewCorrection = await config4.disableClockSkewCorrection?.() === true; signingProperties._disableClockSkewCorrection = noSkewCorrection; if (!noSkewCorrection) { - signingProperties._preRequestSystemClockOffset = config5.systemClockOffset; + signingProperties._preRequestSystemClockOffset = config4.systemClockOffset; signingProperties._requestSentAt = Date.now(); } const signedRequest = await signer.sign(httpRequest2, { - signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config5.systemClockOffset), + signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config4.systemClockOffset), signingRegion, signingService: signingName }); @@ -308616,12 +308916,12 @@ var require_httpAuthSchemes = __commonJS((exports) => { if (!signingProperties._disableClockSkewCorrection) { const serverTime = errorException.ServerTime ?? getDateHeader(errorException.$response); if (serverTime) { - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const preRequestOffset = signingProperties._preRequestSystemClockOffset; const timeRequestSent = signingProperties._requestSentAt; const ageHeader = getAgeHeader(errorException.$response); - const newOffset = getUpdatedSystemClockOffset(serverTime, config5.systemClockOffset, timeRequestSent, ageHeader); - config5.systemClockOffset = newOffset; + const newOffset = getUpdatedSystemClockOffset(serverTime, config4.systemClockOffset, timeRequestSent, ageHeader); + config4.systemClockOffset = newOffset; const skewExceedsThreshold = Math.abs(newOffset) >= 240000; const isLocalCorrection = newOffset !== preRequestOffset; const isConcurrentCorrection = preRequestOffset !== undefined && preRequestOffset !== newOffset; @@ -308639,10 +308939,10 @@ var require_httpAuthSchemes = __commonJS((exports) => { } const dateHeader = getDateHeader(httpResponse); if (dateHeader) { - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const timeRequestSent = signingProperties._requestSentAt; const ageHeader = getAgeHeader(httpResponse); - config5.systemClockOffset = getUpdatedSystemClockOffset(dateHeader, config5.systemClockOffset, timeRequestSent, ageHeader); + config4.systemClockOffset = getUpdatedSystemClockOffset(dateHeader, config4.systemClockOffset, timeRequestSent, ageHeader); } } } @@ -308653,17 +308953,17 @@ var require_httpAuthSchemes = __commonJS((exports) => { if (!HttpRequest4.isInstance(httpRequest2)) { throw new Error("The request is not an instance of `HttpRequest` and cannot be signed"); } - const { config: config5, signer, signingRegion, signingRegionSet, signingName } = await validateSigningProperties(signingProperties); - const configResolvedSigningRegionSet = await config5.sigv4aSigningRegionSet?.(); + const { config: config4, signer, signingRegion, signingRegionSet, signingName } = await validateSigningProperties(signingProperties); + const configResolvedSigningRegionSet = await config4.sigv4aSigningRegionSet?.(); const multiRegionOverride = (configResolvedSigningRegionSet ?? signingRegionSet ?? [signingRegion]).join(","); - const noSkewCorrection = await config5.disableClockSkewCorrection?.() === true; + const noSkewCorrection = await config4.disableClockSkewCorrection?.() === true; signingProperties._disableClockSkewCorrection = noSkewCorrection; if (!noSkewCorrection) { - signingProperties._preRequestSystemClockOffset = config5.systemClockOffset; + signingProperties._preRequestSystemClockOffset = config4.systemClockOffset; signingProperties._requestSentAt = Date.now(); } const signedRequest = await signer.sign(httpRequest2, { - signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config5.systemClockOffset), + signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config4.systemClockOffset), signingRegion: multiRegionOverride, signingService: signingName }); @@ -308692,9 +308992,9 @@ var require_httpAuthSchemes = __commonJS((exports) => { }, default: [] }; - var resolveAwsSdkSigV4AConfig = (config5) => { - config5.sigv4aSigningRegionSet = normalizeProvider3(config5.sigv4aSigningRegionSet); - return config5; + var resolveAwsSdkSigV4AConfig = (config4) => { + config4.sigv4aSigningRegionSet = normalizeProvider3(config4.sigv4aSigningRegionSet); + return config4; }; var NODE_SIGV4A_CONFIG_OPTIONS = { environmentVariableSelector(env6) { @@ -308715,21 +309015,21 @@ var require_httpAuthSchemes = __commonJS((exports) => { }, default: undefined }; - var bindResolveAwsSdkSigV4Config = (defaultDisableClockSkewCorrection) => (config5) => { - let inputCredentials = config5.credentials; - let isUserSupplied = !!config5.credentials; + var bindResolveAwsSdkSigV4Config = (defaultDisableClockSkewCorrection) => (config4) => { + let inputCredentials = config4.credentials; + let isUserSupplied = !!config4.credentials; let resolvedCredentials = undefined; - Object.defineProperty(config5, "credentials", { + Object.defineProperty(config4, "credentials", { set(credentials) { if (credentials && credentials !== inputCredentials && credentials !== resolvedCredentials) { isUserSupplied = true; } inputCredentials = credentials; - const memoizedProvider = normalizeCredentialProvider(config5, { + const memoizedProvider = normalizeCredentialProvider(config4, { credentials: inputCredentials, - credentialDefaultProvider: config5.credentialDefaultProvider + credentialDefaultProvider: config4.credentialDefaultProvider }); - const boundProvider = bindCallerConfig(config5, memoizedProvider); + const boundProvider = bindCallerConfig(config4, memoizedProvider); if (isUserSupplied && !boundProvider.attributed) { const isCredentialObject = typeof inputCredentials === "object" && inputCredentials !== null; resolvedCredentials = async (options4) => { @@ -308753,66 +309053,66 @@ var require_httpAuthSchemes = __commonJS((exports) => { enumerable: true, configurable: true }); - config5.credentials = inputCredentials; - const { signingEscapePath = true, systemClockOffset = config5.systemClockOffset || 0, sha256: sha2562 } = config5; + config4.credentials = inputCredentials; + const { signingEscapePath = true, systemClockOffset = config4.systemClockOffset || 0, sha256: sha2562 } = config4; let signer; - if (config5.signer) { - signer = normalizeProvider3(config5.signer); - } else if (config5.regionInfoProvider) { - signer = () => normalizeProvider3(config5.region)().then(async (region) => [ - await config5.regionInfoProvider(region, { - useFipsEndpoint: await config5.useFipsEndpoint(), - useDualstackEndpoint: await config5.useDualstackEndpoint() + if (config4.signer) { + signer = normalizeProvider3(config4.signer); + } else if (config4.regionInfoProvider) { + signer = () => normalizeProvider3(config4.region)().then(async (region) => [ + await config4.regionInfoProvider(region, { + useFipsEndpoint: await config4.useFipsEndpoint(), + useDualstackEndpoint: await config4.useDualstackEndpoint() }) || {}, region ]).then(([regionInfo, region]) => { const { signingRegion, signingService } = regionInfo; - config5.signingRegion = config5.signingRegion || signingRegion || region; - config5.signingName = config5.signingName || signingService || config5.serviceId; + config4.signingRegion = config4.signingRegion || signingRegion || region; + config4.signingName = config4.signingName || signingService || config4.serviceId; const params = { - ...config5, - credentials: config5.credentials, - region: config5.signingRegion, - service: config5.signingName, + ...config4, + credentials: config4.credentials, + region: config4.signingRegion, + service: config4.signingName, sha256: sha2562, uriEscapePath: signingEscapePath }; - const SignerCtor = config5.signerConstructor || SignatureV4; + const SignerCtor = config4.signerConstructor || SignatureV4; return new SignerCtor(params); }); } else { signer = async (authScheme) => { authScheme = Object.assign({}, { name: "sigv4", - signingName: config5.signingName || config5.defaultSigningName, - signingRegion: await normalizeProvider3(config5.region)(), + signingName: config4.signingName || config4.defaultSigningName, + signingRegion: await normalizeProvider3(config4.region)(), properties: {} }, authScheme); const signingRegion = authScheme.signingRegion; const signingService = authScheme.signingName; - config5.signingRegion = config5.signingRegion || signingRegion; - config5.signingName = config5.signingName || signingService || config5.serviceId; + config4.signingRegion = config4.signingRegion || signingRegion; + config4.signingName = config4.signingName || signingService || config4.serviceId; const params = { - ...config5, - credentials: config5.credentials, - region: config5.signingRegion, - service: config5.signingName, + ...config4, + credentials: config4.credentials, + region: config4.signingRegion, + service: config4.signingName, sha256: sha2562, uriEscapePath: signingEscapePath }; - const SignerCtor = config5.signerConstructor || SignatureV4; + const SignerCtor = config4.signerConstructor || SignatureV4; return new SignerCtor(params); }; } - const resolvedConfig = Object.assign(config5, { + const resolvedConfig = Object.assign(config4, { systemClockOffset, signingEscapePath, signer, - disableClockSkewCorrection: normalizeProvider3(config5.disableClockSkewCorrection ?? defaultDisableClockSkewCorrection) + disableClockSkewCorrection: normalizeProvider3(config4.disableClockSkewCorrection ?? defaultDisableClockSkewCorrection) }); return resolvedConfig; }; - function normalizeCredentialProvider(config5, { credentials, credentialDefaultProvider }) { + function normalizeCredentialProvider(config4, { credentials, credentialDefaultProvider }) { let credentialsProvider; if (credentials) { if (!credentials?.memoized) { @@ -308822,8 +309122,8 @@ var require_httpAuthSchemes = __commonJS((exports) => { } } else { if (credentialDefaultProvider) { - credentialsProvider = normalizeProvider3(credentialDefaultProvider(Object.assign({}, config5, { - parentClientConfig: config5 + credentialsProvider = normalizeProvider3(credentialDefaultProvider(Object.assign({}, config4, { + parentClientConfig: config4 }))); } else { credentialsProvider = async () => { @@ -308834,11 +309134,11 @@ var require_httpAuthSchemes = __commonJS((exports) => { credentialsProvider.memoized = true; return credentialsProvider; } - function bindCallerConfig(config5, credentialsProvider) { + function bindCallerConfig(config4, credentialsProvider) { if (credentialsProvider.configBound) { return credentialsProvider; } - const fn3 = async (options4) => credentialsProvider({ ...options4, callerClientConfig: config5 }); + const fn3 = async (options4) => credentialsProvider({ ...options4, callerClientConfig: config4 }); fn3.memoized = credentialsProvider.memoized; fn3.configBound = true; return fn3; @@ -309852,7 +310152,7 @@ var require_cbor = __commonJS((exports) => { throw new Error("Malformed RPCv2 CBOR response, status: " + response.statusCode); } }; - var buildHttpRpcRequest = async (context4, headers, path30, resolvedHostname, body3) => { + var buildHttpRpcRequest = async (context4, headers, path31, resolvedHostname, body3) => { const endpoint = await context4.endpoint(); const { hostname: hostname4, protocol = "https", port: port2, path: basePath } = endpoint; const contents = { @@ -309860,7 +310160,7 @@ var require_cbor = __commonJS((exports) => { hostname: hostname4, port: port2, method: "POST", - path: basePath.endsWith("/") ? basePath.slice(0, -1) + path30 : basePath + path30, + path: basePath.endsWith("/") ? basePath.slice(0, -1) + path31 : basePath + path31, headers: { ...headers } @@ -310465,7 +310765,7 @@ var require_cbor = __commonJS((exports) => { } } var USE_BUFFER = typeof Buffer !== "undefined"; - var textDecoder3 = new TextDecoder; + var textDecoder2 = new TextDecoder; var payload = new Uint8Array(0); var isBuffer = false; var dataView = new DataView(new ArrayBuffer(0)); @@ -310653,7 +310953,7 @@ var require_cbor = __commonJS((exports) => { if (USE_BUFFER) { return Buffer.from(combined.buffer, combined.byteOffset, combined.byteLength).toString("utf-8"); } - return textDecoder3.decode(combined); + return textDecoder2.decode(combined); } const bytes = readByteString(); chunks2.push(bytes); @@ -310863,7 +311163,7 @@ var require_cbor = __commonJS((exports) => { if (isBuffer) { return payload.toString("utf-8", start2, start2 + length3); } - return textDecoder3.decode(payload.subarray(start2, start2 + length3)); + return textDecoder2.decode(payload.subarray(start2, start2 + length3)); } function decodeUtf8Cached(at3, length3) { let h3 = length3; @@ -310885,7 +311185,7 @@ var require_cbor = __commonJS((exports) => { return cached6; } } - const result6 = isBuffer ? payload.toString("utf-8", at3, at3 + length3) : textDecoder3.decode(payload.subarray(at3, at3 + length3)); + const result6 = isBuffer ? payload.toString("utf-8", at3, at3 + length3) : textDecoder2.decode(payload.subarray(at3, at3 + length3)); if (stringCacheEpochs[slot] !== cacheEpoch) { stringCache[slot] = result6; stringCacheEpochs[slot] = cacheEpoch; @@ -311096,11 +311396,11 @@ var require_cbor = __commonJS((exports) => { } catch (ignored) {} } const { service: service3, operation } = getSmithyContext(context4); - const path30 = `/service/${service3}/operation/${operation}`; + const path31 = `/service/${service3}/operation/${operation}`; if (request3.path.endsWith("/")) { - request3.path += path30.slice(1); + request3.path += path31.slice(1); } else { - request3.path += path30; + request3.path += path31; } return request3; } @@ -311493,8 +311793,8 @@ var require_dist_cjs8 = __commonJS((exports) => { Object.defineProperty(obj, "__proto__", { value: undefined, writable: true, enumerable: true, configurable: true }); } function parseXML(xml2) { - const state2 = new AwsXmlParser(xml2); - return state2.parse(); + const state = new AwsXmlParser(xml2); + return state.parse(); } class AwsXmlParser { @@ -314765,22 +315065,22 @@ var require_sts = __commonJS((exports) => { })); }; customEndpointFunctions3.aws = awsEndpointFunctions3; - var createEndpointRuleSetHttpAuthSchemeParametersProvider = (defaultHttpAuthSchemeParametersProvider) => async (config5, context4, input) => { + var createEndpointRuleSetHttpAuthSchemeParametersProvider = (defaultHttpAuthSchemeParametersProvider) => async (config4, context4, input) => { if (!input) { throw new Error("Could not find `input` for `defaultEndpointRuleSetHttpAuthSchemeParametersProvider`"); } - const defaultParameters = await defaultHttpAuthSchemeParametersProvider(config5, context4, input); + const defaultParameters = await defaultHttpAuthSchemeParametersProvider(config4, context4, input); const instructionsFn = getSmithyContext(context4)?.commandInstance?.constructor?.getEndpointParameterInstructions; if (!instructionsFn) { throw new Error(`getEndpointParameterInstructions() is not defined on '${context4.commandName}'`); } - const endpointParameters = await resolveParams(input, { getEndpointParameterInstructions: instructionsFn }, config5); + const endpointParameters = await resolveParams(input, { getEndpointParameterInstructions: instructionsFn }, config4); return Object.assign(defaultParameters, endpointParameters); }; - var _defaultSTSHttpAuthSchemeParametersProvider = async (config5, context4, input) => { + var _defaultSTSHttpAuthSchemeParametersProvider = async (config4, context4, input) => { return { operation: getSmithyContext(context4).operation, - region: await normalizeProvider3(config5.region)() || (() => { + region: await normalizeProvider3(config4.region)() || (() => { throw new Error("expected `region` to be configured for `aws.auth#sigv4`"); })() }; @@ -314793,9 +315093,9 @@ var require_sts = __commonJS((exports) => { name: "sts", region: authParameters.region }, - propertiesExtractor: (config5, context4) => ({ + propertiesExtractor: (config4, context4) => ({ signingProperties: { - config: config5, + config: config4, context: context4 } }) @@ -314808,9 +315108,9 @@ var require_sts = __commonJS((exports) => { name: "sts", region: authParameters.region }, - propertiesExtractor: (config5, context4) => ({ + propertiesExtractor: (config4, context4) => ({ signingProperties: { - config: config5, + config: config4, context: context4 } }) @@ -314883,11 +315183,11 @@ var require_sts = __commonJS((exports) => { "aws.auth#sigv4a": createAwsAuthSigv4aHttpAuthOption, "smithy.api#noAuth": createSmithyApiNoAuthHttpAuthOption }); - var resolveHttpAuthSchemeConfig = (config5) => { - const config_0 = resolveAwsSdkSigV4Config(config5); + var resolveHttpAuthSchemeConfig = (config4) => { + const config_0 = resolveAwsSdkSigV4Config(config4); const config_1 = resolveAwsSdkSigV4AConfig(config_0); return Object.assign(config_1, { - authSchemePreference: normalizeProvider3(config5.authSchemePreference ?? []) + authSchemePreference: normalizeProvider3(config4.authSchemePreference ?? []) }); }; var resolveClientEndpointParameters = (options4) => { @@ -315254,16 +315554,16 @@ var require_sts = __commonJS((exports) => { () => AssumeRoleWithWebIdentityRequest$, () => AssumeRoleWithWebIdentityResponse$ ]; - var getRuntimeConfig$1 = (config5) => { + var getRuntimeConfig$1 = (config4) => { return { apiVersion: "2011-06-15", - base64Decoder: config5?.base64Decoder ?? fromBase64, - base64Encoder: config5?.base64Encoder ?? toBase64, - disableHostPrefix: config5?.disableHostPrefix ?? false, - endpointProvider: config5?.endpointProvider ?? defaultEndpointResolver, - extensions: config5?.extensions ?? [], - httpAuthSchemeProvider: config5?.httpAuthSchemeProvider ?? defaultSTSHttpAuthSchemeProvider, - httpAuthSchemes: config5?.httpAuthSchemes ?? [ + base64Decoder: config4?.base64Decoder ?? fromBase64, + base64Encoder: config4?.base64Encoder ?? toBase64, + disableHostPrefix: config4?.disableHostPrefix ?? false, + endpointProvider: config4?.endpointProvider ?? defaultEndpointResolver, + extensions: config4?.extensions ?? [], + httpAuthSchemeProvider: config4?.httpAuthSchemeProvider ?? defaultSTSHttpAuthSchemeProvider, + httpAuthSchemes: config4?.httpAuthSchemes ?? [ { schemeId: "aws.auth#sigv4", identityProvider: (ipc) => ipc.getIdentityProvider("aws.auth#sigv4"), @@ -315280,45 +315580,45 @@ var require_sts = __commonJS((exports) => { signer: new NoAuthSigner } ], - logger: config5?.logger ?? new NoOpLogger, - protocol: config5?.protocol ?? AwsQueryProtocol, - protocolSettings: config5?.protocolSettings ?? { + logger: config4?.logger ?? new NoOpLogger, + protocol: config4?.protocol ?? AwsQueryProtocol, + protocolSettings: config4?.protocolSettings ?? { defaultNamespace: "com.amazonaws.sts", errorTypeRegistries, xmlNamespace: "https://sts.amazonaws.com/doc/2011-06-15/", version: "2011-06-15", serviceTarget: "AWSSecurityTokenServiceV20110615" }, - serviceId: config5?.serviceId ?? "STS", - sha256: config5?.sha256 ?? Sha256, - signerConstructor: config5?.signerConstructor ?? SignatureV4MultiRegion, - urlParser: config5?.urlParser ?? parseUrl4, - utf8Decoder: config5?.utf8Decoder ?? fromUtf85, - utf8Encoder: config5?.utf8Encoder ?? toUtf83 + serviceId: config4?.serviceId ?? "STS", + sha256: config4?.sha256 ?? Sha256, + signerConstructor: config4?.signerConstructor ?? SignatureV4MultiRegion, + urlParser: config4?.urlParser ?? parseUrl4, + utf8Decoder: config4?.utf8Decoder ?? fromUtf85, + utf8Encoder: config4?.utf8Encoder ?? toUtf83 }; }; - var getRuntimeConfig = (config5) => { + var getRuntimeConfig = (config4) => { emitWarningIfUnsupportedVersion(process.version); - const defaultsMode = resolveDefaultsModeConfig(config5); + const defaultsMode = resolveDefaultsModeConfig(config4); const defaultConfigProvider = () => defaultsMode().then(loadConfigsForDefaultMode); - const clientSharedValues = getRuntimeConfig$1(config5); + const clientSharedValues = getRuntimeConfig$1(config4); emitWarningIfUnsupportedVersion$1(process.version); const loaderConfig = { - profile: config5?.profile, + profile: config4?.profile, logger: clientSharedValues.logger }; return { ...clientSharedValues, - ...config5, + ...config4, runtime: "node", defaultsMode, - authSchemePreference: config5?.authSchemePreference ?? loadConfig5(NODE_AUTH_SCHEME_PREFERENCE_OPTIONS, loaderConfig), - bodyLengthChecker: config5?.bodyLengthChecker ?? calculateBodyLength, - defaultUserAgentProvider: config5?.defaultUserAgentProvider ?? createDefaultUserAgentProvider({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo.version }), - httpAuthSchemes: config5?.httpAuthSchemes ?? [ + authSchemePreference: config4?.authSchemePreference ?? loadConfig5(NODE_AUTH_SCHEME_PREFERENCE_OPTIONS, loaderConfig), + bodyLengthChecker: config4?.bodyLengthChecker ?? calculateBodyLength, + defaultUserAgentProvider: config4?.defaultUserAgentProvider ?? createDefaultUserAgentProvider({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo.version }), + httpAuthSchemes: config4?.httpAuthSchemes ?? [ { schemeId: "aws.auth#sigv4", - identityProvider: (ipc) => ipc.getIdentityProvider("aws.auth#sigv4") || (async (idProps) => await config5.credentialDefaultProvider(idProps?.__config || {})()), + identityProvider: (ipc) => ipc.getIdentityProvider("aws.auth#sigv4") || (async (idProps) => await config4.credentialDefaultProvider(idProps?.__config || {})()), signer: new AwsSdkSigV4Signer }, { @@ -315332,18 +315632,18 @@ var require_sts = __commonJS((exports) => { signer: new NoAuthSigner } ], - maxAttempts: config5?.maxAttempts ?? loadConfig5(NODE_MAX_ATTEMPT_CONFIG_OPTIONS, config5), - region: config5?.region ?? loadConfig5(NODE_REGION_CONFIG_OPTIONS3, { ...NODE_REGION_CONFIG_FILE_OPTIONS3, ...loaderConfig }), - requestHandler: NodeHttpHandler2.create(config5?.requestHandler ?? defaultConfigProvider), - retryMode: config5?.retryMode ?? loadConfig5({ + maxAttempts: config4?.maxAttempts ?? loadConfig5(NODE_MAX_ATTEMPT_CONFIG_OPTIONS, config4), + region: config4?.region ?? loadConfig5(NODE_REGION_CONFIG_OPTIONS3, { ...NODE_REGION_CONFIG_FILE_OPTIONS3, ...loaderConfig }), + requestHandler: NodeHttpHandler2.create(config4?.requestHandler ?? defaultConfigProvider), + retryMode: config4?.retryMode ?? loadConfig5({ ...NODE_RETRY_MODE_CONFIG_OPTIONS, default: async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE - }, config5), - sigv4aSigningRegionSet: config5?.sigv4aSigningRegionSet ?? loadConfig5(NODE_SIGV4A_CONFIG_OPTIONS, loaderConfig), - streamCollector: config5?.streamCollector ?? streamCollector, - useDualstackEndpoint: config5?.useDualstackEndpoint ?? loadConfig5(NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, loaderConfig), - useFipsEndpoint: config5?.useFipsEndpoint ?? loadConfig5(NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, loaderConfig), - userAgentAppId: config5?.userAgentAppId ?? loadConfig5(NODE_APP_ID_CONFIG_OPTIONS, loaderConfig) + }, config4), + sigv4aSigningRegionSet: config4?.sigv4aSigningRegionSet ?? loadConfig5(NODE_SIGV4A_CONFIG_OPTIONS, loaderConfig), + streamCollector: config4?.streamCollector ?? streamCollector, + useDualstackEndpoint: config4?.useDualstackEndpoint ?? loadConfig5(NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, loaderConfig), + useFipsEndpoint: config4?.useFipsEndpoint ?? loadConfig5(NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, loaderConfig), + userAgentAppId: config4?.userAgentAppId ?? loadConfig5(NODE_APP_ID_CONFIG_OPTIONS, loaderConfig) }; }; var getHttpAuthExtensionConfiguration = (runtimeConfig) => { @@ -315376,11 +315676,11 @@ var require_sts = __commonJS((exports) => { } }; }; - var resolveHttpAuthRuntimeConfig = (config5) => { + var resolveHttpAuthRuntimeConfig = (config4) => { return { - httpAuthSchemes: config5.httpAuthSchemes(), - httpAuthSchemeProvider: config5.httpAuthSchemeProvider(), - credentials: config5.credentials() + httpAuthSchemes: config4.httpAuthSchemes(), + httpAuthSchemeProvider: config4.httpAuthSchemeProvider(), + credentials: config4.credentials() }; }; var resolveRuntimeExtensions = (runtimeConfig, extensions) => { @@ -315413,9 +315713,9 @@ var require_sts = __commonJS((exports) => { this.middlewareStack.use(getRecursionDetectionPlugin(this.config)); this.middlewareStack.use(getHttpAuthSchemeEndpointRuleSetPlugin(this.config, { httpAuthSchemeParametersProvider: defaultSTSHttpAuthSchemeParametersProvider, - identityProviderConfigProvider: async (config5) => new DefaultIdentityProviderConfig({ - "aws.auth#sigv4": config5.credentials, - "aws.auth#sigv4a": config5.credentials + identityProviderConfigProvider: async (config4) => new DefaultIdentityProviderConfig({ + "aws.auth#sigv4": config4.credentials, + "aws.auth#sigv4a": config4.credentials }) })); this.middlewareStack.use(getHttpSigningPlugin(this.config)); @@ -315426,7 +315726,7 @@ var require_sts = __commonJS((exports) => { } var command2 = makeBuilder(commonParams, "AWSSecurityTokenServiceV20110615", "STSClient", getEndpointPlugin); var _ep0 = {}; - var _mw0 = (Command3, cs2, config5, o4) => []; + var _mw0 = (Command3, cs2, config4, o4) => []; class AssumeRoleCommand extends command2(_ep0, _mw0, "AssumeRole", AssumeRole$) { } @@ -315544,8 +315844,8 @@ var require_sts = __commonJS((exports) => { return baseCtor; else return class CustomizableSTSClient extends baseCtor { - constructor(config5) { - super(config5); + constructor(config4) { + super(config4); for (const customization of customizations) { this.middlewareStack.use(customization); } @@ -315813,19 +316113,19 @@ var require_client7 = __commonJS((exports) => { exports.REGION_ENV_NAME = REGION_ENV_NAME3; exports.REGION_INI_NAME = REGION_INI_NAME3; exports.resolveRegionConfig = resolveRegionConfig3; - var state2 = { + var state = { warningEmitted: false }; var emitWarningIfUnsupportedVersion = (version5) => { - if (version5 && !state2.warningEmitted) { + if (version5 && !state.warningEmitted) { if (process.env.AWS_SDK_JS_NODE_VERSION_SUPPORT_WARNING_DISABLED === "true") { - state2.warningEmitted = true; + state.warningEmitted = true; return; } const userMajorVersion = parseInt(version5.substring(1, version5.indexOf("."))); const vv = 22; if (userMajorVersion < vv) { - state2.warningEmitted = true; + state.warningEmitted = true; process.emitWarning(`NodeVersionSupportWarning: The AWS SDK for JavaScript (v3) versions published after the first week of January 2027 will require node >=${vv}. You are running node ${version5}. @@ -316358,13 +316658,13 @@ More information can be found at: https://a.co/c895JFp`); }; var getUserAgentPrefix = () => selectedUserAgentPrefix; var ACCOUNT_ID_ENDPOINT_REGEX = /\d{12}\.ddb/; - async function checkFeatures(context4, config5, args3) { + async function checkFeatures(context4, config4, args3) { const request3 = args3.request; if (request3?.headers?.["smithy-protocol"] === "rpc-v2-cbor") { setFeature(context4, "PROTOCOL_RPC_V2_CBOR", "M"); } - if (typeof config5.retryStrategy === "function") { - const retryStrategy = await config5.retryStrategy(); + if (typeof config4.retryStrategy === "function") { + const retryStrategy = await config4.retryStrategy(); if (typeof retryStrategy.mode === "string") { switch (retryStrategy.mode) { case RETRY_MODES3.ADAPTIVE: @@ -316376,12 +316676,12 @@ More information can be found at: https://a.co/c895JFp`); } } } - if (typeof config5.accountIdEndpointMode === "function") { + if (typeof config4.accountIdEndpointMode === "function") { const endpointV2 = context4.endpointV2; if (String(endpointV2?.url?.hostname).match(ACCOUNT_ID_ENDPOINT_REGEX)) { setFeature(context4, "ACCOUNT_ID_ENDPOINT", "O"); } - switch (await config5.accountIdEndpointMode?.()) { + switch (await config4.accountIdEndpointMode?.()) { case "disabled": setFeature(context4, "ACCOUNT_ID_MODE_DISABLED", "Q"); break; @@ -316490,9 +316790,9 @@ More information can be found at: https://a.co/c895JFp`); tags: ["SET_USER_AGENT", "USER_AGENT"], override: true }; - var getUserAgentPlugin = (config5) => ({ + var getUserAgentPlugin = (config4) => ({ applyToStack: (clientStack) => { - clientStack.add(userAgentMiddleware(config5), getUserAgentMiddlewareOptions); + clientStack.add(userAgentMiddleware(config4), getUserAgentMiddlewareOptions); } }); var getRuntimeUserAgentPair = () => { @@ -316515,7 +316815,7 @@ More information can be found at: https://a.co/c895JFp`); }; var createDefaultUserAgentProvider = ({ serviceId, clientVersion }) => { const runtimeUserAgentPair = getRuntimeUserAgentPair(); - return async (config5) => { + return async (config4) => { const sections = [ ["aws-sdk-js", clientVersion], ["ua", "2.1"], @@ -316533,7 +316833,7 @@ More information can be found at: https://a.co/c895JFp`); if (env6.AWS_EXECUTION_ENV) { sections.push([`exec-env/${env6.AWS_EXECUTION_ENV}`]); } - const appId = await config5?.userAgentAppId?.(); + const appId = await config4?.userAgentAppId?.(); const resolvedUserAgent = appId ? [...sections, [`app/${appId}`]] : [...sections]; return resolvedUserAgent; }; @@ -316547,7 +316847,7 @@ More information can be found at: https://a.co/c895JFp`); configFileSelector: (profile) => profile[UA_APP_ID_INI_NAME] ?? profile[UA_APP_ID_INI_NAME_DEPRECATED], default: DEFAULT_UA_APP_ID }; - var createUserAgentStringParsingProvider = ({ serviceId, clientVersion }) => async (config5) => { + var createUserAgentStringParsingProvider = ({ serviceId, clientVersion }) => async (config4) => { const module3 = require_es5(); const parse12 = module3.parse ?? module3.default.parse ?? (() => ""); const parsedUA = typeof window !== "undefined" && window?.navigator?.userAgent ? parse12(window.navigator.userAgent) : undefined; @@ -316561,7 +316861,7 @@ More information can be found at: https://a.co/c895JFp`); if (serviceId) { sections.push([`api/${serviceId}`, clientVersion]); } - const appId = await config5?.userAgentAppId?.(); + const appId = await config4?.userAgentAppId?.(); if (appId) { sections.push([`app/${appId}`]); } @@ -316723,7 +317023,7 @@ More information can be found at: https://a.co/c895JFp`); exports.setFeature = setFeature; exports.setPartitionInfo = setPartitionInfo; exports.setTokenFeature = setTokenFeature; - exports.state = state2; + exports.state = state; exports.stsRegionDefaultResolver = stsRegionDefaultResolver; exports.stsRegionWarning = warning; exports.toEndpointV1 = toEndpointV1; @@ -316761,15 +317061,15 @@ var require_httpAuthSchemes2 = __commonJS((exports) => { }; var validateSigningProperties = async (signingProperties) => { const context4 = throwSigningPropertyError("context", signingProperties.context); - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const authScheme = context4.endpointV2?.properties?.authSchemes?.[0]; - const signerFunction = throwSigningPropertyError("signer", config5.signer); + const signerFunction = throwSigningPropertyError("signer", config4.signer); const signer = await signerFunction(authScheme); const signingRegion = signingProperties?.signingRegion; const signingRegionSet = signingProperties?.signingRegionSet; const signingName = signingProperties?.signingName; return { - config: config5, + config: config4, signer, signingRegion, signingRegionSet, @@ -316783,7 +317083,7 @@ var require_httpAuthSchemes2 = __commonJS((exports) => { throw new Error("The request is not an instance of `HttpRequest` and cannot be signed"); } const validatedProps = await validateSigningProperties(signingProperties); - const { config: config5, signer } = validatedProps; + const { config: config4, signer } = validatedProps; let { signingRegion, signingName } = validatedProps; const handlerExecutionContext = signingProperties.context; if (handlerExecutionContext?.authSchemes?.length ?? 0 > 1) { @@ -316793,14 +317093,14 @@ var require_httpAuthSchemes2 = __commonJS((exports) => { signingName = second?.signingName ?? signingName; } } - const noSkewCorrection = await config5.disableClockSkewCorrection?.() === true; + const noSkewCorrection = await config4.disableClockSkewCorrection?.() === true; signingProperties._disableClockSkewCorrection = noSkewCorrection; if (!noSkewCorrection) { - signingProperties._preRequestSystemClockOffset = config5.systemClockOffset; + signingProperties._preRequestSystemClockOffset = config4.systemClockOffset; signingProperties._requestSentAt = Date.now(); } const signedRequest = await signer.sign(httpRequest2, { - signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config5.systemClockOffset), + signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config4.systemClockOffset), signingRegion, signingService: signingName }); @@ -316812,12 +317112,12 @@ var require_httpAuthSchemes2 = __commonJS((exports) => { if (!signingProperties._disableClockSkewCorrection) { const serverTime = errorException.ServerTime ?? getDateHeader(errorException.$response); if (serverTime) { - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const preRequestOffset = signingProperties._preRequestSystemClockOffset; const timeRequestSent = signingProperties._requestSentAt; const ageHeader = getAgeHeader(errorException.$response); - const newOffset = getUpdatedSystemClockOffset(serverTime, config5.systemClockOffset, timeRequestSent, ageHeader); - config5.systemClockOffset = newOffset; + const newOffset = getUpdatedSystemClockOffset(serverTime, config4.systemClockOffset, timeRequestSent, ageHeader); + config4.systemClockOffset = newOffset; const skewExceedsThreshold = Math.abs(newOffset) >= 240000; const isLocalCorrection = newOffset !== preRequestOffset; const isConcurrentCorrection = preRequestOffset !== undefined && preRequestOffset !== newOffset; @@ -316835,10 +317135,10 @@ var require_httpAuthSchemes2 = __commonJS((exports) => { } const dateHeader = getDateHeader(httpResponse); if (dateHeader) { - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const timeRequestSent = signingProperties._requestSentAt; const ageHeader = getAgeHeader(httpResponse); - config5.systemClockOffset = getUpdatedSystemClockOffset(dateHeader, config5.systemClockOffset, timeRequestSent, ageHeader); + config4.systemClockOffset = getUpdatedSystemClockOffset(dateHeader, config4.systemClockOffset, timeRequestSent, ageHeader); } } } @@ -316849,17 +317149,17 @@ var require_httpAuthSchemes2 = __commonJS((exports) => { if (!HttpRequest4.isInstance(httpRequest2)) { throw new Error("The request is not an instance of `HttpRequest` and cannot be signed"); } - const { config: config5, signer, signingRegion, signingRegionSet, signingName } = await validateSigningProperties(signingProperties); - const configResolvedSigningRegionSet = await config5.sigv4aSigningRegionSet?.(); + const { config: config4, signer, signingRegion, signingRegionSet, signingName } = await validateSigningProperties(signingProperties); + const configResolvedSigningRegionSet = await config4.sigv4aSigningRegionSet?.(); const multiRegionOverride = (configResolvedSigningRegionSet ?? signingRegionSet ?? [signingRegion]).join(","); - const noSkewCorrection = await config5.disableClockSkewCorrection?.() === true; + const noSkewCorrection = await config4.disableClockSkewCorrection?.() === true; signingProperties._disableClockSkewCorrection = noSkewCorrection; if (!noSkewCorrection) { - signingProperties._preRequestSystemClockOffset = config5.systemClockOffset; + signingProperties._preRequestSystemClockOffset = config4.systemClockOffset; signingProperties._requestSentAt = Date.now(); } const signedRequest = await signer.sign(httpRequest2, { - signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config5.systemClockOffset), + signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config4.systemClockOffset), signingRegion: multiRegionOverride, signingService: signingName }); @@ -316888,9 +317188,9 @@ var require_httpAuthSchemes2 = __commonJS((exports) => { }, default: [] }; - var resolveAwsSdkSigV4AConfig = (config5) => { - config5.sigv4aSigningRegionSet = normalizeProvider3(config5.sigv4aSigningRegionSet); - return config5; + var resolveAwsSdkSigV4AConfig = (config4) => { + config4.sigv4aSigningRegionSet = normalizeProvider3(config4.sigv4aSigningRegionSet); + return config4; }; var NODE_SIGV4A_CONFIG_OPTIONS = { environmentVariableSelector(env6) { @@ -316911,21 +317211,21 @@ var require_httpAuthSchemes2 = __commonJS((exports) => { }, default: undefined }; - var bindResolveAwsSdkSigV4Config = (defaultDisableClockSkewCorrection) => (config5) => { - let inputCredentials = config5.credentials; - let isUserSupplied = !!config5.credentials; + var bindResolveAwsSdkSigV4Config = (defaultDisableClockSkewCorrection) => (config4) => { + let inputCredentials = config4.credentials; + let isUserSupplied = !!config4.credentials; let resolvedCredentials = undefined; - Object.defineProperty(config5, "credentials", { + Object.defineProperty(config4, "credentials", { set(credentials) { if (credentials && credentials !== inputCredentials && credentials !== resolvedCredentials) { isUserSupplied = true; } inputCredentials = credentials; - const memoizedProvider = normalizeCredentialProvider(config5, { + const memoizedProvider = normalizeCredentialProvider(config4, { credentials: inputCredentials, - credentialDefaultProvider: config5.credentialDefaultProvider + credentialDefaultProvider: config4.credentialDefaultProvider }); - const boundProvider = bindCallerConfig(config5, memoizedProvider); + const boundProvider = bindCallerConfig(config4, memoizedProvider); if (isUserSupplied && !boundProvider.attributed) { const isCredentialObject = typeof inputCredentials === "object" && inputCredentials !== null; resolvedCredentials = async (options4) => { @@ -316949,66 +317249,66 @@ var require_httpAuthSchemes2 = __commonJS((exports) => { enumerable: true, configurable: true }); - config5.credentials = inputCredentials; - const { signingEscapePath = true, systemClockOffset = config5.systemClockOffset || 0, sha256: sha2562 } = config5; + config4.credentials = inputCredentials; + const { signingEscapePath = true, systemClockOffset = config4.systemClockOffset || 0, sha256: sha2562 } = config4; let signer; - if (config5.signer) { - signer = normalizeProvider3(config5.signer); - } else if (config5.regionInfoProvider) { - signer = () => normalizeProvider3(config5.region)().then(async (region) => [ - await config5.regionInfoProvider(region, { - useFipsEndpoint: await config5.useFipsEndpoint(), - useDualstackEndpoint: await config5.useDualstackEndpoint() + if (config4.signer) { + signer = normalizeProvider3(config4.signer); + } else if (config4.regionInfoProvider) { + signer = () => normalizeProvider3(config4.region)().then(async (region) => [ + await config4.regionInfoProvider(region, { + useFipsEndpoint: await config4.useFipsEndpoint(), + useDualstackEndpoint: await config4.useDualstackEndpoint() }) || {}, region ]).then(([regionInfo, region]) => { const { signingRegion, signingService } = regionInfo; - config5.signingRegion = config5.signingRegion || signingRegion || region; - config5.signingName = config5.signingName || signingService || config5.serviceId; + config4.signingRegion = config4.signingRegion || signingRegion || region; + config4.signingName = config4.signingName || signingService || config4.serviceId; const params = { - ...config5, - credentials: config5.credentials, - region: config5.signingRegion, - service: config5.signingName, + ...config4, + credentials: config4.credentials, + region: config4.signingRegion, + service: config4.signingName, sha256: sha2562, uriEscapePath: signingEscapePath }; - const SignerCtor = config5.signerConstructor || SignatureV4; + const SignerCtor = config4.signerConstructor || SignatureV4; return new SignerCtor(params); }); } else { signer = async (authScheme) => { authScheme = Object.assign({}, { name: "sigv4", - signingName: config5.signingName || config5.defaultSigningName, - signingRegion: await normalizeProvider3(config5.region)(), + signingName: config4.signingName || config4.defaultSigningName, + signingRegion: await normalizeProvider3(config4.region)(), properties: {} }, authScheme); const signingRegion = authScheme.signingRegion; const signingService = authScheme.signingName; - config5.signingRegion = config5.signingRegion || signingRegion; - config5.signingName = config5.signingName || signingService || config5.serviceId; + config4.signingRegion = config4.signingRegion || signingRegion; + config4.signingName = config4.signingName || signingService || config4.serviceId; const params = { - ...config5, - credentials: config5.credentials, - region: config5.signingRegion, - service: config5.signingName, + ...config4, + credentials: config4.credentials, + region: config4.signingRegion, + service: config4.signingName, sha256: sha2562, uriEscapePath: signingEscapePath }; - const SignerCtor = config5.signerConstructor || SignatureV4; + const SignerCtor = config4.signerConstructor || SignatureV4; return new SignerCtor(params); }; } - const resolvedConfig = Object.assign(config5, { + const resolvedConfig = Object.assign(config4, { systemClockOffset, signingEscapePath, signer, - disableClockSkewCorrection: normalizeProvider3(config5.disableClockSkewCorrection ?? defaultDisableClockSkewCorrection) + disableClockSkewCorrection: normalizeProvider3(config4.disableClockSkewCorrection ?? defaultDisableClockSkewCorrection) }); return resolvedConfig; }; - function normalizeCredentialProvider(config5, { credentials, credentialDefaultProvider }) { + function normalizeCredentialProvider(config4, { credentials, credentialDefaultProvider }) { let credentialsProvider; if (credentials) { if (!credentials?.memoized) { @@ -317018,8 +317318,8 @@ var require_httpAuthSchemes2 = __commonJS((exports) => { } } else { if (credentialDefaultProvider) { - credentialsProvider = normalizeProvider3(credentialDefaultProvider(Object.assign({}, config5, { - parentClientConfig: config5 + credentialsProvider = normalizeProvider3(credentialDefaultProvider(Object.assign({}, config4, { + parentClientConfig: config4 }))); } else { credentialsProvider = async () => { @@ -317030,11 +317330,11 @@ var require_httpAuthSchemes2 = __commonJS((exports) => { credentialsProvider.memoized = true; return credentialsProvider; } - function bindCallerConfig(config5, credentialsProvider) { + function bindCallerConfig(config4, credentialsProvider) { if (credentialsProvider.configBound) { return credentialsProvider; } - const fn3 = async (options4) => credentialsProvider({ ...options4, callerClientConfig: config5 }); + const fn3 = async (options4) => credentialsProvider({ ...options4, callerClientConfig: config4 }); fn3.memoized = credentialsProvider.memoized; fn3.configBound = true; return fn3; @@ -317189,8 +317489,8 @@ var require_dist_cjs9 = __commonJS((exports) => { Object.defineProperty(obj, "__proto__", { value: undefined, writable: true, enumerable: true, configurable: true }); } function parseXML(xml2) { - const state2 = new AwsXmlParser(xml2); - return state2.parse(); + const state = new AwsXmlParser(xml2); + return state.parse(); } class AwsXmlParser { @@ -320288,10 +320588,10 @@ var require_signin = __commonJS((exports) => { var { streamCollector, NodeHttpHandler: NodeHttpHandler2 } = require_dist_cjs5(); var { AwsRestJsonProtocol } = require_protocols3(); var { Sha256 } = require_checksum(); - var defaultSigninHttpAuthSchemeParametersProvider = async (config5, context4, input) => { + var defaultSigninHttpAuthSchemeParametersProvider = async (config4, context4, input) => { return { operation: getSmithyContext(context4).operation, - region: await normalizeProvider3(config5.region)() || (() => { + region: await normalizeProvider3(config4.region)() || (() => { throw new Error("expected `region` to be configured for `aws.auth#sigv4`"); })() }; @@ -320303,9 +320603,9 @@ var require_signin = __commonJS((exports) => { name: "signin", region: authParameters.region }, - propertiesExtractor: (config5, context4) => ({ + propertiesExtractor: (config4, context4) => ({ signingProperties: { - config: config5, + config: config4, context: context4 } }) @@ -320329,10 +320629,10 @@ var require_signin = __commonJS((exports) => { } return options4; }; - var resolveHttpAuthSchemeConfig = (config5) => { - const config_0 = resolveAwsSdkSigV4Config(config5); + var resolveHttpAuthSchemeConfig = (config4) => { + const config_0 = resolveAwsSdkSigV4Config(config4); return Object.assign(config_0, { - authSchemePreference: normalizeProvider3(config5.authSchemePreference ?? []) + authSchemePreference: normalizeProvider3(config4.authSchemePreference ?? []) }); }; var resolveClientEndpointParameters = (options4) => { @@ -320798,16 +321098,16 @@ var require_signin = __commonJS((exports) => { () => CreateOAuth2TokenWithIAMRequest$, () => CreateOAuth2TokenWithIAMResponse$ ]; - var getRuntimeConfig$1 = (config5) => { + var getRuntimeConfig$1 = (config4) => { return { apiVersion: "2023-01-01", - base64Decoder: config5?.base64Decoder ?? fromBase64, - base64Encoder: config5?.base64Encoder ?? toBase64, - disableHostPrefix: config5?.disableHostPrefix ?? false, - endpointProvider: config5?.endpointProvider ?? defaultEndpointResolver, - extensions: config5?.extensions ?? [], - httpAuthSchemeProvider: config5?.httpAuthSchemeProvider ?? defaultSigninHttpAuthSchemeProvider, - httpAuthSchemes: config5?.httpAuthSchemes ?? [ + base64Decoder: config4?.base64Decoder ?? fromBase64, + base64Encoder: config4?.base64Encoder ?? toBase64, + disableHostPrefix: config4?.disableHostPrefix ?? false, + endpointProvider: config4?.endpointProvider ?? defaultEndpointResolver, + extensions: config4?.extensions ?? [], + httpAuthSchemeProvider: config4?.httpAuthSchemeProvider ?? defaultSigninHttpAuthSchemeProvider, + httpAuthSchemes: config4?.httpAuthSchemes ?? [ { schemeId: "aws.auth#sigv4", identityProvider: (ipc) => ipc.getIdentityProvider("aws.auth#sigv4"), @@ -320819,50 +321119,50 @@ var require_signin = __commonJS((exports) => { signer: new NoAuthSigner } ], - logger: config5?.logger ?? new NoOpLogger, - protocol: config5?.protocol ?? AwsRestJsonProtocol, - protocolSettings: config5?.protocolSettings ?? { + logger: config4?.logger ?? new NoOpLogger, + protocol: config4?.protocol ?? AwsRestJsonProtocol, + protocolSettings: config4?.protocolSettings ?? { defaultNamespace: "com.amazonaws.signin", errorTypeRegistries, version: "2023-01-01", serviceTarget: "Signin" }, - serviceId: config5?.serviceId ?? "Signin", - sha256: config5?.sha256 ?? Sha256, - urlParser: config5?.urlParser ?? parseUrl4, - utf8Decoder: config5?.utf8Decoder ?? fromUtf85, - utf8Encoder: config5?.utf8Encoder ?? toUtf83 + serviceId: config4?.serviceId ?? "Signin", + sha256: config4?.sha256 ?? Sha256, + urlParser: config4?.urlParser ?? parseUrl4, + utf8Decoder: config4?.utf8Decoder ?? fromUtf85, + utf8Encoder: config4?.utf8Encoder ?? toUtf83 }; }; - var getRuntimeConfig = (config5) => { + var getRuntimeConfig = (config4) => { emitWarningIfUnsupportedVersion(process.version); - const defaultsMode = resolveDefaultsModeConfig(config5); + const defaultsMode = resolveDefaultsModeConfig(config4); const defaultConfigProvider = () => defaultsMode().then(loadConfigsForDefaultMode); - const clientSharedValues = getRuntimeConfig$1(config5); + const clientSharedValues = getRuntimeConfig$1(config4); emitWarningIfUnsupportedVersion$1(process.version); const loaderConfig = { - profile: config5?.profile, + profile: config4?.profile, logger: clientSharedValues.logger }; return { ...clientSharedValues, - ...config5, + ...config4, runtime: "node", defaultsMode, - authSchemePreference: config5?.authSchemePreference ?? loadConfig5(NODE_AUTH_SCHEME_PREFERENCE_OPTIONS, loaderConfig), - bodyLengthChecker: config5?.bodyLengthChecker ?? calculateBodyLength, - defaultUserAgentProvider: config5?.defaultUserAgentProvider ?? createDefaultUserAgentProvider({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo.version }), - maxAttempts: config5?.maxAttempts ?? loadConfig5(NODE_MAX_ATTEMPT_CONFIG_OPTIONS, config5), - region: config5?.region ?? loadConfig5(NODE_REGION_CONFIG_OPTIONS3, { ...NODE_REGION_CONFIG_FILE_OPTIONS3, ...loaderConfig }), - requestHandler: NodeHttpHandler2.create(config5?.requestHandler ?? defaultConfigProvider), - retryMode: config5?.retryMode ?? loadConfig5({ + authSchemePreference: config4?.authSchemePreference ?? loadConfig5(NODE_AUTH_SCHEME_PREFERENCE_OPTIONS, loaderConfig), + bodyLengthChecker: config4?.bodyLengthChecker ?? calculateBodyLength, + defaultUserAgentProvider: config4?.defaultUserAgentProvider ?? createDefaultUserAgentProvider({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo.version }), + maxAttempts: config4?.maxAttempts ?? loadConfig5(NODE_MAX_ATTEMPT_CONFIG_OPTIONS, config4), + region: config4?.region ?? loadConfig5(NODE_REGION_CONFIG_OPTIONS3, { ...NODE_REGION_CONFIG_FILE_OPTIONS3, ...loaderConfig }), + requestHandler: NodeHttpHandler2.create(config4?.requestHandler ?? defaultConfigProvider), + retryMode: config4?.retryMode ?? loadConfig5({ ...NODE_RETRY_MODE_CONFIG_OPTIONS, default: async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE - }, config5), - streamCollector: config5?.streamCollector ?? streamCollector, - useDualstackEndpoint: config5?.useDualstackEndpoint ?? loadConfig5(NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, loaderConfig), - useFipsEndpoint: config5?.useFipsEndpoint ?? loadConfig5(NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, loaderConfig), - userAgentAppId: config5?.userAgentAppId ?? loadConfig5(NODE_APP_ID_CONFIG_OPTIONS, loaderConfig) + }, config4), + streamCollector: config4?.streamCollector ?? streamCollector, + useDualstackEndpoint: config4?.useDualstackEndpoint ?? loadConfig5(NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, loaderConfig), + useFipsEndpoint: config4?.useFipsEndpoint ?? loadConfig5(NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, loaderConfig), + userAgentAppId: config4?.userAgentAppId ?? loadConfig5(NODE_APP_ID_CONFIG_OPTIONS, loaderConfig) }; }; var getHttpAuthExtensionConfiguration = (runtimeConfig) => { @@ -320895,11 +321195,11 @@ var require_signin = __commonJS((exports) => { } }; }; - var resolveHttpAuthRuntimeConfig = (config5) => { + var resolveHttpAuthRuntimeConfig = (config4) => { return { - httpAuthSchemes: config5.httpAuthSchemes(), - httpAuthSchemeProvider: config5.httpAuthSchemeProvider(), - credentials: config5.credentials() + httpAuthSchemes: config4.httpAuthSchemes(), + httpAuthSchemeProvider: config4.httpAuthSchemeProvider(), + credentials: config4.credentials() }; }; var resolveRuntimeExtensions = (runtimeConfig, extensions) => { @@ -320932,8 +321232,8 @@ var require_signin = __commonJS((exports) => { this.middlewareStack.use(getRecursionDetectionPlugin(this.config)); this.middlewareStack.use(getHttpAuthSchemeEndpointRuleSetPlugin(this.config, { httpAuthSchemeParametersProvider: defaultSigninHttpAuthSchemeParametersProvider, - identityProviderConfigProvider: async (config5) => new DefaultIdentityProviderConfig({ - "aws.auth#sigv4": config5.credentials + identityProviderConfigProvider: async (config4) => new DefaultIdentityProviderConfig({ + "aws.auth#sigv4": config4.credentials }) })); this.middlewareStack.use(getHttpSigningPlugin(this.config)); @@ -320949,7 +321249,7 @@ var require_signin = __commonJS((exports) => { var _ep1 = { IsOAuthEndpoint: { type: "staticContextParams", value: true } }; - var _mw0 = (Command3, cs2, config5, o4) => []; + var _mw0 = (Command3, cs2, config4, o4) => []; class CreateOAuth2TokenCommand extends command2(_ep0, _mw0, "CreateOAuth2Token", CreateOAuth2Token$) { } @@ -322071,19 +322371,19 @@ var require_client8 = __commonJS((exports) => { exports.REGION_ENV_NAME = REGION_ENV_NAME4; exports.REGION_INI_NAME = REGION_INI_NAME4; exports.resolveRegionConfig = resolveRegionConfig4; - var state2 = { + var state = { warningEmitted: false }; var emitWarningIfUnsupportedVersion = (version5) => { - if (version5 && !state2.warningEmitted) { + if (version5 && !state.warningEmitted) { if (process.env.AWS_SDK_JS_NODE_VERSION_SUPPORT_WARNING_DISABLED === "true") { - state2.warningEmitted = true; + state.warningEmitted = true; return; } const userMajorVersion = parseInt(version5.substring(1, version5.indexOf("."))); const vv = 22; if (userMajorVersion < vv) { - state2.warningEmitted = true; + state.warningEmitted = true; process.emitWarning(`NodeVersionSupportWarning: The AWS SDK for JavaScript (v3) versions published after the first week of January 2027 will require node >=${vv}. You are running node ${version5}. @@ -322616,13 +322916,13 @@ More information can be found at: https://a.co/c895JFp`); }; var getUserAgentPrefix = () => selectedUserAgentPrefix; var ACCOUNT_ID_ENDPOINT_REGEX = /\d{12}\.ddb/; - async function checkFeatures(context4, config5, args3) { + async function checkFeatures(context4, config4, args3) { const request3 = args3.request; if (request3?.headers?.["smithy-protocol"] === "rpc-v2-cbor") { setFeature(context4, "PROTOCOL_RPC_V2_CBOR", "M"); } - if (typeof config5.retryStrategy === "function") { - const retryStrategy = await config5.retryStrategy(); + if (typeof config4.retryStrategy === "function") { + const retryStrategy = await config4.retryStrategy(); if (typeof retryStrategy.mode === "string") { switch (retryStrategy.mode) { case RETRY_MODES4.ADAPTIVE: @@ -322634,12 +322934,12 @@ More information can be found at: https://a.co/c895JFp`); } } } - if (typeof config5.accountIdEndpointMode === "function") { + if (typeof config4.accountIdEndpointMode === "function") { const endpointV2 = context4.endpointV2; if (String(endpointV2?.url?.hostname).match(ACCOUNT_ID_ENDPOINT_REGEX)) { setFeature(context4, "ACCOUNT_ID_ENDPOINT", "O"); } - switch (await config5.accountIdEndpointMode?.()) { + switch (await config4.accountIdEndpointMode?.()) { case "disabled": setFeature(context4, "ACCOUNT_ID_MODE_DISABLED", "Q"); break; @@ -322748,9 +323048,9 @@ More information can be found at: https://a.co/c895JFp`); tags: ["SET_USER_AGENT", "USER_AGENT"], override: true }; - var getUserAgentPlugin = (config5) => ({ + var getUserAgentPlugin = (config4) => ({ applyToStack: (clientStack) => { - clientStack.add(userAgentMiddleware(config5), getUserAgentMiddlewareOptions); + clientStack.add(userAgentMiddleware(config4), getUserAgentMiddlewareOptions); } }); var getRuntimeUserAgentPair = () => { @@ -322773,7 +323073,7 @@ More information can be found at: https://a.co/c895JFp`); }; var createDefaultUserAgentProvider = ({ serviceId, clientVersion }) => { const runtimeUserAgentPair = getRuntimeUserAgentPair(); - return async (config5) => { + return async (config4) => { const sections = [ ["aws-sdk-js", clientVersion], ["ua", "2.1"], @@ -322791,7 +323091,7 @@ More information can be found at: https://a.co/c895JFp`); if (env7.AWS_EXECUTION_ENV) { sections.push([`exec-env/${env7.AWS_EXECUTION_ENV}`]); } - const appId = await config5?.userAgentAppId?.(); + const appId = await config4?.userAgentAppId?.(); const resolvedUserAgent = appId ? [...sections, [`app/${appId}`]] : [...sections]; return resolvedUserAgent; }; @@ -322805,7 +323105,7 @@ More information can be found at: https://a.co/c895JFp`); configFileSelector: (profile) => profile[UA_APP_ID_INI_NAME] ?? profile[UA_APP_ID_INI_NAME_DEPRECATED], default: DEFAULT_UA_APP_ID }; - var createUserAgentStringParsingProvider = ({ serviceId, clientVersion }) => async (config5) => { + var createUserAgentStringParsingProvider = ({ serviceId, clientVersion }) => async (config4) => { const module3 = require_es5(); const parse12 = module3.parse ?? module3.default.parse ?? (() => ""); const parsedUA = typeof window !== "undefined" && window?.navigator?.userAgent ? parse12(window.navigator.userAgent) : undefined; @@ -322819,7 +323119,7 @@ More information can be found at: https://a.co/c895JFp`); if (serviceId) { sections.push([`api/${serviceId}`, clientVersion]); } - const appId = await config5?.userAgentAppId?.(); + const appId = await config4?.userAgentAppId?.(); if (appId) { sections.push([`app/${appId}`]); } @@ -322981,7 +323281,7 @@ More information can be found at: https://a.co/c895JFp`); exports.setFeature = setFeature; exports.setPartitionInfo = setPartitionInfo; exports.setTokenFeature = setTokenFeature; - exports.state = state2; + exports.state = state; exports.stsRegionDefaultResolver = stsRegionDefaultResolver; exports.stsRegionWarning = warning; exports.toEndpointV1 = toEndpointV1; @@ -323144,19 +323444,19 @@ var require_client9 = __commonJS((exports) => { exports.REGION_ENV_NAME = REGION_ENV_NAME4; exports.REGION_INI_NAME = REGION_INI_NAME4; exports.resolveRegionConfig = resolveRegionConfig4; - var state2 = { + var state = { warningEmitted: false }; var emitWarningIfUnsupportedVersion = (version5) => { - if (version5 && !state2.warningEmitted) { + if (version5 && !state.warningEmitted) { if (process.env.AWS_SDK_JS_NODE_VERSION_SUPPORT_WARNING_DISABLED === "true") { - state2.warningEmitted = true; + state.warningEmitted = true; return; } const userMajorVersion = parseInt(version5.substring(1, version5.indexOf("."))); const vv = 22; if (userMajorVersion < vv) { - state2.warningEmitted = true; + state.warningEmitted = true; process.emitWarning(`NodeVersionSupportWarning: The AWS SDK for JavaScript (v3) versions published after the first week of January 2027 will require node >=${vv}. You are running node ${version5}. @@ -323689,13 +323989,13 @@ More information can be found at: https://a.co/c895JFp`); }; var getUserAgentPrefix = () => selectedUserAgentPrefix; var ACCOUNT_ID_ENDPOINT_REGEX = /\d{12}\.ddb/; - async function checkFeatures(context4, config5, args3) { + async function checkFeatures(context4, config4, args3) { const request3 = args3.request; if (request3?.headers?.["smithy-protocol"] === "rpc-v2-cbor") { setFeature(context4, "PROTOCOL_RPC_V2_CBOR", "M"); } - if (typeof config5.retryStrategy === "function") { - const retryStrategy = await config5.retryStrategy(); + if (typeof config4.retryStrategy === "function") { + const retryStrategy = await config4.retryStrategy(); if (typeof retryStrategy.mode === "string") { switch (retryStrategy.mode) { case RETRY_MODES4.ADAPTIVE: @@ -323707,12 +324007,12 @@ More information can be found at: https://a.co/c895JFp`); } } } - if (typeof config5.accountIdEndpointMode === "function") { + if (typeof config4.accountIdEndpointMode === "function") { const endpointV2 = context4.endpointV2; if (String(endpointV2?.url?.hostname).match(ACCOUNT_ID_ENDPOINT_REGEX)) { setFeature(context4, "ACCOUNT_ID_ENDPOINT", "O"); } - switch (await config5.accountIdEndpointMode?.()) { + switch (await config4.accountIdEndpointMode?.()) { case "disabled": setFeature(context4, "ACCOUNT_ID_MODE_DISABLED", "Q"); break; @@ -323821,9 +324121,9 @@ More information can be found at: https://a.co/c895JFp`); tags: ["SET_USER_AGENT", "USER_AGENT"], override: true }; - var getUserAgentPlugin = (config5) => ({ + var getUserAgentPlugin = (config4) => ({ applyToStack: (clientStack) => { - clientStack.add(userAgentMiddleware(config5), getUserAgentMiddlewareOptions); + clientStack.add(userAgentMiddleware(config4), getUserAgentMiddlewareOptions); } }); var getRuntimeUserAgentPair = () => { @@ -323846,7 +324146,7 @@ More information can be found at: https://a.co/c895JFp`); }; var createDefaultUserAgentProvider = ({ serviceId, clientVersion }) => { const runtimeUserAgentPair = getRuntimeUserAgentPair(); - return async (config5) => { + return async (config4) => { const sections = [ ["aws-sdk-js", clientVersion], ["ua", "2.1"], @@ -323864,7 +324164,7 @@ More information can be found at: https://a.co/c895JFp`); if (env7.AWS_EXECUTION_ENV) { sections.push([`exec-env/${env7.AWS_EXECUTION_ENV}`]); } - const appId = await config5?.userAgentAppId?.(); + const appId = await config4?.userAgentAppId?.(); const resolvedUserAgent = appId ? [...sections, [`app/${appId}`]] : [...sections]; return resolvedUserAgent; }; @@ -323878,7 +324178,7 @@ More information can be found at: https://a.co/c895JFp`); configFileSelector: (profile) => profile[UA_APP_ID_INI_NAME] ?? profile[UA_APP_ID_INI_NAME_DEPRECATED], default: DEFAULT_UA_APP_ID }; - var createUserAgentStringParsingProvider = ({ serviceId, clientVersion }) => async (config5) => { + var createUserAgentStringParsingProvider = ({ serviceId, clientVersion }) => async (config4) => { const module3 = require_es5(); const parse12 = module3.parse ?? module3.default.parse ?? (() => ""); const parsedUA = typeof window !== "undefined" && window?.navigator?.userAgent ? parse12(window.navigator.userAgent) : undefined; @@ -323892,7 +324192,7 @@ More information can be found at: https://a.co/c895JFp`); if (serviceId) { sections.push([`api/${serviceId}`, clientVersion]); } - const appId = await config5?.userAgentAppId?.(); + const appId = await config4?.userAgentAppId?.(); if (appId) { sections.push([`app/${appId}`]); } @@ -324054,7 +324354,7 @@ More information can be found at: https://a.co/c895JFp`); exports.setFeature = setFeature; exports.setPartitionInfo = setPartitionInfo; exports.setTokenFeature = setTokenFeature; - exports.state = state2; + exports.state = state; exports.stsRegionDefaultResolver = stsRegionDefaultResolver; exports.stsRegionWarning = warning; exports.toEndpointV1 = toEndpointV1; @@ -324092,15 +324392,15 @@ var require_httpAuthSchemes3 = __commonJS((exports) => { }; var validateSigningProperties = async (signingProperties) => { const context4 = throwSigningPropertyError("context", signingProperties.context); - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const authScheme = context4.endpointV2?.properties?.authSchemes?.[0]; - const signerFunction = throwSigningPropertyError("signer", config5.signer); + const signerFunction = throwSigningPropertyError("signer", config4.signer); const signer = await signerFunction(authScheme); const signingRegion = signingProperties?.signingRegion; const signingRegionSet = signingProperties?.signingRegionSet; const signingName = signingProperties?.signingName; return { - config: config5, + config: config4, signer, signingRegion, signingRegionSet, @@ -324114,7 +324414,7 @@ var require_httpAuthSchemes3 = __commonJS((exports) => { throw new Error("The request is not an instance of `HttpRequest` and cannot be signed"); } const validatedProps = await validateSigningProperties(signingProperties); - const { config: config5, signer } = validatedProps; + const { config: config4, signer } = validatedProps; let { signingRegion, signingName } = validatedProps; const handlerExecutionContext = signingProperties.context; if (handlerExecutionContext?.authSchemes?.length ?? 0 > 1) { @@ -324124,14 +324424,14 @@ var require_httpAuthSchemes3 = __commonJS((exports) => { signingName = second?.signingName ?? signingName; } } - const noSkewCorrection = await config5.disableClockSkewCorrection?.() === true; + const noSkewCorrection = await config4.disableClockSkewCorrection?.() === true; signingProperties._disableClockSkewCorrection = noSkewCorrection; if (!noSkewCorrection) { - signingProperties._preRequestSystemClockOffset = config5.systemClockOffset; + signingProperties._preRequestSystemClockOffset = config4.systemClockOffset; signingProperties._requestSentAt = Date.now(); } const signedRequest = await signer.sign(httpRequest2, { - signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config5.systemClockOffset), + signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config4.systemClockOffset), signingRegion, signingService: signingName }); @@ -324143,12 +324443,12 @@ var require_httpAuthSchemes3 = __commonJS((exports) => { if (!signingProperties._disableClockSkewCorrection) { const serverTime = errorException.ServerTime ?? getDateHeader(errorException.$response); if (serverTime) { - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const preRequestOffset = signingProperties._preRequestSystemClockOffset; const timeRequestSent = signingProperties._requestSentAt; const ageHeader = getAgeHeader(errorException.$response); - const newOffset = getUpdatedSystemClockOffset(serverTime, config5.systemClockOffset, timeRequestSent, ageHeader); - config5.systemClockOffset = newOffset; + const newOffset = getUpdatedSystemClockOffset(serverTime, config4.systemClockOffset, timeRequestSent, ageHeader); + config4.systemClockOffset = newOffset; const skewExceedsThreshold = Math.abs(newOffset) >= 240000; const isLocalCorrection = newOffset !== preRequestOffset; const isConcurrentCorrection = preRequestOffset !== undefined && preRequestOffset !== newOffset; @@ -324166,10 +324466,10 @@ var require_httpAuthSchemes3 = __commonJS((exports) => { } const dateHeader = getDateHeader(httpResponse); if (dateHeader) { - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const timeRequestSent = signingProperties._requestSentAt; const ageHeader = getAgeHeader(httpResponse); - config5.systemClockOffset = getUpdatedSystemClockOffset(dateHeader, config5.systemClockOffset, timeRequestSent, ageHeader); + config4.systemClockOffset = getUpdatedSystemClockOffset(dateHeader, config4.systemClockOffset, timeRequestSent, ageHeader); } } } @@ -324180,17 +324480,17 @@ var require_httpAuthSchemes3 = __commonJS((exports) => { if (!HttpRequest6.isInstance(httpRequest2)) { throw new Error("The request is not an instance of `HttpRequest` and cannot be signed"); } - const { config: config5, signer, signingRegion, signingRegionSet, signingName } = await validateSigningProperties(signingProperties); - const configResolvedSigningRegionSet = await config5.sigv4aSigningRegionSet?.(); + const { config: config4, signer, signingRegion, signingRegionSet, signingName } = await validateSigningProperties(signingProperties); + const configResolvedSigningRegionSet = await config4.sigv4aSigningRegionSet?.(); const multiRegionOverride = (configResolvedSigningRegionSet ?? signingRegionSet ?? [signingRegion]).join(","); - const noSkewCorrection = await config5.disableClockSkewCorrection?.() === true; + const noSkewCorrection = await config4.disableClockSkewCorrection?.() === true; signingProperties._disableClockSkewCorrection = noSkewCorrection; if (!noSkewCorrection) { - signingProperties._preRequestSystemClockOffset = config5.systemClockOffset; + signingProperties._preRequestSystemClockOffset = config4.systemClockOffset; signingProperties._requestSentAt = Date.now(); } const signedRequest = await signer.sign(httpRequest2, { - signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config5.systemClockOffset), + signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config4.systemClockOffset), signingRegion: multiRegionOverride, signingService: signingName }); @@ -324219,9 +324519,9 @@ var require_httpAuthSchemes3 = __commonJS((exports) => { }, default: [] }; - var resolveAwsSdkSigV4AConfig = (config5) => { - config5.sigv4aSigningRegionSet = normalizeProvider4(config5.sigv4aSigningRegionSet); - return config5; + var resolveAwsSdkSigV4AConfig = (config4) => { + config4.sigv4aSigningRegionSet = normalizeProvider4(config4.sigv4aSigningRegionSet); + return config4; }; var NODE_SIGV4A_CONFIG_OPTIONS = { environmentVariableSelector(env7) { @@ -324242,21 +324542,21 @@ var require_httpAuthSchemes3 = __commonJS((exports) => { }, default: undefined }; - var bindResolveAwsSdkSigV4Config = (defaultDisableClockSkewCorrection) => (config5) => { - let inputCredentials = config5.credentials; - let isUserSupplied = !!config5.credentials; + var bindResolveAwsSdkSigV4Config = (defaultDisableClockSkewCorrection) => (config4) => { + let inputCredentials = config4.credentials; + let isUserSupplied = !!config4.credentials; let resolvedCredentials = undefined; - Object.defineProperty(config5, "credentials", { + Object.defineProperty(config4, "credentials", { set(credentials) { if (credentials && credentials !== inputCredentials && credentials !== resolvedCredentials) { isUserSupplied = true; } inputCredentials = credentials; - const memoizedProvider = normalizeCredentialProvider(config5, { + const memoizedProvider = normalizeCredentialProvider(config4, { credentials: inputCredentials, - credentialDefaultProvider: config5.credentialDefaultProvider + credentialDefaultProvider: config4.credentialDefaultProvider }); - const boundProvider = bindCallerConfig(config5, memoizedProvider); + const boundProvider = bindCallerConfig(config4, memoizedProvider); if (isUserSupplied && !boundProvider.attributed) { const isCredentialObject = typeof inputCredentials === "object" && inputCredentials !== null; resolvedCredentials = async (options4) => { @@ -324280,66 +324580,66 @@ var require_httpAuthSchemes3 = __commonJS((exports) => { enumerable: true, configurable: true }); - config5.credentials = inputCredentials; - const { signingEscapePath = true, systemClockOffset = config5.systemClockOffset || 0, sha256: sha2562 } = config5; + config4.credentials = inputCredentials; + const { signingEscapePath = true, systemClockOffset = config4.systemClockOffset || 0, sha256: sha2562 } = config4; let signer; - if (config5.signer) { - signer = normalizeProvider4(config5.signer); - } else if (config5.regionInfoProvider) { - signer = () => normalizeProvider4(config5.region)().then(async (region) => [ - await config5.regionInfoProvider(region, { - useFipsEndpoint: await config5.useFipsEndpoint(), - useDualstackEndpoint: await config5.useDualstackEndpoint() + if (config4.signer) { + signer = normalizeProvider4(config4.signer); + } else if (config4.regionInfoProvider) { + signer = () => normalizeProvider4(config4.region)().then(async (region) => [ + await config4.regionInfoProvider(region, { + useFipsEndpoint: await config4.useFipsEndpoint(), + useDualstackEndpoint: await config4.useDualstackEndpoint() }) || {}, region ]).then(([regionInfo, region]) => { const { signingRegion, signingService } = regionInfo; - config5.signingRegion = config5.signingRegion || signingRegion || region; - config5.signingName = config5.signingName || signingService || config5.serviceId; + config4.signingRegion = config4.signingRegion || signingRegion || region; + config4.signingName = config4.signingName || signingService || config4.serviceId; const params = { - ...config5, - credentials: config5.credentials, - region: config5.signingRegion, - service: config5.signingName, + ...config4, + credentials: config4.credentials, + region: config4.signingRegion, + service: config4.signingName, sha256: sha2562, uriEscapePath: signingEscapePath }; - const SignerCtor = config5.signerConstructor || SignatureV4; + const SignerCtor = config4.signerConstructor || SignatureV4; return new SignerCtor(params); }); } else { signer = async (authScheme) => { authScheme = Object.assign({}, { name: "sigv4", - signingName: config5.signingName || config5.defaultSigningName, - signingRegion: await normalizeProvider4(config5.region)(), + signingName: config4.signingName || config4.defaultSigningName, + signingRegion: await normalizeProvider4(config4.region)(), properties: {} }, authScheme); const signingRegion = authScheme.signingRegion; const signingService = authScheme.signingName; - config5.signingRegion = config5.signingRegion || signingRegion; - config5.signingName = config5.signingName || signingService || config5.serviceId; + config4.signingRegion = config4.signingRegion || signingRegion; + config4.signingName = config4.signingName || signingService || config4.serviceId; const params = { - ...config5, - credentials: config5.credentials, - region: config5.signingRegion, - service: config5.signingName, + ...config4, + credentials: config4.credentials, + region: config4.signingRegion, + service: config4.signingName, sha256: sha2562, uriEscapePath: signingEscapePath }; - const SignerCtor = config5.signerConstructor || SignatureV4; + const SignerCtor = config4.signerConstructor || SignatureV4; return new SignerCtor(params); }; } - const resolvedConfig = Object.assign(config5, { + const resolvedConfig = Object.assign(config4, { systemClockOffset, signingEscapePath, signer, - disableClockSkewCorrection: normalizeProvider4(config5.disableClockSkewCorrection ?? defaultDisableClockSkewCorrection) + disableClockSkewCorrection: normalizeProvider4(config4.disableClockSkewCorrection ?? defaultDisableClockSkewCorrection) }); return resolvedConfig; }; - function normalizeCredentialProvider(config5, { credentials, credentialDefaultProvider }) { + function normalizeCredentialProvider(config4, { credentials, credentialDefaultProvider }) { let credentialsProvider; if (credentials) { if (!credentials?.memoized) { @@ -324349,8 +324649,8 @@ var require_httpAuthSchemes3 = __commonJS((exports) => { } } else { if (credentialDefaultProvider) { - credentialsProvider = normalizeProvider4(credentialDefaultProvider(Object.assign({}, config5, { - parentClientConfig: config5 + credentialsProvider = normalizeProvider4(credentialDefaultProvider(Object.assign({}, config4, { + parentClientConfig: config4 }))); } else { credentialsProvider = async () => { @@ -324361,11 +324661,11 @@ var require_httpAuthSchemes3 = __commonJS((exports) => { credentialsProvider.memoized = true; return credentialsProvider; } - function bindCallerConfig(config5, credentialsProvider) { + function bindCallerConfig(config4, credentialsProvider) { if (credentialsProvider.configBound) { return credentialsProvider; } - const fn3 = async (options4) => credentialsProvider({ ...options4, callerClientConfig: config5 }); + const fn3 = async (options4) => credentialsProvider({ ...options4, callerClientConfig: config4 }); fn3.memoized = credentialsProvider.memoized; fn3.configBound = true; return fn3; @@ -324520,8 +324820,8 @@ var require_dist_cjs10 = __commonJS((exports) => { Object.defineProperty(obj, "__proto__", { value: undefined, writable: true, enumerable: true, configurable: true }); } function parseXML(xml2) { - const state2 = new AwsXmlParser(xml2); - return state2.parse(); + const state = new AwsXmlParser(xml2); + return state.parse(); } class AwsXmlParser { @@ -327619,10 +327919,10 @@ var require_sso_oidc = __commonJS((exports) => { var { streamCollector, NodeHttpHandler: NodeHttpHandler2 } = require_dist_cjs5(); var { AwsRestJsonProtocol } = require_protocols4(); var { Sha256 } = require_checksum(); - var defaultSSOOIDCHttpAuthSchemeParametersProvider = async (config5, context4, input) => { + var defaultSSOOIDCHttpAuthSchemeParametersProvider = async (config4, context4, input) => { return { operation: getSmithyContext(context4).operation, - region: await normalizeProvider4(config5.region)() || (() => { + region: await normalizeProvider4(config4.region)() || (() => { throw new Error("expected `region` to be configured for `aws.auth#sigv4`"); })() }; @@ -327634,9 +327934,9 @@ var require_sso_oidc = __commonJS((exports) => { name: "sso-oauth", region: authParameters.region }, - propertiesExtractor: (config5, context4) => ({ + propertiesExtractor: (config4, context4) => ({ signingProperties: { - config: config5, + config: config4, context: context4 } }) @@ -327660,10 +327960,10 @@ var require_sso_oidc = __commonJS((exports) => { } return options4; }; - var resolveHttpAuthSchemeConfig = (config5) => { - const config_0 = resolveAwsSdkSigV4Config(config5); + var resolveHttpAuthSchemeConfig = (config4) => { + const config_0 = resolveAwsSdkSigV4Config(config4); return Object.assign(config_0, { - authSchemePreference: normalizeProvider4(config5.authSchemePreference ?? []) + authSchemePreference: normalizeProvider4(config4.authSchemePreference ?? []) }); }; var resolveClientEndpointParameters = (options4) => { @@ -328155,16 +328455,16 @@ var require_sso_oidc = __commonJS((exports) => { () => CreateTokenRequest$, () => CreateTokenResponse$ ]; - var getRuntimeConfig$1 = (config5) => { + var getRuntimeConfig$1 = (config4) => { return { apiVersion: "2019-06-10", - base64Decoder: config5?.base64Decoder ?? fromBase64, - base64Encoder: config5?.base64Encoder ?? toBase64, - disableHostPrefix: config5?.disableHostPrefix ?? false, - endpointProvider: config5?.endpointProvider ?? defaultEndpointResolver, - extensions: config5?.extensions ?? [], - httpAuthSchemeProvider: config5?.httpAuthSchemeProvider ?? defaultSSOOIDCHttpAuthSchemeProvider, - httpAuthSchemes: config5?.httpAuthSchemes ?? [ + base64Decoder: config4?.base64Decoder ?? fromBase64, + base64Encoder: config4?.base64Encoder ?? toBase64, + disableHostPrefix: config4?.disableHostPrefix ?? false, + endpointProvider: config4?.endpointProvider ?? defaultEndpointResolver, + extensions: config4?.extensions ?? [], + httpAuthSchemeProvider: config4?.httpAuthSchemeProvider ?? defaultSSOOIDCHttpAuthSchemeProvider, + httpAuthSchemes: config4?.httpAuthSchemes ?? [ { schemeId: "aws.auth#sigv4", identityProvider: (ipc) => ipc.getIdentityProvider("aws.auth#sigv4"), @@ -328176,50 +328476,50 @@ var require_sso_oidc = __commonJS((exports) => { signer: new NoAuthSigner } ], - logger: config5?.logger ?? new NoOpLogger, - protocol: config5?.protocol ?? AwsRestJsonProtocol, - protocolSettings: config5?.protocolSettings ?? { + logger: config4?.logger ?? new NoOpLogger, + protocol: config4?.protocol ?? AwsRestJsonProtocol, + protocolSettings: config4?.protocolSettings ?? { defaultNamespace: "com.amazonaws.ssooidc", errorTypeRegistries, version: "2019-06-10", serviceTarget: "AWSSSOOIDCService" }, - serviceId: config5?.serviceId ?? "SSO OIDC", - sha256: config5?.sha256 ?? Sha256, - urlParser: config5?.urlParser ?? parseUrl5, - utf8Decoder: config5?.utf8Decoder ?? fromUtf85, - utf8Encoder: config5?.utf8Encoder ?? toUtf83 + serviceId: config4?.serviceId ?? "SSO OIDC", + sha256: config4?.sha256 ?? Sha256, + urlParser: config4?.urlParser ?? parseUrl5, + utf8Decoder: config4?.utf8Decoder ?? fromUtf85, + utf8Encoder: config4?.utf8Encoder ?? toUtf83 }; }; - var getRuntimeConfig = (config5) => { + var getRuntimeConfig = (config4) => { emitWarningIfUnsupportedVersion(process.version); - const defaultsMode = resolveDefaultsModeConfig(config5); + const defaultsMode = resolveDefaultsModeConfig(config4); const defaultConfigProvider = () => defaultsMode().then(loadConfigsForDefaultMode); - const clientSharedValues = getRuntimeConfig$1(config5); + const clientSharedValues = getRuntimeConfig$1(config4); emitWarningIfUnsupportedVersion$1(process.version); const loaderConfig = { - profile: config5?.profile, + profile: config4?.profile, logger: clientSharedValues.logger }; return { ...clientSharedValues, - ...config5, + ...config4, runtime: "node", defaultsMode, - authSchemePreference: config5?.authSchemePreference ?? loadConfig6(NODE_AUTH_SCHEME_PREFERENCE_OPTIONS, loaderConfig), - bodyLengthChecker: config5?.bodyLengthChecker ?? calculateBodyLength, - defaultUserAgentProvider: config5?.defaultUserAgentProvider ?? createDefaultUserAgentProvider({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo.version }), - maxAttempts: config5?.maxAttempts ?? loadConfig6(NODE_MAX_ATTEMPT_CONFIG_OPTIONS, config5), - region: config5?.region ?? loadConfig6(NODE_REGION_CONFIG_OPTIONS4, { ...NODE_REGION_CONFIG_FILE_OPTIONS4, ...loaderConfig }), - requestHandler: NodeHttpHandler2.create(config5?.requestHandler ?? defaultConfigProvider), - retryMode: config5?.retryMode ?? loadConfig6({ + authSchemePreference: config4?.authSchemePreference ?? loadConfig6(NODE_AUTH_SCHEME_PREFERENCE_OPTIONS, loaderConfig), + bodyLengthChecker: config4?.bodyLengthChecker ?? calculateBodyLength, + defaultUserAgentProvider: config4?.defaultUserAgentProvider ?? createDefaultUserAgentProvider({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo.version }), + maxAttempts: config4?.maxAttempts ?? loadConfig6(NODE_MAX_ATTEMPT_CONFIG_OPTIONS, config4), + region: config4?.region ?? loadConfig6(NODE_REGION_CONFIG_OPTIONS4, { ...NODE_REGION_CONFIG_FILE_OPTIONS4, ...loaderConfig }), + requestHandler: NodeHttpHandler2.create(config4?.requestHandler ?? defaultConfigProvider), + retryMode: config4?.retryMode ?? loadConfig6({ ...NODE_RETRY_MODE_CONFIG_OPTIONS, default: async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE - }, config5), - streamCollector: config5?.streamCollector ?? streamCollector, - useDualstackEndpoint: config5?.useDualstackEndpoint ?? loadConfig6(NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, loaderConfig), - useFipsEndpoint: config5?.useFipsEndpoint ?? loadConfig6(NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, loaderConfig), - userAgentAppId: config5?.userAgentAppId ?? loadConfig6(NODE_APP_ID_CONFIG_OPTIONS, loaderConfig) + }, config4), + streamCollector: config4?.streamCollector ?? streamCollector, + useDualstackEndpoint: config4?.useDualstackEndpoint ?? loadConfig6(NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, loaderConfig), + useFipsEndpoint: config4?.useFipsEndpoint ?? loadConfig6(NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, loaderConfig), + userAgentAppId: config4?.userAgentAppId ?? loadConfig6(NODE_APP_ID_CONFIG_OPTIONS, loaderConfig) }; }; var getHttpAuthExtensionConfiguration = (runtimeConfig) => { @@ -328252,11 +328552,11 @@ var require_sso_oidc = __commonJS((exports) => { } }; }; - var resolveHttpAuthRuntimeConfig = (config5) => { + var resolveHttpAuthRuntimeConfig = (config4) => { return { - httpAuthSchemes: config5.httpAuthSchemes(), - httpAuthSchemeProvider: config5.httpAuthSchemeProvider(), - credentials: config5.credentials() + httpAuthSchemes: config4.httpAuthSchemes(), + httpAuthSchemeProvider: config4.httpAuthSchemeProvider(), + credentials: config4.credentials() }; }; var resolveRuntimeExtensions = (runtimeConfig, extensions) => { @@ -328289,8 +328589,8 @@ var require_sso_oidc = __commonJS((exports) => { this.middlewareStack.use(getRecursionDetectionPlugin(this.config)); this.middlewareStack.use(getHttpAuthSchemeEndpointRuleSetPlugin(this.config, { httpAuthSchemeParametersProvider: defaultSSOOIDCHttpAuthSchemeParametersProvider, - identityProviderConfigProvider: async (config5) => new DefaultIdentityProviderConfig({ - "aws.auth#sigv4": config5.credentials + identityProviderConfigProvider: async (config4) => new DefaultIdentityProviderConfig({ + "aws.auth#sigv4": config4.credentials }) })); this.middlewareStack.use(getHttpSigningPlugin(this.config)); @@ -328301,7 +328601,7 @@ var require_sso_oidc = __commonJS((exports) => { } var command2 = makeBuilder(commonParams, "AWSSSOOIDCService", "SSOOIDCClient", getEndpointPlugin); var _ep0 = {}; - var _mw0 = (Command3, cs2, config5, o3) => []; + var _mw0 = (Command3, cs2, config4, o3) => []; class CreateTokenCommand extends command2(_ep0, _mw0, "CreateToken", CreateToken$) { } @@ -328529,15 +328829,15 @@ var require_httpAuthSchemes4 = __commonJS((exports) => { }; var validateSigningProperties = async (signingProperties) => { const context4 = throwSigningPropertyError("context", signingProperties.context); - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const authScheme = context4.endpointV2?.properties?.authSchemes?.[0]; - const signerFunction = throwSigningPropertyError("signer", config5.signer); + const signerFunction = throwSigningPropertyError("signer", config4.signer); const signer = await signerFunction(authScheme); const signingRegion = signingProperties?.signingRegion; const signingRegionSet = signingProperties?.signingRegionSet; const signingName = signingProperties?.signingName; return { - config: config5, + config: config4, signer, signingRegion, signingRegionSet, @@ -328551,7 +328851,7 @@ var require_httpAuthSchemes4 = __commonJS((exports) => { throw new Error("The request is not an instance of `HttpRequest` and cannot be signed"); } const validatedProps = await validateSigningProperties(signingProperties); - const { config: config5, signer } = validatedProps; + const { config: config4, signer } = validatedProps; let { signingRegion, signingName } = validatedProps; const handlerExecutionContext = signingProperties.context; if (handlerExecutionContext?.authSchemes?.length ?? 0 > 1) { @@ -328561,14 +328861,14 @@ var require_httpAuthSchemes4 = __commonJS((exports) => { signingName = second?.signingName ?? signingName; } } - const noSkewCorrection = await config5.disableClockSkewCorrection?.() === true; + const noSkewCorrection = await config4.disableClockSkewCorrection?.() === true; signingProperties._disableClockSkewCorrection = noSkewCorrection; if (!noSkewCorrection) { - signingProperties._preRequestSystemClockOffset = config5.systemClockOffset; + signingProperties._preRequestSystemClockOffset = config4.systemClockOffset; signingProperties._requestSentAt = Date.now(); } const signedRequest = await signer.sign(httpRequest2, { - signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config5.systemClockOffset), + signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config4.systemClockOffset), signingRegion, signingService: signingName }); @@ -328580,12 +328880,12 @@ var require_httpAuthSchemes4 = __commonJS((exports) => { if (!signingProperties._disableClockSkewCorrection) { const serverTime = errorException.ServerTime ?? getDateHeader(errorException.$response); if (serverTime) { - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const preRequestOffset = signingProperties._preRequestSystemClockOffset; const timeRequestSent = signingProperties._requestSentAt; const ageHeader = getAgeHeader(errorException.$response); - const newOffset = getUpdatedSystemClockOffset(serverTime, config5.systemClockOffset, timeRequestSent, ageHeader); - config5.systemClockOffset = newOffset; + const newOffset = getUpdatedSystemClockOffset(serverTime, config4.systemClockOffset, timeRequestSent, ageHeader); + config4.systemClockOffset = newOffset; const skewExceedsThreshold = Math.abs(newOffset) >= 240000; const isLocalCorrection = newOffset !== preRequestOffset; const isConcurrentCorrection = preRequestOffset !== undefined && preRequestOffset !== newOffset; @@ -328603,10 +328903,10 @@ var require_httpAuthSchemes4 = __commonJS((exports) => { } const dateHeader = getDateHeader(httpResponse); if (dateHeader) { - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const timeRequestSent = signingProperties._requestSentAt; const ageHeader = getAgeHeader(httpResponse); - config5.systemClockOffset = getUpdatedSystemClockOffset(dateHeader, config5.systemClockOffset, timeRequestSent, ageHeader); + config4.systemClockOffset = getUpdatedSystemClockOffset(dateHeader, config4.systemClockOffset, timeRequestSent, ageHeader); } } } @@ -328617,17 +328917,17 @@ var require_httpAuthSchemes4 = __commonJS((exports) => { if (!HttpRequest6.isInstance(httpRequest2)) { throw new Error("The request is not an instance of `HttpRequest` and cannot be signed"); } - const { config: config5, signer, signingRegion, signingRegionSet, signingName } = await validateSigningProperties(signingProperties); - const configResolvedSigningRegionSet = await config5.sigv4aSigningRegionSet?.(); + const { config: config4, signer, signingRegion, signingRegionSet, signingName } = await validateSigningProperties(signingProperties); + const configResolvedSigningRegionSet = await config4.sigv4aSigningRegionSet?.(); const multiRegionOverride = (configResolvedSigningRegionSet ?? signingRegionSet ?? [signingRegion]).join(","); - const noSkewCorrection = await config5.disableClockSkewCorrection?.() === true; + const noSkewCorrection = await config4.disableClockSkewCorrection?.() === true; signingProperties._disableClockSkewCorrection = noSkewCorrection; if (!noSkewCorrection) { - signingProperties._preRequestSystemClockOffset = config5.systemClockOffset; + signingProperties._preRequestSystemClockOffset = config4.systemClockOffset; signingProperties._requestSentAt = Date.now(); } const signedRequest = await signer.sign(httpRequest2, { - signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config5.systemClockOffset), + signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config4.systemClockOffset), signingRegion: multiRegionOverride, signingService: signingName }); @@ -328656,9 +328956,9 @@ var require_httpAuthSchemes4 = __commonJS((exports) => { }, default: [] }; - var resolveAwsSdkSigV4AConfig = (config5) => { - config5.sigv4aSigningRegionSet = normalizeProvider4(config5.sigv4aSigningRegionSet); - return config5; + var resolveAwsSdkSigV4AConfig = (config4) => { + config4.sigv4aSigningRegionSet = normalizeProvider4(config4.sigv4aSigningRegionSet); + return config4; }; var NODE_SIGV4A_CONFIG_OPTIONS = { environmentVariableSelector(env7) { @@ -328679,21 +328979,21 @@ var require_httpAuthSchemes4 = __commonJS((exports) => { }, default: undefined }; - var bindResolveAwsSdkSigV4Config = (defaultDisableClockSkewCorrection) => (config5) => { - let inputCredentials = config5.credentials; - let isUserSupplied = !!config5.credentials; + var bindResolveAwsSdkSigV4Config = (defaultDisableClockSkewCorrection) => (config4) => { + let inputCredentials = config4.credentials; + let isUserSupplied = !!config4.credentials; let resolvedCredentials = undefined; - Object.defineProperty(config5, "credentials", { + Object.defineProperty(config4, "credentials", { set(credentials) { if (credentials && credentials !== inputCredentials && credentials !== resolvedCredentials) { isUserSupplied = true; } inputCredentials = credentials; - const memoizedProvider = normalizeCredentialProvider(config5, { + const memoizedProvider = normalizeCredentialProvider(config4, { credentials: inputCredentials, - credentialDefaultProvider: config5.credentialDefaultProvider + credentialDefaultProvider: config4.credentialDefaultProvider }); - const boundProvider = bindCallerConfig(config5, memoizedProvider); + const boundProvider = bindCallerConfig(config4, memoizedProvider); if (isUserSupplied && !boundProvider.attributed) { const isCredentialObject = typeof inputCredentials === "object" && inputCredentials !== null; resolvedCredentials = async (options4) => { @@ -328717,66 +329017,66 @@ var require_httpAuthSchemes4 = __commonJS((exports) => { enumerable: true, configurable: true }); - config5.credentials = inputCredentials; - const { signingEscapePath = true, systemClockOffset = config5.systemClockOffset || 0, sha256: sha2562 } = config5; + config4.credentials = inputCredentials; + const { signingEscapePath = true, systemClockOffset = config4.systemClockOffset || 0, sha256: sha2562 } = config4; let signer; - if (config5.signer) { - signer = normalizeProvider4(config5.signer); - } else if (config5.regionInfoProvider) { - signer = () => normalizeProvider4(config5.region)().then(async (region) => [ - await config5.regionInfoProvider(region, { - useFipsEndpoint: await config5.useFipsEndpoint(), - useDualstackEndpoint: await config5.useDualstackEndpoint() + if (config4.signer) { + signer = normalizeProvider4(config4.signer); + } else if (config4.regionInfoProvider) { + signer = () => normalizeProvider4(config4.region)().then(async (region) => [ + await config4.regionInfoProvider(region, { + useFipsEndpoint: await config4.useFipsEndpoint(), + useDualstackEndpoint: await config4.useDualstackEndpoint() }) || {}, region ]).then(([regionInfo, region]) => { const { signingRegion, signingService } = regionInfo; - config5.signingRegion = config5.signingRegion || signingRegion || region; - config5.signingName = config5.signingName || signingService || config5.serviceId; + config4.signingRegion = config4.signingRegion || signingRegion || region; + config4.signingName = config4.signingName || signingService || config4.serviceId; const params = { - ...config5, - credentials: config5.credentials, - region: config5.signingRegion, - service: config5.signingName, + ...config4, + credentials: config4.credentials, + region: config4.signingRegion, + service: config4.signingName, sha256: sha2562, uriEscapePath: signingEscapePath }; - const SignerCtor = config5.signerConstructor || SignatureV4; + const SignerCtor = config4.signerConstructor || SignatureV4; return new SignerCtor(params); }); } else { signer = async (authScheme) => { authScheme = Object.assign({}, { name: "sigv4", - signingName: config5.signingName || config5.defaultSigningName, - signingRegion: await normalizeProvider4(config5.region)(), + signingName: config4.signingName || config4.defaultSigningName, + signingRegion: await normalizeProvider4(config4.region)(), properties: {} }, authScheme); const signingRegion = authScheme.signingRegion; const signingService = authScheme.signingName; - config5.signingRegion = config5.signingRegion || signingRegion; - config5.signingName = config5.signingName || signingService || config5.serviceId; + config4.signingRegion = config4.signingRegion || signingRegion; + config4.signingName = config4.signingName || signingService || config4.serviceId; const params = { - ...config5, - credentials: config5.credentials, - region: config5.signingRegion, - service: config5.signingName, + ...config4, + credentials: config4.credentials, + region: config4.signingRegion, + service: config4.signingName, sha256: sha2562, uriEscapePath: signingEscapePath }; - const SignerCtor = config5.signerConstructor || SignatureV4; + const SignerCtor = config4.signerConstructor || SignatureV4; return new SignerCtor(params); }; } - const resolvedConfig = Object.assign(config5, { + const resolvedConfig = Object.assign(config4, { systemClockOffset, signingEscapePath, signer, - disableClockSkewCorrection: normalizeProvider4(config5.disableClockSkewCorrection ?? defaultDisableClockSkewCorrection) + disableClockSkewCorrection: normalizeProvider4(config4.disableClockSkewCorrection ?? defaultDisableClockSkewCorrection) }); return resolvedConfig; }; - function normalizeCredentialProvider(config5, { credentials, credentialDefaultProvider }) { + function normalizeCredentialProvider(config4, { credentials, credentialDefaultProvider }) { let credentialsProvider; if (credentials) { if (!credentials?.memoized) { @@ -328786,8 +329086,8 @@ var require_httpAuthSchemes4 = __commonJS((exports) => { } } else { if (credentialDefaultProvider) { - credentialsProvider = normalizeProvider4(credentialDefaultProvider(Object.assign({}, config5, { - parentClientConfig: config5 + credentialsProvider = normalizeProvider4(credentialDefaultProvider(Object.assign({}, config4, { + parentClientConfig: config4 }))); } else { credentialsProvider = async () => { @@ -328798,11 +329098,11 @@ var require_httpAuthSchemes4 = __commonJS((exports) => { credentialsProvider.memoized = true; return credentialsProvider; } - function bindCallerConfig(config5, credentialsProvider) { + function bindCallerConfig(config4, credentialsProvider) { if (credentialsProvider.configBound) { return credentialsProvider; } - const fn3 = async (options4) => credentialsProvider({ ...options4, callerClientConfig: config5 }); + const fn3 = async (options4) => credentialsProvider({ ...options4, callerClientConfig: config4 }); fn3.memoized = credentialsProvider.memoized; fn3.configBound = true; return fn3; @@ -328957,8 +329257,8 @@ var require_dist_cjs11 = __commonJS((exports) => { Object.defineProperty(obj, "__proto__", { value: undefined, writable: true, enumerable: true, configurable: true }); } function parseXML(xml2) { - const state2 = new AwsXmlParser(xml2); - return state2.parse(); + const state = new AwsXmlParser(xml2); + return state.parse(); } class AwsXmlParser { @@ -332046,9 +332346,9 @@ function createAwsAuthSigv4HttpAuthOption(authParameters) { name: "awsssoportal", region: authParameters.region }, - propertiesExtractor: (config5, context4) => ({ + propertiesExtractor: (config4, context4) => ({ signingProperties: { - config: config5, + config: config4, context: context4 } }) @@ -332059,10 +332359,10 @@ function createSmithyApiNoAuthHttpAuthOption(authParameters) { schemeId: "smithy.api#noAuth" }; } -var awsEndpointFunctions4, emitWarningIfUnsupportedVersion$1, createDefaultUserAgentProvider, NODE_APP_ID_CONFIG_OPTIONS, getAwsRegionExtensionConfiguration, resolveAwsRegionExtensionConfiguration, resolveUserAgentConfig, resolveHostHeaderConfig, getUserAgentPlugin, getHostHeaderPlugin, getLoggerPlugin, getRecursionDetectionPlugin, NoAuthSigner, getHttpAuthSchemeEndpointRuleSetPlugin, DefaultIdentityProviderConfig, getHttpSigningPlugin, normalizeProvider4, getSmithyContext, ServiceException, NoOpLogger, emitWarningIfUnsupportedVersion, loadConfigsForDefaultMode, getDefaultExtensionConfiguration, resolveDefaultRuntimeConfig, Client, makeBuilder, createAggregatedClient, $Command, resolveDefaultsModeConfig, loadConfig6, NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, NODE_REGION_CONFIG_OPTIONS4, NODE_REGION_CONFIG_FILE_OPTIONS4, resolveRegionConfig4, BinaryDecisionDiagram, EndpointCache, decideEndpoint, customEndpointFunctions4, resolveEndpointConfig, getEndpointPlugin, parseUrl5, getHttpHandlerExtensionConfiguration, resolveHttpHandlerRuntimeConfig, getContentLengthPlugin, DEFAULT_RETRY_MODE, NODE_RETRY_MODE_CONFIG_OPTIONS, NODE_MAX_ATTEMPT_CONFIG_OPTIONS, resolveRetryConfig, getRetryPlugin, TypeRegistry, getSchemaSerdePlugin, resolveAwsSdkSigV4Config, AwsSdkSigV4Signer, NODE_AUTH_SCHEME_PREFERENCE_OPTIONS, toUtf83, fromUtf85, toBase64, fromBase64, calculateBodyLength, streamCollector, NodeHttpHandler2, AwsRestJsonProtocol, Sha256, defaultSSOHttpAuthSchemeParametersProvider = async (config5, context4, input) => { +var awsEndpointFunctions4, emitWarningIfUnsupportedVersion$1, createDefaultUserAgentProvider, NODE_APP_ID_CONFIG_OPTIONS, getAwsRegionExtensionConfiguration, resolveAwsRegionExtensionConfiguration, resolveUserAgentConfig, resolveHostHeaderConfig, getUserAgentPlugin, getHostHeaderPlugin, getLoggerPlugin, getRecursionDetectionPlugin, NoAuthSigner, getHttpAuthSchemeEndpointRuleSetPlugin, DefaultIdentityProviderConfig, getHttpSigningPlugin, normalizeProvider4, getSmithyContext, ServiceException, NoOpLogger, emitWarningIfUnsupportedVersion, loadConfigsForDefaultMode, getDefaultExtensionConfiguration, resolveDefaultRuntimeConfig, Client, makeBuilder, createAggregatedClient, $Command, resolveDefaultsModeConfig, loadConfig6, NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, NODE_REGION_CONFIG_OPTIONS4, NODE_REGION_CONFIG_FILE_OPTIONS4, resolveRegionConfig4, BinaryDecisionDiagram, EndpointCache, decideEndpoint, customEndpointFunctions4, resolveEndpointConfig, getEndpointPlugin, parseUrl5, getHttpHandlerExtensionConfiguration, resolveHttpHandlerRuntimeConfig, getContentLengthPlugin, DEFAULT_RETRY_MODE, NODE_RETRY_MODE_CONFIG_OPTIONS, NODE_MAX_ATTEMPT_CONFIG_OPTIONS, resolveRetryConfig, getRetryPlugin, TypeRegistry, getSchemaSerdePlugin, resolveAwsSdkSigV4Config, AwsSdkSigV4Signer, NODE_AUTH_SCHEME_PREFERENCE_OPTIONS, toUtf83, fromUtf85, toBase64, fromBase64, calculateBodyLength, streamCollector, NodeHttpHandler2, AwsRestJsonProtocol, Sha256, defaultSSOHttpAuthSchemeParametersProvider = async (config4, context4, input) => { return { operation: getSmithyContext(context4).operation, - region: await normalizeProvider4(config5.region)() || (() => { + region: await normalizeProvider4(config4.region)() || (() => { throw new Error("expected `region` to be configured for `aws.auth#sigv4`"); })() }; @@ -332078,10 +332378,10 @@ var awsEndpointFunctions4, emitWarningIfUnsupportedVersion$1, createDefaultUserA } } return options4; -}, resolveHttpAuthSchemeConfig = (config5) => { - const config_0 = resolveAwsSdkSigV4Config(config5); +}, resolveHttpAuthSchemeConfig = (config4) => { + const config_0 = resolveAwsSdkSigV4Config(config4); return Object.assign(config_0, { - authSchemePreference: normalizeProvider4(config5.authSchemePreference ?? []) + authSchemePreference: normalizeProvider4(config4.authSchemePreference ?? []) }); }, resolveClientEndpointParameters = (options4) => { return Object.assign(options4, { @@ -332094,16 +332394,16 @@ var awsEndpointFunctions4, emitWarningIfUnsupportedVersion$1, createDefaultUserA endpointParams, logger: context4.logger })); -}, SSOServiceException, InvalidRequestException, ResourceNotFoundException, TooManyRequestsException, UnauthorizedException, _ATT = "AccessTokenType", _GRC = "GetRoleCredentials", _GRCR = "GetRoleCredentialsRequest", _GRCRe = "GetRoleCredentialsResponse", _IRE = "InvalidRequestException", _RC = "RoleCredentials", _RNFE = "ResourceNotFoundException", _SAKT = "SecretAccessKeyType", _STT = "SessionTokenType", _TMRE = "TooManyRequestsException", _UE = "UnauthorizedException", _aI = "accountId", _aKI = "accessKeyId", _aT = "accessToken", _ai = "account_id", _c2 = "client", _e2 = "error", _ex = "expiration", _h = "http", _hE = "httpError", _hH = "httpHeader", _hQ = "httpQuery", _m = "message", _rC = "roleCredentials", _rN = "roleName", _rn = "role_name", _s2 = "smithy.ts.sdk.synthetic.com.amazonaws.sso", _sAK = "secretAccessKey", _sT = "sessionToken", _xasbt = "x-amz-sso_bearer_token", n0 = "com.amazonaws.sso", _s_registry, SSOServiceException$, n0_registry, InvalidRequestException$, ResourceNotFoundException$, TooManyRequestsException$, UnauthorizedException$, errorTypeRegistries, AccessTokenType, SecretAccessKeyType, SessionTokenType, GetRoleCredentialsRequest$, GetRoleCredentialsResponse$, RoleCredentials$, GetRoleCredentials$, getRuntimeConfig$1 = (config5) => { +}, SSOServiceException, InvalidRequestException, ResourceNotFoundException, TooManyRequestsException, UnauthorizedException, _ATT = "AccessTokenType", _GRC = "GetRoleCredentials", _GRCR = "GetRoleCredentialsRequest", _GRCRe = "GetRoleCredentialsResponse", _IRE = "InvalidRequestException", _RC = "RoleCredentials", _RNFE = "ResourceNotFoundException", _SAKT = "SecretAccessKeyType", _STT = "SessionTokenType", _TMRE = "TooManyRequestsException", _UE = "UnauthorizedException", _aI = "accountId", _aKI = "accessKeyId", _aT = "accessToken", _ai = "account_id", _c2 = "client", _e2 = "error", _ex = "expiration", _h = "http", _hE = "httpError", _hH = "httpHeader", _hQ = "httpQuery", _m = "message", _rC = "roleCredentials", _rN = "roleName", _rn = "role_name", _s2 = "smithy.ts.sdk.synthetic.com.amazonaws.sso", _sAK = "secretAccessKey", _sT = "sessionToken", _xasbt = "x-amz-sso_bearer_token", n0 = "com.amazonaws.sso", _s_registry, SSOServiceException$, n0_registry, InvalidRequestException$, ResourceNotFoundException$, TooManyRequestsException$, UnauthorizedException$, errorTypeRegistries, AccessTokenType, SecretAccessKeyType, SessionTokenType, GetRoleCredentialsRequest$, GetRoleCredentialsResponse$, RoleCredentials$, GetRoleCredentials$, getRuntimeConfig$1 = (config4) => { return { apiVersion: "2019-06-10", - base64Decoder: config5?.base64Decoder ?? fromBase64, - base64Encoder: config5?.base64Encoder ?? toBase64, - disableHostPrefix: config5?.disableHostPrefix ?? false, - endpointProvider: config5?.endpointProvider ?? defaultEndpointResolver, - extensions: config5?.extensions ?? [], - httpAuthSchemeProvider: config5?.httpAuthSchemeProvider ?? defaultSSOHttpAuthSchemeProvider, - httpAuthSchemes: config5?.httpAuthSchemes ?? [ + base64Decoder: config4?.base64Decoder ?? fromBase64, + base64Encoder: config4?.base64Encoder ?? toBase64, + disableHostPrefix: config4?.disableHostPrefix ?? false, + endpointProvider: config4?.endpointProvider ?? defaultEndpointResolver, + extensions: config4?.extensions ?? [], + httpAuthSchemeProvider: config4?.httpAuthSchemeProvider ?? defaultSSOHttpAuthSchemeProvider, + httpAuthSchemes: config4?.httpAuthSchemes ?? [ { schemeId: "aws.auth#sigv4", identityProvider: (ipc) => ipc.getIdentityProvider("aws.auth#sigv4"), @@ -332115,49 +332415,49 @@ var awsEndpointFunctions4, emitWarningIfUnsupportedVersion$1, createDefaultUserA signer: new NoAuthSigner } ], - logger: config5?.logger ?? new NoOpLogger, - protocol: config5?.protocol ?? AwsRestJsonProtocol, - protocolSettings: config5?.protocolSettings ?? { + logger: config4?.logger ?? new NoOpLogger, + protocol: config4?.protocol ?? AwsRestJsonProtocol, + protocolSettings: config4?.protocolSettings ?? { defaultNamespace: "com.amazonaws.sso", errorTypeRegistries, version: "2019-06-10", serviceTarget: "SWBPortalService" }, - serviceId: config5?.serviceId ?? "SSO", - sha256: config5?.sha256 ?? Sha256, - urlParser: config5?.urlParser ?? parseUrl5, - utf8Decoder: config5?.utf8Decoder ?? fromUtf85, - utf8Encoder: config5?.utf8Encoder ?? toUtf83 + serviceId: config4?.serviceId ?? "SSO", + sha256: config4?.sha256 ?? Sha256, + urlParser: config4?.urlParser ?? parseUrl5, + utf8Decoder: config4?.utf8Decoder ?? fromUtf85, + utf8Encoder: config4?.utf8Encoder ?? toUtf83 }; -}, getRuntimeConfig = (config5) => { +}, getRuntimeConfig = (config4) => { emitWarningIfUnsupportedVersion(process.version); - const defaultsMode = resolveDefaultsModeConfig(config5); + const defaultsMode = resolveDefaultsModeConfig(config4); const defaultConfigProvider = () => defaultsMode().then(loadConfigsForDefaultMode); - const clientSharedValues = getRuntimeConfig$1(config5); + const clientSharedValues = getRuntimeConfig$1(config4); emitWarningIfUnsupportedVersion$1(process.version); const loaderConfig = { - profile: config5?.profile, + profile: config4?.profile, logger: clientSharedValues.logger }; return { ...clientSharedValues, - ...config5, + ...config4, runtime: "node", defaultsMode, - authSchemePreference: config5?.authSchemePreference ?? loadConfig6(NODE_AUTH_SCHEME_PREFERENCE_OPTIONS, loaderConfig), - bodyLengthChecker: config5?.bodyLengthChecker ?? calculateBodyLength, - defaultUserAgentProvider: config5?.defaultUserAgentProvider ?? createDefaultUserAgentProvider({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo.version }), - maxAttempts: config5?.maxAttempts ?? loadConfig6(NODE_MAX_ATTEMPT_CONFIG_OPTIONS, config5), - region: config5?.region ?? loadConfig6(NODE_REGION_CONFIG_OPTIONS4, { ...NODE_REGION_CONFIG_FILE_OPTIONS4, ...loaderConfig }), - requestHandler: NodeHttpHandler2.create(config5?.requestHandler ?? defaultConfigProvider), - retryMode: config5?.retryMode ?? loadConfig6({ + authSchemePreference: config4?.authSchemePreference ?? loadConfig6(NODE_AUTH_SCHEME_PREFERENCE_OPTIONS, loaderConfig), + bodyLengthChecker: config4?.bodyLengthChecker ?? calculateBodyLength, + defaultUserAgentProvider: config4?.defaultUserAgentProvider ?? createDefaultUserAgentProvider({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo.version }), + maxAttempts: config4?.maxAttempts ?? loadConfig6(NODE_MAX_ATTEMPT_CONFIG_OPTIONS, config4), + region: config4?.region ?? loadConfig6(NODE_REGION_CONFIG_OPTIONS4, { ...NODE_REGION_CONFIG_FILE_OPTIONS4, ...loaderConfig }), + requestHandler: NodeHttpHandler2.create(config4?.requestHandler ?? defaultConfigProvider), + retryMode: config4?.retryMode ?? loadConfig6({ ...NODE_RETRY_MODE_CONFIG_OPTIONS, default: async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE - }, config5), - streamCollector: config5?.streamCollector ?? streamCollector, - useDualstackEndpoint: config5?.useDualstackEndpoint ?? loadConfig6(NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, loaderConfig), - useFipsEndpoint: config5?.useFipsEndpoint ?? loadConfig6(NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, loaderConfig), - userAgentAppId: config5?.userAgentAppId ?? loadConfig6(NODE_APP_ID_CONFIG_OPTIONS, loaderConfig) + }, config4), + streamCollector: config4?.streamCollector ?? streamCollector, + useDualstackEndpoint: config4?.useDualstackEndpoint ?? loadConfig6(NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, loaderConfig), + useFipsEndpoint: config4?.useFipsEndpoint ?? loadConfig6(NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, loaderConfig), + userAgentAppId: config4?.userAgentAppId ?? loadConfig6(NODE_APP_ID_CONFIG_OPTIONS, loaderConfig) }; }, getHttpAuthExtensionConfiguration = (runtimeConfig) => { const _httpAuthSchemes = runtimeConfig.httpAuthSchemes; @@ -332188,17 +332488,17 @@ var awsEndpointFunctions4, emitWarningIfUnsupportedVersion$1, createDefaultUserA return _credentials; } }; -}, resolveHttpAuthRuntimeConfig = (config5) => { +}, resolveHttpAuthRuntimeConfig = (config4) => { return { - httpAuthSchemes: config5.httpAuthSchemes(), - httpAuthSchemeProvider: config5.httpAuthSchemeProvider(), - credentials: config5.credentials() + httpAuthSchemes: config4.httpAuthSchemes(), + httpAuthSchemeProvider: config4.httpAuthSchemeProvider(), + credentials: config4.credentials() }; }, resolveRuntimeExtensions = (runtimeConfig, extensions) => { const extensionConfiguration = Object.assign(getAwsRegionExtensionConfiguration(runtimeConfig), getDefaultExtensionConfiguration(runtimeConfig), getHttpHandlerExtensionConfiguration(runtimeConfig), getHttpAuthExtensionConfiguration(runtimeConfig)); extensions.forEach((extension2) => extension2.configure(extensionConfiguration)); return Object.assign(runtimeConfig, resolveAwsRegionExtensionConfiguration(extensionConfiguration), resolveDefaultRuntimeConfig(extensionConfiguration), resolveHttpHandlerRuntimeConfig(extensionConfiguration), resolveHttpAuthRuntimeConfig(extensionConfiguration)); -}, SSOClient, command2, _ep0, _mw0 = (Command3, cs2, config5, o3) => [], GetRoleCredentialsCommand, commands2, SSO, $GetRoleCredentialsCommand, $SSOClient; +}, SSOClient, command2, _ep0, _mw0 = (Command3, cs2, config4, o3) => [], GetRoleCredentialsCommand, commands2, SSO, $GetRoleCredentialsCommand, $SSOClient; var init_sso = __esm(() => { ({ awsEndpointFunctions: awsEndpointFunctions4, emitWarningIfUnsupportedVersion: emitWarningIfUnsupportedVersion$1, createDefaultUserAgentProvider, NODE_APP_ID_CONFIG_OPTIONS, getAwsRegionExtensionConfiguration, resolveAwsRegionExtensionConfiguration, resolveUserAgentConfig, resolveHostHeaderConfig, getUserAgentPlugin, getHostHeaderPlugin, getLoggerPlugin, getRecursionDetectionPlugin } = require_client8()); ({ NoAuthSigner, getHttpAuthSchemeEndpointRuleSetPlugin, DefaultIdentityProviderConfig, getHttpSigningPlugin } = require_dist_cjs4()); @@ -332462,8 +332762,8 @@ var init_sso = __esm(() => { this.middlewareStack.use(getRecursionDetectionPlugin(this.config)); this.middlewareStack.use(getHttpAuthSchemeEndpointRuleSetPlugin(this.config, { httpAuthSchemeParametersProvider: defaultSSOHttpAuthSchemeParametersProvider, - identityProviderConfigProvider: async (config5) => new DefaultIdentityProviderConfig({ - "aws.auth#sigv4": config5.credentials + identityProviderConfigProvider: async (config4) => new DefaultIdentityProviderConfig({ + "aws.auth#sigv4": config4.credentials }) })); this.middlewareStack.use(getHttpSigningPlugin(this.config)); @@ -332879,19 +333179,19 @@ var require_client10 = __commonJS((exports) => { exports.REGION_ENV_NAME = REGION_ENV_NAME4; exports.REGION_INI_NAME = REGION_INI_NAME4; exports.resolveRegionConfig = resolveRegionConfig5; - var state2 = { + var state = { warningEmitted: false }; var emitWarningIfUnsupportedVersion2 = (version6) => { - if (version6 && !state2.warningEmitted) { + if (version6 && !state.warningEmitted) { if (process.env.AWS_SDK_JS_NODE_VERSION_SUPPORT_WARNING_DISABLED === "true") { - state2.warningEmitted = true; + state.warningEmitted = true; return; } const userMajorVersion = parseInt(version6.substring(1, version6.indexOf("."))); const vv = 22; if (userMajorVersion < vv) { - state2.warningEmitted = true; + state.warningEmitted = true; process.emitWarning(`NodeVersionSupportWarning: The AWS SDK for JavaScript (v3) versions published after the first week of January 2027 will require node >=${vv}. You are running node ${version6}. @@ -333424,13 +333724,13 @@ More information can be found at: https://a.co/c895JFp`); }; var getUserAgentPrefix = () => selectedUserAgentPrefix; var ACCOUNT_ID_ENDPOINT_REGEX = /\d{12}\.ddb/; - async function checkFeatures(context4, config5, args3) { + async function checkFeatures(context4, config4, args3) { const request3 = args3.request; if (request3?.headers?.["smithy-protocol"] === "rpc-v2-cbor") { setFeature(context4, "PROTOCOL_RPC_V2_CBOR", "M"); } - if (typeof config5.retryStrategy === "function") { - const retryStrategy = await config5.retryStrategy(); + if (typeof config4.retryStrategy === "function") { + const retryStrategy = await config4.retryStrategy(); if (typeof retryStrategy.mode === "string") { switch (retryStrategy.mode) { case RETRY_MODES4.ADAPTIVE: @@ -333442,12 +333742,12 @@ More information can be found at: https://a.co/c895JFp`); } } } - if (typeof config5.accountIdEndpointMode === "function") { + if (typeof config4.accountIdEndpointMode === "function") { const endpointV2 = context4.endpointV2; if (String(endpointV2?.url?.hostname).match(ACCOUNT_ID_ENDPOINT_REGEX)) { setFeature(context4, "ACCOUNT_ID_ENDPOINT", "O"); } - switch (await config5.accountIdEndpointMode?.()) { + switch (await config4.accountIdEndpointMode?.()) { case "disabled": setFeature(context4, "ACCOUNT_ID_MODE_DISABLED", "Q"); break; @@ -333556,9 +333856,9 @@ More information can be found at: https://a.co/c895JFp`); tags: ["SET_USER_AGENT", "USER_AGENT"], override: true }; - var getUserAgentPlugin2 = (config5) => ({ + var getUserAgentPlugin2 = (config4) => ({ applyToStack: (clientStack) => { - clientStack.add(userAgentMiddleware(config5), getUserAgentMiddlewareOptions); + clientStack.add(userAgentMiddleware(config4), getUserAgentMiddlewareOptions); } }); var getRuntimeUserAgentPair = () => { @@ -333581,7 +333881,7 @@ More information can be found at: https://a.co/c895JFp`); }; var createDefaultUserAgentProvider2 = ({ serviceId, clientVersion }) => { const runtimeUserAgentPair = getRuntimeUserAgentPair(); - return async (config5) => { + return async (config4) => { const sections = [ ["aws-sdk-js", clientVersion], ["ua", "2.1"], @@ -333599,7 +333899,7 @@ More information can be found at: https://a.co/c895JFp`); if (env7.AWS_EXECUTION_ENV) { sections.push([`exec-env/${env7.AWS_EXECUTION_ENV}`]); } - const appId = await config5?.userAgentAppId?.(); + const appId = await config4?.userAgentAppId?.(); const resolvedUserAgent = appId ? [...sections, [`app/${appId}`]] : [...sections]; return resolvedUserAgent; }; @@ -333613,7 +333913,7 @@ More information can be found at: https://a.co/c895JFp`); configFileSelector: (profile) => profile[UA_APP_ID_INI_NAME] ?? profile[UA_APP_ID_INI_NAME_DEPRECATED], default: DEFAULT_UA_APP_ID }; - var createUserAgentStringParsingProvider = ({ serviceId, clientVersion }) => async (config5) => { + var createUserAgentStringParsingProvider = ({ serviceId, clientVersion }) => async (config4) => { const module3 = require_es5(); const parse12 = module3.parse ?? module3.default.parse ?? (() => ""); const parsedUA = typeof window !== "undefined" && window?.navigator?.userAgent ? parse12(window.navigator.userAgent) : undefined; @@ -333627,7 +333927,7 @@ More information can be found at: https://a.co/c895JFp`); if (serviceId) { sections.push([`api/${serviceId}`, clientVersion]); } - const appId = await config5?.userAgentAppId?.(); + const appId = await config4?.userAgentAppId?.(); if (appId) { sections.push([`app/${appId}`]); } @@ -333789,7 +334089,7 @@ More information can be found at: https://a.co/c895JFp`); exports.setFeature = setFeature; exports.setPartitionInfo = setPartitionInfo; exports.setTokenFeature = setTokenFeature; - exports.state = state2; + exports.state = state; exports.stsRegionDefaultResolver = stsRegionDefaultResolver; exports.stsRegionWarning = warning; exports.toEndpointV1 = toEndpointV1; @@ -333827,15 +334127,15 @@ var require_httpAuthSchemes5 = __commonJS((exports) => { }; var validateSigningProperties = async (signingProperties) => { const context4 = throwSigningPropertyError("context", signingProperties.context); - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const authScheme = context4.endpointV2?.properties?.authSchemes?.[0]; - const signerFunction = throwSigningPropertyError("signer", config5.signer); + const signerFunction = throwSigningPropertyError("signer", config4.signer); const signer = await signerFunction(authScheme); const signingRegion = signingProperties?.signingRegion; const signingRegionSet = signingProperties?.signingRegionSet; const signingName = signingProperties?.signingName; return { - config: config5, + config: config4, signer, signingRegion, signingRegionSet, @@ -333849,7 +334149,7 @@ var require_httpAuthSchemes5 = __commonJS((exports) => { throw new Error("The request is not an instance of `HttpRequest` and cannot be signed"); } const validatedProps = await validateSigningProperties(signingProperties); - const { config: config5, signer } = validatedProps; + const { config: config4, signer } = validatedProps; let { signingRegion, signingName } = validatedProps; const handlerExecutionContext = signingProperties.context; if (handlerExecutionContext?.authSchemes?.length ?? 0 > 1) { @@ -333859,14 +334159,14 @@ var require_httpAuthSchemes5 = __commonJS((exports) => { signingName = second?.signingName ?? signingName; } } - const noSkewCorrection = await config5.disableClockSkewCorrection?.() === true; + const noSkewCorrection = await config4.disableClockSkewCorrection?.() === true; signingProperties._disableClockSkewCorrection = noSkewCorrection; if (!noSkewCorrection) { - signingProperties._preRequestSystemClockOffset = config5.systemClockOffset; + signingProperties._preRequestSystemClockOffset = config4.systemClockOffset; signingProperties._requestSentAt = Date.now(); } const signedRequest = await signer.sign(httpRequest2, { - signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config5.systemClockOffset), + signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config4.systemClockOffset), signingRegion, signingService: signingName }); @@ -333878,12 +334178,12 @@ var require_httpAuthSchemes5 = __commonJS((exports) => { if (!signingProperties._disableClockSkewCorrection) { const serverTime = errorException.ServerTime ?? getDateHeader(errorException.$response); if (serverTime) { - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const preRequestOffset = signingProperties._preRequestSystemClockOffset; const timeRequestSent = signingProperties._requestSentAt; const ageHeader = getAgeHeader(errorException.$response); - const newOffset = getUpdatedSystemClockOffset(serverTime, config5.systemClockOffset, timeRequestSent, ageHeader); - config5.systemClockOffset = newOffset; + const newOffset = getUpdatedSystemClockOffset(serverTime, config4.systemClockOffset, timeRequestSent, ageHeader); + config4.systemClockOffset = newOffset; const skewExceedsThreshold = Math.abs(newOffset) >= 240000; const isLocalCorrection = newOffset !== preRequestOffset; const isConcurrentCorrection = preRequestOffset !== undefined && preRequestOffset !== newOffset; @@ -333901,10 +334201,10 @@ var require_httpAuthSchemes5 = __commonJS((exports) => { } const dateHeader = getDateHeader(httpResponse); if (dateHeader) { - const config5 = throwSigningPropertyError("config", signingProperties.config); + const config4 = throwSigningPropertyError("config", signingProperties.config); const timeRequestSent = signingProperties._requestSentAt; const ageHeader = getAgeHeader(httpResponse); - config5.systemClockOffset = getUpdatedSystemClockOffset(dateHeader, config5.systemClockOffset, timeRequestSent, ageHeader); + config4.systemClockOffset = getUpdatedSystemClockOffset(dateHeader, config4.systemClockOffset, timeRequestSent, ageHeader); } } } @@ -333915,17 +334215,17 @@ var require_httpAuthSchemes5 = __commonJS((exports) => { if (!HttpRequest6.isInstance(httpRequest2)) { throw new Error("The request is not an instance of `HttpRequest` and cannot be signed"); } - const { config: config5, signer, signingRegion, signingRegionSet, signingName } = await validateSigningProperties(signingProperties); - const configResolvedSigningRegionSet = await config5.sigv4aSigningRegionSet?.(); + const { config: config4, signer, signingRegion, signingRegionSet, signingName } = await validateSigningProperties(signingProperties); + const configResolvedSigningRegionSet = await config4.sigv4aSigningRegionSet?.(); const multiRegionOverride = (configResolvedSigningRegionSet ?? signingRegionSet ?? [signingRegion]).join(","); - const noSkewCorrection = await config5.disableClockSkewCorrection?.() === true; + const noSkewCorrection = await config4.disableClockSkewCorrection?.() === true; signingProperties._disableClockSkewCorrection = noSkewCorrection; if (!noSkewCorrection) { - signingProperties._preRequestSystemClockOffset = config5.systemClockOffset; + signingProperties._preRequestSystemClockOffset = config4.systemClockOffset; signingProperties._requestSentAt = Date.now(); } const signedRequest = await signer.sign(httpRequest2, { - signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config5.systemClockOffset), + signingDate: noSkewCorrection ? new Date : getSkewCorrectedDate(config4.systemClockOffset), signingRegion: multiRegionOverride, signingService: signingName }); @@ -333954,9 +334254,9 @@ var require_httpAuthSchemes5 = __commonJS((exports) => { }, default: [] }; - var resolveAwsSdkSigV4AConfig = (config5) => { - config5.sigv4aSigningRegionSet = normalizeProvider5(config5.sigv4aSigningRegionSet); - return config5; + var resolveAwsSdkSigV4AConfig = (config4) => { + config4.sigv4aSigningRegionSet = normalizeProvider5(config4.sigv4aSigningRegionSet); + return config4; }; var NODE_SIGV4A_CONFIG_OPTIONS = { environmentVariableSelector(env7) { @@ -333977,21 +334277,21 @@ var require_httpAuthSchemes5 = __commonJS((exports) => { }, default: undefined }; - var bindResolveAwsSdkSigV4Config = (defaultDisableClockSkewCorrection) => (config5) => { - let inputCredentials = config5.credentials; - let isUserSupplied = !!config5.credentials; + var bindResolveAwsSdkSigV4Config = (defaultDisableClockSkewCorrection) => (config4) => { + let inputCredentials = config4.credentials; + let isUserSupplied = !!config4.credentials; let resolvedCredentials = undefined; - Object.defineProperty(config5, "credentials", { + Object.defineProperty(config4, "credentials", { set(credentials) { if (credentials && credentials !== inputCredentials && credentials !== resolvedCredentials) { isUserSupplied = true; } inputCredentials = credentials; - const memoizedProvider = normalizeCredentialProvider(config5, { + const memoizedProvider = normalizeCredentialProvider(config4, { credentials: inputCredentials, - credentialDefaultProvider: config5.credentialDefaultProvider + credentialDefaultProvider: config4.credentialDefaultProvider }); - const boundProvider = bindCallerConfig(config5, memoizedProvider); + const boundProvider = bindCallerConfig(config4, memoizedProvider); if (isUserSupplied && !boundProvider.attributed) { const isCredentialObject = typeof inputCredentials === "object" && inputCredentials !== null; resolvedCredentials = async (options4) => { @@ -334015,66 +334315,66 @@ var require_httpAuthSchemes5 = __commonJS((exports) => { enumerable: true, configurable: true }); - config5.credentials = inputCredentials; - const { signingEscapePath = true, systemClockOffset = config5.systemClockOffset || 0, sha256: sha2562 } = config5; + config4.credentials = inputCredentials; + const { signingEscapePath = true, systemClockOffset = config4.systemClockOffset || 0, sha256: sha2562 } = config4; let signer; - if (config5.signer) { - signer = normalizeProvider5(config5.signer); - } else if (config5.regionInfoProvider) { - signer = () => normalizeProvider5(config5.region)().then(async (region) => [ - await config5.regionInfoProvider(region, { - useFipsEndpoint: await config5.useFipsEndpoint(), - useDualstackEndpoint: await config5.useDualstackEndpoint() + if (config4.signer) { + signer = normalizeProvider5(config4.signer); + } else if (config4.regionInfoProvider) { + signer = () => normalizeProvider5(config4.region)().then(async (region) => [ + await config4.regionInfoProvider(region, { + useFipsEndpoint: await config4.useFipsEndpoint(), + useDualstackEndpoint: await config4.useDualstackEndpoint() }) || {}, region ]).then(([regionInfo, region]) => { const { signingRegion, signingService } = regionInfo; - config5.signingRegion = config5.signingRegion || signingRegion || region; - config5.signingName = config5.signingName || signingService || config5.serviceId; + config4.signingRegion = config4.signingRegion || signingRegion || region; + config4.signingName = config4.signingName || signingService || config4.serviceId; const params = { - ...config5, - credentials: config5.credentials, - region: config5.signingRegion, - service: config5.signingName, + ...config4, + credentials: config4.credentials, + region: config4.signingRegion, + service: config4.signingName, sha256: sha2562, uriEscapePath: signingEscapePath }; - const SignerCtor = config5.signerConstructor || SignatureV4; + const SignerCtor = config4.signerConstructor || SignatureV4; return new SignerCtor(params); }); } else { signer = async (authScheme) => { authScheme = Object.assign({}, { name: "sigv4", - signingName: config5.signingName || config5.defaultSigningName, - signingRegion: await normalizeProvider5(config5.region)(), + signingName: config4.signingName || config4.defaultSigningName, + signingRegion: await normalizeProvider5(config4.region)(), properties: {} }, authScheme); const signingRegion = authScheme.signingRegion; const signingService = authScheme.signingName; - config5.signingRegion = config5.signingRegion || signingRegion; - config5.signingName = config5.signingName || signingService || config5.serviceId; + config4.signingRegion = config4.signingRegion || signingRegion; + config4.signingName = config4.signingName || signingService || config4.serviceId; const params = { - ...config5, - credentials: config5.credentials, - region: config5.signingRegion, - service: config5.signingName, + ...config4, + credentials: config4.credentials, + region: config4.signingRegion, + service: config4.signingName, sha256: sha2562, uriEscapePath: signingEscapePath }; - const SignerCtor = config5.signerConstructor || SignatureV4; + const SignerCtor = config4.signerConstructor || SignatureV4; return new SignerCtor(params); }; } - const resolvedConfig = Object.assign(config5, { + const resolvedConfig = Object.assign(config4, { systemClockOffset, signingEscapePath, signer, - disableClockSkewCorrection: normalizeProvider5(config5.disableClockSkewCorrection ?? defaultDisableClockSkewCorrection) + disableClockSkewCorrection: normalizeProvider5(config4.disableClockSkewCorrection ?? defaultDisableClockSkewCorrection) }); return resolvedConfig; }; - function normalizeCredentialProvider(config5, { credentials, credentialDefaultProvider }) { + function normalizeCredentialProvider(config4, { credentials, credentialDefaultProvider }) { let credentialsProvider; if (credentials) { if (!credentials?.memoized) { @@ -334084,8 +334384,8 @@ var require_httpAuthSchemes5 = __commonJS((exports) => { } } else { if (credentialDefaultProvider) { - credentialsProvider = normalizeProvider5(credentialDefaultProvider(Object.assign({}, config5, { - parentClientConfig: config5 + credentialsProvider = normalizeProvider5(credentialDefaultProvider(Object.assign({}, config4, { + parentClientConfig: config4 }))); } else { credentialsProvider = async () => { @@ -334096,11 +334396,11 @@ var require_httpAuthSchemes5 = __commonJS((exports) => { credentialsProvider.memoized = true; return credentialsProvider; } - function bindCallerConfig(config5, credentialsProvider) { + function bindCallerConfig(config4, credentialsProvider) { if (credentialsProvider.configBound) { return credentialsProvider; } - const fn3 = async (options4) => credentialsProvider({ ...options4, callerClientConfig: config5 }); + const fn3 = async (options4) => credentialsProvider({ ...options4, callerClientConfig: config4 }); fn3.memoized = credentialsProvider.memoized; fn3.configBound = true; return fn3; @@ -334387,8 +334687,8 @@ var require_dist_cjs13 = __commonJS((exports) => { Object.defineProperty(obj, "__proto__", { value: undefined, writable: true, enumerable: true, configurable: true }); } function parseXML(xml2) { - const state2 = new AwsXmlParser(xml2); - return state2.parse(); + const state = new AwsXmlParser(xml2); + return state.parse(); } class AwsXmlParser { @@ -337659,22 +337959,22 @@ var require_sts2 = __commonJS((exports) => { })); }; customEndpointFunctions5.aws = awsEndpointFunctions5; - var createEndpointRuleSetHttpAuthSchemeParametersProvider = (defaultHttpAuthSchemeParametersProvider) => async (config5, context4, input) => { + var createEndpointRuleSetHttpAuthSchemeParametersProvider = (defaultHttpAuthSchemeParametersProvider) => async (config4, context4, input) => { if (!input) { throw new Error("Could not find `input` for `defaultEndpointRuleSetHttpAuthSchemeParametersProvider`"); } - const defaultParameters = await defaultHttpAuthSchemeParametersProvider(config5, context4, input); + const defaultParameters = await defaultHttpAuthSchemeParametersProvider(config4, context4, input); const instructionsFn = getSmithyContext2(context4)?.commandInstance?.constructor?.getEndpointParameterInstructions; if (!instructionsFn) { throw new Error(`getEndpointParameterInstructions() is not defined on '${context4.commandName}'`); } - const endpointParameters = await resolveParams(input, { getEndpointParameterInstructions: instructionsFn }, config5); + const endpointParameters = await resolveParams(input, { getEndpointParameterInstructions: instructionsFn }, config4); return Object.assign(defaultParameters, endpointParameters); }; - var _defaultSTSHttpAuthSchemeParametersProvider = async (config5, context4, input) => { + var _defaultSTSHttpAuthSchemeParametersProvider = async (config4, context4, input) => { return { operation: getSmithyContext2(context4).operation, - region: await normalizeProvider5(config5.region)() || (() => { + region: await normalizeProvider5(config4.region)() || (() => { throw new Error("expected `region` to be configured for `aws.auth#sigv4`"); })() }; @@ -337687,9 +337987,9 @@ var require_sts2 = __commonJS((exports) => { name: "sts", region: authParameters.region }, - propertiesExtractor: (config5, context4) => ({ + propertiesExtractor: (config4, context4) => ({ signingProperties: { - config: config5, + config: config4, context: context4 } }) @@ -337702,9 +338002,9 @@ var require_sts2 = __commonJS((exports) => { name: "sts", region: authParameters.region }, - propertiesExtractor: (config5, context4) => ({ + propertiesExtractor: (config4, context4) => ({ signingProperties: { - config: config5, + config: config4, context: context4 } }) @@ -337777,11 +338077,11 @@ var require_sts2 = __commonJS((exports) => { "aws.auth#sigv4a": createAwsAuthSigv4aHttpAuthOption, "smithy.api#noAuth": createSmithyApiNoAuthHttpAuthOption2 }); - var resolveHttpAuthSchemeConfig2 = (config5) => { - const config_0 = resolveAwsSdkSigV4Config2(config5); + var resolveHttpAuthSchemeConfig2 = (config4) => { + const config_0 = resolveAwsSdkSigV4Config2(config4); const config_1 = resolveAwsSdkSigV4AConfig(config_0); return Object.assign(config_1, { - authSchemePreference: normalizeProvider5(config5.authSchemePreference ?? []) + authSchemePreference: normalizeProvider5(config4.authSchemePreference ?? []) }); }; var resolveClientEndpointParameters2 = (options4) => { @@ -338148,16 +338448,16 @@ var require_sts2 = __commonJS((exports) => { () => AssumeRoleWithWebIdentityRequest$, () => AssumeRoleWithWebIdentityResponse$ ]; - var getRuntimeConfig$12 = (config5) => { + var getRuntimeConfig$12 = (config4) => { return { apiVersion: "2011-06-15", - base64Decoder: config5?.base64Decoder ?? fromBase642, - base64Encoder: config5?.base64Encoder ?? toBase642, - disableHostPrefix: config5?.disableHostPrefix ?? false, - endpointProvider: config5?.endpointProvider ?? defaultEndpointResolver2, - extensions: config5?.extensions ?? [], - httpAuthSchemeProvider: config5?.httpAuthSchemeProvider ?? defaultSTSHttpAuthSchemeProvider, - httpAuthSchemes: config5?.httpAuthSchemes ?? [ + base64Decoder: config4?.base64Decoder ?? fromBase642, + base64Encoder: config4?.base64Encoder ?? toBase642, + disableHostPrefix: config4?.disableHostPrefix ?? false, + endpointProvider: config4?.endpointProvider ?? defaultEndpointResolver2, + extensions: config4?.extensions ?? [], + httpAuthSchemeProvider: config4?.httpAuthSchemeProvider ?? defaultSTSHttpAuthSchemeProvider, + httpAuthSchemes: config4?.httpAuthSchemes ?? [ { schemeId: "aws.auth#sigv4", identityProvider: (ipc) => ipc.getIdentityProvider("aws.auth#sigv4"), @@ -338174,45 +338474,45 @@ var require_sts2 = __commonJS((exports) => { signer: new NoAuthSigner2 } ], - logger: config5?.logger ?? new NoOpLogger2, - protocol: config5?.protocol ?? AwsQueryProtocol, - protocolSettings: config5?.protocolSettings ?? { + logger: config4?.logger ?? new NoOpLogger2, + protocol: config4?.protocol ?? AwsQueryProtocol, + protocolSettings: config4?.protocolSettings ?? { defaultNamespace: "com.amazonaws.sts", errorTypeRegistries: errorTypeRegistries2, xmlNamespace: "https://sts.amazonaws.com/doc/2011-06-15/", version: "2011-06-15", serviceTarget: "AWSSecurityTokenServiceV20110615" }, - serviceId: config5?.serviceId ?? "STS", - sha256: config5?.sha256 ?? Sha2562, - signerConstructor: config5?.signerConstructor ?? SignatureV4MultiRegion, - urlParser: config5?.urlParser ?? parseUrl6, - utf8Decoder: config5?.utf8Decoder ?? fromUtf86, - utf8Encoder: config5?.utf8Encoder ?? toUtf84 + serviceId: config4?.serviceId ?? "STS", + sha256: config4?.sha256 ?? Sha2562, + signerConstructor: config4?.signerConstructor ?? SignatureV4MultiRegion, + urlParser: config4?.urlParser ?? parseUrl6, + utf8Decoder: config4?.utf8Decoder ?? fromUtf86, + utf8Encoder: config4?.utf8Encoder ?? toUtf84 }; }; - var getRuntimeConfig2 = (config5) => { + var getRuntimeConfig2 = (config4) => { emitWarningIfUnsupportedVersion2(process.version); - const defaultsMode = resolveDefaultsModeConfig2(config5); + const defaultsMode = resolveDefaultsModeConfig2(config4); const defaultConfigProvider = () => defaultsMode().then(loadConfigsForDefaultMode2); - const clientSharedValues = getRuntimeConfig$12(config5); + const clientSharedValues = getRuntimeConfig$12(config4); emitWarningIfUnsupportedVersion$12(process.version); const loaderConfig = { - profile: config5?.profile, + profile: config4?.profile, logger: clientSharedValues.logger }; return { ...clientSharedValues, - ...config5, + ...config4, runtime: "node", defaultsMode, - authSchemePreference: config5?.authSchemePreference ?? loadConfig7(NODE_AUTH_SCHEME_PREFERENCE_OPTIONS2, loaderConfig), - bodyLengthChecker: config5?.bodyLengthChecker ?? calculateBodyLength2, - defaultUserAgentProvider: config5?.defaultUserAgentProvider ?? createDefaultUserAgentProvider2({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo2.version }), - httpAuthSchemes: config5?.httpAuthSchemes ?? [ + authSchemePreference: config4?.authSchemePreference ?? loadConfig7(NODE_AUTH_SCHEME_PREFERENCE_OPTIONS2, loaderConfig), + bodyLengthChecker: config4?.bodyLengthChecker ?? calculateBodyLength2, + defaultUserAgentProvider: config4?.defaultUserAgentProvider ?? createDefaultUserAgentProvider2({ serviceId: clientSharedValues.serviceId, clientVersion: packageInfo2.version }), + httpAuthSchemes: config4?.httpAuthSchemes ?? [ { schemeId: "aws.auth#sigv4", - identityProvider: (ipc) => ipc.getIdentityProvider("aws.auth#sigv4") || (async (idProps) => await config5.credentialDefaultProvider(idProps?.__config || {})()), + identityProvider: (ipc) => ipc.getIdentityProvider("aws.auth#sigv4") || (async (idProps) => await config4.credentialDefaultProvider(idProps?.__config || {})()), signer: new AwsSdkSigV4Signer2 }, { @@ -338226,18 +338526,18 @@ var require_sts2 = __commonJS((exports) => { signer: new NoAuthSigner2 } ], - maxAttempts: config5?.maxAttempts ?? loadConfig7(NODE_MAX_ATTEMPT_CONFIG_OPTIONS2, config5), - region: config5?.region ?? loadConfig7(NODE_REGION_CONFIG_OPTIONS5, { ...NODE_REGION_CONFIG_FILE_OPTIONS5, ...loaderConfig }), - requestHandler: NodeHttpHandler3.create(config5?.requestHandler ?? defaultConfigProvider), - retryMode: config5?.retryMode ?? loadConfig7({ + maxAttempts: config4?.maxAttempts ?? loadConfig7(NODE_MAX_ATTEMPT_CONFIG_OPTIONS2, config4), + region: config4?.region ?? loadConfig7(NODE_REGION_CONFIG_OPTIONS5, { ...NODE_REGION_CONFIG_FILE_OPTIONS5, ...loaderConfig }), + requestHandler: NodeHttpHandler3.create(config4?.requestHandler ?? defaultConfigProvider), + retryMode: config4?.retryMode ?? loadConfig7({ ...NODE_RETRY_MODE_CONFIG_OPTIONS2, default: async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE2 - }, config5), - sigv4aSigningRegionSet: config5?.sigv4aSigningRegionSet ?? loadConfig7(NODE_SIGV4A_CONFIG_OPTIONS, loaderConfig), - streamCollector: config5?.streamCollector ?? streamCollector2, - useDualstackEndpoint: config5?.useDualstackEndpoint ?? loadConfig7(NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS2, loaderConfig), - useFipsEndpoint: config5?.useFipsEndpoint ?? loadConfig7(NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS2, loaderConfig), - userAgentAppId: config5?.userAgentAppId ?? loadConfig7(NODE_APP_ID_CONFIG_OPTIONS2, loaderConfig) + }, config4), + sigv4aSigningRegionSet: config4?.sigv4aSigningRegionSet ?? loadConfig7(NODE_SIGV4A_CONFIG_OPTIONS, loaderConfig), + streamCollector: config4?.streamCollector ?? streamCollector2, + useDualstackEndpoint: config4?.useDualstackEndpoint ?? loadConfig7(NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS2, loaderConfig), + useFipsEndpoint: config4?.useFipsEndpoint ?? loadConfig7(NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS2, loaderConfig), + userAgentAppId: config4?.userAgentAppId ?? loadConfig7(NODE_APP_ID_CONFIG_OPTIONS2, loaderConfig) }; }; var getHttpAuthExtensionConfiguration2 = (runtimeConfig) => { @@ -338270,11 +338570,11 @@ var require_sts2 = __commonJS((exports) => { } }; }; - var resolveHttpAuthRuntimeConfig2 = (config5) => { + var resolveHttpAuthRuntimeConfig2 = (config4) => { return { - httpAuthSchemes: config5.httpAuthSchemes(), - httpAuthSchemeProvider: config5.httpAuthSchemeProvider(), - credentials: config5.credentials() + httpAuthSchemes: config4.httpAuthSchemes(), + httpAuthSchemeProvider: config4.httpAuthSchemeProvider(), + credentials: config4.credentials() }; }; var resolveRuntimeExtensions2 = (runtimeConfig, extensions) => { @@ -338307,9 +338607,9 @@ var require_sts2 = __commonJS((exports) => { this.middlewareStack.use(getRecursionDetectionPlugin2(this.config)); this.middlewareStack.use(getHttpAuthSchemeEndpointRuleSetPlugin2(this.config, { httpAuthSchemeParametersProvider: defaultSTSHttpAuthSchemeParametersProvider, - identityProviderConfigProvider: async (config5) => new DefaultIdentityProviderConfig2({ - "aws.auth#sigv4": config5.credentials, - "aws.auth#sigv4a": config5.credentials + identityProviderConfigProvider: async (config4) => new DefaultIdentityProviderConfig2({ + "aws.auth#sigv4": config4.credentials, + "aws.auth#sigv4a": config4.credentials }) })); this.middlewareStack.use(getHttpSigningPlugin2(this.config)); @@ -338320,7 +338620,7 @@ var require_sts2 = __commonJS((exports) => { } var command3 = makeBuilder2(commonParams2, "AWSSecurityTokenServiceV20110615", "STSClient", getEndpointPlugin2); var _ep02 = {}; - var _mw02 = (Command3, cs2, config5, o4) => []; + var _mw02 = (Command3, cs2, config4, o4) => []; class AssumeRoleCommand extends command3(_ep02, _mw02, "AssumeRole", AssumeRole$) { } @@ -338438,8 +338738,8 @@ var require_sts2 = __commonJS((exports) => { return baseCtor; else return class CustomizableSTSClient extends baseCtor { - constructor(config5) { - super(config5); + constructor(config4) { + super(config4); for (const customization of customizations) { this.middlewareStack.use(customization); } @@ -338900,14 +339200,14 @@ function parseAiGatewayOptions(options4) { return headers; } var __defProp5, __defNormalProp2 = (obj, key, value8) => (key in obj) ? __defProp5(obj, key, { enumerable: true, configurable: true, writable: true, value: value8 }) : obj[key] = value8, __publicField = (obj, key, value8) => __defNormalProp2(obj, typeof key !== "symbol" ? key + "" : key, value8), CF_TEMP_TOKEN = "CF_TEMP_TOKEN", providers, AiGatewayInternalFetchError, AiGatewayDoesNotExist, AiGatewayUnauthorizedError, AiGatewayChatLanguageModel = class { - constructor(models, config5) { + constructor(models, config4) { __publicField(this, "specificationVersion", "v3"); __publicField(this, "defaultObjectGenerationMode", "json"); __publicField(this, "supportedUrls", {}); __publicField(this, "models"); __publicField(this, "config"); this.models = models; - this.config = config5; + this.config = config4; } get modelId() { if (!this.models[0]) { @@ -339685,7 +339985,7 @@ var init_loaders = __esm(async () => { }); // packages/unifia/src/provider/provider.ts -import path30 from "path"; +import path31 from "path"; var import_fuzzysort, Provider3; var init_provider2 = __esm(async () => { init_zod(); @@ -339915,12 +340215,12 @@ var init_provider2 = __esm(async () => { } Provider.fromModelsDevProvider = fromModelsDevProvider; const layer11 = exports_Layer.effect(Service3, exports_Effect.gen(function* () { - const config5 = yield* Config.Service; + const config4 = yield* Config.Service; const auth = yield* Auth.Service; const plugin = yield* Plugin.Service; - const state2 = yield* InstanceState.make(() => exports_Effect.gen(function* () { + const state = yield* InstanceState.make(() => exports_Effect.gen(function* () { using _3 = log12.time("state"); - const cfg = yield* config5.get(); + const cfg = yield* config4.get(); const modelsDev = yield* exports_Effect.promise(() => ModelsDev.get()); const database = i4(modelsDev, fromModelsDevProvider); const providers2 = {}; @@ -339931,7 +340231,7 @@ var init_provider2 = __esm(async () => { const discoveryLoaders = {}; const dep = { auth: (id2) => auth.get(id2).pipe(exports_Effect.orDie), - config: () => config5.get() + config: () => config4.get() }; log12.info("init"); function mergeProvider(providerID, provider) { @@ -340188,10 +340488,10 @@ var init_provider2 = __esm(async () => { }; })); const unsubscribeRefresh = ModelsDev.onRefresh(async () => { - await exports_Effect.runPromise(InstanceState.invalidateAll(state2)); + await exports_Effect.runPromise(InstanceState.invalidateAll(state)); }); yield* exports_Effect.addFinalizer(() => exports_Effect.sync(unsubscribeRefresh)); - const list2 = exports_Effect.fn("Provider.list")(() => InstanceState.use(state2, (s5) => s5.providers)); + const list2 = exports_Effect.fn("Provider.list")(() => InstanceState.use(state, (s5) => s5.providers)); async function resolveSDK(model, s5) { try { using _3 = log12.time("getSDK", { @@ -340313,9 +340613,9 @@ var init_provider2 = __esm(async () => { throw new Provider.InitError({ providerID: model.providerID }, { cause: e3 }); } } - const getProvider2 = exports_Effect.fn("Provider.getProvider")((providerID) => InstanceState.use(state2, (s5) => s5.providers[providerID])); + const getProvider2 = exports_Effect.fn("Provider.getProvider")((providerID) => InstanceState.use(state, (s5) => s5.providers[providerID])); const getModel2 = exports_Effect.fn("Provider.getModel")(function* (providerID, modelID) { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); const provider = s5.providers[providerID]; if (!provider) { const available3 = Object.keys(s5.providers); @@ -340331,7 +340631,7 @@ var init_provider2 = __esm(async () => { return info3; }); const getLanguage2 = exports_Effect.fn("Provider.getLanguage")(function* (model) { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); const key = `${model.providerID}/${model.id}`; if (s5.models.has(key)) return s5.models.get(key); @@ -340366,7 +340666,7 @@ var init_provider2 = __esm(async () => { }); }); const closest2 = exports_Effect.fn("Provider.closest")(function* (providerID, query2) { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); const provider = s5.providers[providerID]; if (!provider) return; @@ -340379,12 +340679,12 @@ var init_provider2 = __esm(async () => { return; }); const getSmallModel2 = exports_Effect.fn("Provider.getSmallModel")(function* (providerID) { - const cfg = yield* config5.get(); + const cfg = yield* config4.get(); if (cfg.small_model) { const parsed = parseModel(cfg.small_model); return yield* getModel2(parsed.providerID, parsed.modelID); } - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); const provider = s5.providers[providerID]; if (!provider) return; @@ -340432,11 +340732,11 @@ var init_provider2 = __esm(async () => { return; }); const defaultModel2 = exports_Effect.fn("Provider.defaultModel")(function* () { - const cfg = yield* config5.get(); + const cfg = yield* config4.get(); if (cfg.model) return parseModel(cfg.model); - const s5 = yield* InstanceState.get(state2); - const recent = yield* exports_Effect.promise(() => Filesystem.readJson(path30.join(Global.Path.state, "model.json")).then((x3) => Array.isArray(x3.recent) ? x3.recent : []).catch(() => [])); + const s5 = yield* InstanceState.get(state); + const recent = yield* exports_Effect.promise(() => Filesystem.readJson(path31.join(Global.Path.state, "model.json")).then((x3) => Array.isArray(x3.recent) ? x3.recent : []).catch(() => [])); for (const entry of recent) { const provider2 = s5.providers[entry.providerID]; if (!provider2) @@ -340601,15 +340901,15 @@ var init_schema8 = __esm(() => { }); // packages/unifia/src/tool/truncation-dir.ts -import path31 from "path"; +import path33 from "path"; var TRUNCATION_DIR; var init_truncation_dir = __esm(async () => { await init_global(); - TRUNCATION_DIR = path31.join(Global.Path.data, "tool-output"); + TRUNCATION_DIR = path33.join(Global.Path.data, "tool-output"); }); // packages/unifia/src/tool/truncate.ts -import path33 from "path"; +import path35 from "path"; var Truncate; var init_truncate = __esm(async () => { init_dist8(); @@ -340629,7 +340929,7 @@ var init_truncate = __esm(async () => { Truncate.MAX_LINES = 2000; Truncate.MAX_BYTES = 50 * 1024; Truncate.DIR = TRUNCATION_DIR; - Truncate.GLOB = path33.join(TRUNCATION_DIR, "*"); + Truncate.GLOB = path35.join(TRUNCATION_DIR, "*"); function hasTaskTool(agent) { if (!agent?.permission) return false; @@ -340647,7 +340947,7 @@ var init_truncate = __esm(async () => { for (const entry of entries10) { if (Identifier.timestamp(entry) >= cutoff) continue; - yield* fs15.remove(path33.join(TRUNCATION_DIR, entry)).pipe(exports_Effect.catch(() => exports_Effect.void)); + yield* fs15.remove(path35.join(TRUNCATION_DIR, entry)).pipe(exports_Effect.catch(() => exports_Effect.void)); } }); const output3 = exports_Effect.fn("Truncate.output")(function* (text7, options4 = {}, agent) { @@ -340689,7 +340989,7 @@ var init_truncate = __esm(async () => { const unit = hitBytes ? "bytes" : "lines"; const preview = out2.join(` `); - const file6 = path33.join(TRUNCATION_DIR, ToolID.ascending()); + const file6 = path35.join(TRUNCATION_DIR, ToolID.ascending()); yield* fs15.ensureDir(TRUNCATION_DIR).pipe(exports_Effect.orDie); yield* fs15.writeFileString(file6, text7).pipe(exports_Effect.orDie); const hint = hasTaskTool(agent) ? `The tool call succeeded but the output was truncated. Full output saved to: ${file6} @@ -341299,22 +341599,22 @@ var init_permission = __esm(async () => { Permission.Service = Service3; Permission.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const bus = yield* Bus.Service; - const state2 = yield* InstanceState.make(exports_Effect.fn("Permission.state")(function* (ctx) { + const state = yield* InstanceState.make(exports_Effect.fn("Permission.state")(function* (ctx) { const row = Database.use((db2) => db2.select().from(PermissionTable).where(eq(PermissionTable.project_id, ctx.project.id)).get()); - const state3 = { + const state2 = { pending: new Map, approved: row?.data ?? [] }; yield* exports_Effect.addFinalizer(() => exports_Effect.gen(function* () { - for (const item of state3.pending.values()) { + for (const item of state2.pending.values()) { yield* exports_Deferred.fail(item.deferred, new RejectedError); } - state3.pending.clear(); + state2.pending.clear(); })); - return state3; + return state2; })); const ask2 = exports_Effect.fn("Permission.ask")(function* (input) { - const { approved, pending: pending2 } = yield* InstanceState.get(state2); + const { approved, pending: pending2 } = yield* InstanceState.get(state); const { ruleset, ...request3 } = input; let needsAsk = false; for (const pattern of request3.patterns) { @@ -341345,7 +341645,7 @@ var init_permission = __esm(async () => { })); }); const reply2 = exports_Effect.fn("Permission.reply")(function* (input) { - const { approved, pending: pending2 } = yield* InstanceState.get(state2); + const { approved, pending: pending2 } = yield* InstanceState.get(state); const existing = pending2.get(input.requestID); if (!existing) return; @@ -341416,7 +341716,7 @@ var init_permission = __esm(async () => { } }); const list2 = exports_Effect.fn("Permission.list")(function* () { - const pending2 = (yield* InstanceState.get(state2)).pending; + const pending2 = (yield* InstanceState.get(state)).pending; return Array.from(pending2.values(), (item) => item.info); }); return Service3.of({ ask: ask2, reply: reply2, list: list2 }); @@ -341608,7 +341908,7 @@ var init_discovery = __esm(async () => { // packages/unifia/src/skill/index.ts import fs_native from "fs/promises"; import os12 from "os"; -import path35 from "path"; +import path36 from "path"; import { pathToFileURL as pathToFileURL5 } from "url"; var import_gray_matter2, Skill; var init_skill = __esm(async () => { @@ -341652,7 +341952,7 @@ var init_skill = __esm(async () => { expected: zod_default.string(), actual: zod_default.string() })); - const add11 = exports_Effect.fnUntraced(function* (state2, match17, bus) { + const add11 = exports_Effect.fnUntraced(function* (state, match17, bus) { const md = yield* exports_Effect.tryPromise({ try: () => ConfigMarkdown.parse(match17), catch: (err2) => err2 @@ -341668,22 +341968,22 @@ var init_skill = __esm(async () => { const parsed = Skill.Info.pick({ name: true, description: true }).safeParse(md.data); if (!parsed.success) return; - if (state2.skills[parsed.data.name]) { + if (state.skills[parsed.data.name]) { log12.warn("duplicate skill name", { name: parsed.data.name, - existing: state2.skills[parsed.data.name].location, + existing: state.skills[parsed.data.name].location, duplicate: match17 }); } - state2.dirs.add(path35.dirname(match17)); - state2.skills[parsed.data.name] = { + state.dirs.add(path36.dirname(match17)); + state.skills[parsed.data.name] = { name: parsed.data.name, description: parsed.data.description, location: match17, content: md.content }; }); - const scan5 = exports_Effect.fnUntraced(function* (state2, bus, root2, pattern, opts) { + const scan5 = exports_Effect.fnUntraced(function* (state, bus, root2, pattern, opts) { const matches = yield* exports_Effect.tryPromise({ try: () => Glob.scan(pattern, { cwd: root2, @@ -341699,46 +341999,46 @@ var init_skill = __esm(async () => { log12.error(`failed to scan ${opts.scope} skills`, { dir: root2, error: error49 }); return exports_Effect.succeed([]); })); - yield* exports_Effect.forEach(matches, (match17) => add11(state2, match17, bus), { + yield* exports_Effect.forEach(matches, (match17) => add11(state, match17, bus), { concurrency: "unbounded", discard: true }); }); - const loadSkills = exports_Effect.fnUntraced(function* (state2, config5, discovery, bus, fsys, directory, worktree) { + const loadSkills = exports_Effect.fnUntraced(function* (state, config4, discovery, bus, fsys, directory, worktree) { if (!Flag.UNIFIA_DISABLE_EXTERNAL_SKILLS) { for (const dir2 of EXTERNAL_DIRS) { - const root2 = path35.join(Global.Path.home, dir2); + const root2 = path36.join(Global.Path.home, dir2); if (!(yield* fsys.isDir(root2))) continue; - yield* scan5(state2, bus, root2, EXTERNAL_SKILL_PATTERN, { dot: true, scope: "global" }); + yield* scan5(state, bus, root2, EXTERNAL_SKILL_PATTERN, { dot: true, scope: "global" }); } const upDirs = yield* fsys.up({ targets: EXTERNAL_DIRS, start: directory, stop: worktree }).pipe(exports_Effect.catch(() => exports_Effect.succeed([]))); for (const root2 of upDirs) { - yield* scan5(state2, bus, root2, EXTERNAL_SKILL_PATTERN, { dot: true, scope: "project" }); + yield* scan5(state, bus, root2, EXTERNAL_SKILL_PATTERN, { dot: true, scope: "project" }); } } - const configDirs = yield* config5.directories(); + const configDirs = yield* config4.directories(); for (const dir2 of configDirs) { - yield* scan5(state2, bus, dir2, OPENCODE_SKILL_PATTERN); + yield* scan5(state, bus, dir2, OPENCODE_SKILL_PATTERN); } - const cfg = yield* config5.get(); + const cfg = yield* config4.get(); for (const item of cfg.skills?.paths ?? []) { - const expanded = item.startsWith("~/") ? path35.join(os12.homedir(), item.slice(2)) : item; - const dir2 = path35.isAbsolute(expanded) ? expanded : path35.join(directory, expanded); + const expanded = item.startsWith("~/") ? path36.join(os12.homedir(), item.slice(2)) : item; + const dir2 = path36.isAbsolute(expanded) ? expanded : path36.join(directory, expanded); if (!(yield* fsys.isDir(dir2))) { log12.warn("skill path not found", { path: dir2 }); continue; } - yield* scan5(state2, bus, dir2, SKILL_PATTERN); + yield* scan5(state, bus, dir2, SKILL_PATTERN); } for (const url4 of cfg.skills?.urls ?? []) { const pulledDirs = yield* discovery.pull(url4); for (const dir2 of pulledDirs) { - state2.dirs.add(dir2); - yield* scan5(state2, bus, dir2, SKILL_PATTERN); + state.dirs.add(dir2); + yield* scan5(state, bus, dir2, SKILL_PATTERN); } } - log12.info("init", { count: Object.keys(state2.skills).length }); + log12.info("init", { count: Object.keys(state.skills).length }); }); class Service3 extends exports_ServiceMap.Service()("@opencode/Skill") { @@ -341746,35 +342046,35 @@ var init_skill = __esm(async () => { Skill.Service = Service3; Skill.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const discovery = yield* Discovery.Service; - const config5 = yield* Config.Service; + const config4 = yield* Config.Service; const bus = yield* Bus.Service; const fsys = yield* AppFileSystem.Service; - const state2 = yield* InstanceState.make(exports_Effect.fn("Skill.state")(function* (ctx) { + const state = yield* InstanceState.make(exports_Effect.fn("Skill.state")(function* (ctx) { const s5 = { skills: {}, dirs: new Set }; - yield* loadSkills(s5, config5, discovery, bus, fsys, ctx.directory, ctx.worktree); + yield* loadSkills(s5, config4, discovery, bus, fsys, ctx.directory, ctx.worktree); return s5; })); const get35 = exports_Effect.fn("Skill.get")(function* (name26) { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); return s5.skills[name26]; }); const all8 = exports_Effect.fn("Skill.all")(function* () { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); return Object.values(s5.skills); }); const dirs2 = exports_Effect.fn("Skill.dirs")(function* () { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); return Array.from(s5.dirs); }); const available4 = exports_Effect.fn("Skill.available")(function* (agent) { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); const list = Object.values(s5.skills).toSorted((a5, b3) => a5.name.localeCompare(b3.name)); if (!agent) return list; return list.filter((skill) => Permission2.evaluate("skill", skill.name, agent.permission).action !== "deny"); }); const install2 = exports_Effect.fn("Skill.install")(function* (url4) { - const globalSkillsDir = path35.join(Global.Path.home, ".claude", "skills"); + const globalSkillsDir = path36.join(Global.Path.home, ".claude", "skills"); const fail19 = (message) => exports_Effect.fail(new Error(`[skill install] ${message}`)); const isDirectMd = url4.endsWith(".md") || url4.toLowerCase().includes("skill.md"); if (isDirectMd) { @@ -341797,21 +342097,21 @@ var init_skill = __esm(async () => { if (!parsed.success) return yield* fail19("champs `name` ou `description` manquants dans le frontmatter"); const { name: name26, description } = parsed.data; - const dest = path35.join(globalSkillsDir, name26, "SKILL.md"); + const dest = path36.join(globalSkillsDir, name26, "SKILL.md"); const body3 = parsed_matter.content.trim(); - yield* exports_Effect.tryPromise(() => fs_native.mkdir(path35.dirname(dest), { recursive: true })); + yield* exports_Effect.tryPromise(() => fs_native.mkdir(path36.dirname(dest), { recursive: true })); yield* exports_Effect.tryPromise(() => fs_native.writeFile(dest, content, "utf8")); const info3 = { name: name26, description, location: dest, content: body3 }; - const s6 = yield* InstanceState.get(state2); + const s6 = yield* InstanceState.get(state); s6.skills[name26] = info3; - s6.dirs.add(path35.dirname(dest)); + s6.dirs.add(path36.dirname(dest)); log12.info("skill installed", { name: name26, url: url4 }); return info3; } const dirs3 = yield* discovery.pull(url4); if (dirs3.length === 0) return yield* fail19("aucun skill trouv\xE9 \xE0 cette URL"); - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); let lastInfo; for (const dir2 of dirs3) { yield* scan5(s5, bus, dir2, SKILL_PATTERN); @@ -341824,12 +342124,12 @@ var init_skill = __esm(async () => { return lastInfo; }); const uninstall2 = exports_Effect.fn("Skill.uninstall")(function* (name26) { - const s5 = yield* InstanceState.get(state2); + const s5 = yield* InstanceState.get(state); const skill = s5.skills[name26]; if (!skill) return; - const globalSkillsDir = path35.join(Global.Path.home, ".claude", "skills"); - const skillDir = path35.dirname(skill.location); + const globalSkillsDir = path36.join(Global.Path.home, ".claude", "skills"); + const skillDir = path36.dirname(skill.location); if (skillDir.startsWith(globalSkillsDir)) { yield* exports_Effect.tryPromise({ try: () => fs_native.rm(skillDir, { recursive: true, force: true }), @@ -341893,7 +342193,7 @@ var init_skill = __esm(async () => { }); // packages/unifia/src/agent/agent.ts -import path36 from "path"; +import path37 from "path"; var Agent2; var init_agent = __esm(async () => { init_zod(); @@ -341960,14 +342260,14 @@ var init_agent = __esm(async () => { } Agent.Service = Service3; Agent.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { - const config5 = yield* Config.Service; + const config4 = yield* Config.Service; const auth = yield* Auth.Service; const skill = yield* Skill.Service; const provider = yield* Provider3.Service; - const state2 = yield* InstanceState.make(exports_Effect.fn("Agent.state")(function* (_ctx) { - const cfg = yield* config5.get(); + const state = yield* InstanceState.make(exports_Effect.fn("Agent.state")(function* (_ctx) { + const cfg = yield* config4.get(); const skillDirs = yield* skill.dirs(); - const whitelistedDirs = [Truncate.GLOB, ...skillDirs.map((dir2) => path36.join(dir2, "*"))]; + const whitelistedDirs = [Truncate.GLOB, ...skillDirs.map((dir2) => path37.join(dir2, "*"))]; const defaults3 = Permission2.fromConfig({ "*": "allow", doom_loop: "ask", @@ -342030,12 +342330,12 @@ var init_agent = __esm(async () => { question: "allow", plan_exit: "allow", external_directory: { - [path36.join(Global.Path.data, "plans", "*")]: "allow" + [path37.join(Global.Path.data, "plans", "*")]: "allow" }, edit: { "*": "deny", - [path36.join(".opencode", "plans", "*.md")]: "allow", - [path36.relative(Instance.worktree, path36.join(Global.Path.data, path36.join("plans", "*.md")))]: "allow" + [path37.join(".opencode", "plans", "*.md")]: "allow", + [path37.relative(Instance.worktree, path37.join(Global.Path.data, path37.join("plans", "*.md")))]: "allow" } }), user), mode: "primary", @@ -342257,11 +342557,11 @@ var init_agent = __esm(async () => { return agents[agent]; }); const list2 = exports_Effect.fnUntraced(function* () { - const cfg2 = yield* config5.get(); + const cfg2 = yield* config4.get(); return C3(agents, r(), a2([(x3) => cfg2.default_agent ? x3.name === cfg2.default_agent : x3.name === "build", "desc"], [(x3) => x3.name, "asc"])); }); const defaultAgent2 = exports_Effect.fnUntraced(function* () { - const c3 = yield* config5.get(); + const c3 = yield* config4.get(); if (c3.default_agent) { const agent = agents[c3.default_agent]; if (agent && agent.mode !== "subagent" && agent.hidden !== true) @@ -342281,22 +342581,22 @@ var init_agent = __esm(async () => { })); return Service3.of({ get: exports_Effect.fn("Agent.get")(function* (agent) { - return yield* InstanceState.useEffect(state2, (s5) => s5.get(agent)); + return yield* InstanceState.useEffect(state, (s5) => s5.get(agent)); }), list: exports_Effect.fn("Agent.list")(function* () { - return yield* InstanceState.useEffect(state2, (s5) => s5.list()); + return yield* InstanceState.useEffect(state, (s5) => s5.list()); }), defaultAgent: exports_Effect.fn("Agent.defaultAgent")(function* () { - return yield* InstanceState.useEffect(state2, (s5) => s5.defaultAgent()); + return yield* InstanceState.useEffect(state, (s5) => s5.defaultAgent()); }), generate: exports_Effect.fn("Agent.generate")(function* (input) { - const cfg = yield* config5.get(); + const cfg = yield* config4.get(); const model = input.model ?? (yield* provider.defaultModel()); const resolved = yield* provider.getModel(model.providerID, model.modelID); const language = yield* provider.getLanguage(resolved); const system = [generate_default]; yield* exports_Effect.promise(() => Plugin.trigger("experimental.chat.system.transform", { model: resolved }, { system })); - const existing = yield* InstanceState.useEffect(state2, (s5) => s5.list()); + const existing = yield* InstanceState.useEffect(state, (s5) => s5.list()); const params = { experimental_telemetry: { isEnabled: cfg.experimental?.openTelemetry, @@ -342993,7 +343293,7 @@ var init_auto_config = __esm(() => { }); // packages/unifia/src/local-llm-server/index.ts -import path37 from "path"; +import path38 from "path"; import os14 from "os"; import fs15 from "fs"; import net from "net"; @@ -343002,16 +343302,16 @@ function resolveTmpDir() { if (envTmp && envTmp.trim()) return envTmp.trim(); if (process.env.HOME) - return path37.join(process.env.HOME, ".cache", "tmp"); + return path38.join(process.env.HOME, ".cache", "tmp"); return os14.tmpdir(); } function initPaths() { if (_pathsReady) return; - BASE_DIR = path37.join(resolveTmpDir(), `opencode-llm-${PORT}`); - REF_DIR = path37.join(BASE_DIR, "refs"); - OWNER_FILE = path37.join(BASE_DIR, "owner.pid"); - LOCK_FILE = path37.join(BASE_DIR, "start.lock"); + BASE_DIR = path38.join(resolveTmpDir(), `opencode-llm-${PORT}`); + REF_DIR = path38.join(BASE_DIR, "refs"); + OWNER_FILE = path38.join(BASE_DIR, "owner.pid"); + LOCK_FILE = path38.join(BASE_DIR, "start.lock"); _pathsReady = true; } function recordRestart() { @@ -343074,21 +343374,21 @@ var init_local_llm_server = __esm(async () => { const isDev = true; const names = isDev ? ["ai.opencode.desktop.dev", "ai.opencode.desktop"] : ["ai.opencode.desktop", "ai.opencode.desktop.dev"]; if (process.platform === "win32") { - const appdata = process.env.APPDATA ?? path37.join(home, "AppData", "Roaming"); - return names.map((n10) => path37.join(appdata, n10)); + const appdata = process.env.APPDATA ?? path38.join(home, "AppData", "Roaming"); + return names.map((n10) => path38.join(appdata, n10)); } if (process.platform === "darwin") { - return names.map((n10) => path37.join(home, "Library", "Application Support", n10)); + return names.map((n10) => path38.join(home, "Library", "Application Support", n10)); } - return names.map((n10) => path37.join(home, ".local", "share", n10)); + return names.map((n10) => path38.join(home, ".local", "share", n10)); } async function findRuntimeDir() { const envDir = process.env.OPENCODE_LLAMA_RUNTIME_DIR; - if (envDir && fs15.existsSync(path37.join(envDir, exeName()))) + if (envDir && fs15.existsSync(path38.join(envDir, exeName()))) return envDir; for (const candidate of candidateDirs()) { - const runtime4 = path37.join(candidate, "llama-runtime"); - if (fs15.existsSync(path37.join(runtime4, exeName()))) + const runtime4 = path38.join(candidate, "llama-runtime"); + if (fs15.existsSync(path38.join(runtime4, exeName()))) return runtime4; } return null; @@ -343097,8 +343397,8 @@ var init_local_llm_server = __esm(async () => { const runtimeDir = await findRuntimeDir(); if (!runtimeDir) return null; - const serverExe = path37.join(runtimeDir, exeName()); - const modelsDir = process.env.OPENCODE_LLAMA_MODELS_DIR ?? path37.join(path37.dirname(runtimeDir), "models"); + const serverExe = path38.join(runtimeDir, exeName()); + const modelsDir = process.env.OPENCODE_LLAMA_MODELS_DIR ?? path38.join(path38.dirname(runtimeDir), "models"); if (!fs15.existsSync(modelsDir)) return null; const files = fs15.readdirSync(modelsDir).filter((f5) => f5.toLowerCase().endsWith(".gguf")); @@ -343113,7 +343413,7 @@ var init_local_llm_server = __esm(async () => { } if (!gguf) return null; - return { serverExe, modelPath: path37.join(modelsDir, gguf), modelFile: gguf }; + return { serverExe, modelPath: path38.join(modelsDir, gguf), modelFile: gguf }; } function isPortOpen() { return new Promise((resolve11) => { @@ -343148,7 +343448,7 @@ var init_local_llm_server = __esm(async () => { return null; const data2 = await res.json(); const raw3 = data2.default_generation_settings?.model ?? data2.model_path ?? null; - return raw3 ? path37.basename(raw3) : null; + return raw3 ? path38.basename(raw3) : null; } catch { return null; } @@ -343165,7 +343465,7 @@ var init_local_llm_server = __esm(async () => { } function refPath(pid = process.pid) { initPaths(); - return path37.join(REF_DIR, `${pid}.ref`); + return path38.join(REF_DIR, `${pid}.ref`); } function registerRef() { if (_refRegistered) @@ -343200,7 +343500,7 @@ var init_local_llm_server = __esm(async () => { const pid = parseInt(entry.replace(/\.ref$/, ""), 10); if (!Number.isInteger(pid) || pid <= 0) { try { - fs15.unlinkSync(path37.join(REF_DIR, entry)); + fs15.unlinkSync(path38.join(REF_DIR, entry)); } catch {} continue; } @@ -343208,7 +343508,7 @@ var init_local_llm_server = __esm(async () => { alive.push(entry); } else { try { - fs15.unlinkSync(path37.join(REF_DIR, entry)); + fs15.unlinkSync(path38.join(REF_DIR, entry)); } catch {} } } @@ -343353,7 +343653,7 @@ var init_local_llm_server = __esm(async () => { kv_cache_type: kvCache, context_size: ctxSize }; - fs15.writeFileSync(path37.join(BASE_DIR, "llm_config.json"), JSON.stringify(shared3)); + fs15.writeFileSync(path38.join(BASE_DIR, "llm_config.json"), JSON.stringify(shared3)); } catch (e3) { log18.warn("Failed to write shared llm_config.json", { err: String(e3) }); } @@ -343385,7 +343685,7 @@ var init_local_llm_server = __esm(async () => { "--mmap", "--slots", "--slot-save-path", - path37.join(BASE_DIR, "kv-slots"), + path38.join(BASE_DIR, "kv-slots"), "--cache-reuse", "256", "--swa-full" @@ -343393,7 +343693,7 @@ var init_local_llm_server = __esm(async () => { if (useFit) args3.push("--fit", "on", "-fitt", "512", "-fitc", "16384"); try { - fs15.mkdirSync(path37.join(BASE_DIR, "kv-slots"), { recursive: true }); + fs15.mkdirSync(path38.join(BASE_DIR, "kv-slots"), { recursive: true }); } catch (e3) { log18.warn("Failed to create kv-slots dir", { err: String(e3) }); } @@ -343402,10 +343702,10 @@ var init_local_llm_server = __esm(async () => { if (env7 && fs15.existsSync(env7)) return env7; try { - const dir2 = path37.dirname(modelPath); + const dir2 = path38.dirname(modelPath); const candidates = fs15.readdirSync(dir2).filter((f5) => f5.toLowerCase().endsWith(".gguf")).filter((f5) => /(-0\.?5b-|-draft)/i.test(f5)); if (candidates.length > 0) - return path37.join(dir2, candidates[0]); + return path38.join(dir2, candidates[0]); } catch {} return null; })(); @@ -343415,13 +343715,13 @@ var init_local_llm_server = __esm(async () => { if (vramHeadroomMb >= 4096 || force) { args3.push("--model-draft", draftPath, "--draft-max", "16", "--draft-min", "5"); log18.info("speculative decoding enabled", { - draft: path37.basename(draftPath), + draft: path38.basename(draftPath), vramHeadroomMb, forced: force }); } else { log18.warn("skipping speculative decoding: insufficient VRAM headroom", { - draft: path37.basename(draftPath), + draft: path38.basename(draftPath), modelSizeMb, vramMb: profile.vramMb, vramHeadroomMb, @@ -343596,14 +343896,14 @@ ${stderrBuf.read() || ""}`); if (!home) return null; try { - const name26 = fs15.readFileSync(path37.join(path37.dirname(home), "llm_ipc", "blocked"), "utf8").trim(); + const name26 = fs15.readFileSync(path38.join(path38.dirname(home), "llm_ipc", "blocked"), "utf8").trim(); return name26 ? { name: name26 } : null; } catch { return null; } } async function ensureRunning(modelID, signal) { - if (process.env.OPENCODE_CLIENT === "mobile-embedded") { + if (process.env.UNIFIA_CLIENT === "mobile-embedded") { const blockedMsg = (m3) => `[LocalLLMServer] Mobile JNI model load is blocked: ${m3.name} crashed the app repeatedly while loading. Select a smaller model in Settings.`; let blocked = readMobileBlockedMarker(); if (blocked) @@ -343736,7 +344036,7 @@ var init_selection = __esm(async () => { return selection; } TeamSelectionStore.set = set25; - async function snapshot4(sessionID) { + async function snapshot3(sessionID) { const existing = await getSession(sessionID); if (existing) return existing; @@ -343746,7 +344046,7 @@ var init_selection = __esm(async () => { await set25(sessionID, selection); return selection; } - TeamSelectionStore.snapshot = snapshot4; + TeamSelectionStore.snapshot = snapshot3; })(TeamSelectionStore ||= {}); }); @@ -349023,10 +349323,10 @@ var init_stream_adapter = () => {}; // node_modules/@zip.js/zip.js/lib/core/configuration.js function getConfiguration() { - return config5; + return config4; } -function getChunkSize(config6) { - return Math.max(config6.chunkSize, MINIMUM_CHUNK_SIZE); +function getChunkSize(config5) { + return Math.max(config5.chunkSize, MINIMUM_CHUNK_SIZE); } function configure(configuration) { const { @@ -349049,40 +349349,40 @@ function configure(configuration) { setIfDefined("useCompressionStream", useCompressionStream); setIfDefined("useWebWorkers", useWebWorkers); if (Deflate2) { - config5.CompressionStream = new StreamAdapter2(Deflate2); + config4.CompressionStream = new StreamAdapter2(Deflate2); } if (Inflate2) { - config5.DecompressionStream = new StreamAdapter2(Inflate2); + config4.DecompressionStream = new StreamAdapter2(Inflate2); } setIfDefined("CompressionStream", CompressionStream2); setIfDefined("DecompressionStream", DecompressionStream2); if (workerScripts !== UNDEFINED_VALUE) { const { deflate, inflate } = workerScripts; if (deflate || inflate) { - if (!config5.workerScripts) { - config5.workerScripts = {}; + if (!config4.workerScripts) { + config4.workerScripts = {}; } } if (deflate) { if (!Array.isArray(deflate)) { throw new Error("workerScripts.deflate must be an array"); } - config5.workerScripts.deflate = deflate; + config4.workerScripts.deflate = deflate; } if (inflate) { if (!Array.isArray(inflate)) { throw new Error("workerScripts.inflate must be an array"); } - config5.workerScripts.inflate = inflate; + config4.workerScripts.inflate = inflate; } } } function setIfDefined(propertyName, propertyValue) { if (propertyValue !== UNDEFINED_VALUE) { - config5[propertyName] = propertyValue; + config4[propertyName] = propertyValue; } } -var MINIMUM_CHUNK_SIZE = 64, maxWorkers = 2, DEFAULT_CONFIGURATION, config5; +var MINIMUM_CHUNK_SIZE = 64, maxWorkers = 2, DEFAULT_CONFIGURATION, config4; var init_configuration = __esm(() => { init_constants5(); init_stream_adapter(); @@ -349101,7 +349401,7 @@ var init_configuration = __esm(() => { CompressionStreamNative: typeof CompressionStream != UNDEFINED_TYPE && CompressionStream, DecompressionStreamNative: typeof DecompressionStream != UNDEFINED_TYPE && DecompressionStream }; - config5 = Object.assign({}, DEFAULT_CONFIGURATION); + config4 = Object.assign({}, DEFAULT_CONFIGURATION); }); // node_modules/@zip.js/zip.js/lib/core/util/default-mime-type.js @@ -351764,7 +352064,7 @@ var MESSAGE_EVENT_TYPE = "message", MESSAGE_START = "start", MESSAGE_PULL = "pul var init_codec_stream = __esm(() => { init_zip_entry_stream(); CodecStream = class CodecStream extends TransformStream { - constructor(options4, config6) { + constructor(options4, config5) { super({}); const codec4 = this; const { codecType } = options4; @@ -351776,7 +352076,7 @@ var init_codec_stream = __esm(() => { } let outputSize = 0; let inputSize = 0; - const stream4 = new Stream6(options4, config6); + const stream4 = new Stream6(options4, config5); const readable = super.readable; const inputSizeStream = new TransformStream({ transform(chunk, controller) { @@ -351846,11 +352146,11 @@ var init_codec_stream = __esm(() => { // node_modules/@zip.js/zip.js/lib/core/codec-worker.js class CodecWorker { - constructor(workerData, { readable, writable }, { options: options4, config: config6, streamOptions, useWebWorkers, transferStreams, scripts }, onTaskFinished) { + constructor(workerData, { readable, writable }, { options: options4, config: config5, streamOptions, useWebWorkers, transferStreams, scripts }, onTaskFinished) { const { signal } = streamOptions; Object.assign(workerData, { busy: true, - readable: readable.pipeThrough(new ChunkStream(config6.chunkSize)).pipeThrough(new ProgressWatcherStream(readable, streamOptions), { signal }), + readable: readable.pipeThrough(new ChunkStream(config5.chunkSize)).pipeThrough(new ProgressWatcherStream(readable, streamOptions), { signal }), writable, options: Object.assign({}, options4), scripts, @@ -351883,7 +352183,7 @@ class CodecWorker { onTaskFinished(workerData); } }); - return (useWebWorkers && WEB_WORKERS_SUPPORTED ? createWebWorkerInterface : createWorkerInterface)(workerData, config6); + return (useWebWorkers && WEB_WORKERS_SUPPORTED ? createWebWorkerInterface : createWorkerInterface)(workerData, config5); } } async function callHandler(handler, ...parameters) { @@ -351891,20 +352191,20 @@ async function callHandler(handler, ...parameters) { await handler(...parameters); } catch (_3) {} } -function createWorkerInterface(workerData, config6) { +function createWorkerInterface(workerData, config5) { return { - run: () => runWorker(workerData, config6) + run: () => runWorker(workerData, config5) }; } -function createWebWorkerInterface(workerData, config6) { - const { baseURL, chunkSize } = config6; +function createWebWorkerInterface(workerData, config5) { + const { baseURL, chunkSize } = config5; if (!workerData.interface) { let worker; try { worker = getWebWorker(workerData.scripts[0], baseURL, workerData); } catch (_3) { WEB_WORKERS_SUPPORTED = false; - return createWorkerInterface(workerData, config6); + return createWorkerInterface(workerData, config5); } Object.assign(workerData, { worker, @@ -351915,9 +352215,9 @@ function createWebWorkerInterface(workerData, config6) { } return workerData.interface; } -async function runWorker({ options: options4, readable, writable, onTaskFinished }, config6) { +async function runWorker({ options: options4, readable, writable, onTaskFinished }, config5) { try { - const codecStream = new CodecStream(options4, config6); + const codecStream = new CodecStream(options4, config5); await readable.pipeThrough(codecStream).pipeTo(writable, { preventClose: true, preventAbort: true }); const { signature, @@ -351933,7 +352233,7 @@ async function runWorker({ options: options4, readable, writable, onTaskFinished onTaskFinished(); } } -async function runWebWorker(workerData, config6) { +async function runWebWorker(workerData, config5) { let resolveResult, rejectResult; const result6 = new Promise((resolve11, reject) => { resolveResult = resolve11; @@ -351952,7 +352252,7 @@ async function runWebWorker(workerData, config6) { type: MESSAGE_START, scripts: scripts.slice(1), options: options4, - config: config6, + config: config5, readable, writable }, workerData); @@ -352128,14 +352428,14 @@ var init_codec_worker = __esm(() => { // node_modules/@zip.js/zip.js/lib/core/codec-pool.js async function runWorker2(stream4, workerOptions) { - const { options: options4, config: config6 } = workerOptions; + const { options: options4, config: config5 } = workerOptions; const { transferStreams, useWebWorkers, useCompressionStream, codecType, compressed, signed, encrypted } = options4; - const { workerScripts, maxWorkers: maxWorkers2 } = config6; + const { workerScripts, maxWorkers: maxWorkers2 } = config5; workerOptions.transferStreams = transferStreams || transferStreams === UNDEFINED_VALUE; const streamCopy = !compressed && !signed && !encrypted && !workerOptions.transferStreams; - workerOptions.useWebWorkers = !streamCopy && (useWebWorkers || useWebWorkers === UNDEFINED_VALUE && config6.useWebWorkers); + workerOptions.useWebWorkers = !streamCopy && (useWebWorkers || useWebWorkers === UNDEFINED_VALUE && config5.useWebWorkers); workerOptions.scripts = workerOptions.useWebWorkers && workerScripts ? workerScripts[codecType] : []; - options4.useCompressionStream = useCompressionStream || useCompressionStream === UNDEFINED_VALUE && config6.useCompressionStream; + options4.useCompressionStream = useCompressionStream || useCompressionStream === UNDEFINED_VALUE && config5.useCompressionStream; return (await getWorker()).run(); async function getWorker() { const workerData = pool.find((workerData2) => !workerData2.busy); @@ -352164,8 +352464,8 @@ async function runWorker2(stream4, workerOptions) { } } function terminateWorker(workerData, workerOptions) { - const { config: config6 } = workerOptions; - const { terminateWorkerTimeout } = config6; + const { config: config5 } = workerOptions; + const { terminateWorkerTimeout } = config5; if (Number.isFinite(terminateWorkerTimeout) && terminateWorkerTimeout >= 0) { if (workerData.terminated) { workerData.terminated = false; @@ -352536,7 +352836,7 @@ class ZipReader { async* getEntriesGenerator(options4 = {}) { const zipReader = this; let { reader } = zipReader; - const { config: config6 } = zipReader; + const { config: config5 } = zipReader; await initStream(reader); if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) { reader = new BlobReader(await new Response(reader.readable).blob()); @@ -352545,7 +352845,7 @@ class ZipReader { if (reader.size < END_OF_CENTRAL_DIR_LENGTH) { throw new Error(ERR_BAD_FORMAT); } - reader.chunkSize = getChunkSize(config6); + reader.chunkSize = getChunkSize(config5); const endOfDirectoryInfo = await seekSignature(reader, END_OF_CENTRAL_DIR_SIGNATURE, reader.size, END_OF_CENTRAL_DIR_LENGTH, MAX_16_BITS * 16); if (!endOfDirectoryInfo) { const signatureArray = await readUint8Array(reader, 0, 4); @@ -352636,7 +352936,7 @@ class ZipReader { const filenameEncoding = getOptionValue(zipReader, options4, "filenameEncoding"); const commentEncoding = getOptionValue(zipReader, options4, "commentEncoding"); for (let indexFile = 0;indexFile < filesLength; indexFile++) { - const fileEntry = new ZipEntry(reader, config6, zipReader.options); + const fileEntry = new ZipEntry(reader, config5, zipReader.options); if (getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) { throw new Error(ERR_CENTRAL_DIRECTORY_NOT_FOUND); } @@ -352730,10 +353030,10 @@ class ZipReader { } class ZipEntry { - constructor(reader, config6, options4) { + constructor(reader, config5, options4) { Object.assign(this, { reader, - config: config6, + config: config5, options: options4 }); } @@ -352745,7 +353045,7 @@ class ZipEntry { diskNumberStart, extraFieldAES, compressionMethod, - config: config6, + config: config5, bitFlag, signature, rawLastModDate, @@ -352824,7 +353124,7 @@ class ZipEntry { transferStreams: getOptionValue(zipEntry, options4, "transferStreams"), checkPasswordOnly }, - config: config6, + config: config5, streamOptions: { signal, size: size24, onstart, onprogress, onend } }; let outputSize = 0; @@ -353160,7 +353460,7 @@ var init_zip = __esm(() => { }); // packages/unifia/src/file/ripgrep.ts -import path38 from "path"; +import path39 from "path"; import fs17 from "fs/promises"; import { text as text7 } from "stream/consumers"; var Ripgrep; @@ -353262,7 +353562,7 @@ var init_ripgrep = __esm(async () => { url: zod_default.string(), status: zod_default.number() })); - const state2 = lazy2(async () => { + const state = lazy2(async () => { const system = which("rg"); if (system) { const stat4 = await fs17.stat(system).catch(() => { @@ -353272,22 +353572,22 @@ var init_ripgrep = __esm(async () => { return { filepath: system }; log12.warn("bun.which returned invalid rg path", { filepath: system }); } - const filepath2 = path38.join(Global.Path.bin, "rg" + (process.platform === "win32" ? ".exe" : "")); + const filepath2 = path39.join(Global.Path.bin, "rg" + (process.platform === "win32" ? ".exe" : "")); if (!await Filesystem.exists(filepath2)) { const platformKey = `${process.arch}-${process.platform}`; - const config6 = PLATFORM[platformKey]; - if (!config6) + const config5 = PLATFORM[platformKey]; + if (!config5) throw new Ripgrep.UnsupportedPlatformError({ platform: platformKey }); const version6 = "14.1.1"; - const filename = `ripgrep-${version6}-${config6.platform}.${config6.extension}`; + const filename = `ripgrep-${version6}-${config5.platform}.${config5.extension}`; const url4 = `https://github.com/BurntSushi/ripgrep/releases/download/${version6}/${filename}`; const response = await fetch(url4); if (!response.ok) throw new Ripgrep.DownloadFailedError({ url: url4, status: response.status }); const arrayBuffer = await response.arrayBuffer(); - const archivePath = path38.join(Global.Path.bin, filename); + const archivePath = path39.join(Global.Path.bin, filename); await Filesystem.write(archivePath, Buffer.from(arrayBuffer)); - if (config6.extension === "tar.gz") { + if (config5.extension === "tar.gz") { const args3 = ["tar", "-xzf", archivePath, "--strip-components=1"]; if (platformKey.endsWith("-darwin")) args3.push("--include=*/rg"); @@ -353307,7 +353607,7 @@ var init_ripgrep = __esm(async () => { }); } } - if (config6.extension === "zip") { + if (config5.extension === "zip") { const zipFileReader = new ZipReader(new BlobReader(new Blob([arrayBuffer]))); const entries10 = await zipFileReader.getEntries(); let rgEntry; @@ -353342,7 +353642,7 @@ var init_ripgrep = __esm(async () => { }; }); async function filepath() { - const { filepath: filepath2 } = await state2(); + const { filepath: filepath2 } = await state(); return filepath2; } Ripgrep.filepath = filepath; @@ -353409,9 +353709,9 @@ var init_ripgrep = __esm(async () => { } const root2 = { name: "", children: new Map }; for (const file6 of files2) { - if (file6.includes(".opencode")) + if (file6.includes(".opencode") || file6.includes(".unifia")) continue; - const parts3 = file6.split(path38.sep); + const parts3 = file6.split(path39.sep); if (parts3.length < 2) continue; let node = root2; @@ -353477,7 +353777,7 @@ var init_ripgrep = __esm(async () => { }); // packages/unifia/src/session/prompt/anthropic.txt -var anthropic_default = `You are OpenCode, the best coding agent on the planet. +var anthropic_default = `You are Unifia, the best coding agent on the planet. You are an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user. @@ -353486,9 +353786,9 @@ IMPORTANT: You must NEVER generate or guess URLs for the user unless you are con If the user asks for help or wants to give feedback inform them of the following: - ctrl+p to list available actions - To give feedback, users should report the issue at - https://github.com/anomalyco/opencode + https://github.com/Rwanbt/unifia/issues -When the user directly asks about OpenCode (eg. "can OpenCode do...", "does OpenCode have..."), or asks in second person (eg. "are you able...", "can you do..."), or asks how to use a specific OpenCode feature (eg. implement a hook, write a slash command, or install an MCP server), use the WebFetch tool to gather information to answer the question from OpenCode docs. The list of available docs is available at https://opencode.ai/docs +When the user directly asks about Unifia (eg. "can Unifia do...", "does Unifia have..."), or asks in second person (eg. "are you able...", "can you do..."), or asks how to use a specific Unifia feature (eg. implement a hook, write a slash command, or install an MCP server), use the WebFetch tool to gather information to answer the question from the Unifia documentation at https://github.com/Rwanbt/unifia # Tone and style - Only use emojis if the user explicitly requests it. Avoid using emojis in all communication unless asked. @@ -353497,7 +353797,7 @@ When the user directly asks about OpenCode (eg. "can OpenCode do...", "does Open - NEVER create files unless they're absolutely necessary for achieving your goal. ALWAYS prefer editing an existing file to creating a new one. This includes markdown files. # Professional objectivity -Prioritize technical accuracy and truthfulness over validating the user's beliefs. Focus on facts and problem-solving, providing direct, objective technical info without any unnecessary superlatives, praise, or emotional validation. It is best for the user if OpenCode honestly applies the same rigorous standards to all ideas and disagrees when necessary, even if it may not be what the user wants to hear. Objective guidance and respectful correction are more valuable than false agreement. Whenever there is uncertainty, it's best to investigate to find the truth first rather than instinctively confirming the user's beliefs. +Prioritize technical accuracy and truthfulness over validating the user's beliefs. Focus on facts and problem-solving, providing direct, objective technical info without any unnecessary superlatives, praise, or emotional validation. It is best for the user if Unifia honestly applies the same rigorous standards to all ideas and disagrees when necessary, even if it may not be what the user wants to hear. Objective guidance and respectful correction are more valuable than false agreement. Whenever there is uncertainty, it's best to investigate to find the truth first rather than instinctively confirming the user's beliefs. # Task Management You have access to the TodoWrite tools to help you manage and plan tasks. Use these tools VERY frequently to ensure that you are tracking your tasks and giving the user visibility into your progress. @@ -353586,15 +353886,15 @@ assistant: Clients are marked as failed in the \`connectToServer\` function in s var init_anthropic2 = () => {}; // packages/unifia/src/session/prompt/default.txt -var default_default = `You are opencode, an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user. +var default_default = `You are Unifia, an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user. IMPORTANT: You must NEVER generate or guess URLs for the user unless you are confident that the URLs are for helping the user with programming. You may use URLs provided by the user in their messages or local files. If the user asks for help or wants to give feedback inform them of the following: -- /help: Get help with using opencode -- To give feedback, users should report the issue at https://github.com/anomalyco/opencode/issues +- /help: Get help with using Unifia +- To give feedback, users should report the issue at https://github.com/Rwanbt/unifia/issues -When the user directly asks about opencode (eg 'can opencode do...', 'does opencode have...') or asks in second person (eg 'are you able...', 'can you do...'), first use the WebFetch tool to gather information to answer the question from opencode docs at https://opencode.ai +When the user directly asks about Unifia (eg 'can Unifia do...', 'does Unifia have...') or asks in second person (eg 'are you able...', 'can you do...'), first use the WebFetch tool to gather information to answer the question from the Unifia documentation at https://github.com/Rwanbt/unifia # Tone and style You should be concise, direct, and to the point. When you run a non-trivial bash command, you should explain what the command does and why you are running it, to make sure the user understands what you are doing (this is especially important when you are running a command that will make changes to the user's system). @@ -353695,7 +353995,7 @@ assistant: Clients are marked as failed in the \`connectToServer\` function in s var init_default2 = () => {}; // packages/unifia/src/session/prompt/beast.txt -var beast_default = `You are opencode, an agent - please keep going until the user\u2019s query is completely resolved, before ending your turn and yielding back to the user. +var beast_default = `You are Unifia, an agent - please keep going until the user\u2019s query is completely resolved, before ending your turn and yielding back to the user. Your thinking should be thorough and so it's fine if it's very long. However, avoid unnecessary repetition and verbosity. You should be concise, but thorough. @@ -353846,7 +354146,7 @@ You are NEVER allowed to stage and commit files automatically. var init_beast = () => {}; // packages/unifia/src/session/prompt/gemini.txt -var gemini_default = `You are opencode, an interactive CLI agent specializing in software engineering tasks. Your primary goal is to help users safely and efficiently, adhering strictly to the following instructions and utilizing your available tools. +var gemini_default = `You are Unifia, an interactive CLI agent specializing in software engineering tasks. Your primary goal is to help users safely and efficiently, adhering strictly to the following instructions and utilizing your available tools. # Core Mandates @@ -354005,7 +354305,7 @@ Your core function is efficient and safe assistance. Balance extreme conciseness var init_gemini = () => {}; // packages/unifia/src/session/prompt/gpt.txt -var gpt_default = `You are OpenCode, You and the user share the same workspace and collaborate to achieve the user's goals. +var gpt_default = `You are Unifia, You and the user share the same workspace and collaborate to achieve the user's goals. You are a deeply pragmatic, effective software engineer. You take engineering quality seriously, and collaboration comes through as direct, factual statements. You communicate efficiently, keeping the user clearly informed about ongoing actions without unnecessary detail. You build context by examining the codebase first without making assumptions or jumping to conclusions. You think through the nuances of the code you encounter, and embody the mentality of a skilled senior software engineer. @@ -354116,7 +354416,7 @@ For large or complex changes, lead with the solution, then explain what you did var init_gpt = () => {}; // packages/unifia/src/session/prompt/kimi.txt -var kimi_default = `You are OpenCode, an interactive general AI agent running on a user's computer. +var kimi_default = `You are Unifia, an interactive general AI agent running on a user's computer. Your primary goal is to help users with software engineering tasks by taking action \u2014 use the tools available to you to make real changes on the user's system. You should also answer questions when asked. Always adhere strictly to the following system instructions and the user's requirements. @@ -354215,7 +354515,7 @@ At any time, you should be HELPFUL, CONCISE, and ACCURATE. Be thorough in your a var init_kimi = () => {}; // packages/unifia/src/session/prompt/codex.txt -var codex_default = `You are OpenCode, the best coding agent on the planet. +var codex_default = `You are Unifia, the best coding agent on the planet. You are an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user. @@ -354298,7 +354598,7 @@ You are producing plain text that will later be styled by the CLI. Follow these var init_codex2 = () => {}; // packages/unifia/src/session/prompt/trinity.txt -var trinity_default = `You are opencode, an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user. +var trinity_default = `You are Unifia, an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user. # Tone and style You should be concise, direct, and to the point. When you run a non-trivial bash command, you should explain what the command does and why you are running it, to make sure the user understands what you are doing (this is especially important when you are running a command that will make changes to the user's system). @@ -354399,7 +354699,7 @@ assistant: Clients are marked as failed in the \`connectToServer\` function in s var init_trinity = () => {}; // packages/unifia/src/session/prompt/local.txt -var local_default = `You are opencode, a coding CLI tool. Be concise and direct. +var local_default = `You are Unifia, a coding CLI tool. Be concise and direct. Rules: - Run tools to complete tasks, don't just explain @@ -354655,11 +354955,11 @@ var init_lifecycle = __esm(() => { // packages/unifia/src/observability/capture-policy.ts function resolveCapturePolicy(input) { - const config6 = CapturePolicyInputSchema.parse(input ?? {}); + const config5 = CapturePolicyInputSchema.parse(input ?? {}); return { - enabled: config6.enabled === true, - level: config6.captureMode ?? "local_metadata", - userIdHmac: config6.userIdHmac, + enabled: config5.enabled === true, + level: config5.captureMode ?? "local_metadata", + userIdHmac: config5.userIdHmac, policyVersion: 3 }; } @@ -354727,10 +355027,10 @@ var init_event_sql2 = __esm(() => { }); // packages/unifia/src/observability/purge.ts -function resolveRetentionConfig(config6) { +function resolveRetentionConfig(config5) { return { - retentionDays: config6?.retentionDays && config6.retentionDays > 0 ? config6.retentionDays : undefined, - maxEvents: config6?.maxEvents && config6.maxEvents > 0 ? config6.maxEvents : DEFAULT_MAX_EVENTS + retentionDays: config5?.retentionDays && config5.retentionDays > 0 ? config5.retentionDays : undefined, + maxEvents: config5?.maxEvents && config5.maxEvents > 0 ? config5.maxEvents : DEFAULT_MAX_EVENTS }; } function changeCount(result6) { @@ -354749,8 +355049,8 @@ function deleteOldest(where, limit2) { const result6 = Database.use((db2) => db2.delete(ObservabilityEventTable).where(inArray(ObservabilityEventTable.id, ids)).run()); return changeCount(result6); } -function purgeByRetention(config6, now4 = Date.now()) { - const policy = resolveRetentionConfig(config6); +function purgeByRetention(config5, now4 = Date.now()) { + const policy = resolveRetentionConfig(config5); const expiredCutoff = policy.retentionDays === undefined ? undefined : now4 - policy.retentionDays * DAY_MS; const deletedExpired = expiredCutoff === undefined ? 0 : deleteOldest(lt2(ObservabilityEventTable.ts_ms, expiredCutoff), RETENTION_BATCH_SIZE); const total = Database.use((db2) => db2.select({ value: count3() }).from(ObservabilityEventTable).get()?.value ?? 0); @@ -355900,10 +356200,10 @@ var init_export_runner = __esm(() => { // packages/unifia/src/observability/hmac-secret.ts import { chmod as chmod4, mkdir as mkdir4, readFile as readFile5, rename as rename3, writeFile as writeFile7 } from "fs/promises"; -import path39 from "path"; +import path40 from "path"; import { randomBytes as randomBytes6 } from "crypto"; function secretPath(configDirectory = Global.Path.config) { - return path39.join(configDirectory, FILE_NAME); + return path40.join(configDirectory, FILE_NAME); } async function loadOrCreateSecret(configDirectory = Global.Path.config) { const file6 = secretPath(configDirectory); @@ -355945,8 +356245,8 @@ function boot2() { await service3.flush(); }); const purge = Instance.bind(async () => { - const config6 = await Config.get(); - const result6 = purgeByRetention(config6.experimental?.observability); + const config5 = await Config.get(); + const result6 = purgeByRetention(config5.experimental?.observability); if (result6.deletedCount > 0) log21.info("purged retained observability events", result6); if (result6.deletedCount > 0) @@ -355959,8 +356259,8 @@ function boot2() { log21.info("purged expired observability content opt-ins", { expiredOptIns }); }); const runExport = Instance.bind(async () => { - const config6 = await Config.get(); - const obsConfig = config6.experimental?.observability; + const config5 = await Config.get(); + const obsConfig = config5.experimental?.observability; const exporters = ExporterRegistry.from(obsConfig); if (!exporters.length) return; @@ -356009,7 +356309,7 @@ async function shutdown6(runtime4) { await runtime4.service.flush().catch((error49) => log21.warn("observability shutdown flush failed", { error: error49 })); Database.use((db2) => db2.run("PRAGMA wal_checkpoint(TRUNCATE)")); } -var log21, FLUSH_INTERVAL_MS = 250, RETENTION_INTERVAL_MS = 5000, EXPORT_INTERVAL_MS = 5000, EXPORT_BATCH_SIZE = 500, state2, ObservabilityRuntime; +var log21, FLUSH_INTERVAL_MS = 250, RETENTION_INTERVAL_MS = 5000, EXPORT_INTERVAL_MS = 5000, EXPORT_BATCH_SIZE = 500, state, ObservabilityRuntime; var init_runtime = __esm(async () => { init_service(); init_exporter(); @@ -356026,16 +356326,16 @@ var init_runtime = __esm(async () => { init_hmac_secret() ]); log21 = Log.create({ service: "observability" }); - state2 = Instance.state(boot2, shutdown6); + state = Instance.state(boot2, shutdown6); ObservabilityRuntime = { service() { - return state2().service; + return state().service; }, exportStats() { - return state2().lastExportRun; + return state().lastExportRun; }, runExportOnce() { - return state2().runExportOnce(); + return state().runExportOnce(); } }; }); @@ -356756,9 +357056,9 @@ var init_status = __esm(async () => { SessionStatus.Service = Service3; SessionStatus.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const bus = yield* Bus.Service; - const state3 = yield* InstanceState.make(exports_Effect.fn("SessionStatus.state")(() => exports_Effect.succeed(new Map))); + const state2 = yield* InstanceState.make(exports_Effect.fn("SessionStatus.state")(() => exports_Effect.succeed(new Map))); const get35 = exports_Effect.fn("SessionStatus.get")(function* (sessionID) { - const data2 = yield* InstanceState.get(state3); + const data2 = yield* InstanceState.get(state2); const memStatus = data2.get(sessionID); if (memStatus) return memStatus; @@ -356770,10 +357070,10 @@ var init_status = __esm(async () => { return { type: "idle" }; }); const list2 = exports_Effect.fn("SessionStatus.list")(function* () { - return new Map(yield* InstanceState.get(state3)); + return new Map(yield* InstanceState.get(state2)); }); const set26 = exports_Effect.fn("SessionStatus.set")(function* (sessionID, status) { - const data2 = yield* InstanceState.get(state3); + const data2 = yield* InstanceState.get(state2); yield* bus.publish(SessionStatus.Event.Status, { sessionID, status }); persistToDb(sessionID, status); if (status.type === "idle") { @@ -356886,20 +357186,20 @@ var init_question = __esm(async () => { Question.Service = Service3; Question.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const bus = yield* Bus.Service; - const state3 = yield* InstanceState.make(exports_Effect.fn("Question.state")(function* () { - const state4 = { + const state2 = yield* InstanceState.make(exports_Effect.fn("Question.state")(function* () { + const state3 = { pending: new Map }; yield* exports_Effect.addFinalizer(() => exports_Effect.gen(function* () { - for (const item of state4.pending.values()) { + for (const item of state3.pending.values()) { yield* exports_Deferred.fail(item.deferred, new RejectedError); } - state4.pending.clear(); + state3.pending.clear(); })); - return state4; + return state3; })); const ask2 = exports_Effect.fn("Question.ask")(function* (input) { - const pending2 = (yield* InstanceState.get(state3)).pending; + const pending2 = (yield* InstanceState.get(state2)).pending; const id2 = QuestionID.ascending(); log12.info("asking", { id: id2, questions: input.questions.length }); const deferred = yield* exports_Deferred.make(); @@ -356916,7 +357216,7 @@ var init_question = __esm(async () => { })); }); const reply2 = exports_Effect.fn("Question.reply")(function* (input) { - const pending2 = (yield* InstanceState.get(state3)).pending; + const pending2 = (yield* InstanceState.get(state2)).pending; const existing = pending2.get(input.requestID); if (!existing) { log12.warn("reply for unknown request", { requestID: input.requestID }); @@ -356932,7 +357232,7 @@ var init_question = __esm(async () => { yield* exports_Deferred.succeed(existing.deferred, input.answers); }); const reject2 = exports_Effect.fn("Question.reject")(function* (requestID) { - const pending2 = (yield* InstanceState.get(state3)).pending; + const pending2 = (yield* InstanceState.get(state2)).pending; const existing = pending2.get(requestID); if (!existing) { log12.warn("reject for unknown request", { requestID }); @@ -356947,7 +357247,7 @@ var init_question = __esm(async () => { yield* exports_Deferred.fail(existing.deferred, new RejectedError); }); const list2 = exports_Effect.fn("Question.list")(function* () { - const pending2 = (yield* InstanceState.get(state3)).pending; + const pending2 = (yield* InstanceState.get(state2)).pending; return Array.from(pending2.values(), (x3) => x3.info); }); return Service3.of({ ask: ask2, reply: reply2, reject: reject2, list: list2 }); @@ -357043,16 +357343,16 @@ var init_processor = __esm(async () => { SessionProcessor.Service = Service3; SessionProcessor.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const session = yield* Session.Service; - const config6 = yield* Config.Service; + const config5 = yield* Config.Service; const bus = yield* Bus.Service; - const snapshot4 = yield* Snapshot.Service; + const snapshot3 = yield* Snapshot.Service; const agents = yield* Agent2.Service; const llm = yield* LLM.Service; const permission = yield* Permission2.Service; const plugin = yield* Plugin.Service; const status = yield* SessionStatus.Service; const create = exports_Effect.fn("SessionProcessor.create")(function* (input) { - const initialSnapshot = yield* snapshot4.track(); + const initialSnapshot = yield* snapshot3.track(); const ctx = { assistantMessage: input.assistantMessage, sessionID: input.sessionID, @@ -357069,7 +357369,7 @@ var init_processor = __esm(async () => { toolSpans: {} }; let aborted3 = false; - const capturePolicy = resolveCapturePolicy((yield* config6.get()).experimental?.observability); + const capturePolicy = resolveCapturePolicy((yield* config5.get()).experimental?.observability); const observability = capturePolicy.enabled ? ObservabilityRuntime.service() : undefined; const sessionInfo = observability ? yield* session.get(ctx.sessionID).pipe(exports_Effect.orElseSucceed(() => { return; @@ -357358,7 +357658,7 @@ var init_processor = __esm(async () => { throw value8.error; case "start-step": if (!ctx.snapshot) - ctx.snapshot = yield* snapshot4.track(); + ctx.snapshot = yield* snapshot3.track(); yield* session.updatePart({ id: PartID.ascending(), messageID: ctx.assistantMessage.id, @@ -357379,7 +357679,7 @@ var init_processor = __esm(async () => { yield* session.updatePart({ id: PartID.ascending(), reason: value8.finishReason, - snapshot: yield* snapshot4.track(), + snapshot: yield* snapshot3.track(), messageID: ctx.assistantMessage.id, sessionID: ctx.assistantMessage.sessionID, type: "step-finish", @@ -357388,7 +357688,7 @@ var init_processor = __esm(async () => { }); yield* session.updateMessage(ctx.assistantMessage); if (ctx.snapshot) { - const patch3 = yield* snapshot4.patch(ctx.snapshot); + const patch3 = yield* snapshot3.patch(ctx.snapshot); if (patch3.files.length) { yield* session.updatePart({ id: PartID.ascending(), @@ -357405,7 +357705,7 @@ var init_processor = __esm(async () => { sessionID: ctx.sessionID, messageID: ctx.assistantMessage.parentID }); - if (!ctx.assistantMessage.summary && isOverflow({ cfg: yield* config6.get(), tokens: usage2.tokens, model: ctx.model })) { + if (!ctx.assistantMessage.summary && isOverflow({ cfg: yield* config5.get(), tokens: usage2.tokens, model: ctx.model })) { ctx.needsCompaction = true; } return; @@ -357460,7 +357760,7 @@ var init_processor = __esm(async () => { }); const cleanup = exports_Effect.fn("SessionProcessor.cleanup")(function* () { if (ctx.snapshot) { - const patch3 = yield* snapshot4.patch(ctx.snapshot); + const patch3 = yield* snapshot3.patch(ctx.snapshot); if (patch3.files.length) { yield* session.updatePart({ id: PartID.ascending(), @@ -357549,7 +357849,7 @@ var init_processor = __esm(async () => { const process3 = exports_Effect.fn("SessionProcessor.process")(function* (streamInput) { log12.info("process"); ctx.needsCompaction = false; - ctx.shouldBreak = (yield* config6.get()).experimental?.continue_loop_on_deny !== true; + ctx.shouldBreak = (yield* config5.get()).experimental?.continue_loop_on_deny !== true; return yield* exports_Effect.gen(function* () { yield* exports_Effect.gen(function* () { ctx.currentText = undefined; @@ -357664,17 +357964,17 @@ var init_compaction2 = __esm(async () => { SessionCompaction.Service = Service3; SessionCompaction.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const bus = yield* Bus.Service; - const config6 = yield* Config.Service; + const config5 = yield* Config.Service; const session = yield* Session.Service; const agents = yield* Agent2.Service; const plugin = yield* Plugin.Service; const processors = yield* SessionProcessor.Service; const provider = yield* Provider3.Service; const isOverflow3 = exports_Effect.fn("SessionCompaction.isOverflow")(function* (input) { - return isOverflow({ cfg: yield* config6.get(), tokens: input.tokens, model: input.model }); + return isOverflow({ cfg: yield* config5.get(), tokens: input.tokens, model: input.model }); }); const prune2 = exports_Effect.fn("SessionCompaction.prune")(function* (input) { - const cfg = yield* config6.get(); + const cfg = yield* config5.get(); if (cfg.compaction?.prune === false) return; const { pruneMinimum, pruneProtect } = input.model ? getPruneThresholds(input.model) : { pruneMinimum: SessionCompaction.PRUNE_MINIMUM, pruneProtect: SessionCompaction.PRUNE_PROTECT }; @@ -357956,15 +358256,15 @@ When constructing the summary, try to stick to this template: // packages/unifia/src/session/instruction.ts import os15 from "os"; -import path40 from "path"; +import path41 from "path"; function globalFiles() { const files = []; if (Flag.UNIFIA_CONFIG_DIR) { - files.push(path40.join(Flag.UNIFIA_CONFIG_DIR, "AGENTS.md")); + files.push(path41.join(Flag.UNIFIA_CONFIG_DIR, "AGENTS.md")); } - files.push(path40.join(Global.Path.config, "AGENTS.md")); + files.push(path41.join(Global.Path.config, "AGENTS.md")); if (!Flag.UNIFIA_DISABLE_CLAUDE_CODE_PROMPT) { - files.push(path40.join(os15.homedir(), ".claude", "CLAUDE.md")); + files.push(path41.join(os15.homedir(), ".claude", "CLAUDE.md")); } return files; } @@ -358017,7 +358317,7 @@ var init_instruction = __esm(async () => { const cfg = yield* Config.Service; const fs18 = yield* AppFileSystem.Service; const http = exports_HttpClient.filterStatusOk(withTransientReadRetry(yield* exports_HttpClient.HttpClient)); - const state3 = yield* InstanceState.make(exports_Effect.fn("Instruction.state")(() => exports_Effect.succeed({ + const state2 = yield* InstanceState.make(exports_Effect.fn("Instruction.state")(() => exports_Effect.succeed({ claims: new Map }))); const relative4 = exports_Effect.fnUntraced(function* (instruction) { @@ -358041,46 +358341,46 @@ var init_instruction = __esm(async () => { return new TextDecoder().decode(body3); }); const clear13 = exports_Effect.fn("Instruction.clear")(function* (messageID) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); s5.claims.delete(messageID); }); const systemPaths2 = exports_Effect.fn("Instruction.systemPaths")(function* () { - const config6 = yield* cfg.get(); + const config5 = yield* cfg.get(); const paths = new Set; if (!Flag.UNIFIA_DISABLE_PROJECT_CONFIG) { for (const file6 of FILES) { const matches = yield* fs18.findUp(file6, Instance.directory, Instance.worktree); if (matches.length > 0) { - matches.forEach((item) => paths.add(path40.resolve(item))); + matches.forEach((item) => paths.add(path41.resolve(item))); break; } } } for (const file6 of globalFiles()) { if (yield* fs18.existsSafe(file6)) { - paths.add(path40.resolve(file6)); + paths.add(path41.resolve(file6)); break; } } - if (config6.instructions) { - for (const raw3 of config6.instructions) { + if (config5.instructions) { + for (const raw3 of config5.instructions) { if (raw3.startsWith("https://") || raw3.startsWith("http://")) continue; - const instruction = raw3.startsWith("~/") ? path40.join(os15.homedir(), raw3.slice(2)) : raw3; - const matches = yield* (path40.isAbsolute(instruction) ? fs18.glob(path40.basename(instruction), { - cwd: path40.dirname(instruction), + const instruction = raw3.startsWith("~/") ? path41.join(os15.homedir(), raw3.slice(2)) : raw3; + const matches = yield* (path41.isAbsolute(instruction) ? fs18.glob(path41.basename(instruction), { + cwd: path41.dirname(instruction), absolute: true, include: "file" }) : relative4(instruction)).pipe(exports_Effect.catch(() => exports_Effect.succeed([]))); - matches.forEach((item) => paths.add(path40.resolve(item))); + matches.forEach((item) => paths.add(path41.resolve(item))); } } return paths; }); const system = exports_Effect.fn("Instruction.system")(function* () { - const config6 = yield* cfg.get(); + const config5 = yield* cfg.get(); const paths = yield* systemPaths2(); - const urls = (config6.instructions ?? []).filter((item) => item.startsWith("https://") || item.startsWith("http://")); + const urls = (config5.instructions ?? []).filter((item) => item.startsWith("https://") || item.startsWith("http://")); const files = yield* exports_Effect.forEach(Array.from(paths), read3, { concurrency: 8 }); const remote = yield* exports_Effect.forEach(urls, fetch3, { concurrency: 4 }); return [ @@ -358092,7 +358392,7 @@ ${remote[i7]}`] : []) }); const find2 = exports_Effect.fn("Instruction.find")(function* (dir2) { for (const file6 of FILES) { - const filepath = path40.resolve(path40.join(dir2, file6)); + const filepath = path41.resolve(path41.join(dir2, file6)); if (yield* fs18.existsSafe(filepath)) return filepath; } @@ -358101,14 +358401,14 @@ ${remote[i7]}`] : []) const sys = yield* systemPaths2(); const already = extract(messages); const results = []; - const s5 = yield* InstanceState.get(state3); - const target = path40.resolve(filepath); - const root2 = path40.resolve(Instance.directory); - let current = path40.dirname(target); + const s5 = yield* InstanceState.get(state2); + const target = path41.resolve(filepath); + const root2 = path41.resolve(Instance.directory); + let current = path41.dirname(target); while (current.startsWith(root2) && current !== root2) { const found = yield* find2(current); if (!found || found === target || sys.has(found) || already.has(found)) { - current = path40.dirname(current); + current = path41.dirname(current); continue; } let set25 = s5.claims.get(messageID); @@ -358117,7 +358417,7 @@ ${remote[i7]}`] : []) s5.claims.set(messageID, set25); } if (set25.has(found)) { - current = path40.dirname(current); + current = path41.dirname(current); continue; } set25.add(found); @@ -358126,7 +358426,7 @@ ${remote[i7]}`] : []) results.push({ filepath: found, content: `Instructions from: ${found} ${content}` }); } - current = path40.dirname(current); + current = path41.dirname(current); } return results; }); @@ -358282,7 +358582,7 @@ Do NOT call this tool: var init_plan_exit = () => {}; // packages/unifia/src/tool/plan.ts -import path41 from "path"; +import path43 from "path"; async function getLastModel(sessionID) { for await (const item of MessageV2.stream(sessionID)) { if (item.info.role === "user" && item.info.model) @@ -358308,7 +358608,7 @@ var init_plan2 = __esm(async () => { parameters: zod_default.object({}), async execute(_params, ctx) { const session = await Session.get(ctx.sessionID); - const plan = path41.relative(Instance.worktree, Session.plan(session)); + const plan = path43.relative(Instance.worktree, Session.plan(session)); const answers = await Question.ask({ sessionID: ctx.sessionID, questions: [ @@ -361747,7 +362047,7 @@ ${JSON.stringify(symbolNames, null, 2)}`); }); // packages/unifia/src/shell/shell.ts -import path43 from "path"; +import path45 from "path"; import { spawn as spawn3 } from "child_process"; import { setTimeout as sleep8 } from "timers/promises"; var SIGKILL_TIMEOUT_MS = 200, Shell; @@ -361793,7 +362093,7 @@ var init_shell = __esm(async () => { if (process.platform !== "win32") return file6; const shell3 = Filesystem.windowsPath(file6); - if (path43.win32.dirname(shell3) !== ".") { + if (path45.win32.dirname(shell3) !== ".") { if (shell3.startsWith("/") && name26(shell3) === "bash") return gitbash() || shell3; return shell3; @@ -361824,17 +362124,17 @@ var init_shell = __esm(async () => { function gitbash() { if (process.platform !== "win32") return; - if (Flag.OPENCODE_GIT_BASH_PATH) - return Flag.OPENCODE_GIT_BASH_PATH; + if (Flag.UNIFIA_GIT_BASH_PATH) + return Flag.UNIFIA_GIT_BASH_PATH; const git = which("git"); if (!git) return; - let dir2 = path43.dirname(git); + let dir2 = path45.dirname(git); for (let i7 = 0;i7 < 4; i7++) { - const file6 = path43.join(dir2, "bin", "bash.exe"); + const file6 = path45.join(dir2, "bin", "bash.exe"); if (Filesystem.stat(file6)?.size) return file6; - dir2 = path43.dirname(dir2); + dir2 = path45.dirname(dir2); } } Shell.gitbash = gitbash; @@ -361854,8 +362154,8 @@ var init_shell = __esm(async () => { } function name26(file6) { if (process.platform === "win32") - return path43.win32.parse(Filesystem.windowsPath(file6)).name.toLowerCase(); - return path43.basename(file6).toLowerCase(); + return path45.win32.parse(Filesystem.windowsPath(file6)).name.toLowerCase(); + return path45.basename(file6).toLowerCase(); } Shell.name = name26; function login(file6) { @@ -362161,7 +362461,7 @@ var require_tree_sitter_powershell = __commonJS((exports, module2) => { // packages/unifia/src/tool/bash.ts import os16 from "os"; -import path45 from "path"; +import path46 from "path"; import { fileURLToPath as fileURLToPath6 } from "url"; function parts3(node) { const out2 = []; @@ -362204,7 +362504,7 @@ function home(text8) { if (text8 === "~") return os16.homedir(); if (text8.startsWith("~/") || text8.startsWith("~\\")) - return path45.join(os16.homedir(), text8.slice(2)); + return path46.join(os16.homedir(), text8.slice(2)); return text8; } function envValue(key) { @@ -362220,7 +362520,7 @@ function auto2(key, cwd, shell3) { if (name26 === "PWD") return cwd; if (name26 === "PSHOME") - return path45.dirname(shell3); + return path46.dirname(shell3); } function expand3(text8, cwd, shell3) { const out2 = unquote(text8).replace(/\$\{env:([^}]+)\}/gi, (_3, key) => envValue(key) || "").replace(/\$env:([A-Za-z_][A-Za-z0-9_]*)/gi, (_3, key) => envValue(key) || "").replace(/\$(HOME|PWD|PSHOME)(?=$|[\\/])/gi, (_3, key) => auto2(key, cwd, shell3) || ""); @@ -362273,9 +362573,9 @@ async function resolvePath(text8, root2, shell3) { if (file6) return file6; } - return Filesystem.normalizePath(path45.resolve(root2, Filesystem.windowsPath(text8))); + return Filesystem.normalizePath(path46.resolve(root2, Filesystem.windowsPath(text8))); } - return path45.resolve(root2, text8); + return path46.resolve(root2, text8); } async function argPath(arg, cwd, ps2, shell3) { const text8 = ps2 ? expand3(arg, cwd, shell3) : home(unquote(arg)); @@ -362326,7 +362626,7 @@ async function collect6(root2, cwd, ps2, shell3) { log26.info("resolved path", { arg, resolved }); if (!resolved || Instance.containsPath(resolved)) continue; - const dir2 = await Filesystem.isDir(resolved) ? resolved : path45.dirname(resolved); + const dir2 = await Filesystem.isDir(resolved) ? resolved : path46.dirname(resolved); scan5.dirs.add(dir2); } } @@ -362354,8 +362654,8 @@ async function ask(ctx, scan5) { if (scan5.dirs.size > 0) { const globs = Array.from(scan5.dirs).map((dir2) => { if (process.platform === "win32") - return Filesystem.normalizePathPattern(path45.join(dir2, "*")); - return path45.join(dir2, "*"); + return Filesystem.normalizePathPattern(path46.join(dir2, "*")); + return path46.join(dir2, "*"); }); await ctx.ask({ permission: "external_directory", @@ -362389,7 +362689,7 @@ function cmd(shell3, name26, command3, cwd, env7) { detached: false }); } - if (env7["OPENCODE_CLIENT"] === "mobile-embedded" && env7["BASH_ENV"] && (shell3.endsWith("/bash") || shell3.endsWith("\\bash"))) { + if (env7["UNIFIA_CLIENT"] === "mobile-embedded" && env7["BASH_ENV"] && (shell3.endsWith("/bash") || shell3.endsWith("\\bash"))) { return exports_ChildProcess.make(shell3, ["--init-file", env7["BASH_ENV"], "-c", command3], { cwd, env: env7, @@ -362708,8 +363008,8 @@ Output: Creates directory 'foo'`), if (outsideProject) { lines.push("", "**Warning**: Working directory is outside the project root."); } - const config7 = await Config.get(); - if (config7.experimental?.sandbox?.type === "docker") { + const config6 = await Config.get(); + if (config6.experimental?.sandbox?.type === "docker") { lines.push("", "**Execution**: Would run inside Docker container"); } const output2 = lines.join(` @@ -362726,8 +363026,8 @@ Output: Creates directory 'foo'`), if (proxied) return proxied; } - const config6 = await Config.get(); - const sandbox3 = config6.experimental?.sandbox; + const config5 = await Config.get(); + const sandbox3 = config5.experimental?.sandbox; if (sandbox3?.type === "docker") { return runDocker({ command: params.command, @@ -363698,8 +363998,8 @@ var init_formatter = __esm(async () => { ], async enabled() { const configs = ["biome.json", "biome.jsonc"]; - for (const config6 of configs) { - const found = await Filesystem.findUp(config6, Instance.directory, Instance.worktree); + for (const config5 of configs) { + const found = await Filesystem.findUp(config5, Instance.directory, Instance.worktree); if (found.length > 0) { const bin = await Npm.which("@biomejs/biome"); if (bin) @@ -363749,10 +364049,10 @@ var init_formatter = __esm(async () => { if (!which("ruff")) return false; const configs = ["pyproject.toml", "ruff.toml", ".ruff.toml"]; - for (const config6 of configs) { - const found = await Filesystem.findUp(config6, Instance.directory, Instance.worktree); + for (const config5 of configs) { + const found = await Filesystem.findUp(config5, Instance.directory, Instance.worktree); if (found.length > 0) { - if (config6 === "pyproject.toml") { + if (config5 === "pyproject.toml") { const content = await Filesystem.readText(found[0]); if (content.includes("[tool.ruff]")) return ["ruff", "format", "$FILE"]; @@ -363974,7 +364274,7 @@ var init_formatter = __esm(async () => { }); // packages/unifia/src/format/index.ts -import path46 from "path"; +import path47 from "path"; var Format; var init_format2 = __esm(async () => { init_dist3(); @@ -364003,12 +364303,12 @@ var init_format2 = __esm(async () => { } Format.Service = Service3; Format.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { - const config6 = yield* Config.Service; + const config5 = yield* Config.Service; const spawner = yield* exports_ChildProcessSpawner.ChildProcessSpawner; - const state3 = yield* InstanceState.make(exports_Effect.fn("Format.state")(function* (_ctx) { + const state2 = yield* InstanceState.make(exports_Effect.fn("Format.state")(function* (_ctx) { const commands4 = {}; const formatters2 = {}; - const cfg = yield* config6.get(); + const cfg = yield* config5.get(); if (cfg.formatter !== false) { for (const item of Object.values(exports_formatter)) { formatters2[item.name] = item; @@ -364061,7 +364361,7 @@ var init_format2 = __esm(async () => { function formatFile(filepath) { return exports_Effect.gen(function* () { log12.info("formatting", { file: filepath }); - const ext2 = path46.extname(filepath); + const ext2 = path47.extname(filepath); for (const { item, cmd: cmd2 } of yield* exports_Effect.promise(() => getFormatter(ext2))) { if (cmd2 === false) continue; @@ -364098,10 +364398,10 @@ var init_format2 = __esm(async () => { }; })); const init5 = exports_Effect.fn("Format.init")(function* () { - yield* InstanceState.get(state3); + yield* InstanceState.get(state2); }); const status2 = exports_Effect.fn("Format.status")(function* () { - const { formatters: formatters2, isEnabled: isEnabled3 } = yield* InstanceState.get(state3); + const { formatters: formatters2, isEnabled: isEnabled3 } = yield* InstanceState.get(state2); const result6 = []; for (const formatter of Object.values(formatters2)) { const isOn = yield* exports_Effect.promise(() => isEnabled3(formatter)); @@ -364114,7 +364414,7 @@ var init_format2 = __esm(async () => { return result6; }); const file7 = exports_Effect.fn("Format.file")(function* (filepath) { - const { formatFile } = yield* InstanceState.get(state3); + const { formatFile } = yield* InstanceState.get(state2); yield* formatFile(filepath); }); return Service3.of({ init: init5, status: status2, file: file7 }); @@ -364137,7 +364437,7 @@ var init_format2 = __esm(async () => { }); // packages/unifia/src/file/protected.ts -import path47 from "path"; +import path48 from "path"; import os17 from "os"; var home2, DARWIN_HOME, DARWIN_LIBRARY, DARWIN_ROOT, WIN32_HOME, Protected; var init_protected = __esm(() => { @@ -364179,12 +364479,12 @@ var init_protected = __esm(() => { function paths() { if (process.platform === "darwin") return [ - ...DARWIN_HOME.map((n10) => path47.join(home2, n10)), - ...DARWIN_LIBRARY.map((n10) => path47.join(home2, "Library", n10)), + ...DARWIN_HOME.map((n10) => path48.join(home2, n10)), + ...DARWIN_LIBRARY.map((n10) => path48.join(home2, "Library", n10)), ...DARWIN_ROOT ]; if (process.platform === "win32") - return WIN32_HOME.map((n10) => path47.join(home2, n10)); + return WIN32_HOME.map((n10) => path48.join(home2, n10)); return []; } Protected.paths = paths; @@ -364228,13 +364528,13 @@ var init_time2 = __esm(async () => { size: info3 ? Number(info3.size) : undefined }; }); - const state3 = yield* InstanceState.make(exports_Effect.fn("FileTime.state")(() => exports_Effect.succeed({ + const state2 = yield* InstanceState.make(exports_Effect.fn("FileTime.state")(() => exports_Effect.succeed({ reads: new Map, locks: new Map }))); const getLock = exports_Effect.fn("FileTime.lock")(function* (filepath) { filepath = Filesystem.normalizePath(filepath); - const locks = (yield* InstanceState.get(state3)).locks; + const locks = (yield* InstanceState.get(state2)).locks; const lock = locks.get(filepath); if (lock) return lock; @@ -364244,20 +364544,20 @@ var init_time2 = __esm(async () => { }); const read4 = exports_Effect.fn("FileTime.read")(function* (sessionID, file6) { file6 = Filesystem.normalizePath(file6); - const reads = (yield* InstanceState.get(state3)).reads; + const reads = (yield* InstanceState.get(state2)).reads; log12.info("read", { sessionID, file: file6 }); session(reads, sessionID).set(file6, yield* stamp(file6)); }); const get35 = exports_Effect.fn("FileTime.get")(function* (sessionID, file6) { file6 = Filesystem.normalizePath(file6); - const reads = (yield* InstanceState.get(state3)).reads; + const reads = (yield* InstanceState.get(state2)).reads; return reads.get(sessionID)?.get(file6)?.read; }); const assert7 = exports_Effect.fn("FileTime.assert")(function* (sessionID, filepath) { if (disableCheck) return; filepath = Filesystem.normalizePath(filepath); - const reads = (yield* InstanceState.get(state3)).reads; + const reads = (yield* InstanceState.get(state2)).reads; const time6 = reads.get(sessionID)?.get(filepath); if (!time6) throw new Error(`You must read file ${filepath} before overwriting it. Use the Read tool first`); @@ -364475,31 +364775,31 @@ var require_to_regex_range = __commonJS((exports, module2) => { return `(?:${result6})`; } let isPadded2 = hasPadding(min14) || hasPadding(max14); - let state3 = { min: min14, max: max14, a: a5, b: b3 }; + let state2 = { min: min14, max: max14, a: a5, b: b3 }; let positives = []; let negatives = []; if (isPadded2) { - state3.isPadded = isPadded2; - state3.maxLen = String(state3.max).length; + state2.isPadded = isPadded2; + state2.maxLen = String(state2.max).length; } if (a5 < 0) { let newMin = b3 < 0 ? Math.abs(b3) : 1; - negatives = splitToPatterns(newMin, Math.abs(a5), state3, opts); - a5 = state3.a = 0; + negatives = splitToPatterns(newMin, Math.abs(a5), state2, opts); + a5 = state2.a = 0; } if (b3 >= 0) { - positives = splitToPatterns(a5, b3, state3, opts); + positives = splitToPatterns(a5, b3, state2, opts); } - state3.negatives = negatives; - state3.positives = positives; - state3.result = collatePatterns(negatives, positives, opts); + state2.negatives = negatives; + state2.positives = positives; + state2.result = collatePatterns(negatives, positives, opts); if (opts.capture === true) { - state3.result = `(${state3.result})`; + state2.result = `(${state2.result})`; } else if (opts.wrap !== false && positives.length + negatives.length > 1) { - state3.result = `(?:${state3.result})`; + state2.result = `(?:${state2.result})`; } - toRegexRange.cache[cacheKey] = state3; - return state3.result; + toRegexRange.cache[cacheKey] = state2; + return state2.result; }; function collatePatterns(neg, pos, options4) { let onlyNegative = filterPatterns(neg, pos, "-", false, options4) || []; @@ -365522,19 +365822,19 @@ var require_utils9 = __commonJS((exports) => { return exports.escapeLast(input, char2, idx - 1); return `${input.slice(0, idx)}\\${input.slice(idx)}`; }; - exports.removePrefix = (input, state3 = {}) => { + exports.removePrefix = (input, state2 = {}) => { let output2 = input; if (output2.startsWith("./")) { output2 = output2.slice(2); - state3.prefix = "./"; + state2.prefix = "./"; } return output2; }; - exports.wrapOutput = (input, state3 = {}, options4 = {}) => { + exports.wrapOutput = (input, state2 = {}, options4 = {}) => { const prepend7 = options4.contains ? "" : "^"; const append8 = options4.contains ? "" : "$"; let output2 = `${prepend7}(?:${input})${append8}`; - if (state3.negated === true) { + if (state2.negated === true) { output2 = `(?:^(?!${output2}).*$)`; } return output2; @@ -365797,7 +366097,7 @@ var require_scan2 = __commonJS((exports, module2) => { base3 = utils.removeBackslashes(base3); } } - const state3 = { + const state2 = { prefix: prefix4, input, start: start2, @@ -365812,11 +366112,11 @@ var require_scan2 = __commonJS((exports, module2) => { negatedExtglob }; if (opts.tokens === true) { - state3.maxDepth = 0; + state2.maxDepth = 0; if (!isPathSeparator(code)) { tokens.push(token); } - state3.tokens = tokens; + state2.tokens = tokens; } if (opts.parts === true || opts.tokens === true) { let prevIndex; @@ -365832,7 +366132,7 @@ var require_scan2 = __commonJS((exports, module2) => { tokens[idx].value = value8; } depth(tokens[idx]); - state3.maxDepth += tokens[idx].depth; + state2.maxDepth += tokens[idx].depth; } if (idx !== 0 || value8 !== "") { parts4.push(value8); @@ -365845,13 +366145,13 @@ var require_scan2 = __commonJS((exports, module2) => { if (opts.tokens) { tokens[tokens.length - 1].value = value8; depth(tokens[tokens.length - 1]); - state3.maxDepth += tokens[tokens.length - 1].depth; + state2.maxDepth += tokens[tokens.length - 1].depth; } } - state3.slashes = slashes; - state3.parts = parts4; + state2.slashes = slashes; + state2.parts = parts4; } - return state3; + return state2; }; module2.exports = scan5; }); @@ -366133,7 +366433,7 @@ var require_parse8 = __commonJS((exports, module2) => { if (typeof opts.noext === "boolean") { opts.noextglob = opts.noext; } - const state3 = { + const state2 = { input, index: -1, start: 0, @@ -366150,57 +366450,57 @@ var require_parse8 = __commonJS((exports, module2) => { globstar: false, tokens }; - input = utils.removePrefix(input, state3); + input = utils.removePrefix(input, state2); len = input.length; const extglobs = []; const braces = []; const stack = []; let prev2 = bos; let value8; - const eos = () => state3.index === len - 1; - const peek4 = state3.peek = (n10 = 1) => input[state3.index + n10]; - const advance = state3.advance = () => input[++state3.index] || ""; - const remaining2 = () => input.slice(state3.index + 1); + const eos = () => state2.index === len - 1; + const peek4 = state2.peek = (n10 = 1) => input[state2.index + n10]; + const advance = state2.advance = () => input[++state2.index] || ""; + const remaining2 = () => input.slice(state2.index + 1); const consume = (value9 = "", num = 0) => { - state3.consumed += value9; - state3.index += num; + state2.consumed += value9; + state2.index += num; }; const append8 = (token) => { - state3.output += token.output != null ? token.output : token.value; + state2.output += token.output != null ? token.output : token.value; consume(token.value); }; const negate4 = () => { let count5 = 1; while (peek4() === "!" && (peek4(2) !== "(" || peek4(3) === "?")) { advance(); - state3.start++; + state2.start++; count5++; } if (count5 % 2 === 0) { return false; } - state3.negated = true; - state3.start++; + state2.negated = true; + state2.start++; return true; }; const increment5 = (type3) => { - state3[type3]++; + state2[type3]++; stack.push(type3); }; const decrement4 = (type3) => { - state3[type3]--; + state2[type3]--; stack.pop(); }; const push = (tok) => { if (prev2.type === "globstar") { - const isBrace = state3.braces > 0 && (tok.type === "comma" || tok.type === "brace"); + const isBrace = state2.braces > 0 && (tok.type === "comma" || tok.type === "brace"); const isExtglob = tok.extglob === true || extglobs.length && (tok.type === "pipe" || tok.type === "paren"); if (tok.type !== "slash" && tok.type !== "paren" && !isBrace && !isExtglob) { - state3.output = state3.output.slice(0, -prev2.output.length); + state2.output = state2.output.slice(0, -prev2.output.length); prev2.type = "star"; prev2.value = "*"; prev2.output = star3; - state3.output += prev2.output; + state2.output += prev2.output; } } if (extglobs.length && tok.type !== "paren") { @@ -366220,19 +366520,19 @@ var require_parse8 = __commonJS((exports, module2) => { const extglobOpen = (type3, value9) => { const token = { ...EXTGLOB_CHARS[value9], conditions: 1, inner: "" }; token.prev = prev2; - token.parens = state3.parens; - token.output = state3.output; - token.startIndex = state3.index; + token.parens = state2.parens; + token.output = state2.output; + token.startIndex = state2.index; token.tokensIndex = tokens.length; const output2 = (opts.capture ? "(" : "") + token.open; increment5("parens"); - push({ type: type3, value: value9, output: state3.output ? "" : ONE_CHAR }); + push({ type: type3, value: value9, output: state2.output ? "" : ONE_CHAR }); push({ type: "paren", extglob: true, value: advance(), output: output2 }); extglobs.push(token); }; const extglobClose = (token) => { - const literal5 = input.slice(token.startIndex, state3.index + 1); - const body3 = input.slice(token.startIndex + 2, state3.index); + const literal5 = input.slice(token.startIndex, state2.index + 1); + const body3 = input.slice(token.startIndex + 2, state2.index); const analysis = analyzeRepeatedExtglob(body3, opts); if ((token.type === "plus" || token.type === "star") && analysis.risky) { const safeOutput = analysis.safeOutput ? (token.output ? "" : ONE_CHAR) + (opts.capture ? `(${analysis.safeOutput})` : analysis.safeOutput) : undefined; @@ -366245,8 +366545,8 @@ var require_parse8 = __commonJS((exports, module2) => { tokens[i7].output = ""; delete tokens[i7].suffix; } - state3.output = token.output + open4.output; - state3.backtrack = true; + state2.output = token.output + open4.output; + state2.backtrack = true; push({ type: "paren", extglob: true, value: value8, output: "" }); decrement4("parens"); return; @@ -366266,7 +366566,7 @@ var require_parse8 = __commonJS((exports, module2) => { output2 = token.close = `)${expression})${extglobStar})`; } if (token.prev.type === "bos") { - state3.negatedExtglob = true; + state2.negatedExtglob = true; } } push({ type: "paren", extglob: true, value: value8, output: output2 }); @@ -366309,11 +366609,11 @@ var require_parse8 = __commonJS((exports, module2) => { } } if (output2 === input && opts.contains === true) { - state3.output = input; - return state3; + state2.output = input; + return state2; } - state3.output = utils.wrapOutput(output2, state3, options4); - return state3; + state2.output = utils.wrapOutput(output2, state2, options4); + return state2; } while (!eos()) { value8 = advance(); @@ -366337,7 +366637,7 @@ var require_parse8 = __commonJS((exports, module2) => { let slashes = 0; if (match17 && match17[0].length > 2) { slashes = match17[0].length; - state3.index += slashes; + state2.index += slashes; if (slashes % 2 !== 0) { value8 += "\\"; } @@ -366347,12 +366647,12 @@ var require_parse8 = __commonJS((exports, module2) => { } else { value8 += advance(); } - if (state3.brackets === 0) { + if (state2.brackets === 0) { push({ type: "text", value: value8 }); continue; } } - if (state3.brackets > 0 && (value8 !== "]" || prev2.value === "[" || prev2.value === "[^")) { + if (state2.brackets > 0 && (value8 !== "]" || prev2.value === "[" || prev2.value === "[^")) { if (opts.posix !== false && value8 === ":") { const inner = prev2.value.slice(1); if (inner.includes("[")) { @@ -366364,7 +366664,7 @@ var require_parse8 = __commonJS((exports, module2) => { const posix2 = POSIX_REGEX_SOURCE[rest2]; if (posix2) { prev2.value = pre2 + posix2; - state3.backtrack = true; + state2.backtrack = true; advance(); if (!bos.output && tokens.indexOf(prev2) === 1) { bos.output = ONE_CHAR; @@ -366387,14 +366687,14 @@ var require_parse8 = __commonJS((exports, module2) => { append8({ value: value8 }); continue; } - if (state3.quotes === 1 && value8 !== '"') { + if (state2.quotes === 1 && value8 !== '"') { value8 = utils.escapeRegex(value8); prev2.value += value8; append8({ value: value8 }); continue; } if (value8 === '"') { - state3.quotes = state3.quotes === 1 ? 0 : 1; + state2.quotes = state2.quotes === 1 ? 0 : 1; if (opts.keepQuotes === true) { push({ type: "text", value: value8 }); } @@ -366406,15 +366706,15 @@ var require_parse8 = __commonJS((exports, module2) => { continue; } if (value8 === ")") { - if (state3.parens === 0 && opts.strictBrackets === true) { + if (state2.parens === 0 && opts.strictBrackets === true) { throw new SyntaxError(syntaxError("opening", "(")); } const extglob = extglobs[extglobs.length - 1]; - if (extglob && state3.parens === extglob.parens + 1) { + if (extglob && state2.parens === extglob.parens + 1) { extglobClose(extglobs.pop()); continue; } - push({ type: "paren", value: value8, output: state3.parens ? ")" : "\\)" }); + push({ type: "paren", value: value8, output: state2.parens ? ")" : "\\)" }); decrement4("parens"); continue; } @@ -366435,7 +366735,7 @@ var require_parse8 = __commonJS((exports, module2) => { push({ type: "text", value: value8, output: `\\${value8}` }); continue; } - if (state3.brackets === 0) { + if (state2.brackets === 0) { if (opts.strictBrackets === true) { throw new SyntaxError(syntaxError("opening", "[")); } @@ -366453,14 +366753,14 @@ var require_parse8 = __commonJS((exports, module2) => { continue; } const escaped = utils.escapeRegex(prev2.value); - state3.output = state3.output.slice(0, -prev2.value.length); + state2.output = state2.output.slice(0, -prev2.value.length); if (opts.literalBrackets === true) { - state3.output += escaped; + state2.output += escaped; prev2.value = escaped; continue; } prev2.value = `(${capture}${escaped}|${prev2.value})`; - state3.output += prev2.value; + state2.output += prev2.value; continue; } if (value8 === "{" && opts.nobrace !== true) { @@ -366469,8 +366769,8 @@ var require_parse8 = __commonJS((exports, module2) => { type: "brace", value: value8, output: "(", - outputIndex: state3.output.length, - tokensIndex: state3.tokens.length + outputIndex: state2.output.length, + tokensIndex: state2.tokens.length }; braces.push(open4); push(open4); @@ -366496,16 +366796,16 @@ var require_parse8 = __commonJS((exports, module2) => { } } output2 = expandRange(range6, opts); - state3.backtrack = true; + state2.backtrack = true; } if (brace.comma !== true && brace.dots !== true) { - const out2 = state3.output.slice(0, brace.outputIndex); - const toks = state3.tokens.slice(brace.tokensIndex); + const out2 = state2.output.slice(0, brace.outputIndex); + const toks = state2.tokens.slice(brace.tokensIndex); brace.value = brace.output = "\\{"; value8 = output2 = "\\}"; - state3.output = out2; + state2.output = out2; for (const t2 of toks) { - state3.output += t2.output || t2.value; + state2.output += t2.output || t2.value; } } push({ type: "brace", value: value8, output: output2 }); @@ -366531,10 +366831,10 @@ var require_parse8 = __commonJS((exports, module2) => { continue; } if (value8 === "/") { - if (prev2.type === "dot" && state3.index === state3.start + 1) { - state3.start = state3.index + 1; - state3.consumed = ""; - state3.output = ""; + if (prev2.type === "dot" && state2.index === state2.start + 1) { + state2.start = state2.index + 1; + state2.consumed = ""; + state2.output = ""; tokens.pop(); prev2 = bos; continue; @@ -366543,7 +366843,7 @@ var require_parse8 = __commonJS((exports, module2) => { continue; } if (value8 === ".") { - if (state3.braces > 0 && prev2.type === "dot") { + if (state2.braces > 0 && prev2.type === "dot") { if (prev2.value === ".") prev2.output = DOT_LITERAL; const brace = braces[braces.length - 1]; @@ -366553,7 +366853,7 @@ var require_parse8 = __commonJS((exports, module2) => { brace.dots = true; continue; } - if (state3.braces + state3.parens === 0 && prev2.type !== "bos" && prev2.type !== "slash") { + if (state2.braces + state2.parens === 0 && prev2.type !== "bos" && prev2.type !== "slash") { push({ type: "text", value: value8, output: DOT_LITERAL }); continue; } @@ -366592,7 +366892,7 @@ var require_parse8 = __commonJS((exports, module2) => { continue; } } - if (opts.nonegate !== true && state3.index === 0) { + if (opts.nonegate !== true && state2.index === 0) { negate4(); continue; } @@ -366606,7 +366906,7 @@ var require_parse8 = __commonJS((exports, module2) => { push({ type: "plus", value: value8, output: PLUS_LITERAL }); continue; } - if (prev2 && (prev2.type === "bracket" || prev2.type === "paren" || prev2.type === "brace") || state3.parens > 0) { + if (prev2 && (prev2.type === "bracket" || prev2.type === "paren" || prev2.type === "brace") || state2.parens > 0) { push({ type: "plus", value: value8 }); continue; } @@ -366628,7 +366928,7 @@ var require_parse8 = __commonJS((exports, module2) => { const match17 = REGEX_NON_SPECIAL_CHARS.exec(remaining2()); if (match17) { value8 += match17[0]; - state3.index += match17[0].length; + state2.index += match17[0].length; } push({ type: "text", value: value8 }); continue; @@ -366638,8 +366938,8 @@ var require_parse8 = __commonJS((exports, module2) => { prev2.star = true; prev2.value += value8; prev2.output = star3; - state3.backtrack = true; - state3.globstar = true; + state2.backtrack = true; + state2.globstar = true; consume(value8); continue; } @@ -366661,14 +366961,14 @@ var require_parse8 = __commonJS((exports, module2) => { push({ type: "star", value: value8, output: "" }); continue; } - const isBrace = state3.braces > 0 && (prior.type === "comma" || prior.type === "brace"); + const isBrace = state2.braces > 0 && (prior.type === "comma" || prior.type === "brace"); const isExtglob = extglobs.length && (prior.type === "pipe" || prior.type === "paren"); if (!isStart && prior.type !== "paren" && !isBrace && !isExtglob) { push({ type: "star", value: value8, output: "" }); continue; } while (rest.slice(0, 3) === "/**") { - const after = input[state3.index + 4]; + const after = input[state2.index + 4]; if (after && after !== "/") { break; } @@ -366679,31 +366979,31 @@ var require_parse8 = __commonJS((exports, module2) => { prev2.type = "globstar"; prev2.value += value8; prev2.output = globstar(opts); - state3.output = prev2.output; - state3.globstar = true; + state2.output = prev2.output; + state2.globstar = true; consume(value8); continue; } if (prior.type === "slash" && prior.prev.type !== "bos" && !afterStar && eos()) { - state3.output = state3.output.slice(0, -(prior.output + prev2.output).length); + state2.output = state2.output.slice(0, -(prior.output + prev2.output).length); prior.output = `(?:${prior.output}`; prev2.type = "globstar"; prev2.output = globstar(opts) + (opts.strictSlashes ? ")" : "|$)"); prev2.value += value8; - state3.globstar = true; - state3.output += prior.output + prev2.output; + state2.globstar = true; + state2.output += prior.output + prev2.output; consume(value8); continue; } if (prior.type === "slash" && prior.prev.type !== "bos" && rest[0] === "/") { const end4 = rest[1] !== undefined ? "|$" : ""; - state3.output = state3.output.slice(0, -(prior.output + prev2.output).length); + state2.output = state2.output.slice(0, -(prior.output + prev2.output).length); prior.output = `(?:${prior.output}`; prev2.type = "globstar"; prev2.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end4})`; prev2.value += value8; - state3.output += prior.output + prev2.output; - state3.globstar = true; + state2.output += prior.output + prev2.output; + state2.globstar = true; consume(value8 + advance()); push({ type: "slash", value: "/", output: "" }); continue; @@ -366712,18 +367012,18 @@ var require_parse8 = __commonJS((exports, module2) => { prev2.type = "globstar"; prev2.value += value8; prev2.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`; - state3.output = prev2.output; - state3.globstar = true; + state2.output = prev2.output; + state2.globstar = true; consume(value8 + advance()); push({ type: "slash", value: "/", output: "" }); continue; } - state3.output = state3.output.slice(0, -prev2.output.length); + state2.output = state2.output.slice(0, -prev2.output.length); prev2.type = "globstar"; prev2.output = globstar(opts); prev2.value += value8; - state3.output += prev2.output; - state3.globstar = true; + state2.output += prev2.output; + state2.globstar = true; consume(value8); continue; } @@ -366741,55 +367041,55 @@ var require_parse8 = __commonJS((exports, module2) => { push(token); continue; } - if (state3.index === state3.start || prev2.type === "slash" || prev2.type === "dot") { + if (state2.index === state2.start || prev2.type === "slash" || prev2.type === "dot") { if (prev2.type === "dot") { - state3.output += NO_DOT_SLASH; + state2.output += NO_DOT_SLASH; prev2.output += NO_DOT_SLASH; } else if (opts.dot === true) { - state3.output += NO_DOTS_SLASH; + state2.output += NO_DOTS_SLASH; prev2.output += NO_DOTS_SLASH; } else { - state3.output += nodot; + state2.output += nodot; prev2.output += nodot; } if (peek4() !== "*") { - state3.output += ONE_CHAR; + state2.output += ONE_CHAR; prev2.output += ONE_CHAR; } } push(token); } - while (state3.brackets > 0) { + while (state2.brackets > 0) { if (opts.strictBrackets === true) throw new SyntaxError(syntaxError("closing", "]")); - state3.output = utils.escapeLast(state3.output, "["); + state2.output = utils.escapeLast(state2.output, "["); decrement4("brackets"); } - while (state3.parens > 0) { + while (state2.parens > 0) { if (opts.strictBrackets === true) throw new SyntaxError(syntaxError("closing", ")")); - state3.output = utils.escapeLast(state3.output, "("); + state2.output = utils.escapeLast(state2.output, "("); decrement4("parens"); } - while (state3.braces > 0) { + while (state2.braces > 0) { if (opts.strictBrackets === true) throw new SyntaxError(syntaxError("closing", "}")); - state3.output = utils.escapeLast(state3.output, "{"); + state2.output = utils.escapeLast(state2.output, "{"); decrement4("braces"); } if (opts.strictSlashes !== true && (prev2.type === "star" || prev2.type === "bracket")) { push({ type: "maybe_slash", value: "", output: `${SLASH_LITERAL}?` }); } - if (state3.backtrack === true) { - state3.output = ""; - for (const token of state3.tokens) { - state3.output += token.output != null ? token.output : token.value; + if (state2.backtrack === true) { + state2.output = ""; + for (const token of state2.tokens) { + state2.output += token.output != null ? token.output : token.value; if (token.suffix) { - state3.output += token.suffix; + state2.output += token.suffix; } } } - return state3; + return state2; }; parse13.fastpaths = (input, options4) => { const opts = { ...options4 }; @@ -366814,7 +367114,7 @@ var require_parse8 = __commonJS((exports, module2) => { const nodot = opts.dot ? NO_DOTS : NO_DOT; const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT; const capture = opts.capture ? "" : "?:"; - const state3 = { negated: false, prefix: "" }; + const state2 = { negated: false, prefix: "" }; let star3 = opts.bash === true ? ".*?" : STAR; if (opts.capture) { star3 = `(${star3})`; @@ -366853,7 +367153,7 @@ var require_parse8 = __commonJS((exports, module2) => { } } }; - const output2 = utils.removePrefix(input, state3); + const output2 = utils.removePrefix(input, state2); let source2 = create(output2); if (source2 && opts.strictSlashes !== true) { source2 += `${SLASH_LITERAL}?`; @@ -366876,9 +367176,9 @@ var require_picomatch = __commonJS((exports, module2) => { const fns = glob.map((input) => picomatch(input, options4, returnState)); const arrayMatcher = (str3) => { for (const isMatch of fns) { - const state4 = isMatch(str3); - if (state4) - return state4; + const state3 = isMatch(str3); + if (state3) + return state3; } return false; }; @@ -366891,7 +367191,7 @@ var require_picomatch = __commonJS((exports, module2) => { const opts = options4 || {}; const posix2 = utils.isWindows(options4); const regex2 = isState ? picomatch.compileRe(glob, options4) : picomatch.makeRe(glob, options4, false, true); - const state3 = regex2.state; + const state2 = regex2.state; delete regex2.state; let isIgnored2 = () => false; if (opts.ignore) { @@ -366900,7 +367200,7 @@ var require_picomatch = __commonJS((exports, module2) => { } const matcher = (input, returnObject = false) => { const { isMatch, match: match17, output: output2 } = picomatch.test(input, regex2, options4, { glob, posix: posix2 }); - const result6 = { glob, state: state3, regex: regex2, posix: posix2, input, output: output2, match: match17, isMatch }; + const result6 = { glob, state: state2, regex: regex2, posix: posix2, input, output: output2, match: match17, isMatch }; if (typeof opts.onResult === "function") { opts.onResult(result6); } @@ -366921,7 +367221,7 @@ var require_picomatch = __commonJS((exports, module2) => { return returnObject ? result6 : true; }; if (returnState) { - matcher.state = state3; + matcher.state = state2; } return matcher; }; @@ -366960,20 +367260,20 @@ var require_picomatch = __commonJS((exports, module2) => { return parse13(pattern, { ...options4, fastpaths: false }); }; picomatch.scan = (input, options4) => scan5(input, options4); - picomatch.compileRe = (state3, options4, returnOutput = false, returnState = false) => { + picomatch.compileRe = (state2, options4, returnOutput = false, returnState = false) => { if (returnOutput === true) { - return state3.output; + return state2.output; } const opts = options4 || {}; const prepend7 = opts.contains ? "" : "^"; const append8 = opts.contains ? "" : "$"; - let source2 = `${prepend7}(?:${state3.output})${append8}`; - if (state3 && state3.negated === true) { + let source2 = `${prepend7}(?:${state2.output})${append8}`; + if (state2 && state2.negated === true) { source2 = `^(?!${source2}).*$`; } const regex2 = picomatch.toRegex(source2, options4); if (returnState === true) { - regex2.state = state3; + regex2.state = state2; } return regex2; }; @@ -367022,10 +367322,10 @@ var require_micromatch = __commonJS((exports, module2) => { let keep = new Set; let items2 = new Set; let negatives = 0; - let onResult = (state3) => { - items2.add(state3.output); + let onResult = (state2) => { + items2.add(state2.output); if (options4 && options4.onResult) { - options4.onResult(state3); + options4.onResult(state2); } }; for (let i7 = 0;i7 < patterns.length; i7++) { @@ -367066,10 +367366,10 @@ var require_micromatch = __commonJS((exports, module2) => { patterns = [].concat(patterns).map(String); let result6 = new Set; let items2 = []; - let onResult = (state3) => { + let onResult = (state2) => { if (options4.onResult) - options4.onResult(state3); - items2.push(state3.output); + options4.onResult(state2); + items2.push(state2.output); }; let matches = new Set(micromatch(list, patterns, { ...options4, onResult })); for (let item of items2) { @@ -367344,22 +367644,22 @@ function normalizeOptions(dir2, opts = {}) { if (!opts.ignorePaths) { opts.ignorePaths = []; } - opts.ignorePaths.push(path48.resolve(dir2, value8)); + opts.ignorePaths.push(path49.resolve(dir2, value8)); } } } return opts; } -var path48, micromatch, isGlob, $createWrapper = (binding) => { +var path49, micromatch, isGlob, $createWrapper = (binding) => { return { - writeSnapshot(dir2, snapshot4, opts) { - return binding.writeSnapshot(path48.resolve(dir2), path48.resolve(snapshot4), normalizeOptions(dir2, opts)); + writeSnapshot(dir2, snapshot3, opts) { + return binding.writeSnapshot(path49.resolve(dir2), path49.resolve(snapshot3), normalizeOptions(dir2, opts)); }, - getEventsSince(dir2, snapshot4, opts) { - return binding.getEventsSince(path48.resolve(dir2), path48.resolve(snapshot4), normalizeOptions(dir2, opts)); + getEventsSince(dir2, snapshot3, opts) { + return binding.getEventsSince(path49.resolve(dir2), path49.resolve(snapshot3), normalizeOptions(dir2, opts)); }, async subscribe(dir2, fn4, opts) { - dir2 = path48.resolve(dir2); + dir2 = path49.resolve(dir2); opts = normalizeOptions(dir2, opts); await binding.subscribe(dir2, fn4, opts); return { @@ -367369,12 +367669,12 @@ var path48, micromatch, isGlob, $createWrapper = (binding) => { }; }, unsubscribe(dir2, fn4, opts) { - return binding.unsubscribe(path48.resolve(dir2), fn4, normalizeOptions(dir2, opts)); + return binding.unsubscribe(path49.resolve(dir2), fn4, normalizeOptions(dir2, opts)); } }; }; var init_wrapper = __esm(() => { - path48 = __require("path"); + path49 = __require("path"); micromatch = require_micromatch(); isGlob = require_is_glob(); }); @@ -367561,7 +367861,7 @@ var init_ignore = __esm(() => { // packages/unifia/src/file/watcher.ts import { readdir as readdir3 } from "fs/promises"; -import path49 from "path"; +import path50 from "path"; var FileWatcher; var init_watcher = __esm(async () => { init_dist3(); @@ -367610,8 +367910,8 @@ var init_watcher = __esm(async () => { } function protecteds(dir2) { return Protected.paths().filter((item) => { - const rel = path49.relative(dir2, item); - return rel !== "" && !rel.startsWith("..") && !path49.isAbsolute(rel); + const rel = path50.relative(dir2, item); + return rel !== "" && !rel.startsWith("..") && !path50.isAbsolute(rel); }); } FileWatcher.hasNativeBinding = () => !!watcher(); @@ -367620,8 +367920,8 @@ var init_watcher = __esm(async () => { } FileWatcher.Service = Service3; FileWatcher.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { - const config6 = yield* Config.Service; - const state3 = yield* InstanceState.make(exports_Effect.fn("FileWatcher.state")(function* () { + const config5 = yield* Config.Service; + const state2 = yield* InstanceState.make(exports_Effect.fn("FileWatcher.state")(function* () { if (yield* Flag.UNIFIA_EXPERIMENTAL_DISABLE_FILEWATCHER) return; log12.info("init", { directory: Instance.directory }); @@ -367660,7 +367960,7 @@ var init_watcher = __esm(async () => { return exports_Effect.void; })); }; - const cfg = yield* config6.get(); + const cfg = yield* config5.get(); const cfgIgnores = cfg.watcher?.ignore ?? []; if (yield* Flag.UNIFIA_EXPERIMENTAL_FILEWATCHER) { yield* subscribe3(Instance.directory, [ @@ -367673,7 +367973,7 @@ var init_watcher = __esm(async () => { const result6 = yield* exports_Effect.promise(() => Git.run(["rev-parse", "--git-dir"], { cwd: Instance.project.worktree })); - const vcsDir = result6.exitCode === 0 ? path49.resolve(Instance.project.worktree, result6.text().trim()) : undefined; + const vcsDir = result6.exitCode === 0 ? path50.resolve(Instance.project.worktree, result6.text().trim()) : undefined; if (vcsDir && !cfgIgnores.includes(".git") && !cfgIgnores.includes(vcsDir)) { const ignore6 = (yield* exports_Effect.promise(() => readdir3(vcsDir).catch(() => []))).filter((entry) => entry !== "HEAD"); yield* subscribe3(vcsDir, ignore6); @@ -367685,7 +367985,7 @@ var init_watcher = __esm(async () => { }))); return Service3.of({ init: exports_Effect.fn("FileWatcher.init")(function* () { - yield* InstanceState.get(state3); + yield* InstanceState.get(state2); }) }); })); @@ -367701,7 +368001,7 @@ var init_watcher = __esm(async () => { // packages/unifia/src/file/index.ts import { createHash as createHash5 } from "crypto"; import { mkdir as fsMkdir, open as fsOpen, rename as fsRename, rm as fsRm } from "fs/promises"; -import path50 from "path"; +import path51 from "path"; var import_fuzzysort2, import_ignore2, File4; var init_file = __esm(async () => { init_bus_event(); @@ -367968,8 +368268,8 @@ var init_file = __esm(async () => { heic: "image/heic", heif: "image/heif" }; - const ext2 = (file6) => path50.extname(file6).toLowerCase().slice(1); - const name26 = (file6) => path50.basename(file6).toLowerCase(); + const ext2 = (file6) => path51.extname(file6).toLowerCase().slice(1); + const name26 = (file6) => path51.basename(file6).toLowerCase(); const isImageByExtension = (file6) => image.has(ext2(file6)); const isTextByExtension = (file6) => text9.has(ext2(file6)); const isTextByName = (file6) => textName.has(name26(file6)); @@ -368022,8 +368322,8 @@ var init_file = __esm(async () => { } function assertWritableTarget(full) { assertInsideProject(full); - let ancestor = path50.dirname(full); - while (ancestor && ancestor !== path50.dirname(ancestor)) { + let ancestor = path51.dirname(full); + while (ancestor && ancestor !== path51.dirname(ancestor)) { if (Filesystem.stat(ancestor)) { const real4 = AppFileSystem.resolve(ancestor); if (!Instance.containsPath(real4)) { @@ -368031,7 +368331,7 @@ var init_file = __esm(async () => { } return; } - ancestor = path50.dirname(ancestor); + ancestor = path51.dirname(ancestor); } } @@ -368040,11 +368340,11 @@ var init_file = __esm(async () => { File.Service = Service3; File.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const appFs = yield* AppFileSystem.Service; - const state3 = yield* InstanceState.make(exports_Effect.fn("File.state")(() => exports_Effect.succeed({ + const state2 = yield* InstanceState.make(exports_Effect.fn("File.state")(() => exports_Effect.succeed({ cache: { files: [], dirs: [] } }))); const scan5 = exports_Effect.fn("File.scan")(function* () { - if (Instance.directory === path50.parse(Instance.directory).root) + if (Instance.directory === path51.parse(Instance.directory).root) return; const isGlobalHome = Instance.directory === Global.Path.home && Instance.project.id === "global"; const next3 = { files: [], dirs: [] }; @@ -368067,7 +368367,7 @@ var init_file = __esm(async () => { if (shouldIgnoreName(entry.name)) continue; dirs.add(entry.name + "/"); - const base3 = path50.join(Instance.directory, entry.name); + const base3 = path51.join(Instance.directory, entry.name); const children = yield* appFs.readDirectoryEntries(base3).pipe(exports_Effect.catchCause((cause) => { log12.warn("readDirectoryEntries failed; subtree skipped", { dir: base3, @@ -368091,7 +368391,7 @@ var init_file = __esm(async () => { next3.files.push(file6); let current = file6; while (true) { - const dir2 = path50.dirname(current); + const dir2 = path51.dirname(current); if (dir2 === ".") break; if (dir2 === current) @@ -368104,7 +368404,7 @@ var init_file = __esm(async () => { } } } - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); s5.cache = next3; }); const scanLoggingCause = (cause) => { @@ -368154,7 +368454,7 @@ var init_file = __esm(async () => { for (const file6 of untrackedOutput.trim().split(` `)) { try { - const content = await Filesystem.readText(path50.join(Instance.directory, file6)); + const content = await Filesystem.readText(path51.join(Instance.directory, file6)); changed.push({ path: file6, added: content.split(` @@ -368189,17 +368489,17 @@ var init_file = __esm(async () => { } } return changed.map((item) => { - const full = path50.isAbsolute(item.path) ? item.path : path50.join(Instance.directory, item.path); + const full = path51.isAbsolute(item.path) ? item.path : path51.join(Instance.directory, item.path); return { ...item, - path: path50.relative(Instance.directory, full) + path: path51.relative(Instance.directory, full) }; }); }); }); const read4 = exports_Effect.fn("File.read")(function* (file6) { using _3 = log12.time("read", { file: file6 }); - const full = path50.join(Instance.directory, file6); + const full = path51.join(Instance.directory, file6); assertInsideProject(full); LSP.touchFile(full, false).catch((err2) => log12.warn("touchFile failed", { full, error: err2 })); if (isImageByExtension(file6)) { @@ -368271,17 +368571,17 @@ var init_file = __esm(async () => { let ignored = (_3) => false; if (Instance.project.vcs === "git") { const ig = import_ignore2.default(); - const gitignore = path50.join(Instance.project.worktree, ".gitignore"); + const gitignore = path51.join(Instance.project.worktree, ".gitignore"); const gitignoreText = yield* appFs.readFileString(gitignore).pipe(exports_Effect.catch(() => exports_Effect.succeed(""))); if (gitignoreText) ig.add(gitignoreText); - const ignoreFile = path50.join(Instance.project.worktree, ".ignore"); + const ignoreFile = path51.join(Instance.project.worktree, ".ignore"); const ignoreText = yield* appFs.readFileString(ignoreFile).pipe(exports_Effect.catch(() => exports_Effect.succeed(""))); if (ignoreText) ig.add(ignoreText); ignored = ig.ignores.bind(ig); } - const resolved = dir2 ? path50.join(Instance.directory, dir2) : Instance.directory; + const resolved = dir2 ? path51.join(Instance.directory, dir2) : Instance.directory; assertInsideProject(resolved); const entries10 = yield* appFs.readDirectoryEntries(resolved).pipe(exports_Effect.catchCause((cause) => { log12.warn("readDirectoryEntries failed; listing may be incomplete", { @@ -368294,8 +368594,8 @@ var init_file = __esm(async () => { for (const entry of entries10) { if (exclude.includes(entry.name)) continue; - const absolute = path50.join(resolved, entry.name); - const file6 = path50.relative(Instance.directory, absolute); + const absolute = path51.join(resolved, entry.name); + const file6 = path51.relative(Instance.directory, absolute); const type3 = entry.type === "directory" ? "directory" : "file"; nodes3.push({ name: entry.name, @@ -368313,7 +368613,7 @@ var init_file = __esm(async () => { }); const search3 = exports_Effect.fn("File.search")(function* (input) { yield* ensure2(); - const { cache: cache5 } = yield* InstanceState.get(state3); + const { cache: cache5 } = yield* InstanceState.get(state2); const query2 = input.query.trim(); const normalizedQuery = query2.replaceAll("\\", "/"); const limit2 = input.limit ?? 100; @@ -368335,7 +368635,7 @@ var init_file = __esm(async () => { return output2; }); const mkdir6 = exports_Effect.fn("File.mkdir")(function* (dir2) { - const resolved = path50.isAbsolute(dir2) ? dir2 : path50.join(Instance.directory, dir2); + const resolved = path51.isAbsolute(dir2) ? dir2 : path51.join(Instance.directory, dir2); assertInsideProject(resolved); yield* appFs.ensureDir(resolved).pipe(exports_Effect.catch((err2) => { log12.warn("ensureDir failed", { dir: resolved, error: String(err2) }); @@ -368418,9 +368718,9 @@ var init_file = __esm(async () => { return stampOf(content, Filesystem.stat(full)); } async function atomicWrite(full, content) { - const dir2 = path50.dirname(full); + const dir2 = path51.dirname(full); await fsMkdir(dir2, { recursive: true }); - const tmp = path50.join(dir2, `.${path50.basename(full)}.${process.pid}.${Date.now()}.tmp`); + const tmp = path51.join(dir2, `.${path51.basename(full)}.${process.pid}.${Date.now()}.tmp`); const handle2 = await fsOpen(tmp, "w"); try { await handle2.writeFile(content, "utf8"); @@ -368467,15 +368767,15 @@ var init_file = __esm(async () => { LSP.touchFile(full, false).catch((err2) => log12.warn("touchFile failed", { full, error: err2 })); } function toCanonicalRelative(full) { - const rel = path50.relative(Instance.directory, full); - return rel.split(path50.sep).join("/"); + const rel = path51.relative(Instance.directory, full); + return rel.split(path51.sep).join("/"); } File.toCanonicalRelative = toCanonicalRelative; async function write2(input) { - if (path50.isAbsolute(input.path)) { + if (path51.isAbsolute(input.path)) { throw new Error(`File.write: input.path must be relative to project root, got absolute: ${input.path}`); } - const full = path50.join(Instance.directory, input.path); + const full = path51.join(Instance.directory, input.path); assertWritableTarget(full); return FileTime.withLock(full, async () => { const exists3 = await Filesystem.exists(full); @@ -368504,10 +368804,10 @@ var init_file = __esm(async () => { } File.write = write2; async function readRaw(file6) { - if (path50.isAbsolute(file6)) { + if (path51.isAbsolute(file6)) { throw new Error(`File.readRaw: file must be relative to project root, got absolute: ${file6}`); } - const full = path50.join(Instance.directory, file6); + const full = path51.join(Instance.directory, file6); assertInsideProject(full); if (!await Filesystem.exists(full)) throw new PathNotFoundError(file6); @@ -368518,8 +368818,8 @@ var init_file = __esm(async () => { } File.readRaw = readRaw; async function relocate(from, to2, expectedHash) { - const fromFull = path50.join(Instance.directory, from); - const toFull = path50.join(Instance.directory, to2); + const fromFull = path51.join(Instance.directory, from); + const toFull = path51.join(Instance.directory, to2); if (fromFull === toFull) throw new Error("Source and destination are the same path"); assertInsideProject(fromFull); @@ -368536,7 +368836,7 @@ var init_file = __esm(async () => { } if (await Filesystem.exists(toFull)) throw new TargetExistsError(to2); - await fsMkdir(path50.dirname(toFull), { recursive: true }); + await fsMkdir(path51.dirname(toFull), { recursive: true }); await fsRename(fromFull, toFull); await notifyDelete(fromFull); await notifyWrite(toFull, "add"); @@ -368552,7 +368852,7 @@ var init_file = __esm(async () => { } File.move = move; async function remove19(input) { - const full = path50.join(Instance.directory, input.path); + const full = path51.join(Instance.directory, input.path); assertInsideProject(full); return FileTime.withLock(full, async () => { if (!await Filesystem.exists(full)) @@ -368575,7 +368875,7 @@ var init_file = __esm(async () => { }); // packages/unifia/src/tool/external-directory.ts -import path51 from "path"; +import path52 from "path"; async function assertExternalDirectory(ctx, target, options4) { if (!target) return; @@ -368585,8 +368885,8 @@ async function assertExternalDirectory(ctx, target, options4) { if (Instance.containsPath(full)) return; const kind = options4?.kind ?? "file"; - const dir2 = kind === "directory" ? full : path51.dirname(full); - const glob = process.platform === "win32" ? AppFileSystem.normalizePathPattern(path51.join(dir2, "*")) : path51.join(dir2, "*").replaceAll("\\", "/"); + const dir2 = kind === "directory" ? full : path52.dirname(full); + const glob = process.platform === "win32" ? AppFileSystem.normalizePathPattern(path52.join(dir2, "*")) : path52.join(dir2, "*").replaceAll("\\", "/"); await ctx.ask({ permission: "external_directory", patterns: [glob], @@ -369022,7 +369322,7 @@ var init_lock = __esm(async () => { }); // packages/unifia/src/tool/edit.ts -import * as path52 from "path"; +import * as path53 from "path"; function normalizeLineEndings(text9) { return text9.replaceAll(`\r `, ` @@ -369496,7 +369796,7 @@ var init_edit3 = __esm(async () => { if (params.oldString === params.newString) { throw new Error("No changes to apply: oldString and newString are identical."); } - const filePath = path52.isAbsolute(params.filePath) ? params.filePath : path52.join(Instance.directory, params.filePath); + const filePath = path53.isAbsolute(params.filePath) ? params.filePath : path53.join(Instance.directory, params.filePath); await assertExternalDirectory(ctx, filePath); if (params.dry_run) { let previewDiff; @@ -369523,7 +369823,7 @@ var init_edit3 = __esm(async () => { ${previewDiff} \`\`\``; return { - title: `[dry-run] Edit ${path52.basename(filePath)}`, + title: `[dry-run] Edit ${path53.basename(filePath)}`, metadata: { diff: previewDiff, filediff: { file: filePath, before: "", after: "", additions: 0, deletions: 0 }, @@ -369542,7 +369842,7 @@ ${previewDiff} diff = trimDiff(createTwoFilesPatch(filePath, filePath, contentOld, contentNew)); await ctx.ask({ permission: "edit", - patterns: [path52.relative(Instance.worktree, filePath)], + patterns: [path53.relative(Instance.worktree, filePath)], always: ["*"], metadata: { filepath: filePath, @@ -369573,7 +369873,7 @@ ${previewDiff} diff = trimDiff(createTwoFilesPatch(filePath, filePath, normalizeLineEndings(contentOld), normalizeLineEndings(contentNew))); await ctx.ask({ permission: "edit", - patterns: [path52.relative(Instance.worktree, filePath)], + patterns: [path53.relative(Instance.worktree, filePath)], always: ["*"], metadata: { filepath: filePath, @@ -369647,7 +369947,7 @@ File is being edited by ${lockConflict.heldBy.username} (session: ${lockConflict diff, filediff }, - title: `${path52.relative(Instance.worktree, filePath)}`, + title: `${path53.relative(Instance.worktree, filePath)}`, output: output2 }; } @@ -369665,7 +369965,7 @@ var glob_default = `- Fast file pattern matching tool that works with any codeba var init_glob2 = () => {}; // packages/unifia/src/tool/glob.ts -import path53 from "path"; +import path54 from "path"; var GlobTool; var init_glob3 = __esm(async () => { init_zod(); @@ -369694,7 +369994,7 @@ var init_glob3 = __esm(async () => { } }); let search2 = params.path ?? Instance.directory; - search2 = path53.isAbsolute(search2) ? search2 : path53.resolve(Instance.directory, search2); + search2 = path54.isAbsolute(search2) ? search2 : path54.resolve(Instance.directory, search2); await assertExternalDirectory(ctx, search2, { kind: "directory" }); const limit2 = 100; const files = []; @@ -369708,7 +370008,7 @@ var init_glob3 = __esm(async () => { truncated = true; break; } - const full = path53.resolve(search2, file6); + const full = path54.resolve(search2, file6); const stats = Filesystem.stat(full)?.mtime.getTime() ?? 0; files.push({ path: full, @@ -369727,7 +370027,7 @@ var init_glob3 = __esm(async () => { } } return { - title: path53.relative(Instance.worktree, search2), + title: path54.relative(Instance.worktree, search2), metadata: { count: files.length, truncated @@ -369753,7 +370053,7 @@ var init_grep = () => {}; // packages/unifia/src/tool/grep.ts import { text as text9 } from "stream/consumers"; -import path54 from "path"; +import path55 from "path"; var MAX_LINE_LENGTH = 2000, GrepTool; var init_grep2 = __esm(async () => { init_zod(); @@ -369788,7 +370088,7 @@ var init_grep2 = __esm(async () => { } }); let searchPath = params.path ?? Instance.directory; - searchPath = path54.isAbsolute(searchPath) ? searchPath : path54.resolve(Instance.directory, searchPath); + searchPath = path55.isAbsolute(searchPath) ? searchPath : path55.resolve(Instance.directory, searchPath); await assertExternalDirectory(ctx, searchPath, { kind: "directory" }); const rgPath = await Ripgrep.filepath(); const args3 = ["-nH", "--hidden", "--no-messages", "--field-match-separator=|", "--regexp", params.pattern]; @@ -370094,7 +370394,7 @@ var init_read = () => {}; // packages/unifia/src/tool/read.ts import { createReadStream } from "fs"; import { open as open4 } from "fs/promises"; -import * as path55 from "path"; +import * as path56 from "path"; import { createInterface } from "readline"; async function lines(filepath, opts) { const stream4 = createReadStream(filepath, { encoding: "utf8" }); @@ -370134,7 +370434,7 @@ async function lines(filepath, opts) { return { raw: raw3, count: count5, cut, more, offset: opts.offset }; } async function isBinaryFile(filepath, fileSize) { - const ext2 = path55.extname(filepath).toLowerCase(); + const ext2 = path56.extname(filepath).toLowerCase(); switch (ext2) { case ".zip": case ".tar": @@ -370219,9 +370519,9 @@ var init_read2 = __esm(async () => { const time6 = yield* FileTime.Service; const scope3 = yield* exports_Scope.Scope; const miss = exports_Effect.fn("ReadTool.miss")(function* (filepath) { - const dir2 = path55.dirname(filepath); - const base3 = path55.basename(filepath); - const items2 = yield* fs18.readDirectory(dir2).pipe(exports_Effect.map((items3) => items3.filter((item) => item.toLowerCase().includes(base3.toLowerCase()) || base3.toLowerCase().includes(item.toLowerCase())).map((item) => path55.join(dir2, item)).slice(0, 3)), exports_Effect.catch(() => exports_Effect.succeed([]))); + const dir2 = path56.dirname(filepath); + const base3 = path56.basename(filepath); + const items2 = yield* fs18.readDirectory(dir2).pipe(exports_Effect.map((items3) => items3.filter((item) => item.toLowerCase().includes(base3.toLowerCase()) || base3.toLowerCase().includes(item.toLowerCase())).map((item) => path56.join(dir2, item)).slice(0, 3)), exports_Effect.catch(() => exports_Effect.succeed([]))); if (items2.length > 0) { return yield* exports_Effect.fail(new Error(`File not found: ${filepath} @@ -370238,7 +370538,7 @@ ${items2.join(` return item.name + "/"; if (item.type !== "symlink") return item.name; - const target = yield* fs18.stat(path55.join(filepath, item.name)).pipe(exports_Effect.catch(() => exports_Effect.succeed(undefined))); + const target = yield* fs18.stat(path56.join(filepath, item.name)).pipe(exports_Effect.catch(() => exports_Effect.succeed(undefined))); if (target?.type === "Directory") return item.name + "/"; return item.name; @@ -370253,13 +370553,13 @@ ${items2.join(` return yield* exports_Effect.fail(new Error("offset must be greater than or equal to 1")); } let filepath = params.filePath; - if (!path55.isAbsolute(filepath)) { - filepath = path55.resolve(Instance.directory, filepath); + if (!path56.isAbsolute(filepath)) { + filepath = path56.resolve(Instance.directory, filepath); } if (process.platform === "win32") { filepath = AppFileSystem.normalizePath(filepath); } - const title = path55.relative(Instance.worktree, filepath); + const title = path56.relative(Instance.worktree, filepath); const stat4 = yield* fs18.stat(filepath).pipe(exports_Effect.catchIf((err2) => ("reason" in err2) && err2.reason._tag === "NotFound", () => exports_Effect.succeed(undefined))); yield* assertExternalDirectoryEffect(ctx, filepath, { bypass: Boolean(ctx.extra?.["bypassCwdCheck"]), @@ -370494,7 +370794,7 @@ var init_workspace_sql = __esm(() => { }); // packages/unifia/src/project/vcs.ts -import path56 from "path"; +import path57 from "path"; var Vcs2; var init_vcs = __esm(async () => { init_dist3(); @@ -370523,7 +370823,7 @@ var init_vcs = __esm(async () => { `).length; }; const work = exports_Effect.fnUntraced(function* (fs18, cwd, file6) { - const full = path56.join(cwd, file6); + const full = path57.join(cwd, file6); if (!(yield* fs18.exists(full).pipe(exports_Effect.orDie))) return ""; const buf = yield* fs18.readFile(full).pipe(exports_Effect.catch(() => exports_Effect.succeed(new Uint8Array))); @@ -370597,7 +370897,7 @@ var init_vcs = __esm(async () => { const fs18 = yield* AppFileSystem.Service; const git = yield* Git.Service; const bus = yield* Bus.Service; - const state3 = yield* InstanceState.make(exports_Effect.fn("Vcs.state")((ctx) => exports_Effect.gen(function* () { + const state2 = yield* InstanceState.make(exports_Effect.fn("Vcs.state")((ctx) => exports_Effect.gen(function* () { if (ctx.project.vcs !== "git") { return { current: undefined, root: undefined }; } @@ -370650,16 +370950,16 @@ var init_vcs = __esm(async () => { }))); return Service3.of({ init: exports_Effect.fn("Vcs.init")(function* () { - yield* InstanceState.get(state3); + yield* InstanceState.get(state2); }), branch: exports_Effect.fn("Vcs.branch")(function* () { - return yield* InstanceState.use(state3, (x3) => x3.current); + return yield* InstanceState.use(state2, (x3) => x3.current); }), defaultBranch: exports_Effect.fn("Vcs.defaultBranch")(function* () { - return yield* InstanceState.use(state3, (x3) => x3.root?.name); + return yield* InstanceState.use(state2, (x3) => x3.root?.name); }), diff: exports_Effect.fn("Vcs.diff")(function* (mode2) { - const value8 = yield* InstanceState.get(state3); + const value8 = yield* InstanceState.get(state2); if (Instance.project.vcs !== "git") return []; if (mode2 === "git") { @@ -379503,21 +379803,21 @@ var init_client12 = __esm(() => { this._pendingListChangedConfig = options4.listChanged; } } - _setupListChangedHandlers(config6) { - if (config6.tools && this._serverCapabilities?.tools?.listChanged) { - this._setupListChangedHandler("tools", ToolListChangedNotificationSchema, config6.tools, async () => { + _setupListChangedHandlers(config5) { + if (config5.tools && this._serverCapabilities?.tools?.listChanged) { + this._setupListChangedHandler("tools", ToolListChangedNotificationSchema, config5.tools, async () => { const result6 = await this.listTools(); return result6.tools; }); } - if (config6.prompts && this._serverCapabilities?.prompts?.listChanged) { - this._setupListChangedHandler("prompts", PromptListChangedNotificationSchema, config6.prompts, async () => { + if (config5.prompts && this._serverCapabilities?.prompts?.listChanged) { + this._setupListChangedHandler("prompts", PromptListChangedNotificationSchema, config5.prompts, async () => { const result6 = await this.listPrompts(); return result6.prompts; }); } - if (config6.resources && this._serverCapabilities?.resources?.listChanged) { - this._setupListChangedHandler("resources", ResourceListChangedNotificationSchema, config6.resources, async () => { + if (config5.resources && this._serverCapabilities?.resources?.listChanged) { + this._setupListChangedHandler("resources", ResourceListChangedNotificationSchema, config5.resources, async () => { const result6 = await this.listResources(); return result6.resources; }); @@ -380427,11 +380727,11 @@ async function authInternal(provider2, { serverUrl, authorizationCode, scope: sc } } } - const state3 = provider2.state ? await provider2.state() : undefined; + const state2 = provider2.state ? await provider2.state() : undefined; const { authorizationUrl, codeVerifier } = await startAuthorization(authorizationServerUrl, { metadata: metadata2, clientInformation, - state: state3, + state: state2, redirectUrl: provider2.redirectUrl, scope: scope3 || resourceMetadata?.scopes_supported?.join(" ") || provider2.clientMetadata.scope, resource @@ -380639,7 +380939,7 @@ async function discoverOAuthServerInfo(serverUrl, opts) { resourceMetadata }; } -async function startAuthorization(authorizationServerUrl, { metadata: metadata2, clientInformation, redirectUrl, scope: scope3, state: state3, resource }) { +async function startAuthorization(authorizationServerUrl, { metadata: metadata2, clientInformation, redirectUrl, scope: scope3, state: state2, resource }) { let authorizationUrl; if (metadata2) { authorizationUrl = new URL(metadata2.authorization_endpoint); @@ -380660,8 +380960,8 @@ async function startAuthorization(authorizationServerUrl, { metadata: metadata2, authorizationUrl.searchParams.set("code_challenge", codeChallenge); authorizationUrl.searchParams.set("code_challenge_method", AUTHORIZATION_CODE_CHALLENGE_METHOD); authorizationUrl.searchParams.set("redirect_uri", String(redirectUrl)); - if (state3) { - authorizationUrl.searchParams.set("state", state3); + if (state2) { + authorizationUrl.searchParams.set("state", state2); } if (scope3) { authorizationUrl.searchParams.set("scope", scope3); @@ -381703,7 +382003,7 @@ var init_stdio2 = __esm(() => { }); // packages/unifia/src/mcp/auth.ts -import path57 from "path"; +import path58 from "path"; var McpAuth; var init_auth5 = __esm(async () => { init_zod(); @@ -381733,7 +382033,7 @@ var init_auth5 = __esm(async () => { oauthState: zod_default.string().optional(), serverUrl: zod_default.string().optional() }); - const filepath = path57.join(Global.Path.data, "mcp-auth.json"); + const filepath = path58.join(Global.Path.data, "mcp-auth.json"); class Service3 extends exports_ServiceMap.Service()("@opencode/McpAuth") { } @@ -381834,10 +382134,10 @@ class McpOAuthProvider { serverUrl; config; callbacks; - constructor(mcpName, serverUrl, config6, callbacks) { + constructor(mcpName, serverUrl, config5, callbacks) { this.mcpName = mcpName; this.serverUrl = serverUrl; - this.config = config6; + this.config = config5; this.callbacks = callbacks; } get redirectUrl() { @@ -381920,8 +382220,8 @@ class McpOAuthProvider { } return entry.codeVerifier; } - async saveState(state3) { - await McpAuth.updateOAuthState(this.mcpName, state3); + async saveState(state2) { + await McpAuth.updateOAuthState(this.mcpName, state2); } async state() { const entry = await McpAuth.get(this.mcpName); @@ -382029,11 +382329,11 @@ var init_oauth_callback = __esm(async () => { return new Response("Not found", { status: 404 }); } const code = url4.searchParams.get("code"); - const state3 = url4.searchParams.get("state"); + const state2 = url4.searchParams.get("state"); const error49 = url4.searchParams.get("error"); const errorDescription = url4.searchParams.get("error_description"); - log30.info("received oauth callback", { hasCode: !!code, state: state3, error: error49 }); - if (!state3) { + log30.info("received oauth callback", { hasCode: !!code, state: state2, error: error49 }); + if (!state2) { const errorMsg = "Missing required state parameter - potential CSRF attack"; log30.error("oauth callback missing state parameter", { url: url4.toString() }); return new Response(HTML_ERROR2(errorMsg), { @@ -382043,12 +382343,12 @@ var init_oauth_callback = __esm(async () => { } if (error49) { const errorMsg = errorDescription || error49; - if (pendingAuths.has(state3)) { - const pending3 = pendingAuths.get(state3); + if (pendingAuths.has(state2)) { + const pending3 = pendingAuths.get(state2); clearTimeout(pending3.timeout); - pendingAuths.delete(state3); + pendingAuths.delete(state2); for (const [name26, s5] of mcpNameToState) { - if (s5 === state3) { + if (s5 === state2) { mcpNameToState.delete(name26); break; } @@ -382065,19 +382365,19 @@ var init_oauth_callback = __esm(async () => { headers: { "Content-Type": "text/html" } }); } - if (!pendingAuths.has(state3)) { + if (!pendingAuths.has(state2)) { const errorMsg = "Invalid or expired state parameter - potential CSRF attack"; - log30.error("oauth callback with invalid state", { state: state3, pendingStates: Array.from(pendingAuths.keys()) }); + log30.error("oauth callback with invalid state", { state: state2, pendingStates: Array.from(pendingAuths.keys()) }); return new Response(HTML_ERROR2(errorMsg), { status: 400, headers: { "Content-Type": "text/html" } }); } - const pending2 = pendingAuths.get(state3); + const pending2 = pendingAuths.get(state2); clearTimeout(pending2.timeout); - pendingAuths.delete(state3); + pendingAuths.delete(state2); for (const [name26, s5] of mcpNameToState) { - if (s5 === state3) { + if (s5 === state2) { mcpNameToState.delete(name26); break; } @@ -382419,7 +382719,7 @@ var init_default_browser = __esm(() => { // node_modules/open/index.js import process8 from "process"; import { Buffer as Buffer3 } from "buffer"; -import path58 from "path"; +import path59 from "path"; import { fileURLToPath as fileURLToPath7 } from "url"; import util7 from "util"; import childProcess from "child_process"; @@ -382629,8 +382929,8 @@ var init_open = __esm(() => { init_default_browser(); init_is_inside_container(); execFile6 = util7.promisify(childProcess.execFile); - __dirname3 = path58.dirname(fileURLToPath7(import.meta.url)); - localXdgOpenPath = path58.join(__dirname3, "xdg-open"); + __dirname3 = path59.dirname(fileURLToPath7(import.meta.url)); + localXdgOpenPath = path59.join(__dirname3, "xdg-open"); ({ platform: platform4, arch } = process8); getWslDrivesMountPoint = (() => { const defaultMountPoint = "/mnt/"; @@ -383007,15 +383307,15 @@ var init_mcp = __esm(async () => { } }); } - const state3 = yield* InstanceState.make(exports_Effect.fn("MCP.state")(function* () { + const state2 = yield* InstanceState.make(exports_Effect.fn("MCP.state")(function* () { const cfg = yield* cfgSvc.get(); - const config6 = cfg.mcp ?? {}; + const config5 = cfg.mcp ?? {}; const s5 = { status: {}, clients: {}, defs: {} }; - yield* exports_Effect.forEach(Object.entries(config6), ([key, mcp2]) => exports_Effect.gen(function* () { + yield* exports_Effect.forEach(Object.entries(config5), ([key, mcp2]) => exports_Effect.gen(function* () { if (!isMcpConfigured(mcp2)) { log12.error("Ignoring MCP config entry without type", { key }); return; @@ -383059,11 +383359,11 @@ var init_mcp = __esm(async () => { return exports_Effect.tryPromise(() => client3.close()).pipe(exports_Effect.ignore); } const status2 = exports_Effect.fn("MCP.status")(function* () { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const cfg = yield* cfgSvc.get(); - const config6 = cfg.mcp ?? {}; + const config5 = cfg.mcp ?? {}; const result6 = {}; - for (const [key, mcp2] of Object.entries(config6)) { + for (const [key, mcp2] of Object.entries(config5)) { if (!isMcpConfigured(mcp2)) continue; result6[key] = s5.status[key] ?? { status: "disabled" }; @@ -383071,11 +383371,11 @@ var init_mcp = __esm(async () => { return result6; }); const clients = exports_Effect.fn("MCP.clients")(function* () { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); return s5.clients; }); const createAndStore = exports_Effect.fn("MCP.createAndStore")(function* (name26, mcp2) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const result6 = yield* create(name26, mcp2); s5.status[name26] = result6.status; if (!result6.mcpClient) { @@ -383093,7 +383393,7 @@ var init_mcp = __esm(async () => { yield* createAndStore(name26, mcp2); const cfg = yield* cfgSvc.get(); yield* cfgSvc.update({ ...cfg, mcp: { ...cfg.mcp ?? {}, [name26]: mcp2 } }); - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); return { status: s5.status }; }); const connect2 = exports_Effect.fn("MCP.connect")(function* (name26) { @@ -383105,13 +383405,13 @@ var init_mcp = __esm(async () => { yield* createAndStore(name26, { ...mcp2, enabled: true }); }); const disconnect3 = exports_Effect.fn("MCP.disconnect")(function* (name26) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); yield* closeClient(s5, name26); delete s5.clients[name26]; s5.status[name26] = { status: "disabled" }; }); const remove20 = exports_Effect.fn("MCP.remove")(function* (name26) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); yield* closeClient(s5, name26); delete s5.clients[name26]; delete s5.status[name26]; @@ -383122,13 +383422,13 @@ var init_mcp = __esm(async () => { }); const tools2 = exports_Effect.fn("MCP.tools")(function* () { const result6 = {}; - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const cfg = yield* cfgSvc.get(); - const config6 = cfg.mcp ?? {}; + const config5 = cfg.mcp ?? {}; const defaultTimeout = cfg.experimental?.mcp_timeout; const connectedClients = Object.entries(s5.clients).filter(([clientName]) => s5.status[clientName]?.status === "connected"); yield* exports_Effect.forEach(connectedClients, ([clientName, client3]) => exports_Effect.gen(function* () { - const mcpConfig = config6[clientName]; + const mcpConfig = config5[clientName]; const entry = mcpConfig && isMcpConfigured(mcpConfig) ? mcpConfig : undefined; const listed = s5.defs[clientName]; if (!listed) { @@ -383148,7 +383448,7 @@ var init_mcp = __esm(async () => { return allTools; if (!scope3.allow && !scope3.deny) return allTools; - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const connectedNames = Object.keys(s5.clients).filter((name26) => s5.status[name26]?.status === "connected"); let allowedServers; if (scope3.allow) { @@ -383191,15 +383491,15 @@ var init_mcp = __esm(async () => { return exports_Effect.forEach(Object.entries(s5.clients).filter(([name26]) => s5.status[name26]?.status === "connected"), ([clientName, client3]) => fetchFromClient(clientName, client3, listFn, label).pipe(exports_Effect.map((items2) => Object.entries(items2 ?? {}))), { concurrency: "unbounded" }).pipe(exports_Effect.map((results) => Object.fromEntries(results.flat()))); } const prompts2 = exports_Effect.fn("MCP.prompts")(function* () { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); return yield* collectFromConnected(s5, (c3) => c3.listPrompts().then((r5) => r5.prompts), "prompts"); }); const resources2 = exports_Effect.fn("MCP.resources")(function* () { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); return yield* collectFromConnected(s5, (c3) => c3.listResources().then((r5) => r5.resources), "resources"); }); const withClient = exports_Effect.fnUntraced(function* (clientName, fn4, label, meta3) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const client3 = s5.clients[clientName]; if (!client3) { log12.warn(`client not found for ${label}`, { clientName }); @@ -383391,7 +383691,7 @@ var init_mcp = __esm(async () => { // packages/unifia/src/command/template/initialize.txt var initialize_default = `Create or update \`AGENTS.md\` for this repository. -The goal is a compact instruction file that helps future OpenCode sessions avoid mistakes and ramp up quickly. Every line should answer: "Would an agent likely miss this without help?" If not, leave it out. +The goal is a compact instruction file that helps future Unifia sessions avoid mistakes and ramp up quickly. Every line should answer: "Would an agent likely miss this without help?" If not, leave it out. User-provided focus or constraints (honor these): $ARGUMENTS @@ -383403,7 +383703,7 @@ Read the highest-value sources first: - build, test, lint, formatter, typecheck, and codegen config - CI workflows and pre-commit / task runner config - existing instruction files (\`AGENTS.md\`, \`CLAUDE.md\`, \`.cursor/rules/\`, \`.cursorrules\`, \`.github/copilot-instructions.md\`) -- repo-local OpenCode config such as \`opencode.json\` +- repo-local Unifia config such as \`unifia.json\` If architecture is still unclear after reading config and docs, inspect a small number of representative code files to find the real entrypoints, package boundaries, and execution flow. Prefer reading the files that explain how the system is wired together over random leaf files. @@ -383448,7 +383748,7 @@ Exclude: - long tutorials or exhaustive file trees - obvious language conventions - speculative claims or anything you could not verify -- content better stored in another file referenced via \`opencode.json\` \`instructions\` +- content better stored in another file referenced via \`unifia.json\` \`instructions\` When in doubt, omit. @@ -383623,11 +383923,11 @@ var init_command = __esm(async () => { } Command.Service = Service3; Command.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { - const config6 = yield* Config.Service; + const config5 = yield* Config.Service; const mcp2 = yield* MCP.Service; const skill = yield* Skill.Service; const init4 = exports_Effect.fn("Command.state")(function* (ctx) { - const cfg = yield* config6.get(); + const cfg = yield* config5.get(); const commands4 = {}; commands4[Command.Default.INIT] = { name: Command.Default.INIT, @@ -383691,13 +383991,13 @@ var init_command = __esm(async () => { commands: commands4 }; }); - const state3 = yield* InstanceState.make((ctx) => init4(ctx)); + const state2 = yield* InstanceState.make((ctx) => init4(ctx)); const get34 = exports_Effect.fn("Command.get")(function* (name26) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); return s5.commands[name26]; }); const list2 = exports_Effect.fn("Command.list")(function* () { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); return Object.values(s5.commands); }); return Service3.of({ get: get34, list: list2 }); @@ -383799,7 +384099,7 @@ var init_share_next = __esm(async () => { return exports_Effect.gen(function* () { if (disabled) return; - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const existing = s5.queue.get(sessionID); if (existing) { for (const item of data2) { @@ -383814,7 +384114,7 @@ var init_share_next = __esm(async () => { })), exports_Effect.forkIn(s5.scope)); }); } - const state3 = yield* InstanceState.make(exports_Effect.fn("ShareNext.state")(function* (_ctx) { + const state2 = yield* InstanceState.make(exports_Effect.fn("ShareNext.state")(function* (_ctx) { const cache5 = { queue: new Map, scope: yield* exports_Scope.make() }; yield* exports_Effect.addFinalizer(() => exports_Scope.close(cache5.scope, exports_Exit.void).pipe(exports_Effect.andThen(exports_Effect.sync(() => { cache5.queue.clear(); @@ -383864,7 +384164,7 @@ var init_share_next = __esm(async () => { const flush = exports_Effect.fn("ShareNext.flush")(function* (sessionID) { if (disabled) return; - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const queued = s5.queue.get(sessionID); if (!queued) return; @@ -383895,7 +384195,7 @@ var init_share_next = __esm(async () => { const init5 = exports_Effect.fn("ShareNext.init")(function* () { if (disabled) return; - yield* InstanceState.get(state3); + yield* InstanceState.get(state2); }); const url5 = exports_Effect.fn("ShareNext.url")(function* () { return (yield* request4()).baseUrl; @@ -383910,7 +384210,7 @@ var init_share_next = __esm(async () => { target: SessionShareTable.session_id, set: { id: result6.id, secret: result6.secret, url: result6.url } }).run()); - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); yield* full(sessionID).pipe(exports_Effect.catchCause((cause) => exports_Effect.sync(() => { log12.error("share full sync failed", { sessionID, cause }); })), exports_Effect.forkIn(s5.scope)); @@ -384478,16 +384778,16 @@ var init_worktree2 = __esm(async () => { }; }, async create(info3) { - const config6 = Config4.parse(info3); + const config5 = Config4.parse(info3); await Worktree.createFromInfo({ - name: config6.name, - directory: config6.directory, - branch: config6.branch + name: config5.name, + directory: config5.directory, + branch: config5.branch }); }, async remove(info3) { - const config6 = Config4.parse(info3); - await Worktree.remove({ directory: config6.directory }); + const config5 = Config4.parse(info3); + await Worktree.remove({ directory: config5.directory }); }, async fetch(_info, _input, _init) { throw new Error("fetch not implemented"); @@ -384625,14 +384925,14 @@ var init_workspace = __esm(async () => { Workspace.create = fn3(CreateInput, async (input) => { const id2 = WorkspaceID.ascending(input.id); const adaptor = await getAdaptor(input.type); - const config6 = await adaptor.configure({ ...input, id: id2, name: input.name ?? null, directory: null }); + const config5 = await adaptor.configure({ ...input, id: id2, name: input.name ?? null, directory: null }); const info3 = { id: id2, - type: config6.type, - branch: config6.branch ?? null, - name: config6.name ?? null, - directory: config6.directory ?? null, - extra: config6.extra ?? null, + type: config5.type, + branch: config5.branch ?? null, + name: config5.name ?? null, + directory: config5.directory ?? null, + extra: config5.extra ?? null, projectID: input.projectID }; Database.use((db2) => { @@ -384646,7 +384946,7 @@ var init_workspace = __esm(async () => { project_id: info3.projectID }).run(); }); - await adaptor.create(config6); + await adaptor.create(config5); return info3; }); function list(project) { @@ -384788,7 +385088,7 @@ var init_task2 = __esm(async () => { description, parameters: parameters3, async execute(params, ctx2) { - const config6 = await Config.get(); + const config5 = await Config.get(); const mode2 = params.mode ?? "foreground"; if (!ctx2.extra?.bypassAgentCheck) { await ctx2.ask({ @@ -384830,7 +385130,7 @@ var init_task2 = __esm(async () => { action: "deny" } ], - ...config6.experimental?.primary_tools?.map((t2) => ({ + ...config5.experimental?.primary_tools?.map((t2) => ({ pattern: "*", action: "allow", permission: t2 @@ -384866,7 +385166,7 @@ var init_task2 = __esm(async () => { tools: { ...hasTodoWritePermission ? {} : { todowrite: false }, ...hasTaskPermission ? {} : { task: false }, - ...Object.fromEntries((config6.experimental?.primary_tools ?? []).map((t2) => [t2, false])) + ...Object.fromEntries((config5.experimental?.primary_tools ?? []).map((t2) => [t2, false])) }, parts: promptParts }; @@ -384913,7 +385213,7 @@ var init_task2 = __esm(async () => { return "__default__"; } })(); - const maxParallel = config6.experimental?.task?.max_parallel ?? DEFAULT_MAX_PARALLEL; + const maxParallel = config5.experimental?.task?.max_parallel ?? DEFAULT_MAX_PARALLEL; let slotHeld = false; const ensureSlotReleased = () => { if (slotHeld) { @@ -384928,7 +385228,7 @@ var init_task2 = __esm(async () => { const capturePolicy2 = resolveCapturePolicy((await Config.get()).experimental?.observability); const observability2 = capturePolicy2.enabled ? ObservabilityRuntime.service() : undefined; const agentTraceId2 = ObservabilityId.create(); - const agentStartedAtMs2 = Date.now(); + const agentStartedAtMs = Date.now(); let agentSpan2; if (observability2) { const started = startAgent({ traceId: agentTraceId2, sessionId: session.id, projectId: session.projectID }); @@ -384948,12 +385248,12 @@ var init_task2 = __esm(async () => { } else { result6 = await SessionPrompt.prompt(promptInput); } - return { result: result6, observability: observability2, agentSpan: agentSpan2, agentStartedAtMs: agentStartedAtMs2, error: null }; + return { result: result6, observability: observability2, agentSpan: agentSpan2, agentStartedAtMs, error: null }; } catch (err2) { - return { result: null, observability: observability2, agentSpan: agentSpan2, agentStartedAtMs: agentStartedAtMs2, error: err2 }; + return { result: null, observability: observability2, agentSpan: agentSpan2, agentStartedAtMs, error: err2 }; } }; - runPrompt().then(async ({ result: result6, observability: observability2, agentSpan: agentSpan2, agentStartedAtMs: agentStartedAtMs2, error: error49 }) => { + runPrompt().then(async ({ result: result6, observability: observability2, agentSpan: agentSpan2, agentStartedAtMs, error: error49 }) => { try { if (error49) throw error49; @@ -384967,7 +385267,7 @@ var init_task2 = __esm(async () => { result: text10.slice(0, 500) }); if (observability2 && agentSpan2) { - const terminal = finishAgent(agentSpan2.trace, "finished", agentStartedAtMs2); + const terminal = finishAgent(agentSpan2.trace, "finished", agentStartedAtMs); observability2.record(terminal.context, terminal.event); } if (workspace) { @@ -384999,7 +385299,7 @@ var init_task2 = __esm(async () => { }).catch(() => {}); log31.error("background task completion handler failed", { sessionID: session.id, error: errorMsg }); if (observability2 && agentSpan2) { - const terminal = finishAgent(agentSpan2.trace, "failed", agentStartedAtMs2); + const terminal = finishAgent(agentSpan2.trace, "failed", agentStartedAtMs); observability2.record(terminal.context, terminal.event); } } @@ -385048,7 +385348,6 @@ var init_task2 = __esm(async () => { const capturePolicy = resolveCapturePolicy((await Config.get()).experimental?.observability); const observability = capturePolicy.enabled ? ObservabilityRuntime.service() : undefined; const agentTraceId = ObservabilityId.create(); - const agentStartedAtMs = Date.now(); let agentSpan; if (observability) { const started = startAgent({ traceId: agentTraceId, sessionId: session.id, projectId: session.projectID }); @@ -387410,7 +387709,7 @@ var require_select = __commonJS((exports, module2) => { }; }, attr: function(key, op, val, i7) { - op = operators3[op]; + op = operators2[op]; return function(el) { var attr; switch (key) { @@ -387665,7 +387964,7 @@ var require_select = __commonJS((exports, module2) => { }; } }; - var operators3 = { + var operators2 = { "-": function() { return true; }, @@ -387987,7 +388286,7 @@ var require_select = __commonJS((exports, module2) => { return find2(sel, context4); }; exports.selectors = selectors; - exports.operators = operators3; + exports.operators = operators2; exports.combinators = combinators; exports.matches = function(el, sel) { var test = { sel }; @@ -401261,21 +401560,21 @@ function trimTrailingNewlines(string14) { return string14.substring(0, indexEnd); } function isBlock(node) { - return is8(node, blockElements); + return is7(node, blockElements); } function isVoid2(node) { - return is8(node, voidElements); + return is7(node, voidElements); } function hasVoid(node) { return has19(node, voidElements); } function isMeaningfulWhenBlank(node) { - return is8(node, meaningfulWhenBlankElements); + return is7(node, meaningfulWhenBlankElements); } function hasMeaningfulWhenBlank(node) { return has19(node, meaningfulWhenBlankElements); } -function is8(node, tagNames) { +function is7(node, tagNames) { return tagNames.indexOf(node.nodeName) >= 0; } function has19(node, tagNames) { @@ -402198,7 +402497,7 @@ Usage: var init_write = () => {}; // packages/unifia/src/tool/write.ts -import * as path59 from "path"; +import * as path60 from "path"; var MAX_DIAGNOSTICS_PER_FILE2 = 20, MAX_PROJECT_DIAGNOSTICS_FILES = 5, WriteTool; var init_write2 = __esm(async () => { init_zod(); @@ -402227,7 +402526,7 @@ var init_write2 = __esm(async () => { dry_run: zod_default.boolean().optional().describe("Set to true ONLY when the user explicitly asks to preview the write operation without applying it. By default leave this unset to actually write the file.") }), async execute(params, ctx) { - const filepath = path59.isAbsolute(params.filePath) ? params.filePath : path59.join(Instance.directory, params.filePath); + const filepath = path60.isAbsolute(params.filePath) ? params.filePath : path60.join(Instance.directory, params.filePath); await assertExternalDirectory(ctx, filepath); const exists3 = await Filesystem.exists(filepath); if (exists3 && ctx.extra?.model?.providerID === "local-llm") { @@ -402250,7 +402549,7 @@ var init_write2 = __esm(async () => { ${diff} \`\`\``; return { - title: `[dry-run] Write ${path59.basename(filepath)}`, + title: `[dry-run] Write ${path60.basename(filepath)}`, metadata: { diagnostics: {}, filepath, @@ -402261,7 +402560,7 @@ ${diff} } await ctx.ask({ permission: "edit", - patterns: [path59.relative(Instance.worktree, filepath)], + patterns: [path60.relative(Instance.worktree, filepath)], always: ["*"], metadata: { filepath, @@ -402322,7 +402621,7 @@ File is being edited by ${lockConflict.heldBy.username} (session: ${lockConflict output2 += formatFindings(secFindings, filepath); } return { - title: path59.relative(Instance.worktree, filepath), + title: path60.relative(Instance.worktree, filepath), metadata: { diagnostics, filepath, @@ -402356,7 +402655,7 @@ var init_invalid = __esm(async () => { }); // packages/unifia/src/tool/skill.ts -import path60 from "path"; +import path61 from "path"; import { pathToFileURL as pathToFileURL6 } from "url"; var SkillTool; var init_skill2 = __esm(async () => { @@ -402403,7 +402702,7 @@ var init_skill2 = __esm(async () => { always: [params.name], metadata: {} }); - const dir2 = path60.dirname(skill.location); + const dir2 = path61.dirname(skill.location); const base3 = pathToFileURL6(dir2).href; const limit2 = 10; const files = await iife2(async () => { @@ -402417,7 +402716,7 @@ var init_skill2 = __esm(async () => { if (file6.includes("SKILL.md")) { continue; } - arr.push(path60.resolve(dir2, file6)); + arr.push(path61.resolve(dir2, file6)); if (arr.length >= limit2) { break; } @@ -402701,7 +403000,7 @@ Note: LSP servers must be configured for the file type. If no server is availabl var init_lsp2 = () => {}; // packages/unifia/src/tool/lsp.ts -import path61 from "path"; +import path62 from "path"; import { pathToFileURL as pathToFileURL7 } from "url"; var operations, LspTool; var init_lsp3 = __esm(async () => { @@ -402734,7 +403033,7 @@ var init_lsp3 = __esm(async () => { character: zod_default.number().int().min(1).describe("The character offset (1-based, as shown in editors)") }), execute: async (args3, ctx) => { - const file6 = path61.isAbsolute(args3.filePath) ? args3.filePath : path61.join(Instance.directory, args3.filePath); + const file6 = path62.isAbsolute(args3.filePath) ? args3.filePath : path62.join(Instance.directory, args3.filePath); await assertExternalDirectory(ctx, file6); await ctx.ask({ permission: "lsp", @@ -402748,7 +403047,7 @@ var init_lsp3 = __esm(async () => { line: args3.line - 1, character: args3.character - 1 }; - const relPath = path61.relative(Instance.worktree, file6); + const relPath = path62.relative(Instance.worktree, file6); const title = `${args3.operation} ${relPath}:${args3.line}:${args3.character}`; const exists3 = await Filesystem.exists(file6); if (!exists3) { @@ -402796,7 +403095,7 @@ var init_lsp3 = __esm(async () => { }); // packages/unifia/src/patch/index.ts -import * as path62 from "path"; +import * as path63 from "path"; import * as fs23 from "fs/promises"; import { readFileSync as readFileSync9 } from "fs"; var Patch; @@ -403166,7 +403465,7 @@ ${chunk.old_lines.join(` for (const hunk of hunks) { switch (hunk.type) { case "add": { - const addDir = path62.dirname(hunk.path); + const addDir = path63.dirname(hunk.path); if (addDir !== "." && addDir !== "/") { await fs23.mkdir(addDir, { recursive: true }); } @@ -403183,7 +403482,7 @@ ${chunk.old_lines.join(` case "update": { const fileUpdate = deriveNewContentsFromChunks(hunk.path, hunk.chunks); if (hunk.move_path) { - const moveDir = path62.dirname(hunk.move_path); + const moveDir = path63.dirname(hunk.move_path); if (moveDir !== "." && moveDir !== "/") { await fs23.mkdir(moveDir, { recursive: true }); } @@ -403222,10 +403521,10 @@ ${chunk.old_lines.join(` switch (result6.type) { case "Body" /* Body */: { const { args: args3 } = result6; - const effectiveCwd = args3.workdir ? path62.resolve(cwd, args3.workdir) : cwd; + const effectiveCwd = args3.workdir ? path63.resolve(cwd, args3.workdir) : cwd; const changes4 = new Map; for (const hunk of args3.hunks) { - const resolvedPath = path62.resolve(effectiveCwd, hunk.type === "update" && hunk.move_path ? hunk.move_path : hunk.path); + const resolvedPath = path63.resolve(effectiveCwd, hunk.type === "update" && hunk.move_path ? hunk.move_path : hunk.path); switch (hunk.type) { case "add": changes4.set(resolvedPath, { @@ -403234,7 +403533,7 @@ ${chunk.old_lines.join(` }); break; case "delete": { - const deletePath = path62.resolve(effectiveCwd, hunk.path); + const deletePath = path63.resolve(effectiveCwd, hunk.path); try { const content = await fs23.readFile(deletePath, "utf-8"); changes4.set(resolvedPath, { @@ -403250,13 +403549,13 @@ ${chunk.old_lines.join(` break; } case "update": { - const updatePath = path62.resolve(effectiveCwd, hunk.path); + const updatePath = path63.resolve(effectiveCwd, hunk.path); try { const fileUpdate = deriveNewContentsFromChunks(updatePath, hunk.chunks); changes4.set(resolvedPath, { type: "update", unified_diff: fileUpdate.unified_diff, - move_path: hunk.move_path ? path62.resolve(effectiveCwd, hunk.move_path) : undefined, + move_path: hunk.move_path ? path63.resolve(effectiveCwd, hunk.move_path) : undefined, new_content: fileUpdate.content }); } catch (error49) { @@ -403329,7 +403628,7 @@ It is important to remember: var init_apply_patch = () => {}; // packages/unifia/src/tool/apply_patch.ts -import * as path63 from "path"; +import * as path64 from "path"; import * as fs25 from "fs/promises"; var PatchParams, ApplyPatchTool; var init_apply_patch2 = __esm(async () => { @@ -403379,7 +403678,7 @@ var init_apply_patch2 = __esm(async () => { const fileChanges = []; let totalDiff = ""; for (const hunk of hunks) { - const filePath = path63.resolve(Instance.directory, hunk.path); + const filePath = path64.resolve(Instance.directory, hunk.path); await assertExternalDirectory(ctx, filePath); switch (hunk.type) { case "add": { @@ -403431,7 +403730,7 @@ var init_apply_patch2 = __esm(async () => { if (change.removed) deletions += change.count || 0; } - const movePath = hunk.move_path ? path63.resolve(Instance.directory, hunk.move_path) : undefined; + const movePath = hunk.move_path ? path64.resolve(Instance.directory, hunk.move_path) : undefined; await assertExternalDirectory(ctx, movePath); fileChanges.push({ filePath, @@ -403471,7 +403770,7 @@ var init_apply_patch2 = __esm(async () => { } const files = fileChanges.map((change) => ({ filePath: change.filePath, - relativePath: path63.relative(Instance.worktree, change.movePath ?? change.filePath).replaceAll("\\", "/"), + relativePath: path64.relative(Instance.worktree, change.movePath ?? change.filePath).replaceAll("\\", "/"), type: change.type, diff: change.diff, before: change.oldContent, @@ -403480,7 +403779,7 @@ var init_apply_patch2 = __esm(async () => { deletions: change.deletions, movePath: change.movePath })); - const relativePaths = fileChanges.map((c3) => path63.relative(Instance.worktree, c3.filePath).replaceAll("\\", "/")); + const relativePaths = fileChanges.map((c3) => path64.relative(Instance.worktree, c3.filePath).replaceAll("\\", "/")); await ctx.ask({ permission: "edit", patterns: relativePaths, @@ -403496,7 +403795,7 @@ var init_apply_patch2 = __esm(async () => { const edited = change.type === "delete" ? undefined : change.movePath ?? change.filePath; switch (change.type) { case "add": - await fs25.mkdir(path63.dirname(change.filePath), { recursive: true }); + await fs25.mkdir(path64.dirname(change.filePath), { recursive: true }); await fs25.writeFile(change.filePath, change.newContent, "utf-8"); updates.push({ file: change.filePath, event: "add" }); break; @@ -403506,7 +403805,7 @@ var init_apply_patch2 = __esm(async () => { break; case "move": if (change.movePath) { - await fs25.mkdir(path63.dirname(change.movePath), { recursive: true }); + await fs25.mkdir(path64.dirname(change.movePath), { recursive: true }); await fs25.writeFile(change.movePath, change.newContent, "utf-8"); await fs25.unlink(change.filePath); updates.push({ file: change.filePath, event: "unlink" }); @@ -403535,13 +403834,13 @@ var init_apply_patch2 = __esm(async () => { const diagnostics = await LSP.diagnostics(); const summaryLines = fileChanges.map((change) => { if (change.type === "add") { - return `A ${path63.relative(Instance.worktree, change.filePath).replaceAll("\\", "/")}`; + return `A ${path64.relative(Instance.worktree, change.filePath).replaceAll("\\", "/")}`; } if (change.type === "delete") { - return `D ${path63.relative(Instance.worktree, change.filePath).replaceAll("\\", "/")}`; + return `D ${path64.relative(Instance.worktree, change.filePath).replaceAll("\\", "/")}`; } const target = change.movePath ?? change.filePath; - return `M ${path63.relative(Instance.worktree, target).replaceAll("\\", "/")}`; + return `M ${path64.relative(Instance.worktree, target).replaceAll("\\", "/")}`; }); let output2 = `Success. Updated the following files: ${summaryLines.join(` @@ -403560,7 +403859,7 @@ ${summaryLines.join(` ... and ${errors6.length - MAX_DIAGNOSTICS_PER_FILE3} more` : ""; output2 += ` -LSP errors detected in ${path63.relative(Instance.worktree, target).replaceAll("\\", "/")}, please fix: +LSP errors detected in ${path64.relative(Instance.worktree, target).replaceAll("\\", "/")}, please fix: ${limited.map(LSP.Diagnostic.pretty).join(` `)}${suffix} @@ -404886,8 +405185,8 @@ class TeamStore { return row2.next_sequence; }); } - saveCheckpoint(runId, checkpointId, state3) { - const stateJson = json7(state3, TEAM_STORE_MAX_JSON_BYTES, "checkpoint state"); + saveCheckpoint(runId, checkpointId, state2) { + const stateJson = json7(state2, TEAM_STORE_MAX_JSON_BYTES, "checkpoint state"); return this.write((db2) => { const row2 = db2.query("SELECT COALESCE(MAX(sequence), 0) + 1 AS next_sequence FROM team_checkpoints WHERE run_id = ?").get(runId); db2.prepare(`INSERT INTO team_checkpoints(checkpoint_id, run_id, sequence, state_json, created_at) @@ -404983,7 +405282,7 @@ var init_team_store = __esm(() => { }); // packages/unifia/src/team/opencode-application.ts -import path64 from "path"; +import path65 from "path"; async function runOpenCodeTeam(request3, signal, options4 = {}) { if (options4.control && !options4.registry) throw new TypeError("A pre-registered Team control requires its owning registry"); @@ -404998,7 +405297,7 @@ async function runOpenCodeTeam(request3, signal, options4 = {}) { const selection = await TeamSelectionStore.snapshot(request3.parentSessionId); if (!selection) throw new Error("Team requires at least two distinct configured models"); - const config6 = await Config.get(); + const config5 = await Config.get(); const agents = new Map((await Agent2.list()).map((agent) => [agent.name, agent])); for (const task of request3.tasks) if (!agents.has(task.agent)) @@ -405015,10 +405314,10 @@ async function runOpenCodeTeam(request3, signal, options4 = {}) { } const taskById = new Map(request3.tasks.map((task) => [task.taskId, task])); const workerResults = new Map; - const workerAdapter = createWorkerAdapter(request3, selection.models, config6, agents, taskById, workerWorkspaces, workerResults, options4.onWorkerStarted); + const workerAdapter = createWorkerAdapter(request3, selection.models, config5, agents, taskById, workerWorkspaces, workerResults, options4.onWorkerStarted); const reviewerSelector = createReviewerSelector(request3.parentSessionId, selection.models); - const integrationAdapter = createIntegrationAdapter(integrationWorkspace, workerResults); - const openedStore = options4.store ?? TeamStore.open(path64.join(Global.Path.data, "team.db")); + const integrationAdapter = createIntegrationAdapter(integrationWorkspace); + const openedStore = options4.store ?? TeamStore.open(path65.join(Global.Path.data, "team.db")); store = openedStore; const service3 = new TeamApplicationService(openedStore, workerAdapter, reviewerSelector, integrationAdapter); const result7 = await service3.run({ ...request3, integrationTargetBranch: integrationWorkspace.branch, control }, control.signal); @@ -405034,10 +405333,10 @@ async function runOpenCodeTeam(request3, signal, options4 = {}) { await removeWorkspaceIfClean(integrationWorkspace); } } -function restrictedWorkerTools(config6) { - return ["task", "team", ...config6.experimental?.primary_tools ?? []]; +function restrictedWorkerTools(config5) { + return ["task", "team", ...config5.experimental?.primary_tools ?? []]; } -function createWorkerAdapter(request3, models, config6, agents, taskById, workspaces, results, onWorkerStarted) { +function createWorkerAdapter(request3, models, config5, agents, taskById, workspaces, results, onWorkerStarted) { return { async run(input) { const task = taskById.get(input.task.taskId); @@ -405046,7 +405345,7 @@ function createWorkerAdapter(request3, models, config6, agents, taskById, worksp const agent = agents.get(task.agent); if (!agent) throw new Error(`Unknown Team agent: ${task.agent}`); - const restricted = restrictedWorkerTools(config6); + const restricted = restrictedWorkerTools(config5); const session = await Session.create({ parentID: request3.parentSessionId, title: `${task.description} (@${task.agent} team member)`, @@ -405177,7 +405476,7 @@ function reviewModel(parentSessionId, model) { } }; } -function createIntegrationAdapter(workspace, results) { +function createIntegrationAdapter(workspace) { return { async execute(plan) { if (!workspace.directory) @@ -405188,7 +405487,7 @@ function createIntegrationAdapter(workspace, results) { const commands4 = integrationValidationCommands(plan); const proofs = []; for (const command3 of commands4) { - const output2 = await processCommand(path64.join(workspace.directory, command3.cwd), [...command3.argv]); + const output2 = await processCommand(path65.join(workspace.directory, command3.cwd), [...command3.argv]); proofs.push(`${command3.label}: ${output2.stdout.trim().slice(-500) || "passed"}`); } const dirty = (await git(workspace.directory, ["status", "--porcelain"])).stdout.trim(); @@ -405871,18 +406170,18 @@ var init_debate_store = __esm(async () => { } DebateStore.Service = Service3; DebateStore.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { - const create = exports_Effect.fn("DebateStore.create")(function* (config6, providerCount, directory) { + const create = exports_Effect.fn("DebateStore.create")(function* (config5, providerCount, directory) { const id2 = Collective.DebateID.make(); - log12.info("creating debate", { id: id2, tier: config6.tier }); + log12.info("creating debate", { id: id2, tier: config5.tier }); Database.use((db2) => { db2.insert(DebateTable).values({ id: id2, status: "pending", - prompt: config6.question, - prompt_hash: hashPrompt(config6.question), + prompt: config5.question, + prompt_hash: hashPrompt(config5.question), workspace_hash: hashWorkspace(directory), - tier: config6.tier, - config: config6, + tier: config5.tier, + config: config5, provider_count: providerCount }).run(); }); @@ -406109,11 +406408,11 @@ var init_budget_tracker = __esm(async () => { }; } BudgetTracker.unlimited = unlimited; - function estimate(config6, participants) { - const questionTokens = Math.ceil(config6.question.length / 4); - const contextTokens = config6.context ? Math.ceil(config6.context.length / 4) : 0; + function estimate(config5, participants) { + const questionTokens = Math.ceil(config5.question.length / 4); + const contextTokens = config5.context ? Math.ceil(config5.context.length / 4) : 0; const inputPerModel = questionTokens + contextTokens + 500; - const tierCfg = Collective.TIER_CONFIG[config6.tier]; + const tierCfg = Collective.TIER_CONFIG[config5.tier]; const breakdown = []; let totalTokens = 0; let totalCost = 0; @@ -408272,7 +408571,7 @@ var init_orchestrator2 = __esm(async () => { Orchestrator.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const store = yield* DebateStore.Service; const bus = yield* Bus.Service; - const run9 = exports_Effect.fn("Orchestrator.run")(function* (config6, onDebateID) { + const run9 = exports_Effect.fn("Orchestrator.run")(function* (config5, onDebateID) { const startTime = Date.now(); const salt = crypto.randomUUID(); let directory; @@ -408281,38 +408580,38 @@ var init_orchestrator2 = __esm(async () => { } catch { directory = process.cwd(); } - if (!config6.participants && config6.tier === "quick") { - const recommendation = TierClassifier.classifyHeuristic(config6.question); - if (recommendation.tier !== config6.tier) { + if (!config5.participants && config5.tier === "quick") { + const recommendation = TierClassifier.classifyHeuristic(config5.question); + if (recommendation.tier !== config5.tier) { log12.info("auto-tier reclassified", { - from: config6.tier, + from: config5.tier, to: recommendation.tier, score: recommendation.score, reason: recommendation.reason }); - config6 = { ...config6, tier: recommendation.tier }; + config5 = { ...config5, tier: recommendation.tier }; } } - const tierCfg = Collective.TIER_CONFIG[config6.tier]; + const tierCfg = Collective.TIER_CONFIG[config5.tier]; let abVariant; - const isAbEligible = config6.tier === "standard" || config6.tier === "deep"; + const isAbEligible = config5.tier === "standard" || config5.tier === "deep"; if (isAbEligible) { const roll = Math.random(); if (roll < 0.1) { abVariant = "variant"; - log12.info("A/B mode: variant selected", { tier: config6.tier }); + log12.info("A/B mode: variant selected", { tier: config5.tier }); } else { abVariant = "control"; } } - const { providers: discoveredParticipants, ghostWarnings } = yield* ProviderDiscovery.discover(config6.participants); - const discovered = ProviderDiscovery.includeJudge(discoveredParticipants, config6.judgeProviderID, config6.judgeModelID); + const { providers: discoveredParticipants, ghostWarnings } = yield* ProviderDiscovery.discover(config5.participants); + const discovered = ProviderDiscovery.includeJudge(discoveredParticipants, config5.judgeProviderID, config5.judgeModelID); if (ghostWarnings.length > 0) { log12.info("ghost model warnings", { warnings: ghostWarnings }); } - const debateID = yield* store.create(config6, discovered.length, directory); + const debateID = yield* store.create(config5, discovered.length, directory); onDebateID?.(debateID); - const budgetCfg = config6.budget ?? BudgetTracker.unlimited(); + const budgetCfg = config5.budget ?? BudgetTracker.unlimited(); const budget = BudgetTracker.create(budgetCfg); const failedProviders = []; const describeError = (error49) => { @@ -408323,7 +408622,7 @@ var init_orchestrator2 = __esm(async () => { return String(error49); }; try { - const roles = yield* RoleAssigner.assign(config6.question, discovered.length, discovered[0].providerID, discovered[0].modelID, config6.roles); + const roles = yield* RoleAssigner.assign(config5.question, discovered.length, discovered[0].providerID, discovered[0].modelID, config5.roles); const participants = discovered.map((d5, i7) => ({ providerID: d5.providerID, modelID: d5.modelID, @@ -408332,28 +408631,28 @@ var init_orchestrator2 = __esm(async () => { authMethod: d5.authMethod })); let seeds = []; - if (!config6.noMemory) { - seeds = yield* store.seedWithPastBlindSpots(config6.question, directory, 3); + if (!config5.noMemory) { + seeds = yield* store.seedWithPastBlindSpots(config5.question, directory, 3); } yield* bus.publish(DebateStarted, { debateID, - tier: config6.tier, + tier: config5.tier, providers: participants.map((p2) => `${p2.providerID}/${p2.modelID}`) }); let canaryBug; - let effectiveContext = config6.context; - if (tierCfg.enableCanary && config6.enableCanary) { + let effectiveContext = config5.context; + if (tierCfg.enableCanary && config5.enableCanary) { const cheapP = discovered[0]; - const { canary, tokenUsage: canaryTokens } = yield* Canary.generate(config6.question, config6.context, cheapP.providerID, cheapP.modelID, bus, debateID); + const { canary, tokenUsage: canaryTokens } = yield* Canary.generate(config5.question, config5.context, cheapP.providerID, cheapP.modelID, bus, debateID); canaryBug = canary; - effectiveContext = Canary.injectIntoContext(config6.context, canary); + effectiveContext = Canary.injectIntoContext(config5.context, canary); budget.record("canary_gen", cheapP.providerID, canaryTokens.input, canaryTokens.output); log12.info("canary injected", { category: canary.category }); } yield* store.updateStatus(debateID, "phase1_diverge"); yield* bus.publish(DebatePhaseChanged, { debateID, phase: "phase1_diverge" }); log12.info("phase 1: diverge", { participantCount: participants.length }); - const phase1Responses = yield* exports_Effect.all(participants.map((p2) => runParticipant(p2, config6.question, effectiveContext, seeds, bus, debateID).pipe(exports_Effect.catch((error49) => { + const phase1Responses = yield* exports_Effect.all(participants.map((p2) => runParticipant(p2, config5.question, effectiveContext, seeds, bus, debateID).pipe(exports_Effect.catch((error49) => { const provider2 = `${p2.providerID}/${p2.modelID}`; const message = describeError(error49); failedProviders.push({ provider: provider2, error: message }); @@ -408389,7 +408688,7 @@ var init_orchestrator2 = __esm(async () => { yield* bus.publish(DebatePhaseChanged, { debateID, phase: "phase2_extract" }); log12.info("phase 2: extract", { responseCount: validResponses.length }); const extractorP = activeProviders[0]; - const { claims: rawClaims, tokenUsage: extractTokens } = yield* ClaimExtractor.extract(validResponses, config6.question, extractorP.providerID, extractorP.modelID, bus, debateID); + const { claims: rawClaims, tokenUsage: extractTokens } = yield* ClaimExtractor.extract(validResponses, config5.question, extractorP.providerID, extractorP.modelID, bus, debateID); budget.record("phase2_extract", extractorP.providerID, extractTokens.input, extractTokens.output); yield* budget.check(); const { updatedClaims } = yield* JargonChecker.check(rawClaims, directory); @@ -408433,7 +408732,7 @@ var init_orchestrator2 = __esm(async () => { round: round4 + 1, claimsResubmitted: targetClaims.length }); - const roundResults = yield* exports_Effect.all(participants.map((p2) => runConvergence(p2, targetClaims, config6.question, bus, debateID).pipe(exports_Effect.catch(() => exports_Effect.succeed(null)))), { concurrency: "unbounded" }); + const roundResults = yield* exports_Effect.all(participants.map((p2) => runConvergence(p2, targetClaims, config5.question, bus, debateID).pipe(exports_Effect.catch(() => exports_Effect.succeed(null)))), { concurrency: "unbounded" }); for (const cr2 of roundResults) { if (cr2) { convergenceResults.push(cr2); @@ -408463,8 +408762,8 @@ var init_orchestrator2 = __esm(async () => { } let _redTeamAttacks = []; const consensusRatio = RedTeam.computeConsensusRatio(claims); - const redTeamSetting = config6.redTeam ?? tierCfg.redTeam; - if (RedTeam.shouldActivate(config6.tier, redTeamSetting, consensusRatio)) { + const redTeamSetting = config5.redTeam ?? tierCfg.redTeam; + if (RedTeam.shouldActivate(config5.tier, redTeamSetting, consensusRatio)) { yield* bus.publish(RedTeamActivated, { debateID, reason: `Consensus ratio ${(consensusRatio * 100).toFixed(0)}% \u2265 threshold` @@ -408487,7 +408786,7 @@ var init_orchestrator2 = __esm(async () => { } yield* store.updateStatus(debateID, "phase4_synthesize"); yield* bus.publish(DebatePhaseChanged, { debateID, phase: "phase4_synthesize" }); - const requestedJudge = config6.judgeProviderID && config6.judgeModelID ? activeProviders.find((provider2) => provider2.providerID === config6.judgeProviderID && provider2.modelID === config6.judgeModelID) : undefined; + const requestedJudge = config5.judgeProviderID && config5.judgeModelID ? activeProviders.find((provider2) => provider2.providerID === config5.judgeProviderID && provider2.modelID === config5.judgeModelID) : undefined; const judge = requestedJudge ?? { ...activeProviders[0], role: "judge" }; log12.info("phase 4: synthesize", { claimCount: claims.length, @@ -408501,12 +408800,12 @@ var init_orchestrator2 = __esm(async () => { meta: meta3, tokenUsage: synthTokens } = yield* SynthesisJudge.synthesize({ - question: config6.question, + question: config5.question, claims, participants, judgeProviderID: judge.providerID, judgeModelID: judge.modelID, - tier: config6.tier, + tier: config5.tier, initialDisagreements, convergenceResults, bus, @@ -408532,15 +408831,15 @@ var init_orchestrator2 = __esm(async () => { }); } let shadowDelta; - if (config6.enableShadowBaseline && config6.tier !== "free") { + if (config5.enableShadowBaseline && config5.tier !== "free") { const strongest = [...discovered].sort((a5, b3) => { const ca = "cost" in a5 && a5.cost ? a5.cost.output : 10; const cb = "cost" in b3 && b3.cost ? b3.cost.output : 10; return cb - ca; })[0]; const shadowResult = yield* Metrics.runShadowBaseline({ - question: config6.question, - context: config6.context, + question: config5.question, + context: config5.context, bestProviderID: strongest.providerID, bestModelID: strongest.modelID, collectiveClaims: adjustedClaims @@ -408563,9 +408862,9 @@ var init_orchestrator2 = __esm(async () => { } const report2 = { id: debateID, - prompt: config6.question, + prompt: config5.question, timestamp: new Date(startTime).toISOString(), - tier: config6.tier, + tier: config5.tier, providers: participants.map((p2) => `${p2.providerID}/${p2.modelID}`), failedProviders, roles: rolesMap, @@ -408611,20 +408910,20 @@ var init_orchestrator2 = __esm(async () => { throw error49; } }); - const estimate = exports_Effect.fn("Orchestrator.estimate")(function* (config6) { - const { providers: discovered } = yield* ProviderDiscovery.discover(config6.participants, Collective.TIER_CONFIG[config6.tier].maxProviders); - return BudgetTracker.estimate(config6, discovered); + const estimate = exports_Effect.fn("Orchestrator.estimate")(function* (config5) { + const { providers: discovered } = yield* ProviderDiscovery.discover(config5.participants, Collective.TIER_CONFIG[config5.tier].maxProviders); + return BudgetTracker.estimate(config5, discovered); }); return Service3.of({ run: run9, estimate }); })); Orchestrator.defaultLayer = Orchestrator.layer.pipe(exports_Layer.provide(DebateStore.layer), exports_Layer.provide(Bus.layer)); const { runPromise: runPromise3 } = makeRuntime4(Service3, Orchestrator.defaultLayer); - async function runPromiseExport(config6, onDebateID) { - return runPromise3((svc) => svc.run(config6, onDebateID)); + async function runPromiseExport(config5, onDebateID) { + return runPromise3((svc) => svc.run(config5, onDebateID)); } Orchestrator.runPromiseExport = runPromiseExport; - async function estimatePromise(config6) { - return runPromise3((svc) => svc.estimate(config6)); + async function estimatePromise(config5) { + return runPromise3((svc) => svc.estimate(config5)); } Orchestrator.estimatePromise = estimatePromise; function runParticipant(participant, question, context4, seeds, bus, debateID) { @@ -409002,8 +409301,8 @@ function initSubscription() { properties: {} }, async (event) => { try { - const config6 = await Config.get(); - const shadowCfg = config6.experimental?.collective?.shadow_daemon; + const config5 = await Config.get(); + const shadowCfg = config5.experimental?.collective?.shadow_daemon; if (!shadowCfg?.enabled) return; const sessionID = event.properties?.sessionID; @@ -409065,19 +409364,19 @@ var init_collective = __esm(async () => { }); // packages/unifia/src/tool/debate.ts -async function executeWithLiveTracking(config6, ctx, run9) { +async function executeWithLiveTracking(config5, ctx, run9) { let currentDebateID; - const tracker = DebateLive.createTracker((snapshot4) => { + const tracker = DebateLive.createTracker((snapshot3) => { ctx.metadata({ metadata: { - phase: snapshot4.phase, - participants: snapshot4.participants + phase: snapshot3.phase, + participants: snapshot3.participants } }); }); const unsubscribeAll = DebateLive.subscribe(() => currentDebateID, tracker); try { - const report2 = await run9(config6, (id2) => { + const report2 = await run9(config5, (id2) => { currentDebateID = id2; }); const summary2 = [ @@ -409165,7 +409464,7 @@ var init_debate3 = __esm(async () => { error: event.error }; } - function snapshot4() { + function snapshot3() { return { phase, participants: { ...participants } }; } function drain4() { @@ -409178,14 +409477,14 @@ var init_debate3 = __esm(async () => { } finally { draining = false; } - onFlush(snapshot4()); + onFlush(snapshot3()); } return { enqueue(event) { queue.push(event); drain4(); }, - snapshot: snapshot4 + snapshot: snapshot3 }; } DebateLive.createTracker = createTracker; @@ -409239,12 +409538,12 @@ var init_debate3 = __esm(async () => { } DebateLive.subscribe = subscribe3; function formatParticipantSummary(participants) { - return Object.entries(participants).map(([provider2, state3]) => `${provider2}: ${state3.status}${state3.error ? ` (${state3.error})` : ""}`).join(", "); + return Object.entries(participants).map(([provider2, state2]) => `${provider2}: ${state2.status}${state2.error ? ` (${state2.error})` : ""}`).join(", "); } - function describeFailure(snapshot4, cause) { + function describeFailure(snapshot3, cause) { const message = cause instanceof Error ? cause.message : String(cause); - const participantSummary = formatParticipantSummary(snapshot4.participants); - const context4 = participantSummary ? `phase "${snapshot4.phase}", participants: ${participantSummary}` : `phase "${snapshot4.phase}", no participant activity recorded`; + const participantSummary = formatParticipantSummary(snapshot3.participants); + const context4 = participantSummary ? `phase "${snapshot3.phase}", participants: ${participantSummary}` : `phase "${snapshot3.phase}", no participant activity recorded`; return `Debate failed (${context4}): ${message}`; } DebateLive.describeFailure = describeFailure; @@ -409260,7 +409559,7 @@ var init_debate3 = __esm(async () => { parameters: parameters6, async execute(args3, ctx) { const selection = await DebateSelection.get(ctx.sessionID); - const config6 = { + const config5 = { question: args3.question, context: args3.context, tier: args3.tier ?? "quick", @@ -409275,7 +409574,7 @@ var init_debate3 = __esm(async () => { maxRounds: 2 }; try { - return await executeWithLiveTracking(config6, ctx, Orchestrator.runPromiseExport); + return await executeWithLiveTracking(config5, ctx, Orchestrator.runPromiseExport); } catch (error49) { const message = error49 instanceof Error ? error49.message : String(error49); return { @@ -409301,7 +409600,7 @@ var exports_registry = {}; __export(exports_registry, { ToolRegistry: () => ToolRegistry }); -import path65 from "path"; +import path66 from "path"; import { pathToFileURL as pathToFileURL8 } from "url"; var ToolRegistry; var init_registry = __esm(async () => { @@ -409353,10 +409652,10 @@ var init_registry = __esm(async () => { } ToolRegistry.Service = Service3; ToolRegistry.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { - const config6 = yield* Config.Service; + const config5 = yield* Config.Service; const plugin = yield* Plugin.Service; const build2 = (tool2) => exports_Effect.isEffect(tool2) ? tool2 : exports_Effect.succeed(tool2); - const state3 = yield* InstanceState.make(exports_Effect.fn("ToolRegistry.state")(function* (ctx) { + const state2 = yield* InstanceState.make(exports_Effect.fn("ToolRegistry.state")(function* (ctx) { const custom4 = []; function fromPlugin(id2, def) { return { @@ -409381,12 +409680,12 @@ var init_registry = __esm(async () => { }) }; } - const dirs = yield* config6.directories(); + const dirs = yield* config5.directories(); const matches = dirs.flatMap((dir2) => Glob.scanSync("{tool,tools}/*.{js,ts}", { cwd: dir2, absolute: true, dot: true, symlink: true })); if (matches.length) - yield* config6.waitForDependencies(); + yield* config5.waitForDependencies(); for (const match17 of matches) { - const namespace = path65.basename(match17, path65.extname(match17)); + const namespace = path66.basename(match17, path66.extname(match17)); const mod2 = yield* exports_Effect.promise(() => process.platform === "win32" ? import(match17) : import(pathToFileURL8(match17).href)); for (const [id2, def] of Object.entries(mod2)) { custom4.push(fromPlugin(id2 === "default" ? namespace : `${namespace}_${id2}`, def)); @@ -409421,8 +409720,8 @@ var init_registry = __esm(async () => { const plan = yield* build2(PlanExitTool); const debate = yield* build2(DebateTool); const all7 = exports_Effect.fn("ToolRegistry.all")(function* (custom4) { - const cfg = yield* config6.get(); - const question = ["app", "cli", "desktop"].includes(Flag.OPENCODE_CLIENT) || Flag.UNIFIA_ENABLE_QUESTION_TOOL; + const cfg = yield* config5.get(); + const question = ["app", "cli", "desktop"].includes(Flag.UNIFIA_CLIENT) || Flag.UNIFIA_ENABLE_QUESTION_TOOL; return [ invalid2, ...question ? [ask2] : [], @@ -409442,18 +409741,18 @@ var init_registry = __esm(async () => { patch3, ...Flag.UNIFIA_EXPERIMENTAL_LSP_TOOL ? [lsp] : [], ...cfg.experimental?.batch_tool === true ? [batch] : [], - ...Flag.OPENCODE_EXPERIMENTAL_PLAN_MODE && Flag.OPENCODE_CLIENT === "cli" ? [plan] : [], + ...Flag.UNIFIA_EXPERIMENTAL_PLAN_MODE && Flag.UNIFIA_CLIENT === "cli" ? [plan] : [], debate, ...custom4 ]; }); const ids2 = exports_Effect.fn("ToolRegistry.ids")(function* () { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const tools3 = yield* all7(s5.custom); return tools3.map((t2) => t2.id); }); const tools2 = exports_Effect.fn("ToolRegistry.tools")(function* (model, agent, permission) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const allTools = yield* all7(s5.custom); const LOCAL_TOOLS = new Set([ "bash", @@ -409553,7 +409852,7 @@ var init_runner = __esm(() => { const busy = opts?.onBusy ?? exports_Effect.void; const onInterrupt3 = opts?.onInterrupt; let ids = 0; - const state3 = () => exports_SynchronizedRef.getUnsafe(ref); + const state2 = () => exports_SynchronizedRef.getUnsafe(ref); const next4 = () => { ids += 1; return ids; @@ -409671,10 +409970,10 @@ var init_runner = __esm(() => { }).pipe(exports_Effect.flatten); return { get state() { - return state3(); + return state2(); }, get busy() { - return state3()._tag !== "Idle"; + return state2()._tag !== "Idle"; }, ensureRunning, startShell, @@ -409686,7 +409985,7 @@ var init_runner = __esm(() => { // packages/unifia/src/session/project-context.ts import fs26 from "fs"; -import path66 from "path"; +import path67 from "path"; var log34, DECLARATION_PATTERNS, SOURCE_EXTENSIONS, ProjectContext; var init_project_context = __esm(async () => { init_glob(); @@ -409750,7 +410049,7 @@ var init_project_context = __esm(async () => { for (const rel of allFiles) { if (FileIgnore.match(rel)) continue; - const abs5 = path66.join(dir2, rel); + const abs5 = path67.join(dir2, rel); try { const stat5 = fs26.statSync(abs5); const content = fs26.readFileSync(abs5, "utf-8"); @@ -409774,7 +410073,7 @@ var init_project_context = __esm(async () => { async function extractAllDeclarations(files) { const results = []; for (const file6 of files) { - const ext2 = path66.extname(file6.relativePath).toLowerCase(); + const ext2 = path67.extname(file6.relativePath).toLowerCase(); const pattern = DECLARATION_PATTERNS[ext2]; if (!pattern) { results.push({ file: file6, declarations: [] }); @@ -409806,12 +410105,12 @@ var init_project_context = __esm(async () => { } function format11(symbols, budgetTokens) { const budgetChars = budgetTokens * 4; - const filesLine = symbols.filter((s5) => SOURCE_EXTENSIONS.has(path66.extname(s5.file.relativePath).toLowerCase()) || s5.declarations.length > 0).map((s5) => `${s5.file.relativePath} (${s5.file.lines}L)`).join(", "); + const filesLine = symbols.filter((s5) => SOURCE_EXTENSIONS.has(path67.extname(s5.file.relativePath).toLowerCase()) || s5.declarations.length > 0).map((s5) => `${s5.file.relativePath} (${s5.file.lines}L)`).join(", "); const level1 = ` Files: ${filesLine} `; if (level1.length > budgetChars) { - const truncated = symbols.filter((s5) => SOURCE_EXTENSIONS.has(path66.extname(s5.file.relativePath).toLowerCase())).slice(0, 10).map((s5) => `${s5.file.relativePath} (${s5.file.lines}L)`).join(", "); + const truncated = symbols.filter((s5) => SOURCE_EXTENSIONS.has(path67.extname(s5.file.relativePath).toLowerCase())).slice(0, 10).map((s5) => `${s5.file.relativePath} (${s5.file.lines}L)`).join(", "); const minimal = ` Files: ${truncated} `; @@ -409948,8 +410247,8 @@ function assertVector(vec, expected) { } return parsed.data; } -async function getEmbeddingModel(config6) { - const cfg = config6 ?? DEFAULT_CONFIG; +async function getEmbeddingModel(config5) { + const cfg = config5 ?? DEFAULT_CONFIG; const ragConfig = (await Config.get())?.experimental?.rag; const apiKey = ragConfig?.api_key; switch (cfg.provider) { @@ -409978,25 +410277,25 @@ async function getEmbeddingModel(config6) { throw new Error(`Unsupported embedding provider: ${cfg.provider}`); } } -async function generateEmbedding(text10, config6) { - const model = await getEmbeddingModel(config6); +async function generateEmbedding(text10, config5) { + const model = await getEmbeddingModel(config5); const result7 = await embed({ model, value: text10 }); - const vec = assertVector(result7.embedding, config6?.dimensions); + const vec = assertVector(result7.embedding, config5?.dimensions); log35.info("generated embedding", { tokens: result7.usage?.tokens ?? 0, dimensions: vec.length }); return { embedding: new Float32Array(vec), tokens: result7.usage?.tokens ?? 0 }; } -async function generateEmbeddings(texts, config6) { +async function generateEmbeddings(texts, config5) { if (texts.length === 0) return { embeddings: [], tokens: 0 }; - const model = await getEmbeddingModel(config6); + const model = await getEmbeddingModel(config5); const result7 = await embedMany({ model, values: texts }); if (!Array.isArray(result7.embeddings) || result7.embeddings.length !== texts.length) { throw new Error(`embedding: batch size mismatch \u2014 sent ${texts.length}, got ${Array.isArray(result7.embeddings) ? result7.embeddings.length : "non-array"}`); } - const validated = result7.embeddings.map((e4) => assertVector(e4, config6?.dimensions)); + const validated = result7.embeddings.map((e4) => assertVector(e4, config5?.dimensions)); log35.info("generated embeddings", { count: texts.length, tokens: result7.usage?.tokens ?? 0 @@ -410353,7 +410652,7 @@ var init_vector_store = __esm(async () => { }); // packages/unifia/src/rag/index.ts -import path67 from "path"; +import path68 from "path"; import fs27 from "fs"; var log37, MAX_BATCH_SIZE = 50, DEFAULT_TOP_K = 5, MIN_SIMILARITY = 0.3, RAG; var init_rag = __esm(async () => { @@ -410408,7 +410707,7 @@ var init_rag = __esm(async () => { if (!await isEnabled3()) return 0; const provider2 = await getActiveProvider(); - const relativePath = path67.relative(Instance.worktree, filePath); + const relativePath = path68.relative(Instance.worktree, filePath); if (FileIgnore.match(relativePath)) return 0; let byteSize; @@ -410427,8 +410726,8 @@ var init_rag = __esm(async () => { return 0; if (provider2 === "bm25") return indexBM25Chunks(projectID, "file", relativePath, chunks3); - const config6 = await getEmbeddingConfig(); - return indexVectorChunks(projectID, "file", relativePath, chunks3, config6); + const config5 = await getEmbeddingConfig(); + return indexVectorChunks(projectID, "file", relativePath, chunks3, config5); } RAG.indexFile = indexFile; async function indexSummary(projectID, sessionID, summary2) { @@ -410440,8 +410739,8 @@ var init_rag = __esm(async () => { ${summary2}`, { sessionID }); if (provider2 === "bm25") return indexBM25Chunks(projectID, "summary", sessionID, chunks3); - const config6 = await getEmbeddingConfig(); - return indexVectorChunks(projectID, "summary", sessionID, chunks3, config6); + const config5 = await getEmbeddingConfig(); + return indexVectorChunks(projectID, "summary", sessionID, chunks3, config5); } RAG.indexSummary = indexSummary; async function indexLearning(projectID, filePath, content) { @@ -410453,8 +410752,8 @@ ${summary2}`, { sessionID }); ${content}`, { file: filePath }); if (provider2 === "bm25") return indexBM25Chunks(projectID, "learning", filePath, chunks3); - const config6 = await getEmbeddingConfig(); - return indexVectorChunks(projectID, "learning", filePath, chunks3, config6); + const config5 = await getEmbeddingConfig(); + return indexVectorChunks(projectID, "learning", filePath, chunks3, config5); } RAG.indexLearning = indexLearning; async function indexFiles(projectID, filePaths) { @@ -410464,7 +410763,7 @@ ${content}`, { file: filePath }); let total = 0; for (const fp of filePaths) { try { - const rel = path67.relative(Instance.worktree, fp); + const rel = path68.relative(Instance.worktree, fp); validRelPaths.add(rel); total += await indexFile(projectID, fp); } catch (e4) { @@ -410531,8 +410830,8 @@ ${content}`, { file: filePath }); }); } async function vectorSearch(projectID, query2, k4, minSim, sourceTypes) { - const config6 = await getEmbeddingConfig(); - const { embedding: queryVec } = await generateEmbedding(query2, config6); + const config5 = await getEmbeddingConfig(); + const { embedding: queryVec } = await generateEmbedding(query2, config5); const db2 = Database.Client(); const conditions = [eq(EmbeddingTable.project_id, projectID)]; if (sourceTypes?.length) { @@ -410649,7 +410948,7 @@ ${sections.join(` log37.info("indexed bm25 chunks", { sourceType, sourceId, total: indexed }); return indexed; } - async function indexVectorChunks(projectID, sourceType, sourceId, chunks3, config6) { + async function indexVectorChunks(projectID, sourceType, sourceId, chunks3, config5) { const db2 = Database.Client(); const existingRows = db2.select({ content_hash: EmbeddingTable.content_hash }).from(EmbeddingTable).where(and3(eq(EmbeddingTable.project_id, projectID), eq(EmbeddingTable.source_type, sourceType), eq(EmbeddingTable.source_id, sourceId))).all(); const existingHashes = new Set(existingRows.map((r5) => r5.content_hash)); @@ -410664,7 +410963,7 @@ ${sections.join(` const batch = chunks3.slice(i7, i7 + MAX_BATCH_SIZE); const texts = batch.map((c3) => c3.content); try { - const { embeddings } = await generateEmbeddings(texts, config6); + const { embeddings } = await generateEmbeddings(texts, config5); for (let j3 = 0;j3 < batch.length; j3++) { db2.insert(EmbeddingTable).values({ id: ulid5(), @@ -410673,8 +410972,8 @@ ${sections.join(` source_id: sourceId, content: batch[j3].content, vector: vectorToBuffer(embeddings[j3]), - model: config6.model, - dimensions: config6.dimensions, + model: config5.model, + dimensions: config5.dimensions, metadata: batch[j3].metadata, content_hash: batch[j3].hash, time_created: Date.now(), @@ -410693,7 +410992,7 @@ ${sections.join(` }); // packages/unifia/src/session/learn.ts -import path68 from "path"; +import path69 from "path"; var log38, MIN_MESSAGES_FOR_LEARNING = 6, SessionLearn; var init_learn = __esm(async () => { init_dist3(); @@ -410705,6 +411004,7 @@ var init_learn = __esm(async () => { init_llm(), init_log(), init_instance(), + init_paths(), init_rag() ]); log38 = Log.create({ service: "session.learn" }); @@ -410764,7 +411064,7 @@ var init_learn = __esm(async () => { } const date13 = new Date().toISOString().split("T")[0]; const filename = `${date13}-${input.sessionID.slice(0, 8)}.md`; - const filepath = path68.join(Instance.worktree, ".opencode", "learnings", filename); + const filepath = path69.join(Instance.worktree, ConfigPaths.PROJECT_DIRECTORY, "learnings", filename); const content = lessons.map((l2) => `### ${l2.title} ${l2.content} @@ -410801,25 +411101,29 @@ ${content} // packages/unifia/src/session/learnings-context.ts import fs28 from "fs"; -import path69 from "path"; +import path70 from "path"; function readRecentLearnings(worktree, budgetTokens) { if (budgetTokens <= 0) return; - const dir2 = path69.join(worktree, ".opencode", "learnings"); - let files; - try { - files = fs28.readdirSync(dir2).filter((f5) => f5.endsWith(".md")); - } catch { - return; - } + const dirs = [ + path70.join(worktree, ConfigPaths.LEGACY_PROJECT_DIRECTORY, "learnings"), + path70.join(worktree, ConfigPaths.PROJECT_DIRECTORY, "learnings") + ]; + const files = dirs.flatMap((dir2) => { + try { + return fs28.readdirSync(dir2).filter((name26) => name26.endsWith(".md")).map((name26) => ({ name: name26, filepath: path70.join(dir2, name26) })); + } catch { + return []; + } + }); if (files.length === 0) return; - files.sort().reverse(); + files.sort((a5, b3) => b3.name.localeCompare(a5.name)); const budgetChars = budgetTokens * 4; let content = ""; for (const file6 of files.slice(0, 5)) { try { - const text10 = fs28.readFileSync(path69.join(dir2, file6), "utf-8"); + const text10 = fs28.readFileSync(file6.filepath, "utf-8"); if (content.length + text10.length > budgetChars) break; content += text10 + ` @@ -410835,7 +411139,9 @@ Previous session learnings: ${content.trim()} `; } -var init_learnings_context = () => {}; +var init_learnings_context = __esm(async () => { + await init_paths(); +}); // packages/unifia/src/util/data-url.ts function decodeDataUrl(url4) { @@ -410850,7 +411156,7 @@ function decodeDataUrl(url4) { } // packages/unifia/src/session/prompt.ts -import path70 from "path"; +import path71 from "path"; import fs29 from "fs"; import os19 from "os"; import { pathToFileURL as pathToFileURL9, fileURLToPath as fileURLToPath8 } from "url"; @@ -410913,7 +411219,6 @@ var init_prompt = __esm(async () => { init_cross_spawn_spawner(); init_Stream(); init_markdown(); - init_learnings_context(); init_error(); init_filesystem2(); init_process2(); @@ -410941,6 +411246,7 @@ var init_prompt = __esm(async () => { init_project_context(), init_rag(), init_learn(), + init_learnings_context(), init_processor(), init_permission(), init_status(), @@ -410979,7 +411285,7 @@ var init_prompt = __esm(async () => { const spawner = yield* exports_ChildProcessSpawner.ChildProcessSpawner; const scope3 = yield* exports_Scope.Scope; const instruction = yield* Instruction.Service; - const state3 = yield* InstanceState.make(exports_Effect.fn("SessionPrompt.state")(function* () { + const state2 = yield* InstanceState.make(exports_Effect.fn("SessionPrompt.state")(function* () { const runners = new Map; yield* exports_Effect.addFinalizer(exports_Effect.fnUntraced(function* () { yield* exports_Effect.forEach(runners.values(), (r5) => r5.cancel, { concurrency: "unbounded", discard: true }); @@ -411023,14 +411329,14 @@ var init_prompt = __esm(async () => { return runner; }; const assertNotBusy2 = exports_Effect.fn("SessionPrompt.assertNotBusy")(function* (sessionID) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const runner = s5.runners.get(sessionID); if (runner?.busy) throw new Session.BusyError(sessionID); }); const cancel2 = exports_Effect.fn("SessionPrompt.cancel")(function* (sessionID) { log12.info("cancel", { sessionID }); - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const runner = s5.runners.get(sessionID); if (!runner || !runner.busy) { yield* status.set(sessionID, { type: "idle" }); @@ -411048,7 +411354,7 @@ var init_prompt = __esm(async () => { if (seen.has(name26)) return; seen.add(name26); - const filepath = name26.startsWith("~/") ? path70.join(os19.homedir(), name26.slice(2)) : path70.resolve(ctx.worktree, name26); + const filepath = name26.startsWith("~/") ? path71.join(os19.homedir(), name26.slice(2)) : path71.resolve(ctx.worktree, name26); const info3 = yield* fsys.stat(filepath).pipe(exports_Effect.option); if (exports_Option.isNone(info3)) { const found = yield* agents.get(name26); @@ -411174,7 +411480,7 @@ var init_prompt = __esm(async () => { const plan = Session.plan(input.session); const exists3 = yield* fsys.existsSafe(plan); if (!exists3) - yield* fsys.ensureDir(path70.dirname(plan)).pipe(exports_Effect.catch(exports_Effect.die)); + yield* fsys.ensureDir(path71.dirname(plan)).pipe(exports_Effect.catch(exports_Effect.die)); const part = yield* sessions.updatePart({ id: PartID.ascending(), messageID: userMessage.info.id, @@ -411264,7 +411570,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the } if (args3.oldString) { try { - const resolved = path70.resolve(args3.filePath); + const resolved = path71.resolve(args3.filePath); const content = fs29.readFileSync(resolved, "utf-8"); if (!canFuzzyMatch(content, args3.oldString)) { let msg = "oldString not found in file (even with whitespace tolerance). Re-read the file with the read tool first, then copy a short unique snippet (2-5 lines) exactly as it appears."; @@ -411294,7 +411600,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the } } if (toolId === "write" && args3.filePath) { - const resolved = path70.resolve(args3.filePath); + const resolved = path71.resolve(args3.filePath); if (fs29.existsSync(resolved)) { return "File already exists. Read the file first with the read tool, then use edit with a small unique oldString snippet to modify it."; } @@ -411661,7 +411967,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the }; yield* sessions.updatePart(part); const sh = Shell.preferred(); - const shellName = (process.platform === "win32" ? path70.win32.basename(sh, ".exe") : path70.basename(sh)).toLowerCase(); + const shellName = (process.platform === "win32" ? path71.win32.basename(sh, ".exe") : path71.basename(sh)).toLowerCase(); const invocations = { nu: { args: ["-c", input.command] }, fish: { args: ["-c", input.command] }, @@ -412345,12 +412651,12 @@ NOTE: At any point in time through this workflow you should feel free to ask the return yield* lastAssistant(sessionID); }); const loop2 = exports_Effect.fn("SessionPrompt.loop")(function* (input) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const runner = getRunner(s5.runners, input.sessionID); return yield* runner.ensureRunning(runLoop(input.sessionID)); }); const shell4 = exports_Effect.fn("SessionPrompt.shell")(function* (input) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const runner = getRunner(s5.runners, input.sessionID); return yield* runner.startShell((signal) => shellImpl(input, signal)); }); @@ -412604,7 +412910,8 @@ var exports_session = {}; __export(exports_session, { Session: () => Session }); -import path71 from "path"; +import path72 from "path"; +import { existsSync as existsSync8 } from "fs"; var Session; var init_session3 = __esm(async () => { init_slug(); @@ -412622,6 +412929,7 @@ var init_session3 = __esm(async () => { init_schema7(); init_dist3(); await __promiseAll([ + init_paths(), init_bus(), init_config(), init_installation(), @@ -412809,8 +413117,14 @@ var init_session3 = __esm(async () => { })) }; function plan(input) { - const base3 = Instance.project.vcs ? path71.join(Instance.worktree, ".opencode", "plans") : path71.join(Global.Path.data, "plans"); - return path71.join(base3, [input.time.created, input.slug].join("-") + ".md"); + if (!Instance.project.vcs) { + return path72.join(Global.Path.data, "plans", [input.time.created, input.slug].join("-") + ".md"); + } + const name26 = [input.time.created, input.slug].join("-") + ".md"; + const legacy = path72.join(Instance.worktree, ConfigPaths.LEGACY_PROJECT_DIRECTORY, "plans", name26); + if (existsSync8(legacy)) + return legacy; + return path72.join(Instance.worktree, ConfigPaths.PROJECT_DIRECTORY, "plans", name26); } Session.plan = plan; Session.getUsage = (input) => { @@ -412866,7 +413180,7 @@ var init_session3 = __esm(async () => { const db2 = (fn4) => exports_Effect.sync(() => Database.use(fn4)); Session.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const bus = yield* Bus.Service; - const config6 = yield* Config.Service; + const config5 = yield* Config.Service; const scope3 = yield* exports_Scope.Scope; const createNext = exports_Effect.fn("Session.createNext")(function* (input) { const ctx = yield* InstanceState.context; @@ -412887,7 +413201,7 @@ var init_session3 = __esm(async () => { }; log12.info("created", result7); yield* exports_Effect.sync(() => SyncEvent.run(Session.Event.Created, { sessionID: result7.id, info: result7 })); - const cfg = yield* config6.get(); + const cfg = yield* config5.get(); if (!result7.parentID && (Flag.UNIFIA_AUTO_SHARE || cfg.share === "auto")) { yield* share3(result7.id).pipe(exports_Effect.ignore, exports_Effect.forkIn(scope3)); } @@ -412915,7 +413229,7 @@ var init_session3 = __esm(async () => { return fromRow(row2); }); const share3 = exports_Effect.fn("Session.share")(function* (id2) { - const cfg = yield* config6.get(); + const cfg = yield* config5.get(); if (cfg.share === "disabled") throw new Error("Sharing is disabled in configuration"); const result7 = yield* exports_Effect.promise(async () => { @@ -413212,11 +413526,11 @@ var exports_config = {}; __export(exports_config, { Config: () => Config }); -import path72 from "path"; +import path73 from "path"; import { pathToFileURL as pathToFileURL10 } from "url"; import os20 from "os"; import fsNode from "fs/promises"; -import { constants as constants2, existsSync as existsSync8 } from "fs"; +import { constants as constants2, existsSync as existsSync9 } from "fs"; var Config; var init_config = __esm(async () => { init_process2(); @@ -413273,7 +413587,7 @@ var init_config = __esm(async () => { case "darwin": return "/Library/Application Support/opencode"; case "win32": - return path72.join(process.env.ProgramData || "C:\\ProgramData", "unifia"); + return path73.join(process.env.ProgramData || "C:\\ProgramData", "unifia"); default: return "/etc/opencode"; } @@ -413307,11 +413621,11 @@ var init_config = __esm(async () => { const domain4 = MANAGED_PLIST_DOMAIN; const user = os20.userInfo().username; const paths = [ - path72.join("/Library/Managed Preferences", user, `${domain4}.plist`), - path72.join("/Library/Managed Preferences", `${domain4}.plist`) + path73.join("/Library/Managed Preferences", user, `${domain4}.plist`), + path73.join("/Library/Managed Preferences", `${domain4}.plist`) ]; for (const plist of paths) { - if (!existsSync8(plist)) + if (!existsSync9(plist)) continue; log12.info("reading macOS managed preferences", { path: plist }); const result7 = await Process.run(["plutil", "-convert", "json", "-o", "-", plist], { nothrow: true }); @@ -413343,23 +413657,35 @@ var init_config = __esm(async () => { }) }); input?.signal?.throwIfAborted(); - const pkg = path72.join(dir2, "package.json"); + const pkg = path73.join(dir2, "package.json"); const target = Installation.isLocal() ? "*" : Installation.VERSION; - const json8 = await Filesystem.readJson(pkg).catch(() => ({ - dependencies: {} - })); - json8.dependencies = { - ...json8.dependencies, - "@unifia/plugin": target - }; + const json8 = await Filesystem.readJson(pkg).catch(() => ({ dependencies: {} })); + const declared = { ...json8.dependencies }; + json8.dependencies = { ...declared, [PLUGIN_PACKAGE]: target }; await Filesystem.writeJson(pkg, json8); - const gitignore = path72.join(dir2, ".gitignore"); + const gitignore = path73.join(dir2, ".gitignore"); const ignore7 = await Filesystem.exists(gitignore); if (!ignore7) { await Filesystem.write(gitignore, ["node_modules", "package.json", "package-lock.json", "bun.lock", ".gitignore"].join(` `)); } - await Npm.install(dir2); + await Npm.install(dir2).catch(async (err2) => { + log12.warn("dependency install failed, retrying without the plugin package", { + dir: dir2, + package: PLUGIN_PACKAGE, + error: err2 instanceof Error ? err2.message : String(err2) + }); + const withoutPlugin = { ...declared }; + delete withoutPlugin[PLUGIN_PACKAGE]; + json8.dependencies = withoutPlugin; + await Filesystem.writeJson(pkg, json8); + await Npm.install(dir2).catch((retryErr) => { + log12.error("dependency install failed without the plugin package", { + dir: dir2, + error: retryErr instanceof Error ? retryErr.message : String(retryErr) + }); + }); + }); } Config.installDependencies = installDependencies; async function isWritable(dir2) { @@ -413380,7 +413706,7 @@ var init_config = __esm(async () => { } } function trim4(file6) { - const ext2 = path72.extname(file6); + const ext2 = path73.extname(file6); return ext2.length ? file6.slice(0, -ext2.length) : file6; } async function loadCommand(dir2) { @@ -413400,17 +413726,24 @@ var init_config = __esm(async () => { }); if (!md) continue; - const patterns = ["/.opencode/command/", "/.opencode/commands/", "/command/", "/commands/"]; - const file6 = rel(item, patterns) ?? path72.basename(item); + const patterns = [ + "/.unifia/command/", + "/.unifia/commands/", + "/.opencode/command/", + "/.opencode/commands/", + "/command/", + "/commands/" + ]; + const file6 = rel(item, patterns) ?? path73.basename(item); const name26 = trim4(file6); - const config6 = { + const config5 = { name: name26, ...md.data, template: md.content.trim() }; - const parsed = Config.Command.safeParse(config6); + const parsed = Config.Command.safeParse(config5); if (parsed.success) { - result7[config6.name] = parsed.data; + result7[config5.name] = parsed.data; continue; } throw new Config.InvalidError({ path: item, issues: parsed.error.issues }, { cause: parsed.error }); @@ -413434,17 +413767,24 @@ var init_config = __esm(async () => { }); if (!md) continue; - const patterns = ["/.opencode/agent/", "/.opencode/agents/", "/agent/", "/agents/"]; - const file6 = rel(item, patterns) ?? path72.basename(item); + const patterns = [ + "/.unifia/agent/", + "/.unifia/agents/", + "/.opencode/agent/", + "/.opencode/agents/", + "/agent/", + "/agents/" + ]; + const file6 = rel(item, patterns) ?? path73.basename(item); const agentName = trim4(file6); - const config6 = { + const config5 = { name: agentName, ...md.data, prompt: md.content.trim() }; - const parsed = Config.Agent.safeParse(config6); + const parsed = Config.Agent.safeParse(config5); if (parsed.success) { - result7[config6.name] = parsed.data; + result7[config5.name] = parsed.data; continue; } throw new Config.InvalidError({ path: item, issues: parsed.error.issues }, { cause: parsed.error }); @@ -413468,14 +413808,14 @@ var init_config = __esm(async () => { }); if (!md) continue; - const config6 = { - name: path72.basename(item, ".md"), + const config5 = { + name: path73.basename(item, ".md"), ...md.data, prompt: md.content.trim() }; - const parsed = Config.Agent.safeParse(config6); + const parsed = Config.Agent.safeParse(config5); if (parsed.success) { - result7[config6.name] = { + result7[config5.name] = { ...parsed.data, mode: "primary" }; @@ -413507,13 +413847,13 @@ var init_config = __esm(async () => { const spec = pluginSpecifier(plugin); if (!isPathPluginSpec(spec)) return plugin; - const base3 = path72.dirname(configFilepath); + const base3 = path73.dirname(configFilepath); const file6 = (() => { if (spec.startsWith("file://")) return spec; - if (path72.isAbsolute(spec) || /^[A-Za-z]:[\\/]/.test(spec)) + if (path73.isAbsolute(spec) || /^[A-Za-z]:[\\/]/.test(spec)) return pathToFileURL10(spec).href; - return pathToFileURL10(path72.resolve(base3, spec)).href; + return pathToFileURL10(path73.resolve(base3, spec)).href; })(); const resolved = await resolvePathPluginTarget(file6).catch(() => file6); if (Array.isArray(plugin)) @@ -413539,10 +413879,13 @@ var init_config = __esm(async () => { class Service3 extends exports_ServiceMap.Service()("@opencode/Config") { } Config.Service = Service3; + const PLUGIN_PACKAGE = "@unifia/plugin"; + const CONFIG_FILES = ["unifia.json", "unifia.jsonc"]; + const LEGACY_CONFIG_FILES = ["opencode.json", "opencode.jsonc"]; function globalConfigFile() { - const candidates = ["unifia.jsonc", "unifia.json", "config.json"].map((file6) => path72.join(Global.Path.config, file6)); + const candidates = ["unifia.jsonc", "unifia.json", "config.json", ...LEGACY_CONFIG_FILES.toReversed()].map((file6) => path73.join(Global.Path.config, file6)); for (const file6 of candidates) { - if (existsSync8(file6)) + if (existsSync9(file6)) return file6; } return candidates[0]; @@ -413666,16 +414009,16 @@ ${errorDetails} return yield* loadConfig7(text10, { path: filepath }); }); const loadGlobal = exports_Effect.fnUntraced(function* () { - let result7 = C3({}, D2(yield* loadFile(path72.join(Global.Path.config, "config.json"))), D2(yield* loadFile(path72.join(Global.Path.config, "unifia.json"))), D2(yield* loadFile(path72.join(Global.Path.config, "unifia.jsonc")))); - const legacy = path72.join(Global.Path.config, "config"); - if (existsSync8(legacy)) { + let result7 = C3({}, D2(yield* loadFile(path73.join(Global.Path.config, "config.json"))), D2(yield* loadFile(path73.join(Global.Path.config, "opencode.json"))), D2(yield* loadFile(path73.join(Global.Path.config, "opencode.jsonc"))), D2(yield* loadFile(path73.join(Global.Path.config, "unifia.json"))), D2(yield* loadFile(path73.join(Global.Path.config, "unifia.jsonc")))); + const legacy = path73.join(Global.Path.config, "config"); + if (existsSync9(legacy)) { yield* exports_Effect.promise(() => import(pathToFileURL10(legacy).href, { with: { type: "toml" } }).then(async (mod2) => { const { provider: provider2, model, ...rest } = mod2.default; if (provider2 && model) result7.model = `${provider2}/${model}`; result7["$schema"] = "https://opencode.ai/config.json"; result7 = D2(result7, rest); - await fsNode.writeFile(path72.join(Global.Path.config, "config.json"), JSON.stringify(result7, null, 2)); + await fsNode.writeFile(path73.join(Global.Path.config, "config.json"), JSON.stringify(result7, null, 2)); await fsNode.unlink(legacy); }).catch(() => {})); } @@ -413729,7 +414072,7 @@ ${errorDetails} remoteConfig.$schema = "https://opencode.ai/config.json"; const source2 = `${url4}/.well-known/opencode`; const next4 = yield* loadConfig7(JSON.stringify(remoteConfig), { - dir: path72.dirname(source2), + dir: path73.dirname(source2), source: source2 }); merge12(source2, next4, "global"); @@ -413744,7 +414087,7 @@ ${errorDetails} } const searchStop = ConfigPaths.searchStop({ worktree: ctx.worktree, vcs: ctx.project.vcs }); if (!Flag.UNIFIA_DISABLE_PROJECT_CONFIG) { - for (const file6 of yield* exports_Effect.promise(() => ConfigPaths.projectFiles("unifia", ctx.directory, searchStop))) { + for (const file6 of yield* exports_Effect.promise(() => ConfigPaths.projectFiles("unifia", ctx.directory, searchStop, "opencode"))) { merge12(file6, yield* loadFile(file6), "local"); } } @@ -413757,9 +414100,9 @@ ${errorDetails} } const deps = []; for (const dir2 of i2(directories3)) { - if (dir2.endsWith(".opencode") || dir2 === Flag.UNIFIA_CONFIG_DIR) { - for (const file6 of ["unifia.json", "unifia.jsonc"]) { - const source2 = path72.join(dir2, file6); + if (ConfigPaths.isConfigDirectory(dir2)) { + for (const file6 of LEGACY_CONFIG_FILES.concat(CONFIG_FILES)) { + const source2 = path73.join(dir2, file6); log12.debug(`loading config from ${source2}`); merge12(source2, yield* loadFile(source2)); result7.agent ??= {}; @@ -413767,13 +414110,15 @@ ${errorDetails} result7.plugin ??= []; } } - const dep = iife2(async () => { - await installDependencies(dir2); - }); - dep.catch((err2) => { - log12.warn("background dependency install failed", { dir: dir2, error: err2 }); - }); - deps.push(dep); + if (!ConfigPaths.isLegacyDirectory(dir2)) { + const dep = iife2(async () => { + await installDependencies(dir2); + }); + dep.catch((err2) => { + log12.warn("background dependency install failed", { dir: dir2, error: err2 }); + }); + deps.push(dep); + } result7.command = D2(result7.command ?? {}, yield* exports_Effect.promise(() => loadCommand(dir2))); result7.agent = D2(result7.agent, yield* exports_Effect.promise(() => loadAgent(dir2))); result7.agent = D2(result7.agent, yield* exports_Effect.promise(() => loadMode(dir2))); @@ -413801,7 +414146,7 @@ ${errorDetails} if (exports_Option.isSome(configOpt)) { const source2 = `${activeOrg.account.url}/api/config`; const next4 = yield* loadConfig7(JSON.stringify(configOpt.value), { - dir: path72.dirname(source2), + dir: path73.dirname(source2), source: source2 }); for (const providerID of Object.keys(next4.provider ?? {})) { @@ -413816,9 +414161,9 @@ ${errorDetails} return exports_Effect.void; })); } - if (existsSync8(managedDir)) { - for (const file6 of ["unifia.json", "unifia.jsonc"]) { - const source2 = path72.join(managedDir, file6); + if (existsSync9(managedDir)) { + for (const file6 of LEGACY_CONFIG_FILES.concat(CONFIG_FILES)) { + const source2 = path73.join(managedDir, file6); merge12(source2, yield* loadFile(source2), "global"); } } @@ -413876,28 +414221,28 @@ ${errorDetails} } }; }); - const state3 = yield* InstanceState.make(exports_Effect.fn("Config.state")(function* (ctx) { + const state2 = yield* InstanceState.make(exports_Effect.fn("Config.state")(function* (ctx) { return yield* loadInstanceState(ctx); })); const get35 = exports_Effect.fn("Config.get")(function* () { - return yield* InstanceState.use(state3, (s5) => s5.config); + return yield* InstanceState.use(state2, (s5) => s5.config); }); const directories2 = exports_Effect.fn("Config.directories")(function* () { - return yield* InstanceState.use(state3, (s5) => s5.directories); + return yield* InstanceState.use(state2, (s5) => s5.directories); }); const getConsoleState2 = exports_Effect.fn("Config.getConsoleState")(function* () { - return yield* InstanceState.use(state3, (s5) => s5.consoleState); + return yield* InstanceState.use(state2, (s5) => s5.consoleState); }); const waitForDependencies2 = exports_Effect.fn("Config.waitForDependencies")(function* () { - yield* InstanceState.useEffect(state3, (s5) => exports_Effect.promise(() => Promise.all(s5.deps).then(() => { + yield* InstanceState.useEffect(state2, (s5) => exports_Effect.promise(() => Promise.all(s5.deps).then(() => { return; }))); }); - const update10 = exports_Effect.fn("Config.update")(function* (config6) { + const update10 = exports_Effect.fn("Config.update")(function* (config5) { const dir2 = yield* InstanceState.directory; - const file6 = path72.join(dir2, "config.json"); + const file6 = path73.join(dir2, "config.json"); const existing = yield* loadFile(file6); - yield* fs24.writeFileString(file6, JSON.stringify(D2(writable(existing), writable(config6)), null, 2)).pipe(exports_Effect.orDie); + yield* fs24.writeFileString(file6, JSON.stringify(D2(writable(existing), writable(config5)), null, 2)).pipe(exports_Effect.orDie); yield* exports_Effect.promise(() => Instance.dispose()); }); const invalidate8 = exports_Effect.fn("Config.invalidate")(function* (wait) { @@ -413914,10 +414259,10 @@ ${errorDetails} if (wait) yield* exports_Effect.promise(() => task); }); - const updateGlobal2 = exports_Effect.fn("Config.updateGlobal")(function* (config6) { + const updateGlobal2 = exports_Effect.fn("Config.updateGlobal")(function* (config5) { const file6 = globalConfigFile(); const before = (yield* readConfigFile(file6)) ?? "{}"; - const input = writable(config6); + const input = writable(config5); let next4; if (!file6.endsWith(".jsonc")) { const existing = parseConfig(before, file6); @@ -413957,12 +414302,12 @@ ${errorDetails} return runPromise3((svc) => svc.getConsoleState()); } Config.getConsoleState = getConsoleState; - async function update9(config6) { - return runPromise3((svc) => svc.update(config6)); + async function update9(config5) { + return runPromise3((svc) => svc.update(config5)); } Config.update = update9; - async function updateGlobal(config6) { - return runPromise3((svc) => svc.updateGlobal(config6)); + async function updateGlobal(config5) { + return runPromise3((svc) => svc.updateGlobal(config5)); } Config.updateGlobal = updateGlobal; async function invalidate7(wait = false) { @@ -414517,6 +414862,10 @@ var hopByHopHeaders, ALLOWED_TOKEN_PATTERN, buildRequestInitFromRequest = (reque req.headers.delete("accept-encoding"); const res = await (customFetch || fetch)(req); const resHeaders = new Headers(res.headers); + const connectionValue = resHeaders.get("connection"); + if (connectionValue) { + connectionValue.split(",").map((h4) => h4.trim()).filter((h4) => ALLOWED_TOKEN_PATTERN.test(h4)).forEach((h4) => resHeaders.delete(h4)); + } hopByHopHeaders.forEach((header) => { resHeaders.delete(header); }); @@ -415116,7 +415465,9 @@ var StreamingApi = class { done5 ? controller.close() : controller.enqueue(value8); }, cancel: () => { - this.abort(); + if (!this.closed) { + this.abort(); + } } }); } @@ -415138,15 +415489,18 @@ var StreamingApi = class { return new Promise((res) => setTimeout(res, ms2)); } async close() { + this.closed = true; try { await this.writer.close(); } catch {} - this.closed = true; } async pipe(body3) { this.writer.releaseLock(); - await body3.pipeTo(this.writable, { preventClose: true }); - this.writer = this.writable.getWriter(); + try { + await body3.pipeTo(this.writable, { preventClose: true, preventAbort: true }); + } finally { + this.writer = this.writable.getWriter(); + } } onAbort(listener) { this.abortSubscribers.push(listener); @@ -415254,16 +415608,17 @@ var init_sse2 = __esm(() => { return `data: ${line2}`; }).join(` `); - for (const key of ["event", "id", "retry"]) { - if (message[key] && /[\r\n]/.test(message[key])) { + for (const key of ["event", "id"]) { + const value8 = message[key]; + if (value8 && /[\r\n]/.test(value8)) { throw new Error(`${key} must not contain "\\r" or "\\n"`); } } const sseData = [ message.event && `event: ${message.event}`, dataLines, - message.id && `id: ${message.id}`, - message.retry && `retry: ${message.retry}` + message.id !== undefined && `id: ${message.id}`, + message.retry !== undefined && `retry: ${message.retry}` ].filter(Boolean).join(` `) + ` @@ -416030,7 +416385,7 @@ var init_session4 = __esm(async () => { var init_mime = () => {}; // node_modules/hono/dist/middleware/serve-static/path.js -var init_path3 = () => {}; +var init_path4 = () => {}; // node_modules/hono/dist/middleware/serve-static/index.js var ENCODINGS, ENCODINGS_ORDERED_KEYS; @@ -416038,7 +416393,7 @@ var init_serve_static = __esm(() => { init_compress(); init_mime(); init_url(); - init_path3(); + init_path4(); ENCODINGS = { br: ".br", zstd: ".zst", @@ -416207,7 +416562,7 @@ var init_websocket2 = __esm(() => { data: { events, url: new URL(c3.req.url), - protocol: c3.req.url + protocol: c3.req.header("sec-websocket-protocol")?.split(",")[0]?.trim() ?? "" } }); if (upgradeResult) { @@ -416535,7 +416890,7 @@ class EventEmitter3 { import { dlopen, FFIType, ptr } from "bun:ffi"; import { Buffer as Buffer4 } from "buffer"; import { join as join21, dirname as dirname14, basename as basename7 } from "path"; -import { existsSync as existsSync9 } from "fs"; +import { existsSync as existsSync10 } from "fs"; function shQuote(s5) { if (s5.length === 0) return "''"; @@ -416543,7 +416898,7 @@ function shQuote(s5) { } function resolveLibPath() { const env7 = process.env.BUN_PTY_LIB; - if (env7 && existsSync9(env7)) + if (env7 && existsSync10(env7)) return env7; try { const embeddedPath = __require(`../rust-pty/target/release/${process.platform === "win32" ? "rust_pty.dll" : process.platform === "darwin" ? process.arch === "arm64" ? "librust_pty_arm64.dylib" : "librust_pty.dylib" : process.arch === "arm64" ? "librust_pty_arm64.so" : "librust_pty.so"}`); @@ -416569,7 +416924,7 @@ function resolveLibPath() { } } for (const path34 of fallbackPaths) { - if (existsSync9(path34)) + if (existsSync10(path34)) return path34; } throw new Error(`librust_pty shared library not found. @@ -416825,21 +417180,21 @@ var init_pty = __esm(async () => { } session.subscribers.clear(); } - const state3 = yield* InstanceState.make(exports_Effect.fn("Pty.state")(function* (ctx) { - const state4 = { + const state2 = yield* InstanceState.make(exports_Effect.fn("Pty.state")(function* (ctx) { + const state3 = { dir: ctx.directory, sessions: new Map }; yield* exports_Effect.addFinalizer(() => exports_Effect.sync(() => { - for (const session of state4.sessions.values()) { + for (const session of state3.sessions.values()) { teardown(session); } - state4.sessions.clear(); + state3.sessions.clear(); })); - return state4; + return state3; })); const remove21 = exports_Effect.fn("Pty.remove")(function* (id2) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const session = s5.sessions.get(id2); if (!session) return; @@ -416849,22 +417204,22 @@ var init_pty = __esm(async () => { yield* bus.publish(Pty.Event.Deleted, { id: session.info.id }); }); const list2 = exports_Effect.fn("Pty.list")(function* () { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); return Array.from(s5.sessions.values()).map((session) => session.info); }); const get35 = exports_Effect.fn("Pty.get")(function* (id2) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); return s5.sessions.get(id2)?.info; }); const tail4 = exports_Effect.fn("Pty.tail")(function* (id2, maxChars = 60000) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const session = s5.sessions.get(id2); if (!session) return ""; return stripAnsi2(session.buffer.slice(-maxChars)); }); const create2 = exports_Effect.fn("Pty.create")(function* (input) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); if (input.id && s5.sessions.has(input.id)) { return s5.sessions.get(input.id).info; } @@ -416979,7 +417334,7 @@ var init_pty = __esm(async () => { return info3; }); const update10 = exports_Effect.fn("Pty.update")(function* (id2, input) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const session = s5.sessions.get(id2); if (!session) return; @@ -417030,21 +417385,21 @@ var init_pty = __esm(async () => { } } const resize4 = exports_Effect.fn("Pty.resize")(function* (id2, cols, rows) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const session = s5.sessions.get(id2); if (session && session.info.status === "running") { applyResize(session, cols, rows); } }); const write4 = exports_Effect.fn("Pty.write")(function* (id2, data2) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const session = s5.sessions.get(id2); if (session && session.info.status === "running") { session.process.write(data2); } }); const connect2 = exports_Effect.fn("Pty.connect")(function* (id2, ws2, cursor2) { - const s5 = yield* InstanceState.get(state3); + const s5 = yield* InstanceState.get(state2); const session = s5.sessions.get(id2); if (!session) { ws2.close(); @@ -417383,8 +417738,8 @@ var init_mcp2 = __esm(async () => { name: zod_default.string(), config: Config.Mcp })), async (c3) => { - const { name: name26, config: config6 } = c3.req.valid("json"); - const result7 = await MCP.add(name26, config6); + const { name: name26, config: config5 } = c3.req.valid("json"); + const result7 = await MCP.add(name26, config5); return c3.json(result7.status); }).post("/:name/auth", describeRoute({ summary: "Start MCP OAuth", @@ -418739,13 +419094,13 @@ var init_config2 = __esm(async () => { ...errors6(400) } }), validator2("json", Config.Info), async (c3) => { - const config6 = c3.req.valid("json"); - await Config.update(config6); + const config5 = c3.req.valid("json"); + await Config.update(config5); AuditLog.recordAsync({ action: "config.update", - metadata: { changedKeys: Object.keys(config6 ?? {}) } + metadata: { changedKeys: Object.keys(config5 ?? {}) } }); - return c3.json(config6); + return c3.json(config5); }).get("/providers", describeRoute({ summary: "List config providers", description: "Get a list of all configured AI providers and their default models.", @@ -419210,7 +419565,7 @@ var init_auth7 = __esm(async () => { ProviderAuth.layer = exports_Layer.effect(Service3, exports_Effect.gen(function* () { const auth2 = yield* Auth.Service; const plugin = yield* Plugin.Service; - const state3 = yield* InstanceState.make(exports_Effect.fn("ProviderAuth.state")(function* () { + const state2 = yield* InstanceState.make(exports_Effect.fn("ProviderAuth.state")(function* () { const plugins = yield* plugin.list(); return { hooks: exports_Record.fromEntries(exports_Array.filterMap(plugins, (x3) => x3.auth?.provider !== undefined ? exports_Result.succeed([ProviderID.make(x3.auth.provider), x3.auth]) : exports_Result.failVoid)), @@ -419218,7 +419573,7 @@ var init_auth7 = __esm(async () => { }; })); const methods2 = exports_Effect.fn("ProviderAuth.methods")(function* () { - const hooks = (yield* InstanceState.get(state3)).hooks; + const hooks = (yield* InstanceState.get(state2)).hooks; return exports_Record.map(hooks, (item) => item.methods.map((method) => ({ type: method.type, label: method.label, @@ -419243,7 +419598,7 @@ var init_auth7 = __esm(async () => { }))); }); const authorize2 = exports_Effect.fn("ProviderAuth.authorize")(function* (input) { - const { hooks, pending: pending2 } = yield* InstanceState.get(state3); + const { hooks, pending: pending2 } = yield* InstanceState.get(state2); const method = hooks[input.providerID].methods[input.method]; if (method.type !== "oauth") return; @@ -419265,7 +419620,7 @@ var init_auth7 = __esm(async () => { }; }); const callback6 = exports_Effect.fn("ProviderAuth.callback")(function* (input) { - const pending2 = (yield* InstanceState.get(state3)).pending; + const pending2 = (yield* InstanceState.get(state2)).pending; const match17 = pending2.get(input.providerID); if (!match17) return yield* exports_Effect.fail(new ProviderAuth.OauthMissing({ providerID: input.providerID })); @@ -419347,9 +419702,9 @@ var init_provider3 = __esm(async () => { } } }), async (c3) => { - const config6 = await Config.get(); - const disabled = new Set(config6.disabled_providers ?? []); - const enabled = config6.enabled_providers ? new Set(config6.enabled_providers) : undefined; + const config5 = await Config.get(); + const disabled = new Set(config5.disabled_providers ?? []); + const enabled = config5.enabled_providers ? new Set(config5.enabled_providers) : undefined; const allProviders = await ModelsDev.get(); const filteredProviders = {}; for (const [key, value8] of Object.entries(allProviders)) { @@ -420207,7 +420562,7 @@ var init_agent_skills = __esm(async () => { // packages/unifia/src/server/routes/gdpr.ts import fs30 from "fs/promises"; -import path73 from "path"; +import path74 from "path"; var log51, GdprRoutes = () => new Hono2().get("/user/data/export", describeRoute({ summary: "Export user data (RGPD)", description: "Streams a JSON document containing all local sessions, messages, and non-secret config. Auth tokens are omitted by default.", @@ -420305,7 +420660,7 @@ var log51, GdprRoutes = () => new Hono2().get("/user/data/export", describeRoute log51.error("delete: worktree cleanup failed", { e: String(e4) }); } try { - const crashDir = path73.join(Global.Path.data, "crashes"); + const crashDir = path74.join(Global.Path.data, "crashes"); const entries10 = await fs30.readdir(crashDir).catch((e4) => { if (e4?.code === "ENOENT") return []; @@ -420313,7 +420668,7 @@ var log51, GdprRoutes = () => new Hono2().get("/user/data/export", describeRoute }); for (const name26 of entries10) { try { - await fs30.unlink(path73.join(crashDir, name26)); + await fs30.unlink(path74.join(crashDir, name26)); } catch (e4) { if (e4?.code !== "ENOENT") log51.warn("delete: crash unlink failed", { name: name26, e: String(e4) }); @@ -420329,11 +420684,11 @@ var log51, GdprRoutes = () => new Hono2().get("/user/data/export", describeRoute log51.warn("delete: Database.close failed", { e: String(e4) }); } const toUnlink = [ - path73.join(Global.Path.data, "auth.json"), + path74.join(Global.Path.data, "auth.json"), Database.Path, - path73.join(Global.Path.config, "unifia.jsonc"), - path73.join(Global.Path.config, "unifia.json"), - path73.join(Global.Path.config, "config.json") + path74.join(Global.Path.config, "unifia.jsonc"), + path74.join(Global.Path.config, "unifia.json"), + path74.join(Global.Path.config, "config.json") ]; for (const f5 of toUnlink) { if (f5 === ":memory:") @@ -421073,9 +421428,9 @@ var init_debate4 = __esm(async () => { } } }), validator2("json", Collective.DebateConfig), async (c3) => { - const config6 = c3.req.valid("json"); + const config5 = c3.req.valid("json"); try { - const report2 = await Orchestrator.runPromiseExport(config6); + const report2 = await Orchestrator.runPromiseExport(config5); return c3.json(report2); } catch (e4) { const message = e4 instanceof Error ? e4.message : String(e4); @@ -421148,9 +421503,9 @@ var init_debate4 = __esm(async () => { } } }), validator2("json", Collective.DebateConfig), async (c3) => { - const config6 = c3.req.valid("json"); + const config5 = c3.req.valid("json"); try { - const estimate = await Orchestrator.estimatePromise(config6); + const estimate = await Orchestrator.estimatePromise(config5); return c3.json(estimate); } catch (e4) { log52.error("estimate failed", { error: String(e4) }); @@ -421242,7 +421597,7 @@ function invalidQuery(result7, c3) { } // packages/unifia/src/server/routes/team.ts -import path74 from "path"; +import path75 from "path"; function teamStore() { opened = true; return store(); @@ -421340,7 +421695,7 @@ var init_team4 = __esm(async () => { ]); log53 = Log.create({ service: "server.team" }); teamRunRegistry = new TeamRunRegistry; - store = lazy2(() => TeamStore.open(path74.join(Global.Path.data, "team.db"))); + store = lazy2(() => TeamStore.open(path75.join(Global.Path.data, "team.db"))); RunSchema = zod_default.object({ runId: zod_default.string(), schemaVersion: zod_default.string(), @@ -422473,11 +422828,11 @@ function serialize2(registry3, generatorVersion) { snapshot: registry3 }; } -function toCanonicalJSON(snapshot4) { - return JSON.stringify(snapshot4, canonicalReplacer, 2); +function toCanonicalJSON(snapshot3) { + return JSON.stringify(snapshot3, canonicalReplacer, 2); } -function hashSnapshot(snapshot4) { - return createHash10("sha256").update(toCanonicalJSON(snapshot4)).digest("hex"); +function hashSnapshot(snapshot3) { + return createHash10("sha256").update(toCanonicalJSON(snapshot3)).digest("hex"); } function canonicalReplacer(_key, value8) { if (value8 === null || typeof value8 !== "object") @@ -422823,8 +423178,8 @@ var init_model_intelligence = __esm(async () => { } }), async (c3) => { try { - const snapshot4 = await runPromise3((svc) => svc.snapshot()); - return c3.json({ schemaVersion: SCHEMA_VERSION, hash: snapshot4.hash, byteLength: snapshot4.json.length }); + const snapshot3 = await runPromise3((svc) => svc.snapshot()); + return c3.json({ schemaVersion: SCHEMA_VERSION, hash: snapshot3.hash, byteLength: snapshot3.json.length }); } catch (e4) { return registryError(c3, e4, "snapshot failed"); } @@ -423513,8 +423868,8 @@ var init_global3 = __esm(async () => { ...errors6(400) } }), validator2("json", Config.Info), async (c3) => { - const config6 = c3.req.valid("json"); - const next4 = await Config.updateGlobal(config6); + const config5 = c3.req.valid("json"); + const next4 = await Config.updateGlobal(config5); return c3.json(next4); }).post("/dispose", describeRoute({ summary: "Dispose instance", @@ -423708,28 +424063,28 @@ var require_service = __commonJS((exports) => { var TLD = ".local"; class Service3 extends events_1.EventEmitter { - constructor(config6) { + constructor(config5) { super(); this.probe = true; this.published = false; this.activated = false; this.destroyed = false; this.txtService = new dns_txt_1.default; - if (!config6.name) + if (!config5.name) throw new Error("ServiceConfig requires `name` property to be set"); - if (!config6.type) + if (!config5.type) throw new Error("ServiceConfig requires `type` property to be set"); - if (!config6.port) + if (!config5.port) throw new Error("ServiceConfig requires `port` property to be set"); - this.name = config6.name.split(".").join("-"); - this.protocol = config6.protocol || "tcp"; - this.type = (0, service_types_1.toString)({ name: config6.type, protocol: this.protocol }); - this.port = config6.port; - this.host = config6.host || os_1.default.hostname(); + this.name = config5.name.split(".").join("-"); + this.protocol = config5.protocol || "tcp"; + this.type = (0, service_types_1.toString)({ name: config5.type, protocol: this.protocol }); + this.port = config5.port; + this.host = config5.host || os_1.default.hostname(); this.fqdn = `${this.name}.${this.type}${TLD}`; - this.txt = config6.txt; - this.subtypes = config6.subtypes; - this.disableIPv6 = !!config6.disableIPv6; + this.txt = config5.txt; + this.subtypes = config5.subtypes; + this.disableIPv6 = !!config5.disableIPv6; } records() { var records = [this.RecordPTR(this), this.RecordSRV(this), this.RecordTXT(this)]; @@ -423830,7 +424185,7 @@ var require_registry2 = __commonJS((exports) => { this.services = []; this.server = server2; } - publish(config6) { + publish(config5) { function start2(service4, registry3, opts) { if (service4.activated) return; @@ -423864,10 +424219,10 @@ var require_registry2 = __commonJS((exports) => { if (index3 !== -1) registry3.services.splice(index3, 1); } - const service3 = new service_1.default(config6); + const service3 = new service_1.default(config5); service3.start = start2.bind(null, service3, this); service3.stop = stop3.bind(null, service3, this); - service3.start({ probe: config6.probe !== false }); + service3.start({ probe: config5.probe !== false }); return service3; } unpublishAll(callback5) { @@ -426163,21 +426518,21 @@ var require_thunky = __commonJS((exports, module2) => { process.nextTick(upgrade, 42); module2.exports = thunky; function thunky(fn4) { - var state3 = run11; + var state2 = run11; return thunk; function thunk(callback5) { - state3(callback5 || noop5); + state2(callback5 || noop5); } function run11(callback5) { var stack = [callback5]; - state3 = wait; + state2 = wait; fn4(done5); function wait(callback6) { stack.push(callback6); } function done5(err2) { var args3 = arguments; - state3 = isError2(err2) ? run11 : finished; + state2 = isError2(err2) ? run11 : finished; while (stack.length) finished(stack.shift()); function finished(callback6) { @@ -427300,7 +427655,7 @@ var init_server4 = __esm(async () => { }); // packages/unifia/src/mobile-entry.ts -import { existsSync as existsSync11, writeFileSync as writeFileSync4, mkdirSync as mkdirSync3, readdirSync as readdirSync5, readFileSync as readFileSync10 } from "fs"; +import { existsSync as existsSync12, writeFileSync as writeFileSync4, mkdirSync as mkdirSync3, readdirSync as readdirSync5, readFileSync as readFileSync10 } from "fs"; import dns from "dns"; import { join as pathJoin, dirname as dirname15 } from "path"; @@ -432700,17 +433055,17 @@ function withNetworkOptions(yargs) { return yargs.options(options4); } async function resolveNetworkOptions(args3) { - const config6 = await Config.getGlobal(); + const config5 = await Config.getGlobal(); const portExplicitlySet = process.argv.includes("--port"); const hostnameExplicitlySet = process.argv.includes("--hostname"); const mdnsExplicitlySet = process.argv.includes("--mdns"); const mdnsDomainExplicitlySet = process.argv.includes("--mdns-domain"); const _corsExplicitlySet = process.argv.includes("--cors"); - const mdns = mdnsExplicitlySet ? args3.mdns : config6?.server?.mdns ?? args3.mdns; - const mdnsDomain = mdnsDomainExplicitlySet ? args3["mdns-domain"] : config6?.server?.mdnsDomain ?? args3["mdns-domain"]; - const port2 = portExplicitlySet ? args3.port : config6?.server?.port ?? args3.port; - const hostname4 = hostnameExplicitlySet ? args3.hostname : mdns && !config6?.server?.hostname ? "0.0.0.0" : config6?.server?.hostname ?? args3.hostname; - const configCors = config6?.server?.cors ?? []; + const mdns = mdnsExplicitlySet ? args3.mdns : config5?.server?.mdns ?? args3.mdns; + const mdnsDomain = mdnsDomainExplicitlySet ? args3["mdns-domain"] : config5?.server?.mdnsDomain ?? args3["mdns-domain"]; + const port2 = portExplicitlySet ? args3.port : config5?.server?.port ?? args3.port; + const hostname4 = hostnameExplicitlySet ? args3.hostname : mdns && !config5?.server?.hostname ? "0.0.0.0" : config5?.server?.hostname ?? args3.hostname; + const configCors = config5?.server?.cors ?? []; const argsCors = Array.isArray(args3.cors) ? args3.cors : args3.cors ? [args3.cors] : []; const cors2 = [...configCors, ...argsCors]; return { hostname: hostname4, port: port2, mdns, mdnsDomain, cors: cors2 }; @@ -432761,14 +433116,14 @@ await __promiseAll([ init_global(), init_log() ]); -import path75 from "path"; -import { existsSync as existsSync10 } from "fs"; +import path76 from "path"; +import { existsSync as existsSync11 } from "fs"; var JsonMigration; ((JsonMigration) => { const log12 = Log.create({ service: "json-migration" }); async function run11(sqlite, options5) { - const storageDir = path75.join(Global.Path.data, "storage"); - if (!existsSync10(storageDir)) { + const storageDir = path76.join(Global.Path.data, "storage"); + if (!existsSync11(storageDir)) { log12.info("storage directory does not exist, skipping migration"); return { projects: 0, @@ -432877,7 +433232,7 @@ var JsonMigration; const data2 = batch[j3]; if (!data2) continue; - const id2 = path75.basename(projectFiles[i7 + j3], ".json"); + const id2 = path76.basename(projectFiles[i7 + j3], ".json"); projectIds.add(id2); projectValues.push({ id: id2, @@ -432897,7 +433252,7 @@ var JsonMigration; step("projects", end4 - i7); } log12.info("migrated projects", { count: stats.projects, duration: Math.round(performance.now() - start2) }); - const sessionProjects = sessionFiles.map((file6) => path75.basename(path75.dirname(file6))); + const sessionProjects = sessionFiles.map((file6) => path76.basename(path76.dirname(file6))); const sessionIds = new Set; const sessionValues = []; for (let i7 = 0;i7 < sessionFiles.length; i7 += batchSize) { @@ -432908,7 +433263,7 @@ var JsonMigration; const data2 = batch[j3]; if (!data2) continue; - const id2 = path75.basename(sessionFiles[i7 + j3], ".json"); + const id2 = path76.basename(sessionFiles[i7 + j3], ".json"); const projectID = sessionProjects[i7 + j3]; if (!projectIds.has(projectID)) { orphans.sessions++; @@ -432947,7 +433302,7 @@ var JsonMigration; const allMessageSessions = []; const messageSessions = new Map; for (const file6 of messageFiles) { - const sessionID = path75.basename(path75.dirname(file6)); + const sessionID = path76.basename(path76.dirname(file6)); if (!sessionIds.has(sessionID)) continue; allMessageFiles.push(file6); @@ -432963,7 +433318,7 @@ var JsonMigration; if (!data2) continue; const file6 = allMessageFiles[i7 + j3]; - const id2 = path75.basename(file6, ".json"); + const id2 = path76.basename(file6, ".json"); const sessionID = allMessageSessions[i7 + j3]; messageSessions.set(id2, sessionID); const rest = data2; @@ -432992,8 +433347,8 @@ var JsonMigration; if (!data2) continue; const file6 = partFiles[i7 + j3]; - const id2 = path75.basename(file6, ".json"); - const messageID = path75.basename(path75.dirname(file6)); + const id2 = path76.basename(file6, ".json"); + const messageID = path76.basename(path76.dirname(file6)); const sessionID = messageSessions.get(messageID); if (!sessionID) { errs.push(`part missing message session: ${file6}`); @@ -433019,7 +433374,7 @@ var JsonMigration; step("parts", end4 - i7); } log12.info("migrated parts", { count: stats.parts }); - const todoSessions = todoFiles.map((file6) => path75.basename(file6, ".json")); + const todoSessions = todoFiles.map((file6) => path76.basename(file6, ".json")); for (let i7 = 0;i7 < todoFiles.length; i7 += batchSize) { const end4 = Math.min(i7 + batchSize, todoFiles.length); const batch = await read3(todoFiles, i7, end4); @@ -433059,7 +433414,7 @@ var JsonMigration; if (orphans.todos > 0) { log12.warn("skipped orphaned todos", { count: orphans.todos }); } - const permProjects = permFiles.map((file6) => path75.basename(file6, ".json")); + const permProjects = permFiles.map((file6) => path76.basename(file6, ".json")); const permValues = []; for (let i7 = 0;i7 < permFiles.length; i7 += batchSize) { const end4 = Math.min(i7 + batchSize, permFiles.length); @@ -433083,7 +433438,7 @@ var JsonMigration; if (orphans.permissions > 0) { log12.warn("skipped orphaned permissions", { count: orphans.permissions }); } - const shareSessions = shareFiles.map((file6) => path75.basename(file6, ".json")); + const shareSessions = shareFiles.map((file6) => path76.basename(file6, ".json")); const shareValues = []; for (let i7 = 0;i7 < shareFiles.length; i7 += batchSize) { const end4 = Math.min(i7 + batchSize, shareFiles.length); @@ -433136,12 +433491,12 @@ var JsonMigration; init_filesystem(); init_error2(); await init_global(); -import path76 from "path"; +import path77 from "path"; import { EOL } from "os"; var scriptPath = process.argv[1] || import.meta.path; var runtimeDir = dirname15(scriptPath); var envFile = pathJoin(runtimeDir, ".env_vars"); -if (existsSync11(envFile)) { +if (existsSync12(envFile)) { try { const content = readFileSync10(envFile, "utf8"); for (const line2 of content.split(` @@ -433189,7 +433544,7 @@ if (!process.env.XDG_CONFIG_HOME) process.env.XDG_CONFIG_HOME = pathJoin(homeDir, ".config"); if (!process.env.SSL_CERT_FILE) { const caBundlePath = pathJoin(runtimeDir, "ca-certificates.crt"); - if (existsSync11(caBundlePath)) { + if (existsSync12(caBundlePath)) { process.env.SSL_CERT_FILE = caBundlePath; process.env.NODE_EXTRA_CA_CERTS = caBundlePath; } else { @@ -433220,7 +433575,7 @@ if (!process.env.SSL_CERT_FILE) { } } } -if (!existsSync11("/etc/resolv.conf")) { +if (!existsSync12("/etc/resolv.conf")) { const servers = ["8.8.8.8", "8.8.4.4", "1.1.1.1"]; try { dns.setServers(servers); @@ -433259,7 +433614,7 @@ process.on("uncaughtException", (e4) => { Log.Default.error("exception", { e: errorMessage(e4) }); }); var args3 = hideBin(process.argv); -var cli = yargs_default(args3).scriptName("opencode").wrap(100).help("help").version(Installation.VERSION).option("print-logs", { describe: "print logs to stderr", type: "boolean" }).option("log-level", { describe: "log level", type: "string", choices: ["DEBUG", "INFO", "WARN", "ERROR"] }).middleware(async (opts) => { +var cli = yargs_default(args3).scriptName("unifia").wrap(100).help("help").version(Installation.VERSION).option("print-logs", { describe: "print logs to stderr", type: "boolean" }).option("log-level", { describe: "log level", type: "string", choices: ["DEBUG", "INFO", "WARN", "ERROR"] }).middleware(async (opts) => { await Log.init({ print: process.argv.includes("--print-logs"), dev: false, @@ -433267,12 +433622,12 @@ var cli = yargs_default(args3).scriptName("opencode").wrap(100).help("help").ver }); process.env.AGENT = "1"; process.env.OPENCODE = "1"; - process.env.OPENCODE_CLIENT = process.env.OPENCODE_CLIENT ?? "mobile-embedded"; - Log.Default.info("opencode-mobile", { + process.env.UNIFIA_CLIENT = process.env.UNIFIA_CLIENT ?? "mobile-embedded"; + Log.Default.info("unifia-mobile", { version: Installation.VERSION, args: process.argv.slice(2) }); - const marker25 = path76.join(Global.Path.data, "opencode.db"); + const marker25 = path77.join(Global.Path.data, DATABASE_FILE); if (!await Filesystem.exists(marker25)) { process.stderr.write("Performing database migration..." + EOL); await JsonMigration.run(Database.Client().$client, {}); diff --git a/packages/mobile/src-tauri/gen/schemas/acl-manifests.json b/packages/mobile/src-tauri/gen/schemas/acl-manifests.json index a657b9fa8b82..c4e2953062b4 100644 --- a/packages/mobile/src-tauri/gen/schemas/acl-manifests.json +++ b/packages/mobile/src-tauri/gen/schemas/acl-manifests.json @@ -1 +1 @@ -{"clipboard-manager":{"default_permission":{"identifier":"default","description":"No features are enabled by default, as we believe\nthe clipboard can be inherently dangerous and it is \napplication specific if read and/or write access is needed.\n\nClipboard interaction needs to be explicitly enabled.\n","permissions":[]},"permissions":{"allow-clear":{"identifier":"allow-clear","description":"Enables the clear command without any pre-configured scope.","commands":{"allow":["clear"],"deny":[]}},"allow-read-image":{"identifier":"allow-read-image","description":"Enables the read_image command without any pre-configured scope.","commands":{"allow":["read_image"],"deny":[]}},"allow-read-text":{"identifier":"allow-read-text","description":"Enables the read_text command without any pre-configured scope.","commands":{"allow":["read_text"],"deny":[]}},"allow-write-html":{"identifier":"allow-write-html","description":"Enables the write_html command without any pre-configured scope.","commands":{"allow":["write_html"],"deny":[]}},"allow-write-image":{"identifier":"allow-write-image","description":"Enables the write_image command without any pre-configured scope.","commands":{"allow":["write_image"],"deny":[]}},"allow-write-text":{"identifier":"allow-write-text","description":"Enables the write_text command without any pre-configured scope.","commands":{"allow":["write_text"],"deny":[]}},"deny-clear":{"identifier":"deny-clear","description":"Denies the clear command without any pre-configured scope.","commands":{"allow":[],"deny":["clear"]}},"deny-read-image":{"identifier":"deny-read-image","description":"Denies the read_image command without any pre-configured scope.","commands":{"allow":[],"deny":["read_image"]}},"deny-read-text":{"identifier":"deny-read-text","description":"Denies the read_text command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text"]}},"deny-write-html":{"identifier":"deny-write-html","description":"Denies the write_html command without any pre-configured scope.","commands":{"allow":[],"deny":["write_html"]}},"deny-write-image":{"identifier":"deny-write-image","description":"Denies the write_image command without any pre-configured scope.","commands":{"allow":[],"deny":["write_image"]}},"deny-write-text":{"identifier":"deny-write-text","description":"Denies the write_text command without any pre-configured scope.","commands":{"allow":[],"deny":["write_text"]}}},"permission_sets":{},"global_scope_schema":null},"core":{"default_permission":{"identifier":"default","description":"Default core plugins set.","permissions":["core:path:default","core:event:default","core:window:default","core:webview:default","core:app:default","core:image:default","core:resources:default","core:menu:default","core:tray:default"]},"permissions":{},"permission_sets":{},"global_scope_schema":null},"core:app":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-version","allow-name","allow-tauri-version","allow-identifier","allow-bundle-type","allow-register-listener","allow-remove-listener"]},"permissions":{"allow-app-hide":{"identifier":"allow-app-hide","description":"Enables the app_hide command without any pre-configured scope.","commands":{"allow":["app_hide"],"deny":[]}},"allow-app-show":{"identifier":"allow-app-show","description":"Enables the app_show command without any pre-configured scope.","commands":{"allow":["app_show"],"deny":[]}},"allow-bundle-type":{"identifier":"allow-bundle-type","description":"Enables the bundle_type command without any pre-configured scope.","commands":{"allow":["bundle_type"],"deny":[]}},"allow-default-window-icon":{"identifier":"allow-default-window-icon","description":"Enables the default_window_icon command without any pre-configured scope.","commands":{"allow":["default_window_icon"],"deny":[]}},"allow-fetch-data-store-identifiers":{"identifier":"allow-fetch-data-store-identifiers","description":"Enables the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":["fetch_data_store_identifiers"],"deny":[]}},"allow-identifier":{"identifier":"allow-identifier","description":"Enables the identifier command without any pre-configured scope.","commands":{"allow":["identifier"],"deny":[]}},"allow-name":{"identifier":"allow-name","description":"Enables the name command without any pre-configured scope.","commands":{"allow":["name"],"deny":[]}},"allow-register-listener":{"identifier":"allow-register-listener","description":"Enables the register_listener command without any pre-configured scope.","commands":{"allow":["register_listener"],"deny":[]}},"allow-remove-data-store":{"identifier":"allow-remove-data-store","description":"Enables the remove_data_store command without any pre-configured scope.","commands":{"allow":["remove_data_store"],"deny":[]}},"allow-remove-listener":{"identifier":"allow-remove-listener","description":"Enables the remove_listener command without any pre-configured scope.","commands":{"allow":["remove_listener"],"deny":[]}},"allow-set-app-theme":{"identifier":"allow-set-app-theme","description":"Enables the set_app_theme command without any pre-configured scope.","commands":{"allow":["set_app_theme"],"deny":[]}},"allow-set-dock-visibility":{"identifier":"allow-set-dock-visibility","description":"Enables the set_dock_visibility command without any pre-configured scope.","commands":{"allow":["set_dock_visibility"],"deny":[]}},"allow-tauri-version":{"identifier":"allow-tauri-version","description":"Enables the tauri_version command without any pre-configured scope.","commands":{"allow":["tauri_version"],"deny":[]}},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]}},"deny-app-hide":{"identifier":"deny-app-hide","description":"Denies the app_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["app_hide"]}},"deny-app-show":{"identifier":"deny-app-show","description":"Denies the app_show command without any pre-configured scope.","commands":{"allow":[],"deny":["app_show"]}},"deny-bundle-type":{"identifier":"deny-bundle-type","description":"Denies the bundle_type command without any pre-configured scope.","commands":{"allow":[],"deny":["bundle_type"]}},"deny-default-window-icon":{"identifier":"deny-default-window-icon","description":"Denies the default_window_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["default_window_icon"]}},"deny-fetch-data-store-identifiers":{"identifier":"deny-fetch-data-store-identifiers","description":"Denies the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_data_store_identifiers"]}},"deny-identifier":{"identifier":"deny-identifier","description":"Denies the identifier command without any pre-configured scope.","commands":{"allow":[],"deny":["identifier"]}},"deny-name":{"identifier":"deny-name","description":"Denies the name command without any pre-configured scope.","commands":{"allow":[],"deny":["name"]}},"deny-register-listener":{"identifier":"deny-register-listener","description":"Denies the register_listener command without any pre-configured scope.","commands":{"allow":[],"deny":["register_listener"]}},"deny-remove-data-store":{"identifier":"deny-remove-data-store","description":"Denies the remove_data_store command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_data_store"]}},"deny-remove-listener":{"identifier":"deny-remove-listener","description":"Denies the remove_listener command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_listener"]}},"deny-set-app-theme":{"identifier":"deny-set-app-theme","description":"Denies the set_app_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_app_theme"]}},"deny-set-dock-visibility":{"identifier":"deny-set-dock-visibility","description":"Denies the set_dock_visibility command without any pre-configured scope.","commands":{"allow":[],"deny":["set_dock_visibility"]}},"deny-tauri-version":{"identifier":"deny-tauri-version","description":"Denies the tauri_version command without any pre-configured scope.","commands":{"allow":[],"deny":["tauri_version"]}},"deny-version":{"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]}}},"permission_sets":{},"global_scope_schema":null},"core:event":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-listen","allow-unlisten","allow-emit","allow-emit-to"]},"permissions":{"allow-emit":{"identifier":"allow-emit","description":"Enables the emit command without any pre-configured scope.","commands":{"allow":["emit"],"deny":[]}},"allow-emit-to":{"identifier":"allow-emit-to","description":"Enables the emit_to command without any pre-configured scope.","commands":{"allow":["emit_to"],"deny":[]}},"allow-listen":{"identifier":"allow-listen","description":"Enables the listen command without any pre-configured scope.","commands":{"allow":["listen"],"deny":[]}},"allow-unlisten":{"identifier":"allow-unlisten","description":"Enables the unlisten command without any pre-configured scope.","commands":{"allow":["unlisten"],"deny":[]}},"deny-emit":{"identifier":"deny-emit","description":"Denies the emit command without any pre-configured scope.","commands":{"allow":[],"deny":["emit"]}},"deny-emit-to":{"identifier":"deny-emit-to","description":"Denies the emit_to command without any pre-configured scope.","commands":{"allow":[],"deny":["emit_to"]}},"deny-listen":{"identifier":"deny-listen","description":"Denies the listen command without any pre-configured scope.","commands":{"allow":[],"deny":["listen"]}},"deny-unlisten":{"identifier":"deny-unlisten","description":"Denies the unlisten command without any pre-configured scope.","commands":{"allow":[],"deny":["unlisten"]}}},"permission_sets":{},"global_scope_schema":null},"core:image":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-from-bytes","allow-from-path","allow-rgba","allow-size"]},"permissions":{"allow-from-bytes":{"identifier":"allow-from-bytes","description":"Enables the from_bytes command without any pre-configured scope.","commands":{"allow":["from_bytes"],"deny":[]}},"allow-from-path":{"identifier":"allow-from-path","description":"Enables the from_path command without any pre-configured scope.","commands":{"allow":["from_path"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-rgba":{"identifier":"allow-rgba","description":"Enables the rgba command without any pre-configured scope.","commands":{"allow":["rgba"],"deny":[]}},"allow-size":{"identifier":"allow-size","description":"Enables the size command without any pre-configured scope.","commands":{"allow":["size"],"deny":[]}},"deny-from-bytes":{"identifier":"deny-from-bytes","description":"Denies the from_bytes command without any pre-configured scope.","commands":{"allow":[],"deny":["from_bytes"]}},"deny-from-path":{"identifier":"deny-from-path","description":"Denies the from_path command without any pre-configured scope.","commands":{"allow":[],"deny":["from_path"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-rgba":{"identifier":"deny-rgba","description":"Denies the rgba command without any pre-configured scope.","commands":{"allow":[],"deny":["rgba"]}},"deny-size":{"identifier":"deny-size","description":"Denies the size command without any pre-configured scope.","commands":{"allow":[],"deny":["size"]}}},"permission_sets":{},"global_scope_schema":null},"core:menu":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-append","allow-prepend","allow-insert","allow-remove","allow-remove-at","allow-items","allow-get","allow-popup","allow-create-default","allow-set-as-app-menu","allow-set-as-window-menu","allow-text","allow-set-text","allow-is-enabled","allow-set-enabled","allow-set-accelerator","allow-set-as-windows-menu-for-nsapp","allow-set-as-help-menu-for-nsapp","allow-is-checked","allow-set-checked","allow-set-icon"]},"permissions":{"allow-append":{"identifier":"allow-append","description":"Enables the append command without any pre-configured scope.","commands":{"allow":["append"],"deny":[]}},"allow-create-default":{"identifier":"allow-create-default","description":"Enables the create_default command without any pre-configured scope.","commands":{"allow":["create_default"],"deny":[]}},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]}},"allow-insert":{"identifier":"allow-insert","description":"Enables the insert command without any pre-configured scope.","commands":{"allow":["insert"],"deny":[]}},"allow-is-checked":{"identifier":"allow-is-checked","description":"Enables the is_checked command without any pre-configured scope.","commands":{"allow":["is_checked"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-items":{"identifier":"allow-items","description":"Enables the items command without any pre-configured scope.","commands":{"allow":["items"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-popup":{"identifier":"allow-popup","description":"Enables the popup command without any pre-configured scope.","commands":{"allow":["popup"],"deny":[]}},"allow-prepend":{"identifier":"allow-prepend","description":"Enables the prepend command without any pre-configured scope.","commands":{"allow":["prepend"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-remove-at":{"identifier":"allow-remove-at","description":"Enables the remove_at command without any pre-configured scope.","commands":{"allow":["remove_at"],"deny":[]}},"allow-set-accelerator":{"identifier":"allow-set-accelerator","description":"Enables the set_accelerator command without any pre-configured scope.","commands":{"allow":["set_accelerator"],"deny":[]}},"allow-set-as-app-menu":{"identifier":"allow-set-as-app-menu","description":"Enables the set_as_app_menu command without any pre-configured scope.","commands":{"allow":["set_as_app_menu"],"deny":[]}},"allow-set-as-help-menu-for-nsapp":{"identifier":"allow-set-as-help-menu-for-nsapp","description":"Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_help_menu_for_nsapp"],"deny":[]}},"allow-set-as-window-menu":{"identifier":"allow-set-as-window-menu","description":"Enables the set_as_window_menu command without any pre-configured scope.","commands":{"allow":["set_as_window_menu"],"deny":[]}},"allow-set-as-windows-menu-for-nsapp":{"identifier":"allow-set-as-windows-menu-for-nsapp","description":"Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_windows_menu_for_nsapp"],"deny":[]}},"allow-set-checked":{"identifier":"allow-set-checked","description":"Enables the set_checked command without any pre-configured scope.","commands":{"allow":["set_checked"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-text":{"identifier":"allow-set-text","description":"Enables the set_text command without any pre-configured scope.","commands":{"allow":["set_text"],"deny":[]}},"allow-text":{"identifier":"allow-text","description":"Enables the text command without any pre-configured scope.","commands":{"allow":["text"],"deny":[]}},"deny-append":{"identifier":"deny-append","description":"Denies the append command without any pre-configured scope.","commands":{"allow":[],"deny":["append"]}},"deny-create-default":{"identifier":"deny-create-default","description":"Denies the create_default command without any pre-configured scope.","commands":{"allow":[],"deny":["create_default"]}},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]}},"deny-insert":{"identifier":"deny-insert","description":"Denies the insert command without any pre-configured scope.","commands":{"allow":[],"deny":["insert"]}},"deny-is-checked":{"identifier":"deny-is-checked","description":"Denies the is_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["is_checked"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-items":{"identifier":"deny-items","description":"Denies the items command without any pre-configured scope.","commands":{"allow":[],"deny":["items"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-popup":{"identifier":"deny-popup","description":"Denies the popup command without any pre-configured scope.","commands":{"allow":[],"deny":["popup"]}},"deny-prepend":{"identifier":"deny-prepend","description":"Denies the prepend command without any pre-configured scope.","commands":{"allow":[],"deny":["prepend"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-remove-at":{"identifier":"deny-remove-at","description":"Denies the remove_at command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_at"]}},"deny-set-accelerator":{"identifier":"deny-set-accelerator","description":"Denies the set_accelerator command without any pre-configured scope.","commands":{"allow":[],"deny":["set_accelerator"]}},"deny-set-as-app-menu":{"identifier":"deny-set-as-app-menu","description":"Denies the set_as_app_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_app_menu"]}},"deny-set-as-help-menu-for-nsapp":{"identifier":"deny-set-as-help-menu-for-nsapp","description":"Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_help_menu_for_nsapp"]}},"deny-set-as-window-menu":{"identifier":"deny-set-as-window-menu","description":"Denies the set_as_window_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_window_menu"]}},"deny-set-as-windows-menu-for-nsapp":{"identifier":"deny-set-as-windows-menu-for-nsapp","description":"Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_windows_menu_for_nsapp"]}},"deny-set-checked":{"identifier":"deny-set-checked","description":"Denies the set_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["set_checked"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-text":{"identifier":"deny-set-text","description":"Denies the set_text command without any pre-configured scope.","commands":{"allow":[],"deny":["set_text"]}},"deny-text":{"identifier":"deny-text","description":"Denies the text command without any pre-configured scope.","commands":{"allow":[],"deny":["text"]}}},"permission_sets":{},"global_scope_schema":null},"core:path":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-resolve-directory","allow-resolve","allow-normalize","allow-join","allow-dirname","allow-extname","allow-basename","allow-is-absolute"]},"permissions":{"allow-basename":{"identifier":"allow-basename","description":"Enables the basename command without any pre-configured scope.","commands":{"allow":["basename"],"deny":[]}},"allow-dirname":{"identifier":"allow-dirname","description":"Enables the dirname command without any pre-configured scope.","commands":{"allow":["dirname"],"deny":[]}},"allow-extname":{"identifier":"allow-extname","description":"Enables the extname command without any pre-configured scope.","commands":{"allow":["extname"],"deny":[]}},"allow-is-absolute":{"identifier":"allow-is-absolute","description":"Enables the is_absolute command without any pre-configured scope.","commands":{"allow":["is_absolute"],"deny":[]}},"allow-join":{"identifier":"allow-join","description":"Enables the join command without any pre-configured scope.","commands":{"allow":["join"],"deny":[]}},"allow-normalize":{"identifier":"allow-normalize","description":"Enables the normalize command without any pre-configured scope.","commands":{"allow":["normalize"],"deny":[]}},"allow-resolve":{"identifier":"allow-resolve","description":"Enables the resolve command without any pre-configured scope.","commands":{"allow":["resolve"],"deny":[]}},"allow-resolve-directory":{"identifier":"allow-resolve-directory","description":"Enables the resolve_directory command without any pre-configured scope.","commands":{"allow":["resolve_directory"],"deny":[]}},"deny-basename":{"identifier":"deny-basename","description":"Denies the basename command without any pre-configured scope.","commands":{"allow":[],"deny":["basename"]}},"deny-dirname":{"identifier":"deny-dirname","description":"Denies the dirname command without any pre-configured scope.","commands":{"allow":[],"deny":["dirname"]}},"deny-extname":{"identifier":"deny-extname","description":"Denies the extname command without any pre-configured scope.","commands":{"allow":[],"deny":["extname"]}},"deny-is-absolute":{"identifier":"deny-is-absolute","description":"Denies the is_absolute command without any pre-configured scope.","commands":{"allow":[],"deny":["is_absolute"]}},"deny-join":{"identifier":"deny-join","description":"Denies the join command without any pre-configured scope.","commands":{"allow":[],"deny":["join"]}},"deny-normalize":{"identifier":"deny-normalize","description":"Denies the normalize command without any pre-configured scope.","commands":{"allow":[],"deny":["normalize"]}},"deny-resolve":{"identifier":"deny-resolve","description":"Denies the resolve command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve"]}},"deny-resolve-directory":{"identifier":"deny-resolve-directory","description":"Denies the resolve_directory command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve_directory"]}}},"permission_sets":{},"global_scope_schema":null},"core:resources":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-close"]},"permissions":{"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}}},"permission_sets":{},"global_scope_schema":null},"core:tray":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-get-by-id","allow-remove-by-id","allow-set-icon","allow-set-menu","allow-set-tooltip","allow-set-title","allow-set-visible","allow-set-temp-dir-path","allow-set-icon-as-template","allow-set-show-menu-on-left-click"]},"permissions":{"allow-get-by-id":{"identifier":"allow-get-by-id","description":"Enables the get_by_id command without any pre-configured scope.","commands":{"allow":["get_by_id"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-remove-by-id":{"identifier":"allow-remove-by-id","description":"Enables the remove_by_id command without any pre-configured scope.","commands":{"allow":["remove_by_id"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-icon-as-template":{"identifier":"allow-set-icon-as-template","description":"Enables the set_icon_as_template command without any pre-configured scope.","commands":{"allow":["set_icon_as_template"],"deny":[]}},"allow-set-menu":{"identifier":"allow-set-menu","description":"Enables the set_menu command without any pre-configured scope.","commands":{"allow":["set_menu"],"deny":[]}},"allow-set-show-menu-on-left-click":{"identifier":"allow-set-show-menu-on-left-click","description":"Enables the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":["set_show_menu_on_left_click"],"deny":[]}},"allow-set-temp-dir-path":{"identifier":"allow-set-temp-dir-path","description":"Enables the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":["set_temp_dir_path"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-tooltip":{"identifier":"allow-set-tooltip","description":"Enables the set_tooltip command without any pre-configured scope.","commands":{"allow":["set_tooltip"],"deny":[]}},"allow-set-visible":{"identifier":"allow-set-visible","description":"Enables the set_visible command without any pre-configured scope.","commands":{"allow":["set_visible"],"deny":[]}},"deny-get-by-id":{"identifier":"deny-get-by-id","description":"Denies the get_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["get_by_id"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-remove-by-id":{"identifier":"deny-remove-by-id","description":"Denies the remove_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_by_id"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-icon-as-template":{"identifier":"deny-set-icon-as-template","description":"Denies the set_icon_as_template command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon_as_template"]}},"deny-set-menu":{"identifier":"deny-set-menu","description":"Denies the set_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_menu"]}},"deny-set-show-menu-on-left-click":{"identifier":"deny-set-show-menu-on-left-click","description":"Denies the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":[],"deny":["set_show_menu_on_left_click"]}},"deny-set-temp-dir-path":{"identifier":"deny-set-temp-dir-path","description":"Denies the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":[],"deny":["set_temp_dir_path"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-tooltip":{"identifier":"deny-set-tooltip","description":"Denies the set_tooltip command without any pre-configured scope.","commands":{"allow":[],"deny":["set_tooltip"]}},"deny-set-visible":{"identifier":"deny-set-visible","description":"Denies the set_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible"]}}},"permission_sets":{},"global_scope_schema":null},"core:webview":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-webviews","allow-webview-position","allow-webview-size","allow-internal-toggle-devtools"]},"permissions":{"allow-clear-all-browsing-data":{"identifier":"allow-clear-all-browsing-data","description":"Enables the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":["clear_all_browsing_data"],"deny":[]}},"allow-create-webview":{"identifier":"allow-create-webview","description":"Enables the create_webview command without any pre-configured scope.","commands":{"allow":["create_webview"],"deny":[]}},"allow-create-webview-window":{"identifier":"allow-create-webview-window","description":"Enables the create_webview_window command without any pre-configured scope.","commands":{"allow":["create_webview_window"],"deny":[]}},"allow-get-all-webviews":{"identifier":"allow-get-all-webviews","description":"Enables the get_all_webviews command without any pre-configured scope.","commands":{"allow":["get_all_webviews"],"deny":[]}},"allow-internal-toggle-devtools":{"identifier":"allow-internal-toggle-devtools","description":"Enables the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":["internal_toggle_devtools"],"deny":[]}},"allow-print":{"identifier":"allow-print","description":"Enables the print command without any pre-configured scope.","commands":{"allow":["print"],"deny":[]}},"allow-reparent":{"identifier":"allow-reparent","description":"Enables the reparent command without any pre-configured scope.","commands":{"allow":["reparent"],"deny":[]}},"allow-set-webview-auto-resize":{"identifier":"allow-set-webview-auto-resize","description":"Enables the set_webview_auto_resize command without any pre-configured scope.","commands":{"allow":["set_webview_auto_resize"],"deny":[]}},"allow-set-webview-background-color":{"identifier":"allow-set-webview-background-color","description":"Enables the set_webview_background_color command without any pre-configured scope.","commands":{"allow":["set_webview_background_color"],"deny":[]}},"allow-set-webview-focus":{"identifier":"allow-set-webview-focus","description":"Enables the set_webview_focus command without any pre-configured scope.","commands":{"allow":["set_webview_focus"],"deny":[]}},"allow-set-webview-position":{"identifier":"allow-set-webview-position","description":"Enables the set_webview_position command without any pre-configured scope.","commands":{"allow":["set_webview_position"],"deny":[]}},"allow-set-webview-size":{"identifier":"allow-set-webview-size","description":"Enables the set_webview_size command without any pre-configured scope.","commands":{"allow":["set_webview_size"],"deny":[]}},"allow-set-webview-zoom":{"identifier":"allow-set-webview-zoom","description":"Enables the set_webview_zoom command without any pre-configured scope.","commands":{"allow":["set_webview_zoom"],"deny":[]}},"allow-webview-close":{"identifier":"allow-webview-close","description":"Enables the webview_close command without any pre-configured scope.","commands":{"allow":["webview_close"],"deny":[]}},"allow-webview-hide":{"identifier":"allow-webview-hide","description":"Enables the webview_hide command without any pre-configured scope.","commands":{"allow":["webview_hide"],"deny":[]}},"allow-webview-position":{"identifier":"allow-webview-position","description":"Enables the webview_position command without any pre-configured scope.","commands":{"allow":["webview_position"],"deny":[]}},"allow-webview-show":{"identifier":"allow-webview-show","description":"Enables the webview_show command without any pre-configured scope.","commands":{"allow":["webview_show"],"deny":[]}},"allow-webview-size":{"identifier":"allow-webview-size","description":"Enables the webview_size command without any pre-configured scope.","commands":{"allow":["webview_size"],"deny":[]}},"deny-clear-all-browsing-data":{"identifier":"deny-clear-all-browsing-data","description":"Denies the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":[],"deny":["clear_all_browsing_data"]}},"deny-create-webview":{"identifier":"deny-create-webview","description":"Denies the create_webview command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview"]}},"deny-create-webview-window":{"identifier":"deny-create-webview-window","description":"Denies the create_webview_window command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview_window"]}},"deny-get-all-webviews":{"identifier":"deny-get-all-webviews","description":"Denies the get_all_webviews command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_webviews"]}},"deny-internal-toggle-devtools":{"identifier":"deny-internal-toggle-devtools","description":"Denies the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_devtools"]}},"deny-print":{"identifier":"deny-print","description":"Denies the print command without any pre-configured scope.","commands":{"allow":[],"deny":["print"]}},"deny-reparent":{"identifier":"deny-reparent","description":"Denies the reparent command without any pre-configured scope.","commands":{"allow":[],"deny":["reparent"]}},"deny-set-webview-auto-resize":{"identifier":"deny-set-webview-auto-resize","description":"Denies the set_webview_auto_resize command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_auto_resize"]}},"deny-set-webview-background-color":{"identifier":"deny-set-webview-background-color","description":"Denies the set_webview_background_color command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_background_color"]}},"deny-set-webview-focus":{"identifier":"deny-set-webview-focus","description":"Denies the set_webview_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_focus"]}},"deny-set-webview-position":{"identifier":"deny-set-webview-position","description":"Denies the set_webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_position"]}},"deny-set-webview-size":{"identifier":"deny-set-webview-size","description":"Denies the set_webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_size"]}},"deny-set-webview-zoom":{"identifier":"deny-set-webview-zoom","description":"Denies the set_webview_zoom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_zoom"]}},"deny-webview-close":{"identifier":"deny-webview-close","description":"Denies the webview_close command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_close"]}},"deny-webview-hide":{"identifier":"deny-webview-hide","description":"Denies the webview_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_hide"]}},"deny-webview-position":{"identifier":"deny-webview-position","description":"Denies the webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_position"]}},"deny-webview-show":{"identifier":"deny-webview-show","description":"Denies the webview_show command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_show"]}},"deny-webview-size":{"identifier":"deny-webview-size","description":"Denies the webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_size"]}}},"permission_sets":{},"global_scope_schema":null},"core:window":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-windows","allow-scale-factor","allow-inner-position","allow-outer-position","allow-inner-size","allow-outer-size","allow-is-fullscreen","allow-is-minimized","allow-is-maximized","allow-is-focused","allow-is-decorated","allow-is-resizable","allow-is-maximizable","allow-is-minimizable","allow-is-closable","allow-is-visible","allow-is-enabled","allow-title","allow-current-monitor","allow-primary-monitor","allow-monitor-from-point","allow-available-monitors","allow-cursor-position","allow-theme","allow-is-always-on-top","allow-internal-toggle-maximize"]},"permissions":{"allow-available-monitors":{"identifier":"allow-available-monitors","description":"Enables the available_monitors command without any pre-configured scope.","commands":{"allow":["available_monitors"],"deny":[]}},"allow-center":{"identifier":"allow-center","description":"Enables the center command without any pre-configured scope.","commands":{"allow":["center"],"deny":[]}},"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-current-monitor":{"identifier":"allow-current-monitor","description":"Enables the current_monitor command without any pre-configured scope.","commands":{"allow":["current_monitor"],"deny":[]}},"allow-cursor-position":{"identifier":"allow-cursor-position","description":"Enables the cursor_position command without any pre-configured scope.","commands":{"allow":["cursor_position"],"deny":[]}},"allow-destroy":{"identifier":"allow-destroy","description":"Enables the destroy command without any pre-configured scope.","commands":{"allow":["destroy"],"deny":[]}},"allow-get-all-windows":{"identifier":"allow-get-all-windows","description":"Enables the get_all_windows command without any pre-configured scope.","commands":{"allow":["get_all_windows"],"deny":[]}},"allow-hide":{"identifier":"allow-hide","description":"Enables the hide command without any pre-configured scope.","commands":{"allow":["hide"],"deny":[]}},"allow-inner-position":{"identifier":"allow-inner-position","description":"Enables the inner_position command without any pre-configured scope.","commands":{"allow":["inner_position"],"deny":[]}},"allow-inner-size":{"identifier":"allow-inner-size","description":"Enables the inner_size command without any pre-configured scope.","commands":{"allow":["inner_size"],"deny":[]}},"allow-internal-toggle-maximize":{"identifier":"allow-internal-toggle-maximize","description":"Enables the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":["internal_toggle_maximize"],"deny":[]}},"allow-is-always-on-top":{"identifier":"allow-is-always-on-top","description":"Enables the is_always_on_top command without any pre-configured scope.","commands":{"allow":["is_always_on_top"],"deny":[]}},"allow-is-closable":{"identifier":"allow-is-closable","description":"Enables the is_closable command without any pre-configured scope.","commands":{"allow":["is_closable"],"deny":[]}},"allow-is-decorated":{"identifier":"allow-is-decorated","description":"Enables the is_decorated command without any pre-configured scope.","commands":{"allow":["is_decorated"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-is-focused":{"identifier":"allow-is-focused","description":"Enables the is_focused command without any pre-configured scope.","commands":{"allow":["is_focused"],"deny":[]}},"allow-is-fullscreen":{"identifier":"allow-is-fullscreen","description":"Enables the is_fullscreen command without any pre-configured scope.","commands":{"allow":["is_fullscreen"],"deny":[]}},"allow-is-maximizable":{"identifier":"allow-is-maximizable","description":"Enables the is_maximizable command without any pre-configured scope.","commands":{"allow":["is_maximizable"],"deny":[]}},"allow-is-maximized":{"identifier":"allow-is-maximized","description":"Enables the is_maximized command without any pre-configured scope.","commands":{"allow":["is_maximized"],"deny":[]}},"allow-is-minimizable":{"identifier":"allow-is-minimizable","description":"Enables the is_minimizable command without any pre-configured scope.","commands":{"allow":["is_minimizable"],"deny":[]}},"allow-is-minimized":{"identifier":"allow-is-minimized","description":"Enables the is_minimized command without any pre-configured scope.","commands":{"allow":["is_minimized"],"deny":[]}},"allow-is-resizable":{"identifier":"allow-is-resizable","description":"Enables the is_resizable command without any pre-configured scope.","commands":{"allow":["is_resizable"],"deny":[]}},"allow-is-visible":{"identifier":"allow-is-visible","description":"Enables the is_visible command without any pre-configured scope.","commands":{"allow":["is_visible"],"deny":[]}},"allow-maximize":{"identifier":"allow-maximize","description":"Enables the maximize command without any pre-configured scope.","commands":{"allow":["maximize"],"deny":[]}},"allow-minimize":{"identifier":"allow-minimize","description":"Enables the minimize command without any pre-configured scope.","commands":{"allow":["minimize"],"deny":[]}},"allow-monitor-from-point":{"identifier":"allow-monitor-from-point","description":"Enables the monitor_from_point command without any pre-configured scope.","commands":{"allow":["monitor_from_point"],"deny":[]}},"allow-outer-position":{"identifier":"allow-outer-position","description":"Enables the outer_position command without any pre-configured scope.","commands":{"allow":["outer_position"],"deny":[]}},"allow-outer-size":{"identifier":"allow-outer-size","description":"Enables the outer_size command without any pre-configured scope.","commands":{"allow":["outer_size"],"deny":[]}},"allow-primary-monitor":{"identifier":"allow-primary-monitor","description":"Enables the primary_monitor command without any pre-configured scope.","commands":{"allow":["primary_monitor"],"deny":[]}},"allow-request-user-attention":{"identifier":"allow-request-user-attention","description":"Enables the request_user_attention command without any pre-configured scope.","commands":{"allow":["request_user_attention"],"deny":[]}},"allow-scale-factor":{"identifier":"allow-scale-factor","description":"Enables the scale_factor command without any pre-configured scope.","commands":{"allow":["scale_factor"],"deny":[]}},"allow-set-always-on-bottom":{"identifier":"allow-set-always-on-bottom","description":"Enables the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":["set_always_on_bottom"],"deny":[]}},"allow-set-always-on-top":{"identifier":"allow-set-always-on-top","description":"Enables the set_always_on_top command without any pre-configured scope.","commands":{"allow":["set_always_on_top"],"deny":[]}},"allow-set-background-color":{"identifier":"allow-set-background-color","description":"Enables the set_background_color command without any pre-configured scope.","commands":{"allow":["set_background_color"],"deny":[]}},"allow-set-badge-count":{"identifier":"allow-set-badge-count","description":"Enables the set_badge_count command without any pre-configured scope.","commands":{"allow":["set_badge_count"],"deny":[]}},"allow-set-badge-label":{"identifier":"allow-set-badge-label","description":"Enables the set_badge_label command without any pre-configured scope.","commands":{"allow":["set_badge_label"],"deny":[]}},"allow-set-closable":{"identifier":"allow-set-closable","description":"Enables the set_closable command without any pre-configured scope.","commands":{"allow":["set_closable"],"deny":[]}},"allow-set-content-protected":{"identifier":"allow-set-content-protected","description":"Enables the set_content_protected command without any pre-configured scope.","commands":{"allow":["set_content_protected"],"deny":[]}},"allow-set-cursor-grab":{"identifier":"allow-set-cursor-grab","description":"Enables the set_cursor_grab command without any pre-configured scope.","commands":{"allow":["set_cursor_grab"],"deny":[]}},"allow-set-cursor-icon":{"identifier":"allow-set-cursor-icon","description":"Enables the set_cursor_icon command without any pre-configured scope.","commands":{"allow":["set_cursor_icon"],"deny":[]}},"allow-set-cursor-position":{"identifier":"allow-set-cursor-position","description":"Enables the set_cursor_position command without any pre-configured scope.","commands":{"allow":["set_cursor_position"],"deny":[]}},"allow-set-cursor-visible":{"identifier":"allow-set-cursor-visible","description":"Enables the set_cursor_visible command without any pre-configured scope.","commands":{"allow":["set_cursor_visible"],"deny":[]}},"allow-set-decorations":{"identifier":"allow-set-decorations","description":"Enables the set_decorations command without any pre-configured scope.","commands":{"allow":["set_decorations"],"deny":[]}},"allow-set-effects":{"identifier":"allow-set-effects","description":"Enables the set_effects command without any pre-configured scope.","commands":{"allow":["set_effects"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-focus":{"identifier":"allow-set-focus","description":"Enables the set_focus command without any pre-configured scope.","commands":{"allow":["set_focus"],"deny":[]}},"allow-set-focusable":{"identifier":"allow-set-focusable","description":"Enables the set_focusable command without any pre-configured scope.","commands":{"allow":["set_focusable"],"deny":[]}},"allow-set-fullscreen":{"identifier":"allow-set-fullscreen","description":"Enables the set_fullscreen command without any pre-configured scope.","commands":{"allow":["set_fullscreen"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-ignore-cursor-events":{"identifier":"allow-set-ignore-cursor-events","description":"Enables the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":["set_ignore_cursor_events"],"deny":[]}},"allow-set-max-size":{"identifier":"allow-set-max-size","description":"Enables the set_max_size command without any pre-configured scope.","commands":{"allow":["set_max_size"],"deny":[]}},"allow-set-maximizable":{"identifier":"allow-set-maximizable","description":"Enables the set_maximizable command without any pre-configured scope.","commands":{"allow":["set_maximizable"],"deny":[]}},"allow-set-min-size":{"identifier":"allow-set-min-size","description":"Enables the set_min_size command without any pre-configured scope.","commands":{"allow":["set_min_size"],"deny":[]}},"allow-set-minimizable":{"identifier":"allow-set-minimizable","description":"Enables the set_minimizable command without any pre-configured scope.","commands":{"allow":["set_minimizable"],"deny":[]}},"allow-set-overlay-icon":{"identifier":"allow-set-overlay-icon","description":"Enables the set_overlay_icon command without any pre-configured scope.","commands":{"allow":["set_overlay_icon"],"deny":[]}},"allow-set-position":{"identifier":"allow-set-position","description":"Enables the set_position command without any pre-configured scope.","commands":{"allow":["set_position"],"deny":[]}},"allow-set-progress-bar":{"identifier":"allow-set-progress-bar","description":"Enables the set_progress_bar command without any pre-configured scope.","commands":{"allow":["set_progress_bar"],"deny":[]}},"allow-set-resizable":{"identifier":"allow-set-resizable","description":"Enables the set_resizable command without any pre-configured scope.","commands":{"allow":["set_resizable"],"deny":[]}},"allow-set-shadow":{"identifier":"allow-set-shadow","description":"Enables the set_shadow command without any pre-configured scope.","commands":{"allow":["set_shadow"],"deny":[]}},"allow-set-simple-fullscreen":{"identifier":"allow-set-simple-fullscreen","description":"Enables the set_simple_fullscreen command without any pre-configured scope.","commands":{"allow":["set_simple_fullscreen"],"deny":[]}},"allow-set-size":{"identifier":"allow-set-size","description":"Enables the set_size command without any pre-configured scope.","commands":{"allow":["set_size"],"deny":[]}},"allow-set-size-constraints":{"identifier":"allow-set-size-constraints","description":"Enables the set_size_constraints command without any pre-configured scope.","commands":{"allow":["set_size_constraints"],"deny":[]}},"allow-set-skip-taskbar":{"identifier":"allow-set-skip-taskbar","description":"Enables the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":["set_skip_taskbar"],"deny":[]}},"allow-set-theme":{"identifier":"allow-set-theme","description":"Enables the set_theme command without any pre-configured scope.","commands":{"allow":["set_theme"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-title-bar-style":{"identifier":"allow-set-title-bar-style","description":"Enables the set_title_bar_style command without any pre-configured scope.","commands":{"allow":["set_title_bar_style"],"deny":[]}},"allow-set-visible-on-all-workspaces":{"identifier":"allow-set-visible-on-all-workspaces","description":"Enables the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":["set_visible_on_all_workspaces"],"deny":[]}},"allow-show":{"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]}},"allow-start-dragging":{"identifier":"allow-start-dragging","description":"Enables the start_dragging command without any pre-configured scope.","commands":{"allow":["start_dragging"],"deny":[]}},"allow-start-resize-dragging":{"identifier":"allow-start-resize-dragging","description":"Enables the start_resize_dragging command without any pre-configured scope.","commands":{"allow":["start_resize_dragging"],"deny":[]}},"allow-theme":{"identifier":"allow-theme","description":"Enables the theme command without any pre-configured scope.","commands":{"allow":["theme"],"deny":[]}},"allow-title":{"identifier":"allow-title","description":"Enables the title command without any pre-configured scope.","commands":{"allow":["title"],"deny":[]}},"allow-toggle-maximize":{"identifier":"allow-toggle-maximize","description":"Enables the toggle_maximize command without any pre-configured scope.","commands":{"allow":["toggle_maximize"],"deny":[]}},"allow-unmaximize":{"identifier":"allow-unmaximize","description":"Enables the unmaximize command without any pre-configured scope.","commands":{"allow":["unmaximize"],"deny":[]}},"allow-unminimize":{"identifier":"allow-unminimize","description":"Enables the unminimize command without any pre-configured scope.","commands":{"allow":["unminimize"],"deny":[]}},"deny-available-monitors":{"identifier":"deny-available-monitors","description":"Denies the available_monitors command without any pre-configured scope.","commands":{"allow":[],"deny":["available_monitors"]}},"deny-center":{"identifier":"deny-center","description":"Denies the center command without any pre-configured scope.","commands":{"allow":[],"deny":["center"]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-current-monitor":{"identifier":"deny-current-monitor","description":"Denies the current_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["current_monitor"]}},"deny-cursor-position":{"identifier":"deny-cursor-position","description":"Denies the cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["cursor_position"]}},"deny-destroy":{"identifier":"deny-destroy","description":"Denies the destroy command without any pre-configured scope.","commands":{"allow":[],"deny":["destroy"]}},"deny-get-all-windows":{"identifier":"deny-get-all-windows","description":"Denies the get_all_windows command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_windows"]}},"deny-hide":{"identifier":"deny-hide","description":"Denies the hide command without any pre-configured scope.","commands":{"allow":[],"deny":["hide"]}},"deny-inner-position":{"identifier":"deny-inner-position","description":"Denies the inner_position command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_position"]}},"deny-inner-size":{"identifier":"deny-inner-size","description":"Denies the inner_size command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_size"]}},"deny-internal-toggle-maximize":{"identifier":"deny-internal-toggle-maximize","description":"Denies the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_maximize"]}},"deny-is-always-on-top":{"identifier":"deny-is-always-on-top","description":"Denies the is_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["is_always_on_top"]}},"deny-is-closable":{"identifier":"deny-is-closable","description":"Denies the is_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_closable"]}},"deny-is-decorated":{"identifier":"deny-is-decorated","description":"Denies the is_decorated command without any pre-configured scope.","commands":{"allow":[],"deny":["is_decorated"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-is-focused":{"identifier":"deny-is-focused","description":"Denies the is_focused command without any pre-configured scope.","commands":{"allow":[],"deny":["is_focused"]}},"deny-is-fullscreen":{"identifier":"deny-is-fullscreen","description":"Denies the is_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["is_fullscreen"]}},"deny-is-maximizable":{"identifier":"deny-is-maximizable","description":"Denies the is_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximizable"]}},"deny-is-maximized":{"identifier":"deny-is-maximized","description":"Denies the is_maximized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximized"]}},"deny-is-minimizable":{"identifier":"deny-is-minimizable","description":"Denies the is_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimizable"]}},"deny-is-minimized":{"identifier":"deny-is-minimized","description":"Denies the is_minimized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimized"]}},"deny-is-resizable":{"identifier":"deny-is-resizable","description":"Denies the is_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_resizable"]}},"deny-is-visible":{"identifier":"deny-is-visible","description":"Denies the is_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["is_visible"]}},"deny-maximize":{"identifier":"deny-maximize","description":"Denies the maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["maximize"]}},"deny-minimize":{"identifier":"deny-minimize","description":"Denies the minimize command without any pre-configured scope.","commands":{"allow":[],"deny":["minimize"]}},"deny-monitor-from-point":{"identifier":"deny-monitor-from-point","description":"Denies the monitor_from_point command without any pre-configured scope.","commands":{"allow":[],"deny":["monitor_from_point"]}},"deny-outer-position":{"identifier":"deny-outer-position","description":"Denies the outer_position command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_position"]}},"deny-outer-size":{"identifier":"deny-outer-size","description":"Denies the outer_size command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_size"]}},"deny-primary-monitor":{"identifier":"deny-primary-monitor","description":"Denies the primary_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["primary_monitor"]}},"deny-request-user-attention":{"identifier":"deny-request-user-attention","description":"Denies the request_user_attention command without any pre-configured scope.","commands":{"allow":[],"deny":["request_user_attention"]}},"deny-scale-factor":{"identifier":"deny-scale-factor","description":"Denies the scale_factor command without any pre-configured scope.","commands":{"allow":[],"deny":["scale_factor"]}},"deny-set-always-on-bottom":{"identifier":"deny-set-always-on-bottom","description":"Denies the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_bottom"]}},"deny-set-always-on-top":{"identifier":"deny-set-always-on-top","description":"Denies the set_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_top"]}},"deny-set-background-color":{"identifier":"deny-set-background-color","description":"Denies the set_background_color command without any pre-configured scope.","commands":{"allow":[],"deny":["set_background_color"]}},"deny-set-badge-count":{"identifier":"deny-set-badge-count","description":"Denies the set_badge_count command without any pre-configured scope.","commands":{"allow":[],"deny":["set_badge_count"]}},"deny-set-badge-label":{"identifier":"deny-set-badge-label","description":"Denies the set_badge_label command without any pre-configured scope.","commands":{"allow":[],"deny":["set_badge_label"]}},"deny-set-closable":{"identifier":"deny-set-closable","description":"Denies the set_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_closable"]}},"deny-set-content-protected":{"identifier":"deny-set-content-protected","description":"Denies the set_content_protected command without any pre-configured scope.","commands":{"allow":[],"deny":["set_content_protected"]}},"deny-set-cursor-grab":{"identifier":"deny-set-cursor-grab","description":"Denies the set_cursor_grab command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_grab"]}},"deny-set-cursor-icon":{"identifier":"deny-set-cursor-icon","description":"Denies the set_cursor_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_icon"]}},"deny-set-cursor-position":{"identifier":"deny-set-cursor-position","description":"Denies the set_cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_position"]}},"deny-set-cursor-visible":{"identifier":"deny-set-cursor-visible","description":"Denies the set_cursor_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_visible"]}},"deny-set-decorations":{"identifier":"deny-set-decorations","description":"Denies the set_decorations command without any pre-configured scope.","commands":{"allow":[],"deny":["set_decorations"]}},"deny-set-effects":{"identifier":"deny-set-effects","description":"Denies the set_effects command without any pre-configured scope.","commands":{"allow":[],"deny":["set_effects"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-focus":{"identifier":"deny-set-focus","description":"Denies the set_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focus"]}},"deny-set-focusable":{"identifier":"deny-set-focusable","description":"Denies the set_focusable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focusable"]}},"deny-set-fullscreen":{"identifier":"deny-set-fullscreen","description":"Denies the set_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_fullscreen"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-ignore-cursor-events":{"identifier":"deny-set-ignore-cursor-events","description":"Denies the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":[],"deny":["set_ignore_cursor_events"]}},"deny-set-max-size":{"identifier":"deny-set-max-size","description":"Denies the set_max_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_max_size"]}},"deny-set-maximizable":{"identifier":"deny-set-maximizable","description":"Denies the set_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_maximizable"]}},"deny-set-min-size":{"identifier":"deny-set-min-size","description":"Denies the set_min_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_min_size"]}},"deny-set-minimizable":{"identifier":"deny-set-minimizable","description":"Denies the set_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_minimizable"]}},"deny-set-overlay-icon":{"identifier":"deny-set-overlay-icon","description":"Denies the set_overlay_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_overlay_icon"]}},"deny-set-position":{"identifier":"deny-set-position","description":"Denies the set_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_position"]}},"deny-set-progress-bar":{"identifier":"deny-set-progress-bar","description":"Denies the set_progress_bar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_progress_bar"]}},"deny-set-resizable":{"identifier":"deny-set-resizable","description":"Denies the set_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_resizable"]}},"deny-set-shadow":{"identifier":"deny-set-shadow","description":"Denies the set_shadow command without any pre-configured scope.","commands":{"allow":[],"deny":["set_shadow"]}},"deny-set-simple-fullscreen":{"identifier":"deny-set-simple-fullscreen","description":"Denies the set_simple_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_simple_fullscreen"]}},"deny-set-size":{"identifier":"deny-set-size","description":"Denies the set_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size"]}},"deny-set-size-constraints":{"identifier":"deny-set-size-constraints","description":"Denies the set_size_constraints command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size_constraints"]}},"deny-set-skip-taskbar":{"identifier":"deny-set-skip-taskbar","description":"Denies the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_skip_taskbar"]}},"deny-set-theme":{"identifier":"deny-set-theme","description":"Denies the set_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_theme"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-title-bar-style":{"identifier":"deny-set-title-bar-style","description":"Denies the set_title_bar_style command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title_bar_style"]}},"deny-set-visible-on-all-workspaces":{"identifier":"deny-set-visible-on-all-workspaces","description":"Denies the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible_on_all_workspaces"]}},"deny-show":{"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]}},"deny-start-dragging":{"identifier":"deny-start-dragging","description":"Denies the start_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_dragging"]}},"deny-start-resize-dragging":{"identifier":"deny-start-resize-dragging","description":"Denies the start_resize_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_resize_dragging"]}},"deny-theme":{"identifier":"deny-theme","description":"Denies the theme command without any pre-configured scope.","commands":{"allow":[],"deny":["theme"]}},"deny-title":{"identifier":"deny-title","description":"Denies the title command without any pre-configured scope.","commands":{"allow":[],"deny":["title"]}},"deny-toggle-maximize":{"identifier":"deny-toggle-maximize","description":"Denies the toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["toggle_maximize"]}},"deny-unmaximize":{"identifier":"deny-unmaximize","description":"Denies the unmaximize command without any pre-configured scope.","commands":{"allow":[],"deny":["unmaximize"]}},"deny-unminimize":{"identifier":"deny-unminimize","description":"Denies the unminimize command without any pre-configured scope.","commands":{"allow":[],"deny":["unminimize"]}}},"permission_sets":{},"global_scope_schema":null},"deep-link":{"default_permission":{"identifier":"default","description":"Allows reading the opened deep link via the get_current command","permissions":["allow-get-current"]},"permissions":{"allow-get-current":{"identifier":"allow-get-current","description":"Enables the get_current command without any pre-configured scope.","commands":{"allow":["get_current"],"deny":[]}},"allow-is-registered":{"identifier":"allow-is-registered","description":"Enables the is_registered command without any pre-configured scope.","commands":{"allow":["is_registered"],"deny":[]}},"allow-register":{"identifier":"allow-register","description":"Enables the register command without any pre-configured scope.","commands":{"allow":["register"],"deny":[]}},"allow-unregister":{"identifier":"allow-unregister","description":"Enables the unregister command without any pre-configured scope.","commands":{"allow":["unregister"],"deny":[]}},"deny-get-current":{"identifier":"deny-get-current","description":"Denies the get_current command without any pre-configured scope.","commands":{"allow":[],"deny":["get_current"]}},"deny-is-registered":{"identifier":"deny-is-registered","description":"Denies the is_registered command without any pre-configured scope.","commands":{"allow":[],"deny":["is_registered"]}},"deny-register":{"identifier":"deny-register","description":"Denies the register command without any pre-configured scope.","commands":{"allow":[],"deny":["register"]}},"deny-unregister":{"identifier":"deny-unregister","description":"Denies the unregister command without any pre-configured scope.","commands":{"allow":[],"deny":["unregister"]}}},"permission_sets":{},"global_scope_schema":null},"dialog":{"default_permission":{"identifier":"default","description":"This permission set configures the types of dialogs\navailable from the dialog plugin.\n\n#### Granted Permissions\n\nAll dialog types are enabled.\n\n\n","permissions":["allow-message","allow-save","allow-open"]},"permissions":{"allow-ask":{"identifier":"allow-ask","description":"Enables the ask command without any pre-configured scope. (**DEPRECATED**: This is now an alias to `allow-message` and will be removed in v3)","commands":{"allow":["message"],"deny":[]}},"allow-confirm":{"identifier":"allow-confirm","description":"Enables the confirm command without any pre-configured scope. (**DEPRECATED**: This is now an alias to `allow-message` and will be removed in v3)","commands":{"allow":["message"],"deny":[]}},"allow-message":{"identifier":"allow-message","description":"Enables the message command without any pre-configured scope.","commands":{"allow":["message"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-save":{"identifier":"allow-save","description":"Enables the save command without any pre-configured scope.","commands":{"allow":["save"],"deny":[]}},"deny-ask":{"identifier":"deny-ask","description":"Denies the ask command without any pre-configured scope. (**DEPRECATED**: This is now an alias to `deny-message` and will be removed in v3)","commands":{"allow":[],"deny":["message"]}},"deny-confirm":{"identifier":"deny-confirm","description":"Denies the confirm command without any pre-configured scope. (**DEPRECATED**: This is now an alias to `deny-message` and will be removed in v3)","commands":{"allow":[],"deny":["message"]}},"deny-message":{"identifier":"deny-message","description":"Denies the message command without any pre-configured scope.","commands":{"allow":[],"deny":["message"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-save":{"identifier":"deny-save","description":"Denies the save command without any pre-configured scope.","commands":{"allow":[],"deny":["save"]}}},"permission_sets":{},"global_scope_schema":null},"haptics":{"default_permission":null,"permissions":{"allow-impact-feedback":{"identifier":"allow-impact-feedback","description":"Enables the impact_feedback command without any pre-configured scope.","commands":{"allow":["impact_feedback"],"deny":[]}},"allow-notification-feedback":{"identifier":"allow-notification-feedback","description":"Enables the notification_feedback command without any pre-configured scope.","commands":{"allow":["notification_feedback"],"deny":[]}},"allow-selection-feedback":{"identifier":"allow-selection-feedback","description":"Enables the selection_feedback command without any pre-configured scope.","commands":{"allow":["selection_feedback"],"deny":[]}},"allow-vibrate":{"identifier":"allow-vibrate","description":"Enables the vibrate command without any pre-configured scope.","commands":{"allow":["vibrate"],"deny":[]}},"deny-impact-feedback":{"identifier":"deny-impact-feedback","description":"Denies the impact_feedback command without any pre-configured scope.","commands":{"allow":[],"deny":["impact_feedback"]}},"deny-notification-feedback":{"identifier":"deny-notification-feedback","description":"Denies the notification_feedback command without any pre-configured scope.","commands":{"allow":[],"deny":["notification_feedback"]}},"deny-selection-feedback":{"identifier":"deny-selection-feedback","description":"Denies the selection_feedback command without any pre-configured scope.","commands":{"allow":[],"deny":["selection_feedback"]}},"deny-vibrate":{"identifier":"deny-vibrate","description":"Denies the vibrate command without any pre-configured scope.","commands":{"allow":[],"deny":["vibrate"]}}},"permission_sets":{},"global_scope_schema":null},"http":{"default_permission":{"identifier":"default","description":"This permission set configures what kind of\nfetch operations are available from the http plugin.\n\nThis enables all fetch operations but does not\nallow explicitly any origins to be fetched. This needs to\nbe manually configured before usage.\n\n#### Granted Permissions\n\nAll fetch operations are enabled.\n\n","permissions":["allow-fetch","allow-fetch-cancel","allow-fetch-send","allow-fetch-read-body","allow-fetch-cancel-body"]},"permissions":{"allow-fetch":{"identifier":"allow-fetch","description":"Enables the fetch command without any pre-configured scope.","commands":{"allow":["fetch"],"deny":[]}},"allow-fetch-cancel":{"identifier":"allow-fetch-cancel","description":"Enables the fetch_cancel command without any pre-configured scope.","commands":{"allow":["fetch_cancel"],"deny":[]}},"allow-fetch-cancel-body":{"identifier":"allow-fetch-cancel-body","description":"Enables the fetch_cancel_body command without any pre-configured scope.","commands":{"allow":["fetch_cancel_body"],"deny":[]}},"allow-fetch-read-body":{"identifier":"allow-fetch-read-body","description":"Enables the fetch_read_body command without any pre-configured scope.","commands":{"allow":["fetch_read_body"],"deny":[]}},"allow-fetch-send":{"identifier":"allow-fetch-send","description":"Enables the fetch_send command without any pre-configured scope.","commands":{"allow":["fetch_send"],"deny":[]}},"deny-fetch":{"identifier":"deny-fetch","description":"Denies the fetch command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch"]}},"deny-fetch-cancel":{"identifier":"deny-fetch-cancel","description":"Denies the fetch_cancel command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_cancel"]}},"deny-fetch-cancel-body":{"identifier":"deny-fetch-cancel-body","description":"Denies the fetch_cancel_body command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_cancel_body"]}},"deny-fetch-read-body":{"identifier":"deny-fetch-read-body","description":"Denies the fetch_read_body command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_read_body"]}},"deny-fetch-send":{"identifier":"deny-fetch-send","description":"Denies the fetch_send command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_send"]}}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"description":"A URL that can be accessed by the webview when using the HTTP APIs. Wildcards can be used following the URL pattern standard.\n\nSee [the URL Pattern spec](https://urlpattern.spec.whatwg.org/) for more information.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin on port 443\n\n- \"https://*:*\" : allows all HTTPS origin on any port\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"","type":"string"},{"properties":{"url":{"description":"A URL that can be accessed by the webview when using the HTTP APIs. Wildcards can be used following the URL pattern standard.\n\nSee [the URL Pattern spec](https://urlpattern.spec.whatwg.org/) for more information.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin on port 443\n\n- \"https://*:*\" : allows all HTTPS origin on any port\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"","type":"string"}},"required":["url"],"type":"object"}],"description":"HTTP scope entry.","title":"HttpScopeEntry"}},"notification":{"default_permission":{"identifier":"default","description":"This permission set configures which\nnotification features are by default exposed.\n\n#### Granted Permissions\n\nIt allows all notification related features.\n\n","permissions":["allow-is-permission-granted","allow-request-permission","allow-notify","allow-register-action-types","allow-register-listener","allow-cancel","allow-get-pending","allow-remove-active","allow-get-active","allow-check-permissions","allow-show","allow-batch","allow-list-channels","allow-delete-channel","allow-create-channel","allow-permission-state"]},"permissions":{"allow-batch":{"identifier":"allow-batch","description":"Enables the batch command without any pre-configured scope.","commands":{"allow":["batch"],"deny":[]}},"allow-cancel":{"identifier":"allow-cancel","description":"Enables the cancel command without any pre-configured scope.","commands":{"allow":["cancel"],"deny":[]}},"allow-check-permissions":{"identifier":"allow-check-permissions","description":"Enables the check_permissions command without any pre-configured scope.","commands":{"allow":["check_permissions"],"deny":[]}},"allow-create-channel":{"identifier":"allow-create-channel","description":"Enables the create_channel command without any pre-configured scope.","commands":{"allow":["create_channel"],"deny":[]}},"allow-delete-channel":{"identifier":"allow-delete-channel","description":"Enables the delete_channel command without any pre-configured scope.","commands":{"allow":["delete_channel"],"deny":[]}},"allow-get-active":{"identifier":"allow-get-active","description":"Enables the get_active command without any pre-configured scope.","commands":{"allow":["get_active"],"deny":[]}},"allow-get-pending":{"identifier":"allow-get-pending","description":"Enables the get_pending command without any pre-configured scope.","commands":{"allow":["get_pending"],"deny":[]}},"allow-is-permission-granted":{"identifier":"allow-is-permission-granted","description":"Enables the is_permission_granted command without any pre-configured scope.","commands":{"allow":["is_permission_granted"],"deny":[]}},"allow-list-channels":{"identifier":"allow-list-channels","description":"Enables the list_channels command without any pre-configured scope.","commands":{"allow":["list_channels"],"deny":[]}},"allow-notify":{"identifier":"allow-notify","description":"Enables the notify command without any pre-configured scope.","commands":{"allow":["notify"],"deny":[]}},"allow-permission-state":{"identifier":"allow-permission-state","description":"Enables the permission_state command without any pre-configured scope.","commands":{"allow":["permission_state"],"deny":[]}},"allow-register-action-types":{"identifier":"allow-register-action-types","description":"Enables the register_action_types command without any pre-configured scope.","commands":{"allow":["register_action_types"],"deny":[]}},"allow-register-listener":{"identifier":"allow-register-listener","description":"Enables the register_listener command without any pre-configured scope.","commands":{"allow":["register_listener"],"deny":[]}},"allow-remove-active":{"identifier":"allow-remove-active","description":"Enables the remove_active command without any pre-configured scope.","commands":{"allow":["remove_active"],"deny":[]}},"allow-request-permission":{"identifier":"allow-request-permission","description":"Enables the request_permission command without any pre-configured scope.","commands":{"allow":["request_permission"],"deny":[]}},"allow-show":{"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]}},"deny-batch":{"identifier":"deny-batch","description":"Denies the batch command without any pre-configured scope.","commands":{"allow":[],"deny":["batch"]}},"deny-cancel":{"identifier":"deny-cancel","description":"Denies the cancel command without any pre-configured scope.","commands":{"allow":[],"deny":["cancel"]}},"deny-check-permissions":{"identifier":"deny-check-permissions","description":"Denies the check_permissions command without any pre-configured scope.","commands":{"allow":[],"deny":["check_permissions"]}},"deny-create-channel":{"identifier":"deny-create-channel","description":"Denies the create_channel command without any pre-configured scope.","commands":{"allow":[],"deny":["create_channel"]}},"deny-delete-channel":{"identifier":"deny-delete-channel","description":"Denies the delete_channel command without any pre-configured scope.","commands":{"allow":[],"deny":["delete_channel"]}},"deny-get-active":{"identifier":"deny-get-active","description":"Denies the get_active command without any pre-configured scope.","commands":{"allow":[],"deny":["get_active"]}},"deny-get-pending":{"identifier":"deny-get-pending","description":"Denies the get_pending command without any pre-configured scope.","commands":{"allow":[],"deny":["get_pending"]}},"deny-is-permission-granted":{"identifier":"deny-is-permission-granted","description":"Denies the is_permission_granted command without any pre-configured scope.","commands":{"allow":[],"deny":["is_permission_granted"]}},"deny-list-channels":{"identifier":"deny-list-channels","description":"Denies the list_channels command without any pre-configured scope.","commands":{"allow":[],"deny":["list_channels"]}},"deny-notify":{"identifier":"deny-notify","description":"Denies the notify command without any pre-configured scope.","commands":{"allow":[],"deny":["notify"]}},"deny-permission-state":{"identifier":"deny-permission-state","description":"Denies the permission_state command without any pre-configured scope.","commands":{"allow":[],"deny":["permission_state"]}},"deny-register-action-types":{"identifier":"deny-register-action-types","description":"Denies the register_action_types command without any pre-configured scope.","commands":{"allow":[],"deny":["register_action_types"]}},"deny-register-listener":{"identifier":"deny-register-listener","description":"Denies the register_listener command without any pre-configured scope.","commands":{"allow":[],"deny":["register_listener"]}},"deny-remove-active":{"identifier":"deny-remove-active","description":"Denies the remove_active command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_active"]}},"deny-request-permission":{"identifier":"deny-request-permission","description":"Denies the request_permission command without any pre-configured scope.","commands":{"allow":[],"deny":["request_permission"]}},"deny-show":{"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]}}},"permission_sets":{},"global_scope_schema":null},"opener":{"default_permission":{"identifier":"default","description":"This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer","permissions":["allow-open-url","allow-reveal-item-in-dir","allow-default-urls"]},"permissions":{"allow-default-urls":{"identifier":"allow-default-urls","description":"This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"url":"mailto:*"},{"url":"tel:*"},{"url":"http://*"},{"url":"https://*"}]}},"allow-open-path":{"identifier":"allow-open-path","description":"Enables the open_path command without any pre-configured scope.","commands":{"allow":["open_path"],"deny":[]}},"allow-open-url":{"identifier":"allow-open-url","description":"Enables the open_url command without any pre-configured scope.","commands":{"allow":["open_url"],"deny":[]}},"allow-reveal-item-in-dir":{"identifier":"allow-reveal-item-in-dir","description":"Enables the reveal_item_in_dir command without any pre-configured scope.","commands":{"allow":["reveal_item_in_dir"],"deny":[]}},"deny-open-path":{"identifier":"deny-open-path","description":"Denies the open_path command without any pre-configured scope.","commands":{"allow":[],"deny":["open_path"]}},"deny-open-url":{"identifier":"deny-open-url","description":"Denies the open_url command without any pre-configured scope.","commands":{"allow":[],"deny":["open_url"]}},"deny-reveal-item-in-dir":{"identifier":"deny-reveal-item-in-dir","description":"Denies the reveal_item_in_dir command without any pre-configured scope.","commands":{"allow":[],"deny":["reveal_item_in_dir"]}}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"properties":{"app":{"allOf":[{"$ref":"#/definitions/Application"}],"description":"An application to open this url with, for example: firefox."},"url":{"description":"A URL that can be opened by the webview when using the Opener APIs.\n\nWildcards can be used following the UNIX glob pattern.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"","type":"string"}},"required":["url"],"type":"object"},{"properties":{"app":{"allOf":[{"$ref":"#/definitions/Application"}],"description":"An application to open this path with, for example: xdg-open."},"path":{"description":"A path that can be opened by the webview when using the Opener APIs.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"}},"required":["path"],"type":"object"}],"definitions":{"Application":{"anyOf":[{"description":"Open in default application.","type":"null"},{"description":"If true, allow open with any application.","type":"boolean"},{"description":"Allow specific application to open with.","type":"string"}],"description":"Opener scope application."}},"description":"Opener scope entry.","title":"OpenerScopeEntry"}},"os":{"default_permission":{"identifier":"default","description":"This permission set configures which\noperating system information are available\nto gather from the frontend.\n\n#### Granted Permissions\n\nAll information except the host name are available.\n\n","permissions":["allow-arch","allow-exe-extension","allow-family","allow-locale","allow-os-type","allow-platform","allow-version"]},"permissions":{"allow-arch":{"identifier":"allow-arch","description":"Enables the arch command without any pre-configured scope.","commands":{"allow":["arch"],"deny":[]}},"allow-exe-extension":{"identifier":"allow-exe-extension","description":"Enables the exe_extension command without any pre-configured scope.","commands":{"allow":["exe_extension"],"deny":[]}},"allow-family":{"identifier":"allow-family","description":"Enables the family command without any pre-configured scope.","commands":{"allow":["family"],"deny":[]}},"allow-hostname":{"identifier":"allow-hostname","description":"Enables the hostname command without any pre-configured scope.","commands":{"allow":["hostname"],"deny":[]}},"allow-locale":{"identifier":"allow-locale","description":"Enables the locale command without any pre-configured scope.","commands":{"allow":["locale"],"deny":[]}},"allow-os-type":{"identifier":"allow-os-type","description":"Enables the os_type command without any pre-configured scope.","commands":{"allow":["os_type"],"deny":[]}},"allow-platform":{"identifier":"allow-platform","description":"Enables the platform command without any pre-configured scope.","commands":{"allow":["platform"],"deny":[]}},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]}},"deny-arch":{"identifier":"deny-arch","description":"Denies the arch command without any pre-configured scope.","commands":{"allow":[],"deny":["arch"]}},"deny-exe-extension":{"identifier":"deny-exe-extension","description":"Denies the exe_extension command without any pre-configured scope.","commands":{"allow":[],"deny":["exe_extension"]}},"deny-family":{"identifier":"deny-family","description":"Denies the family command without any pre-configured scope.","commands":{"allow":[],"deny":["family"]}},"deny-hostname":{"identifier":"deny-hostname","description":"Denies the hostname command without any pre-configured scope.","commands":{"allow":[],"deny":["hostname"]}},"deny-locale":{"identifier":"deny-locale","description":"Denies the locale command without any pre-configured scope.","commands":{"allow":[],"deny":["locale"]}},"deny-os-type":{"identifier":"deny-os-type","description":"Denies the os_type command without any pre-configured scope.","commands":{"allow":[],"deny":["os_type"]}},"deny-platform":{"identifier":"deny-platform","description":"Denies the platform command without any pre-configured scope.","commands":{"allow":[],"deny":["platform"]}},"deny-version":{"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]}}},"permission_sets":{},"global_scope_schema":null},"process":{"default_permission":{"identifier":"default","description":"This permission set configures which\nprocess features are by default exposed.\n\n#### Granted Permissions\n\nThis enables to quit via `allow-exit` and restart via `allow-restart`\nthe application.\n","permissions":["allow-exit","allow-restart"]},"permissions":{"allow-exit":{"identifier":"allow-exit","description":"Enables the exit command without any pre-configured scope.","commands":{"allow":["exit"],"deny":[]}},"allow-restart":{"identifier":"allow-restart","description":"Enables the restart command without any pre-configured scope.","commands":{"allow":["restart"],"deny":[]}},"deny-exit":{"identifier":"deny-exit","description":"Denies the exit command without any pre-configured scope.","commands":{"allow":[],"deny":["exit"]}},"deny-restart":{"identifier":"deny-restart","description":"Denies the restart command without any pre-configured scope.","commands":{"allow":[],"deny":["restart"]}}},"permission_sets":{},"global_scope_schema":null},"store":{"default_permission":{"identifier":"default","description":"This permission set configures what kind of\noperations are available from the store plugin.\n\n#### Granted Permissions\n\nAll operations are enabled by default.\n\n","permissions":["allow-load","allow-get-store","allow-set","allow-get","allow-has","allow-delete","allow-clear","allow-reset","allow-keys","allow-values","allow-entries","allow-length","allow-reload","allow-save"]},"permissions":{"allow-clear":{"identifier":"allow-clear","description":"Enables the clear command without any pre-configured scope.","commands":{"allow":["clear"],"deny":[]}},"allow-delete":{"identifier":"allow-delete","description":"Enables the delete command without any pre-configured scope.","commands":{"allow":["delete"],"deny":[]}},"allow-entries":{"identifier":"allow-entries","description":"Enables the entries command without any pre-configured scope.","commands":{"allow":["entries"],"deny":[]}},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]}},"allow-get-store":{"identifier":"allow-get-store","description":"Enables the get_store command without any pre-configured scope.","commands":{"allow":["get_store"],"deny":[]}},"allow-has":{"identifier":"allow-has","description":"Enables the has command without any pre-configured scope.","commands":{"allow":["has"],"deny":[]}},"allow-keys":{"identifier":"allow-keys","description":"Enables the keys command without any pre-configured scope.","commands":{"allow":["keys"],"deny":[]}},"allow-length":{"identifier":"allow-length","description":"Enables the length command without any pre-configured scope.","commands":{"allow":["length"],"deny":[]}},"allow-load":{"identifier":"allow-load","description":"Enables the load command without any pre-configured scope.","commands":{"allow":["load"],"deny":[]}},"allow-reload":{"identifier":"allow-reload","description":"Enables the reload command without any pre-configured scope.","commands":{"allow":["reload"],"deny":[]}},"allow-reset":{"identifier":"allow-reset","description":"Enables the reset command without any pre-configured scope.","commands":{"allow":["reset"],"deny":[]}},"allow-save":{"identifier":"allow-save","description":"Enables the save command without any pre-configured scope.","commands":{"allow":["save"],"deny":[]}},"allow-set":{"identifier":"allow-set","description":"Enables the set command without any pre-configured scope.","commands":{"allow":["set"],"deny":[]}},"allow-values":{"identifier":"allow-values","description":"Enables the values command without any pre-configured scope.","commands":{"allow":["values"],"deny":[]}},"deny-clear":{"identifier":"deny-clear","description":"Denies the clear command without any pre-configured scope.","commands":{"allow":[],"deny":["clear"]}},"deny-delete":{"identifier":"deny-delete","description":"Denies the delete command without any pre-configured scope.","commands":{"allow":[],"deny":["delete"]}},"deny-entries":{"identifier":"deny-entries","description":"Denies the entries command without any pre-configured scope.","commands":{"allow":[],"deny":["entries"]}},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]}},"deny-get-store":{"identifier":"deny-get-store","description":"Denies the get_store command without any pre-configured scope.","commands":{"allow":[],"deny":["get_store"]}},"deny-has":{"identifier":"deny-has","description":"Denies the has command without any pre-configured scope.","commands":{"allow":[],"deny":["has"]}},"deny-keys":{"identifier":"deny-keys","description":"Denies the keys command without any pre-configured scope.","commands":{"allow":[],"deny":["keys"]}},"deny-length":{"identifier":"deny-length","description":"Denies the length command without any pre-configured scope.","commands":{"allow":[],"deny":["length"]}},"deny-load":{"identifier":"deny-load","description":"Denies the load command without any pre-configured scope.","commands":{"allow":[],"deny":["load"]}},"deny-reload":{"identifier":"deny-reload","description":"Denies the reload command without any pre-configured scope.","commands":{"allow":[],"deny":["reload"]}},"deny-reset":{"identifier":"deny-reset","description":"Denies the reset command without any pre-configured scope.","commands":{"allow":[],"deny":["reset"]}},"deny-save":{"identifier":"deny-save","description":"Denies the save command without any pre-configured scope.","commands":{"allow":[],"deny":["save"]}},"deny-set":{"identifier":"deny-set","description":"Denies the set command without any pre-configured scope.","commands":{"allow":[],"deny":["set"]}},"deny-values":{"identifier":"deny-values","description":"Denies the values command without any pre-configured scope.","commands":{"allow":[],"deny":["values"]}}},"permission_sets":{},"global_scope_schema":null},"window-state":{"default_permission":{"identifier":"default","description":"This permission set configures what kind of\noperations are available from the window state plugin.\n\n#### Granted Permissions\n\nAll operations are enabled by default.\n\n","permissions":["allow-filename","allow-restore-state","allow-save-window-state"]},"permissions":{"allow-filename":{"identifier":"allow-filename","description":"Enables the filename command without any pre-configured scope.","commands":{"allow":["filename"],"deny":[]}},"allow-restore-state":{"identifier":"allow-restore-state","description":"Enables the restore_state command without any pre-configured scope.","commands":{"allow":["restore_state"],"deny":[]}},"allow-save-window-state":{"identifier":"allow-save-window-state","description":"Enables the save_window_state command without any pre-configured scope.","commands":{"allow":["save_window_state"],"deny":[]}},"deny-filename":{"identifier":"deny-filename","description":"Denies the filename command without any pre-configured scope.","commands":{"allow":[],"deny":["filename"]}},"deny-restore-state":{"identifier":"deny-restore-state","description":"Denies the restore_state command without any pre-configured scope.","commands":{"allow":[],"deny":["restore_state"]}},"deny-save-window-state":{"identifier":"deny-save-window-state","description":"Denies the save_window_state command without any pre-configured scope.","commands":{"allow":[],"deny":["save_window_state"]}}},"permission_sets":{},"global_scope_schema":null}} \ No newline at end of file +{"clipboard-manager":{"default_permission":{"identifier":"default","description":"No features are enabled by default, as we believe\nthe clipboard can be inherently dangerous and it is \napplication specific if read and/or write access is needed.\n\nClipboard interaction needs to be explicitly enabled.\n","permissions":[]},"permissions":{"allow-clear":{"identifier":"allow-clear","description":"Enables the clear command without any pre-configured scope.","commands":{"allow":["clear"],"deny":[]}},"allow-read-image":{"identifier":"allow-read-image","description":"Enables the read_image command without any pre-configured scope.","commands":{"allow":["read_image"],"deny":[]}},"allow-read-text":{"identifier":"allow-read-text","description":"Enables the read_text command without any pre-configured scope.","commands":{"allow":["read_text"],"deny":[]}},"allow-write-html":{"identifier":"allow-write-html","description":"Enables the write_html command without any pre-configured scope.","commands":{"allow":["write_html"],"deny":[]}},"allow-write-image":{"identifier":"allow-write-image","description":"Enables the write_image command without any pre-configured scope.","commands":{"allow":["write_image"],"deny":[]}},"allow-write-text":{"identifier":"allow-write-text","description":"Enables the write_text command without any pre-configured scope.","commands":{"allow":["write_text"],"deny":[]}},"deny-clear":{"identifier":"deny-clear","description":"Denies the clear command without any pre-configured scope.","commands":{"allow":[],"deny":["clear"]}},"deny-read-image":{"identifier":"deny-read-image","description":"Denies the read_image command without any pre-configured scope.","commands":{"allow":[],"deny":["read_image"]}},"deny-read-text":{"identifier":"deny-read-text","description":"Denies the read_text command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text"]}},"deny-write-html":{"identifier":"deny-write-html","description":"Denies the write_html command without any pre-configured scope.","commands":{"allow":[],"deny":["write_html"]}},"deny-write-image":{"identifier":"deny-write-image","description":"Denies the write_image command without any pre-configured scope.","commands":{"allow":[],"deny":["write_image"]}},"deny-write-text":{"identifier":"deny-write-text","description":"Denies the write_text command without any pre-configured scope.","commands":{"allow":[],"deny":["write_text"]}}},"permission_sets":{},"global_scope_schema":null},"core":{"default_permission":{"identifier":"default","description":"Default core plugins set.","permissions":["core:path:default","core:event:default","core:window:default","core:webview:default","core:app:default","core:image:default","core:resources:default","core:menu:default","core:tray:default"]},"permissions":{},"permission_sets":{},"global_scope_schema":null},"core:app":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-version","allow-name","allow-tauri-version","allow-identifier","allow-bundle-type","allow-register-listener","allow-remove-listener"]},"permissions":{"allow-app-hide":{"identifier":"allow-app-hide","description":"Enables the app_hide command without any pre-configured scope.","commands":{"allow":["app_hide"],"deny":[]}},"allow-app-show":{"identifier":"allow-app-show","description":"Enables the app_show command without any pre-configured scope.","commands":{"allow":["app_show"],"deny":[]}},"allow-bundle-type":{"identifier":"allow-bundle-type","description":"Enables the bundle_type command without any pre-configured scope.","commands":{"allow":["bundle_type"],"deny":[]}},"allow-default-window-icon":{"identifier":"allow-default-window-icon","description":"Enables the default_window_icon command without any pre-configured scope.","commands":{"allow":["default_window_icon"],"deny":[]}},"allow-fetch-data-store-identifiers":{"identifier":"allow-fetch-data-store-identifiers","description":"Enables the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":["fetch_data_store_identifiers"],"deny":[]}},"allow-identifier":{"identifier":"allow-identifier","description":"Enables the identifier command without any pre-configured scope.","commands":{"allow":["identifier"],"deny":[]}},"allow-name":{"identifier":"allow-name","description":"Enables the name command without any pre-configured scope.","commands":{"allow":["name"],"deny":[]}},"allow-register-listener":{"identifier":"allow-register-listener","description":"Enables the register_listener command without any pre-configured scope.","commands":{"allow":["register_listener"],"deny":[]}},"allow-remove-data-store":{"identifier":"allow-remove-data-store","description":"Enables the remove_data_store command without any pre-configured scope.","commands":{"allow":["remove_data_store"],"deny":[]}},"allow-remove-listener":{"identifier":"allow-remove-listener","description":"Enables the remove_listener command without any pre-configured scope.","commands":{"allow":["remove_listener"],"deny":[]}},"allow-set-app-theme":{"identifier":"allow-set-app-theme","description":"Enables the set_app_theme command without any pre-configured scope.","commands":{"allow":["set_app_theme"],"deny":[]}},"allow-set-dock-visibility":{"identifier":"allow-set-dock-visibility","description":"Enables the set_dock_visibility command without any pre-configured scope.","commands":{"allow":["set_dock_visibility"],"deny":[]}},"allow-tauri-version":{"identifier":"allow-tauri-version","description":"Enables the tauri_version command without any pre-configured scope.","commands":{"allow":["tauri_version"],"deny":[]}},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]}},"deny-app-hide":{"identifier":"deny-app-hide","description":"Denies the app_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["app_hide"]}},"deny-app-show":{"identifier":"deny-app-show","description":"Denies the app_show command without any pre-configured scope.","commands":{"allow":[],"deny":["app_show"]}},"deny-bundle-type":{"identifier":"deny-bundle-type","description":"Denies the bundle_type command without any pre-configured scope.","commands":{"allow":[],"deny":["bundle_type"]}},"deny-default-window-icon":{"identifier":"deny-default-window-icon","description":"Denies the default_window_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["default_window_icon"]}},"deny-fetch-data-store-identifiers":{"identifier":"deny-fetch-data-store-identifiers","description":"Denies the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_data_store_identifiers"]}},"deny-identifier":{"identifier":"deny-identifier","description":"Denies the identifier command without any pre-configured scope.","commands":{"allow":[],"deny":["identifier"]}},"deny-name":{"identifier":"deny-name","description":"Denies the name command without any pre-configured scope.","commands":{"allow":[],"deny":["name"]}},"deny-register-listener":{"identifier":"deny-register-listener","description":"Denies the register_listener command without any pre-configured scope.","commands":{"allow":[],"deny":["register_listener"]}},"deny-remove-data-store":{"identifier":"deny-remove-data-store","description":"Denies the remove_data_store command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_data_store"]}},"deny-remove-listener":{"identifier":"deny-remove-listener","description":"Denies the remove_listener command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_listener"]}},"deny-set-app-theme":{"identifier":"deny-set-app-theme","description":"Denies the set_app_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_app_theme"]}},"deny-set-dock-visibility":{"identifier":"deny-set-dock-visibility","description":"Denies the set_dock_visibility command without any pre-configured scope.","commands":{"allow":[],"deny":["set_dock_visibility"]}},"deny-tauri-version":{"identifier":"deny-tauri-version","description":"Denies the tauri_version command without any pre-configured scope.","commands":{"allow":[],"deny":["tauri_version"]}},"deny-version":{"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]}}},"permission_sets":{},"global_scope_schema":null},"core:event":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-listen","allow-unlisten","allow-emit","allow-emit-to"]},"permissions":{"allow-emit":{"identifier":"allow-emit","description":"Enables the emit command without any pre-configured scope.","commands":{"allow":["emit"],"deny":[]}},"allow-emit-to":{"identifier":"allow-emit-to","description":"Enables the emit_to command without any pre-configured scope.","commands":{"allow":["emit_to"],"deny":[]}},"allow-listen":{"identifier":"allow-listen","description":"Enables the listen command without any pre-configured scope.","commands":{"allow":["listen"],"deny":[]}},"allow-unlisten":{"identifier":"allow-unlisten","description":"Enables the unlisten command without any pre-configured scope.","commands":{"allow":["unlisten"],"deny":[]}},"deny-emit":{"identifier":"deny-emit","description":"Denies the emit command without any pre-configured scope.","commands":{"allow":[],"deny":["emit"]}},"deny-emit-to":{"identifier":"deny-emit-to","description":"Denies the emit_to command without any pre-configured scope.","commands":{"allow":[],"deny":["emit_to"]}},"deny-listen":{"identifier":"deny-listen","description":"Denies the listen command without any pre-configured scope.","commands":{"allow":[],"deny":["listen"]}},"deny-unlisten":{"identifier":"deny-unlisten","description":"Denies the unlisten command without any pre-configured scope.","commands":{"allow":[],"deny":["unlisten"]}}},"permission_sets":{},"global_scope_schema":null},"core:image":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-from-bytes","allow-from-path","allow-rgba","allow-size"]},"permissions":{"allow-from-bytes":{"identifier":"allow-from-bytes","description":"Enables the from_bytes command without any pre-configured scope.","commands":{"allow":["from_bytes"],"deny":[]}},"allow-from-path":{"identifier":"allow-from-path","description":"Enables the from_path command without any pre-configured scope.","commands":{"allow":["from_path"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-rgba":{"identifier":"allow-rgba","description":"Enables the rgba command without any pre-configured scope.","commands":{"allow":["rgba"],"deny":[]}},"allow-size":{"identifier":"allow-size","description":"Enables the size command without any pre-configured scope.","commands":{"allow":["size"],"deny":[]}},"deny-from-bytes":{"identifier":"deny-from-bytes","description":"Denies the from_bytes command without any pre-configured scope.","commands":{"allow":[],"deny":["from_bytes"]}},"deny-from-path":{"identifier":"deny-from-path","description":"Denies the from_path command without any pre-configured scope.","commands":{"allow":[],"deny":["from_path"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-rgba":{"identifier":"deny-rgba","description":"Denies the rgba command without any pre-configured scope.","commands":{"allow":[],"deny":["rgba"]}},"deny-size":{"identifier":"deny-size","description":"Denies the size command without any pre-configured scope.","commands":{"allow":[],"deny":["size"]}}},"permission_sets":{},"global_scope_schema":null},"core:menu":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-append","allow-prepend","allow-insert","allow-remove","allow-remove-at","allow-items","allow-get","allow-popup","allow-create-default","allow-set-as-app-menu","allow-set-as-window-menu","allow-text","allow-set-text","allow-is-enabled","allow-set-enabled","allow-set-accelerator","allow-set-as-windows-menu-for-nsapp","allow-set-as-help-menu-for-nsapp","allow-is-checked","allow-set-checked","allow-set-icon"]},"permissions":{"allow-append":{"identifier":"allow-append","description":"Enables the append command without any pre-configured scope.","commands":{"allow":["append"],"deny":[]}},"allow-create-default":{"identifier":"allow-create-default","description":"Enables the create_default command without any pre-configured scope.","commands":{"allow":["create_default"],"deny":[]}},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]}},"allow-insert":{"identifier":"allow-insert","description":"Enables the insert command without any pre-configured scope.","commands":{"allow":["insert"],"deny":[]}},"allow-is-checked":{"identifier":"allow-is-checked","description":"Enables the is_checked command without any pre-configured scope.","commands":{"allow":["is_checked"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-items":{"identifier":"allow-items","description":"Enables the items command without any pre-configured scope.","commands":{"allow":["items"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-popup":{"identifier":"allow-popup","description":"Enables the popup command without any pre-configured scope.","commands":{"allow":["popup"],"deny":[]}},"allow-prepend":{"identifier":"allow-prepend","description":"Enables the prepend command without any pre-configured scope.","commands":{"allow":["prepend"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-remove-at":{"identifier":"allow-remove-at","description":"Enables the remove_at command without any pre-configured scope.","commands":{"allow":["remove_at"],"deny":[]}},"allow-set-accelerator":{"identifier":"allow-set-accelerator","description":"Enables the set_accelerator command without any pre-configured scope.","commands":{"allow":["set_accelerator"],"deny":[]}},"allow-set-as-app-menu":{"identifier":"allow-set-as-app-menu","description":"Enables the set_as_app_menu command without any pre-configured scope.","commands":{"allow":["set_as_app_menu"],"deny":[]}},"allow-set-as-help-menu-for-nsapp":{"identifier":"allow-set-as-help-menu-for-nsapp","description":"Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_help_menu_for_nsapp"],"deny":[]}},"allow-set-as-window-menu":{"identifier":"allow-set-as-window-menu","description":"Enables the set_as_window_menu command without any pre-configured scope.","commands":{"allow":["set_as_window_menu"],"deny":[]}},"allow-set-as-windows-menu-for-nsapp":{"identifier":"allow-set-as-windows-menu-for-nsapp","description":"Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_windows_menu_for_nsapp"],"deny":[]}},"allow-set-checked":{"identifier":"allow-set-checked","description":"Enables the set_checked command without any pre-configured scope.","commands":{"allow":["set_checked"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-text":{"identifier":"allow-set-text","description":"Enables the set_text command without any pre-configured scope.","commands":{"allow":["set_text"],"deny":[]}},"allow-text":{"identifier":"allow-text","description":"Enables the text command without any pre-configured scope.","commands":{"allow":["text"],"deny":[]}},"deny-append":{"identifier":"deny-append","description":"Denies the append command without any pre-configured scope.","commands":{"allow":[],"deny":["append"]}},"deny-create-default":{"identifier":"deny-create-default","description":"Denies the create_default command without any pre-configured scope.","commands":{"allow":[],"deny":["create_default"]}},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]}},"deny-insert":{"identifier":"deny-insert","description":"Denies the insert command without any pre-configured scope.","commands":{"allow":[],"deny":["insert"]}},"deny-is-checked":{"identifier":"deny-is-checked","description":"Denies the is_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["is_checked"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-items":{"identifier":"deny-items","description":"Denies the items command without any pre-configured scope.","commands":{"allow":[],"deny":["items"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-popup":{"identifier":"deny-popup","description":"Denies the popup command without any pre-configured scope.","commands":{"allow":[],"deny":["popup"]}},"deny-prepend":{"identifier":"deny-prepend","description":"Denies the prepend command without any pre-configured scope.","commands":{"allow":[],"deny":["prepend"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-remove-at":{"identifier":"deny-remove-at","description":"Denies the remove_at command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_at"]}},"deny-set-accelerator":{"identifier":"deny-set-accelerator","description":"Denies the set_accelerator command without any pre-configured scope.","commands":{"allow":[],"deny":["set_accelerator"]}},"deny-set-as-app-menu":{"identifier":"deny-set-as-app-menu","description":"Denies the set_as_app_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_app_menu"]}},"deny-set-as-help-menu-for-nsapp":{"identifier":"deny-set-as-help-menu-for-nsapp","description":"Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_help_menu_for_nsapp"]}},"deny-set-as-window-menu":{"identifier":"deny-set-as-window-menu","description":"Denies the set_as_window_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_window_menu"]}},"deny-set-as-windows-menu-for-nsapp":{"identifier":"deny-set-as-windows-menu-for-nsapp","description":"Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_windows_menu_for_nsapp"]}},"deny-set-checked":{"identifier":"deny-set-checked","description":"Denies the set_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["set_checked"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-text":{"identifier":"deny-set-text","description":"Denies the set_text command without any pre-configured scope.","commands":{"allow":[],"deny":["set_text"]}},"deny-text":{"identifier":"deny-text","description":"Denies the text command without any pre-configured scope.","commands":{"allow":[],"deny":["text"]}}},"permission_sets":{},"global_scope_schema":null},"core:path":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-resolve-directory","allow-resolve","allow-normalize","allow-join","allow-dirname","allow-extname","allow-basename","allow-is-absolute"]},"permissions":{"allow-basename":{"identifier":"allow-basename","description":"Enables the basename command without any pre-configured scope.","commands":{"allow":["basename"],"deny":[]}},"allow-dirname":{"identifier":"allow-dirname","description":"Enables the dirname command without any pre-configured scope.","commands":{"allow":["dirname"],"deny":[]}},"allow-extname":{"identifier":"allow-extname","description":"Enables the extname command without any pre-configured scope.","commands":{"allow":["extname"],"deny":[]}},"allow-is-absolute":{"identifier":"allow-is-absolute","description":"Enables the is_absolute command without any pre-configured scope.","commands":{"allow":["is_absolute"],"deny":[]}},"allow-join":{"identifier":"allow-join","description":"Enables the join command without any pre-configured scope.","commands":{"allow":["join"],"deny":[]}},"allow-normalize":{"identifier":"allow-normalize","description":"Enables the normalize command without any pre-configured scope.","commands":{"allow":["normalize"],"deny":[]}},"allow-resolve":{"identifier":"allow-resolve","description":"Enables the resolve command without any pre-configured scope.","commands":{"allow":["resolve"],"deny":[]}},"allow-resolve-directory":{"identifier":"allow-resolve-directory","description":"Enables the resolve_directory command without any pre-configured scope.","commands":{"allow":["resolve_directory"],"deny":[]}},"deny-basename":{"identifier":"deny-basename","description":"Denies the basename command without any pre-configured scope.","commands":{"allow":[],"deny":["basename"]}},"deny-dirname":{"identifier":"deny-dirname","description":"Denies the dirname command without any pre-configured scope.","commands":{"allow":[],"deny":["dirname"]}},"deny-extname":{"identifier":"deny-extname","description":"Denies the extname command without any pre-configured scope.","commands":{"allow":[],"deny":["extname"]}},"deny-is-absolute":{"identifier":"deny-is-absolute","description":"Denies the is_absolute command without any pre-configured scope.","commands":{"allow":[],"deny":["is_absolute"]}},"deny-join":{"identifier":"deny-join","description":"Denies the join command without any pre-configured scope.","commands":{"allow":[],"deny":["join"]}},"deny-normalize":{"identifier":"deny-normalize","description":"Denies the normalize command without any pre-configured scope.","commands":{"allow":[],"deny":["normalize"]}},"deny-resolve":{"identifier":"deny-resolve","description":"Denies the resolve command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve"]}},"deny-resolve-directory":{"identifier":"deny-resolve-directory","description":"Denies the resolve_directory command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve_directory"]}}},"permission_sets":{},"global_scope_schema":null},"core:resources":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-close"]},"permissions":{"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}}},"permission_sets":{},"global_scope_schema":null},"core:tray":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-get-by-id","allow-remove-by-id","allow-set-icon","allow-set-menu","allow-set-tooltip","allow-set-title","allow-set-visible","allow-set-temp-dir-path","allow-set-icon-as-template","allow-set-show-menu-on-left-click"]},"permissions":{"allow-get-by-id":{"identifier":"allow-get-by-id","description":"Enables the get_by_id command without any pre-configured scope.","commands":{"allow":["get_by_id"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-remove-by-id":{"identifier":"allow-remove-by-id","description":"Enables the remove_by_id command without any pre-configured scope.","commands":{"allow":["remove_by_id"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-icon-as-template":{"identifier":"allow-set-icon-as-template","description":"Enables the set_icon_as_template command without any pre-configured scope.","commands":{"allow":["set_icon_as_template"],"deny":[]}},"allow-set-menu":{"identifier":"allow-set-menu","description":"Enables the set_menu command without any pre-configured scope.","commands":{"allow":["set_menu"],"deny":[]}},"allow-set-show-menu-on-left-click":{"identifier":"allow-set-show-menu-on-left-click","description":"Enables the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":["set_show_menu_on_left_click"],"deny":[]}},"allow-set-temp-dir-path":{"identifier":"allow-set-temp-dir-path","description":"Enables the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":["set_temp_dir_path"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-tooltip":{"identifier":"allow-set-tooltip","description":"Enables the set_tooltip command without any pre-configured scope.","commands":{"allow":["set_tooltip"],"deny":[]}},"allow-set-visible":{"identifier":"allow-set-visible","description":"Enables the set_visible command without any pre-configured scope.","commands":{"allow":["set_visible"],"deny":[]}},"deny-get-by-id":{"identifier":"deny-get-by-id","description":"Denies the get_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["get_by_id"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-remove-by-id":{"identifier":"deny-remove-by-id","description":"Denies the remove_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_by_id"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-icon-as-template":{"identifier":"deny-set-icon-as-template","description":"Denies the set_icon_as_template command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon_as_template"]}},"deny-set-menu":{"identifier":"deny-set-menu","description":"Denies the set_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_menu"]}},"deny-set-show-menu-on-left-click":{"identifier":"deny-set-show-menu-on-left-click","description":"Denies the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":[],"deny":["set_show_menu_on_left_click"]}},"deny-set-temp-dir-path":{"identifier":"deny-set-temp-dir-path","description":"Denies the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":[],"deny":["set_temp_dir_path"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-tooltip":{"identifier":"deny-set-tooltip","description":"Denies the set_tooltip command without any pre-configured scope.","commands":{"allow":[],"deny":["set_tooltip"]}},"deny-set-visible":{"identifier":"deny-set-visible","description":"Denies the set_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible"]}}},"permission_sets":{},"global_scope_schema":null},"core:webview":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-webviews","allow-webview-position","allow-webview-size","allow-internal-toggle-devtools"]},"permissions":{"allow-clear-all-browsing-data":{"identifier":"allow-clear-all-browsing-data","description":"Enables the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":["clear_all_browsing_data"],"deny":[]}},"allow-create-webview":{"identifier":"allow-create-webview","description":"Enables the create_webview command without any pre-configured scope.","commands":{"allow":["create_webview"],"deny":[]}},"allow-create-webview-window":{"identifier":"allow-create-webview-window","description":"Enables the create_webview_window command without any pre-configured scope.","commands":{"allow":["create_webview_window"],"deny":[]}},"allow-get-all-webviews":{"identifier":"allow-get-all-webviews","description":"Enables the get_all_webviews command without any pre-configured scope.","commands":{"allow":["get_all_webviews"],"deny":[]}},"allow-internal-toggle-devtools":{"identifier":"allow-internal-toggle-devtools","description":"Enables the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":["internal_toggle_devtools"],"deny":[]}},"allow-print":{"identifier":"allow-print","description":"Enables the print command without any pre-configured scope.","commands":{"allow":["print"],"deny":[]}},"allow-reparent":{"identifier":"allow-reparent","description":"Enables the reparent command without any pre-configured scope.","commands":{"allow":["reparent"],"deny":[]}},"allow-set-webview-auto-resize":{"identifier":"allow-set-webview-auto-resize","description":"Enables the set_webview_auto_resize command without any pre-configured scope.","commands":{"allow":["set_webview_auto_resize"],"deny":[]}},"allow-set-webview-background-color":{"identifier":"allow-set-webview-background-color","description":"Enables the set_webview_background_color command without any pre-configured scope.","commands":{"allow":["set_webview_background_color"],"deny":[]}},"allow-set-webview-focus":{"identifier":"allow-set-webview-focus","description":"Enables the set_webview_focus command without any pre-configured scope.","commands":{"allow":["set_webview_focus"],"deny":[]}},"allow-set-webview-position":{"identifier":"allow-set-webview-position","description":"Enables the set_webview_position command without any pre-configured scope.","commands":{"allow":["set_webview_position"],"deny":[]}},"allow-set-webview-size":{"identifier":"allow-set-webview-size","description":"Enables the set_webview_size command without any pre-configured scope.","commands":{"allow":["set_webview_size"],"deny":[]}},"allow-set-webview-zoom":{"identifier":"allow-set-webview-zoom","description":"Enables the set_webview_zoom command without any pre-configured scope.","commands":{"allow":["set_webview_zoom"],"deny":[]}},"allow-webview-close":{"identifier":"allow-webview-close","description":"Enables the webview_close command without any pre-configured scope.","commands":{"allow":["webview_close"],"deny":[]}},"allow-webview-hide":{"identifier":"allow-webview-hide","description":"Enables the webview_hide command without any pre-configured scope.","commands":{"allow":["webview_hide"],"deny":[]}},"allow-webview-position":{"identifier":"allow-webview-position","description":"Enables the webview_position command without any pre-configured scope.","commands":{"allow":["webview_position"],"deny":[]}},"allow-webview-show":{"identifier":"allow-webview-show","description":"Enables the webview_show command without any pre-configured scope.","commands":{"allow":["webview_show"],"deny":[]}},"allow-webview-size":{"identifier":"allow-webview-size","description":"Enables the webview_size command without any pre-configured scope.","commands":{"allow":["webview_size"],"deny":[]}},"deny-clear-all-browsing-data":{"identifier":"deny-clear-all-browsing-data","description":"Denies the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":[],"deny":["clear_all_browsing_data"]}},"deny-create-webview":{"identifier":"deny-create-webview","description":"Denies the create_webview command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview"]}},"deny-create-webview-window":{"identifier":"deny-create-webview-window","description":"Denies the create_webview_window command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview_window"]}},"deny-get-all-webviews":{"identifier":"deny-get-all-webviews","description":"Denies the get_all_webviews command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_webviews"]}},"deny-internal-toggle-devtools":{"identifier":"deny-internal-toggle-devtools","description":"Denies the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_devtools"]}},"deny-print":{"identifier":"deny-print","description":"Denies the print command without any pre-configured scope.","commands":{"allow":[],"deny":["print"]}},"deny-reparent":{"identifier":"deny-reparent","description":"Denies the reparent command without any pre-configured scope.","commands":{"allow":[],"deny":["reparent"]}},"deny-set-webview-auto-resize":{"identifier":"deny-set-webview-auto-resize","description":"Denies the set_webview_auto_resize command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_auto_resize"]}},"deny-set-webview-background-color":{"identifier":"deny-set-webview-background-color","description":"Denies the set_webview_background_color command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_background_color"]}},"deny-set-webview-focus":{"identifier":"deny-set-webview-focus","description":"Denies the set_webview_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_focus"]}},"deny-set-webview-position":{"identifier":"deny-set-webview-position","description":"Denies the set_webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_position"]}},"deny-set-webview-size":{"identifier":"deny-set-webview-size","description":"Denies the set_webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_size"]}},"deny-set-webview-zoom":{"identifier":"deny-set-webview-zoom","description":"Denies the set_webview_zoom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_zoom"]}},"deny-webview-close":{"identifier":"deny-webview-close","description":"Denies the webview_close command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_close"]}},"deny-webview-hide":{"identifier":"deny-webview-hide","description":"Denies the webview_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_hide"]}},"deny-webview-position":{"identifier":"deny-webview-position","description":"Denies the webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_position"]}},"deny-webview-show":{"identifier":"deny-webview-show","description":"Denies the webview_show command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_show"]}},"deny-webview-size":{"identifier":"deny-webview-size","description":"Denies the webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_size"]}}},"permission_sets":{},"global_scope_schema":null},"core:window":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-windows","allow-scale-factor","allow-inner-position","allow-outer-position","allow-inner-size","allow-outer-size","allow-is-fullscreen","allow-is-minimized","allow-is-maximized","allow-is-focused","allow-is-decorated","allow-is-resizable","allow-is-maximizable","allow-is-minimizable","allow-is-closable","allow-is-visible","allow-is-enabled","allow-title","allow-current-monitor","allow-primary-monitor","allow-monitor-from-point","allow-available-monitors","allow-cursor-position","allow-theme","allow-is-always-on-top","allow-internal-toggle-maximize"]},"permissions":{"allow-available-monitors":{"identifier":"allow-available-monitors","description":"Enables the available_monitors command without any pre-configured scope.","commands":{"allow":["available_monitors"],"deny":[]}},"allow-center":{"identifier":"allow-center","description":"Enables the center command without any pre-configured scope.","commands":{"allow":["center"],"deny":[]}},"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-current-monitor":{"identifier":"allow-current-monitor","description":"Enables the current_monitor command without any pre-configured scope.","commands":{"allow":["current_monitor"],"deny":[]}},"allow-cursor-position":{"identifier":"allow-cursor-position","description":"Enables the cursor_position command without any pre-configured scope.","commands":{"allow":["cursor_position"],"deny":[]}},"allow-destroy":{"identifier":"allow-destroy","description":"Enables the destroy command without any pre-configured scope.","commands":{"allow":["destroy"],"deny":[]}},"allow-get-all-windows":{"identifier":"allow-get-all-windows","description":"Enables the get_all_windows command without any pre-configured scope.","commands":{"allow":["get_all_windows"],"deny":[]}},"allow-hide":{"identifier":"allow-hide","description":"Enables the hide command without any pre-configured scope.","commands":{"allow":["hide"],"deny":[]}},"allow-inner-position":{"identifier":"allow-inner-position","description":"Enables the inner_position command without any pre-configured scope.","commands":{"allow":["inner_position"],"deny":[]}},"allow-inner-size":{"identifier":"allow-inner-size","description":"Enables the inner_size command without any pre-configured scope.","commands":{"allow":["inner_size"],"deny":[]}},"allow-internal-toggle-maximize":{"identifier":"allow-internal-toggle-maximize","description":"Enables the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":["internal_toggle_maximize"],"deny":[]}},"allow-is-always-on-top":{"identifier":"allow-is-always-on-top","description":"Enables the is_always_on_top command without any pre-configured scope.","commands":{"allow":["is_always_on_top"],"deny":[]}},"allow-is-closable":{"identifier":"allow-is-closable","description":"Enables the is_closable command without any pre-configured scope.","commands":{"allow":["is_closable"],"deny":[]}},"allow-is-decorated":{"identifier":"allow-is-decorated","description":"Enables the is_decorated command without any pre-configured scope.","commands":{"allow":["is_decorated"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-is-focused":{"identifier":"allow-is-focused","description":"Enables the is_focused command without any pre-configured scope.","commands":{"allow":["is_focused"],"deny":[]}},"allow-is-fullscreen":{"identifier":"allow-is-fullscreen","description":"Enables the is_fullscreen command without any pre-configured scope.","commands":{"allow":["is_fullscreen"],"deny":[]}},"allow-is-maximizable":{"identifier":"allow-is-maximizable","description":"Enables the is_maximizable command without any pre-configured scope.","commands":{"allow":["is_maximizable"],"deny":[]}},"allow-is-maximized":{"identifier":"allow-is-maximized","description":"Enables the is_maximized command without any pre-configured scope.","commands":{"allow":["is_maximized"],"deny":[]}},"allow-is-minimizable":{"identifier":"allow-is-minimizable","description":"Enables the is_minimizable command without any pre-configured scope.","commands":{"allow":["is_minimizable"],"deny":[]}},"allow-is-minimized":{"identifier":"allow-is-minimized","description":"Enables the is_minimized command without any pre-configured scope.","commands":{"allow":["is_minimized"],"deny":[]}},"allow-is-resizable":{"identifier":"allow-is-resizable","description":"Enables the is_resizable command without any pre-configured scope.","commands":{"allow":["is_resizable"],"deny":[]}},"allow-is-visible":{"identifier":"allow-is-visible","description":"Enables the is_visible command without any pre-configured scope.","commands":{"allow":["is_visible"],"deny":[]}},"allow-maximize":{"identifier":"allow-maximize","description":"Enables the maximize command without any pre-configured scope.","commands":{"allow":["maximize"],"deny":[]}},"allow-minimize":{"identifier":"allow-minimize","description":"Enables the minimize command without any pre-configured scope.","commands":{"allow":["minimize"],"deny":[]}},"allow-monitor-from-point":{"identifier":"allow-monitor-from-point","description":"Enables the monitor_from_point command without any pre-configured scope.","commands":{"allow":["monitor_from_point"],"deny":[]}},"allow-outer-position":{"identifier":"allow-outer-position","description":"Enables the outer_position command without any pre-configured scope.","commands":{"allow":["outer_position"],"deny":[]}},"allow-outer-size":{"identifier":"allow-outer-size","description":"Enables the outer_size command without any pre-configured scope.","commands":{"allow":["outer_size"],"deny":[]}},"allow-primary-monitor":{"identifier":"allow-primary-monitor","description":"Enables the primary_monitor command without any pre-configured scope.","commands":{"allow":["primary_monitor"],"deny":[]}},"allow-request-user-attention":{"identifier":"allow-request-user-attention","description":"Enables the request_user_attention command without any pre-configured scope.","commands":{"allow":["request_user_attention"],"deny":[]}},"allow-scale-factor":{"identifier":"allow-scale-factor","description":"Enables the scale_factor command without any pre-configured scope.","commands":{"allow":["scale_factor"],"deny":[]}},"allow-set-always-on-bottom":{"identifier":"allow-set-always-on-bottom","description":"Enables the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":["set_always_on_bottom"],"deny":[]}},"allow-set-always-on-top":{"identifier":"allow-set-always-on-top","description":"Enables the set_always_on_top command without any pre-configured scope.","commands":{"allow":["set_always_on_top"],"deny":[]}},"allow-set-background-color":{"identifier":"allow-set-background-color","description":"Enables the set_background_color command without any pre-configured scope.","commands":{"allow":["set_background_color"],"deny":[]}},"allow-set-badge-count":{"identifier":"allow-set-badge-count","description":"Enables the set_badge_count command without any pre-configured scope.","commands":{"allow":["set_badge_count"],"deny":[]}},"allow-set-badge-label":{"identifier":"allow-set-badge-label","description":"Enables the set_badge_label command without any pre-configured scope.","commands":{"allow":["set_badge_label"],"deny":[]}},"allow-set-closable":{"identifier":"allow-set-closable","description":"Enables the set_closable command without any pre-configured scope.","commands":{"allow":["set_closable"],"deny":[]}},"allow-set-content-protected":{"identifier":"allow-set-content-protected","description":"Enables the set_content_protected command without any pre-configured scope.","commands":{"allow":["set_content_protected"],"deny":[]}},"allow-set-cursor-grab":{"identifier":"allow-set-cursor-grab","description":"Enables the set_cursor_grab command without any pre-configured scope.","commands":{"allow":["set_cursor_grab"],"deny":[]}},"allow-set-cursor-icon":{"identifier":"allow-set-cursor-icon","description":"Enables the set_cursor_icon command without any pre-configured scope.","commands":{"allow":["set_cursor_icon"],"deny":[]}},"allow-set-cursor-position":{"identifier":"allow-set-cursor-position","description":"Enables the set_cursor_position command without any pre-configured scope.","commands":{"allow":["set_cursor_position"],"deny":[]}},"allow-set-cursor-visible":{"identifier":"allow-set-cursor-visible","description":"Enables the set_cursor_visible command without any pre-configured scope.","commands":{"allow":["set_cursor_visible"],"deny":[]}},"allow-set-decorations":{"identifier":"allow-set-decorations","description":"Enables the set_decorations command without any pre-configured scope.","commands":{"allow":["set_decorations"],"deny":[]}},"allow-set-effects":{"identifier":"allow-set-effects","description":"Enables the set_effects command without any pre-configured scope.","commands":{"allow":["set_effects"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-focus":{"identifier":"allow-set-focus","description":"Enables the set_focus command without any pre-configured scope.","commands":{"allow":["set_focus"],"deny":[]}},"allow-set-focusable":{"identifier":"allow-set-focusable","description":"Enables the set_focusable command without any pre-configured scope.","commands":{"allow":["set_focusable"],"deny":[]}},"allow-set-fullscreen":{"identifier":"allow-set-fullscreen","description":"Enables the set_fullscreen command without any pre-configured scope.","commands":{"allow":["set_fullscreen"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-ignore-cursor-events":{"identifier":"allow-set-ignore-cursor-events","description":"Enables the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":["set_ignore_cursor_events"],"deny":[]}},"allow-set-max-size":{"identifier":"allow-set-max-size","description":"Enables the set_max_size command without any pre-configured scope.","commands":{"allow":["set_max_size"],"deny":[]}},"allow-set-maximizable":{"identifier":"allow-set-maximizable","description":"Enables the set_maximizable command without any pre-configured scope.","commands":{"allow":["set_maximizable"],"deny":[]}},"allow-set-min-size":{"identifier":"allow-set-min-size","description":"Enables the set_min_size command without any pre-configured scope.","commands":{"allow":["set_min_size"],"deny":[]}},"allow-set-minimizable":{"identifier":"allow-set-minimizable","description":"Enables the set_minimizable command without any pre-configured scope.","commands":{"allow":["set_minimizable"],"deny":[]}},"allow-set-overlay-icon":{"identifier":"allow-set-overlay-icon","description":"Enables the set_overlay_icon command without any pre-configured scope.","commands":{"allow":["set_overlay_icon"],"deny":[]}},"allow-set-position":{"identifier":"allow-set-position","description":"Enables the set_position command without any pre-configured scope.","commands":{"allow":["set_position"],"deny":[]}},"allow-set-progress-bar":{"identifier":"allow-set-progress-bar","description":"Enables the set_progress_bar command without any pre-configured scope.","commands":{"allow":["set_progress_bar"],"deny":[]}},"allow-set-resizable":{"identifier":"allow-set-resizable","description":"Enables the set_resizable command without any pre-configured scope.","commands":{"allow":["set_resizable"],"deny":[]}},"allow-set-shadow":{"identifier":"allow-set-shadow","description":"Enables the set_shadow command without any pre-configured scope.","commands":{"allow":["set_shadow"],"deny":[]}},"allow-set-simple-fullscreen":{"identifier":"allow-set-simple-fullscreen","description":"Enables the set_simple_fullscreen command without any pre-configured scope.","commands":{"allow":["set_simple_fullscreen"],"deny":[]}},"allow-set-size":{"identifier":"allow-set-size","description":"Enables the set_size command without any pre-configured scope.","commands":{"allow":["set_size"],"deny":[]}},"allow-set-size-constraints":{"identifier":"allow-set-size-constraints","description":"Enables the set_size_constraints command without any pre-configured scope.","commands":{"allow":["set_size_constraints"],"deny":[]}},"allow-set-skip-taskbar":{"identifier":"allow-set-skip-taskbar","description":"Enables the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":["set_skip_taskbar"],"deny":[]}},"allow-set-theme":{"identifier":"allow-set-theme","description":"Enables the set_theme command without any pre-configured scope.","commands":{"allow":["set_theme"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-title-bar-style":{"identifier":"allow-set-title-bar-style","description":"Enables the set_title_bar_style command without any pre-configured scope.","commands":{"allow":["set_title_bar_style"],"deny":[]}},"allow-set-visible-on-all-workspaces":{"identifier":"allow-set-visible-on-all-workspaces","description":"Enables the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":["set_visible_on_all_workspaces"],"deny":[]}},"allow-show":{"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]}},"allow-start-dragging":{"identifier":"allow-start-dragging","description":"Enables the start_dragging command without any pre-configured scope.","commands":{"allow":["start_dragging"],"deny":[]}},"allow-start-resize-dragging":{"identifier":"allow-start-resize-dragging","description":"Enables the start_resize_dragging command without any pre-configured scope.","commands":{"allow":["start_resize_dragging"],"deny":[]}},"allow-theme":{"identifier":"allow-theme","description":"Enables the theme command without any pre-configured scope.","commands":{"allow":["theme"],"deny":[]}},"allow-title":{"identifier":"allow-title","description":"Enables the title command without any pre-configured scope.","commands":{"allow":["title"],"deny":[]}},"allow-toggle-maximize":{"identifier":"allow-toggle-maximize","description":"Enables the toggle_maximize command without any pre-configured scope.","commands":{"allow":["toggle_maximize"],"deny":[]}},"allow-unmaximize":{"identifier":"allow-unmaximize","description":"Enables the unmaximize command without any pre-configured scope.","commands":{"allow":["unmaximize"],"deny":[]}},"allow-unminimize":{"identifier":"allow-unminimize","description":"Enables the unminimize command without any pre-configured scope.","commands":{"allow":["unminimize"],"deny":[]}},"deny-available-monitors":{"identifier":"deny-available-monitors","description":"Denies the available_monitors command without any pre-configured scope.","commands":{"allow":[],"deny":["available_monitors"]}},"deny-center":{"identifier":"deny-center","description":"Denies the center command without any pre-configured scope.","commands":{"allow":[],"deny":["center"]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-current-monitor":{"identifier":"deny-current-monitor","description":"Denies the current_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["current_monitor"]}},"deny-cursor-position":{"identifier":"deny-cursor-position","description":"Denies the cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["cursor_position"]}},"deny-destroy":{"identifier":"deny-destroy","description":"Denies the destroy command without any pre-configured scope.","commands":{"allow":[],"deny":["destroy"]}},"deny-get-all-windows":{"identifier":"deny-get-all-windows","description":"Denies the get_all_windows command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_windows"]}},"deny-hide":{"identifier":"deny-hide","description":"Denies the hide command without any pre-configured scope.","commands":{"allow":[],"deny":["hide"]}},"deny-inner-position":{"identifier":"deny-inner-position","description":"Denies the inner_position command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_position"]}},"deny-inner-size":{"identifier":"deny-inner-size","description":"Denies the inner_size command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_size"]}},"deny-internal-toggle-maximize":{"identifier":"deny-internal-toggle-maximize","description":"Denies the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_maximize"]}},"deny-is-always-on-top":{"identifier":"deny-is-always-on-top","description":"Denies the is_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["is_always_on_top"]}},"deny-is-closable":{"identifier":"deny-is-closable","description":"Denies the is_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_closable"]}},"deny-is-decorated":{"identifier":"deny-is-decorated","description":"Denies the is_decorated command without any pre-configured scope.","commands":{"allow":[],"deny":["is_decorated"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-is-focused":{"identifier":"deny-is-focused","description":"Denies the is_focused command without any pre-configured scope.","commands":{"allow":[],"deny":["is_focused"]}},"deny-is-fullscreen":{"identifier":"deny-is-fullscreen","description":"Denies the is_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["is_fullscreen"]}},"deny-is-maximizable":{"identifier":"deny-is-maximizable","description":"Denies the is_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximizable"]}},"deny-is-maximized":{"identifier":"deny-is-maximized","description":"Denies the is_maximized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximized"]}},"deny-is-minimizable":{"identifier":"deny-is-minimizable","description":"Denies the is_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimizable"]}},"deny-is-minimized":{"identifier":"deny-is-minimized","description":"Denies the is_minimized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimized"]}},"deny-is-resizable":{"identifier":"deny-is-resizable","description":"Denies the is_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_resizable"]}},"deny-is-visible":{"identifier":"deny-is-visible","description":"Denies the is_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["is_visible"]}},"deny-maximize":{"identifier":"deny-maximize","description":"Denies the maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["maximize"]}},"deny-minimize":{"identifier":"deny-minimize","description":"Denies the minimize command without any pre-configured scope.","commands":{"allow":[],"deny":["minimize"]}},"deny-monitor-from-point":{"identifier":"deny-monitor-from-point","description":"Denies the monitor_from_point command without any pre-configured scope.","commands":{"allow":[],"deny":["monitor_from_point"]}},"deny-outer-position":{"identifier":"deny-outer-position","description":"Denies the outer_position command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_position"]}},"deny-outer-size":{"identifier":"deny-outer-size","description":"Denies the outer_size command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_size"]}},"deny-primary-monitor":{"identifier":"deny-primary-monitor","description":"Denies the primary_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["primary_monitor"]}},"deny-request-user-attention":{"identifier":"deny-request-user-attention","description":"Denies the request_user_attention command without any pre-configured scope.","commands":{"allow":[],"deny":["request_user_attention"]}},"deny-scale-factor":{"identifier":"deny-scale-factor","description":"Denies the scale_factor command without any pre-configured scope.","commands":{"allow":[],"deny":["scale_factor"]}},"deny-set-always-on-bottom":{"identifier":"deny-set-always-on-bottom","description":"Denies the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_bottom"]}},"deny-set-always-on-top":{"identifier":"deny-set-always-on-top","description":"Denies the set_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_top"]}},"deny-set-background-color":{"identifier":"deny-set-background-color","description":"Denies the set_background_color command without any pre-configured scope.","commands":{"allow":[],"deny":["set_background_color"]}},"deny-set-badge-count":{"identifier":"deny-set-badge-count","description":"Denies the set_badge_count command without any pre-configured scope.","commands":{"allow":[],"deny":["set_badge_count"]}},"deny-set-badge-label":{"identifier":"deny-set-badge-label","description":"Denies the set_badge_label command without any pre-configured scope.","commands":{"allow":[],"deny":["set_badge_label"]}},"deny-set-closable":{"identifier":"deny-set-closable","description":"Denies the set_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_closable"]}},"deny-set-content-protected":{"identifier":"deny-set-content-protected","description":"Denies the set_content_protected command without any pre-configured scope.","commands":{"allow":[],"deny":["set_content_protected"]}},"deny-set-cursor-grab":{"identifier":"deny-set-cursor-grab","description":"Denies the set_cursor_grab command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_grab"]}},"deny-set-cursor-icon":{"identifier":"deny-set-cursor-icon","description":"Denies the set_cursor_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_icon"]}},"deny-set-cursor-position":{"identifier":"deny-set-cursor-position","description":"Denies the set_cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_position"]}},"deny-set-cursor-visible":{"identifier":"deny-set-cursor-visible","description":"Denies the set_cursor_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_visible"]}},"deny-set-decorations":{"identifier":"deny-set-decorations","description":"Denies the set_decorations command without any pre-configured scope.","commands":{"allow":[],"deny":["set_decorations"]}},"deny-set-effects":{"identifier":"deny-set-effects","description":"Denies the set_effects command without any pre-configured scope.","commands":{"allow":[],"deny":["set_effects"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-focus":{"identifier":"deny-set-focus","description":"Denies the set_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focus"]}},"deny-set-focusable":{"identifier":"deny-set-focusable","description":"Denies the set_focusable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focusable"]}},"deny-set-fullscreen":{"identifier":"deny-set-fullscreen","description":"Denies the set_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_fullscreen"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-ignore-cursor-events":{"identifier":"deny-set-ignore-cursor-events","description":"Denies the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":[],"deny":["set_ignore_cursor_events"]}},"deny-set-max-size":{"identifier":"deny-set-max-size","description":"Denies the set_max_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_max_size"]}},"deny-set-maximizable":{"identifier":"deny-set-maximizable","description":"Denies the set_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_maximizable"]}},"deny-set-min-size":{"identifier":"deny-set-min-size","description":"Denies the set_min_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_min_size"]}},"deny-set-minimizable":{"identifier":"deny-set-minimizable","description":"Denies the set_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_minimizable"]}},"deny-set-overlay-icon":{"identifier":"deny-set-overlay-icon","description":"Denies the set_overlay_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_overlay_icon"]}},"deny-set-position":{"identifier":"deny-set-position","description":"Denies the set_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_position"]}},"deny-set-progress-bar":{"identifier":"deny-set-progress-bar","description":"Denies the set_progress_bar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_progress_bar"]}},"deny-set-resizable":{"identifier":"deny-set-resizable","description":"Denies the set_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_resizable"]}},"deny-set-shadow":{"identifier":"deny-set-shadow","description":"Denies the set_shadow command without any pre-configured scope.","commands":{"allow":[],"deny":["set_shadow"]}},"deny-set-simple-fullscreen":{"identifier":"deny-set-simple-fullscreen","description":"Denies the set_simple_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_simple_fullscreen"]}},"deny-set-size":{"identifier":"deny-set-size","description":"Denies the set_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size"]}},"deny-set-size-constraints":{"identifier":"deny-set-size-constraints","description":"Denies the set_size_constraints command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size_constraints"]}},"deny-set-skip-taskbar":{"identifier":"deny-set-skip-taskbar","description":"Denies the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_skip_taskbar"]}},"deny-set-theme":{"identifier":"deny-set-theme","description":"Denies the set_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_theme"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-title-bar-style":{"identifier":"deny-set-title-bar-style","description":"Denies the set_title_bar_style command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title_bar_style"]}},"deny-set-visible-on-all-workspaces":{"identifier":"deny-set-visible-on-all-workspaces","description":"Denies the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible_on_all_workspaces"]}},"deny-show":{"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]}},"deny-start-dragging":{"identifier":"deny-start-dragging","description":"Denies the start_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_dragging"]}},"deny-start-resize-dragging":{"identifier":"deny-start-resize-dragging","description":"Denies the start_resize_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_resize_dragging"]}},"deny-theme":{"identifier":"deny-theme","description":"Denies the theme command without any pre-configured scope.","commands":{"allow":[],"deny":["theme"]}},"deny-title":{"identifier":"deny-title","description":"Denies the title command without any pre-configured scope.","commands":{"allow":[],"deny":["title"]}},"deny-toggle-maximize":{"identifier":"deny-toggle-maximize","description":"Denies the toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["toggle_maximize"]}},"deny-unmaximize":{"identifier":"deny-unmaximize","description":"Denies the unmaximize command without any pre-configured scope.","commands":{"allow":[],"deny":["unmaximize"]}},"deny-unminimize":{"identifier":"deny-unminimize","description":"Denies the unminimize command without any pre-configured scope.","commands":{"allow":[],"deny":["unminimize"]}}},"permission_sets":{},"global_scope_schema":null},"deep-link":{"default_permission":{"identifier":"default","description":"Allows reading the opened deep link via the get_current command","permissions":["allow-get-current"]},"permissions":{"allow-get-current":{"identifier":"allow-get-current","description":"Enables the get_current command without any pre-configured scope.","commands":{"allow":["get_current"],"deny":[]}},"allow-is-registered":{"identifier":"allow-is-registered","description":"Enables the is_registered command without any pre-configured scope.","commands":{"allow":["is_registered"],"deny":[]}},"allow-register":{"identifier":"allow-register","description":"Enables the register command without any pre-configured scope.","commands":{"allow":["register"],"deny":[]}},"allow-unregister":{"identifier":"allow-unregister","description":"Enables the unregister command without any pre-configured scope.","commands":{"allow":["unregister"],"deny":[]}},"deny-get-current":{"identifier":"deny-get-current","description":"Denies the get_current command without any pre-configured scope.","commands":{"allow":[],"deny":["get_current"]}},"deny-is-registered":{"identifier":"deny-is-registered","description":"Denies the is_registered command without any pre-configured scope.","commands":{"allow":[],"deny":["is_registered"]}},"deny-register":{"identifier":"deny-register","description":"Denies the register command without any pre-configured scope.","commands":{"allow":[],"deny":["register"]}},"deny-unregister":{"identifier":"deny-unregister","description":"Denies the unregister command without any pre-configured scope.","commands":{"allow":[],"deny":["unregister"]}}},"permission_sets":{},"global_scope_schema":null},"dialog":{"default_permission":{"identifier":"default","description":"This permission set configures the types of dialogs\navailable from the dialog plugin.\n\n#### Granted Permissions\n\nAll dialog types are enabled.\n\n\n","permissions":["allow-message","allow-save","allow-open"]},"permissions":{"allow-ask":{"identifier":"allow-ask","description":"Enables the ask command without any pre-configured scope. (**DEPRECATED**: This is now an alias to `allow-message` and will be removed in v3)","commands":{"allow":["message"],"deny":[]}},"allow-confirm":{"identifier":"allow-confirm","description":"Enables the confirm command without any pre-configured scope. (**DEPRECATED**: This is now an alias to `allow-message` and will be removed in v3)","commands":{"allow":["message"],"deny":[]}},"allow-message":{"identifier":"allow-message","description":"Enables the message command without any pre-configured scope.","commands":{"allow":["message"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-save":{"identifier":"allow-save","description":"Enables the save command without any pre-configured scope.","commands":{"allow":["save"],"deny":[]}},"deny-ask":{"identifier":"deny-ask","description":"Denies the ask command without any pre-configured scope. (**DEPRECATED**: This is now an alias to `deny-message` and will be removed in v3)","commands":{"allow":[],"deny":["message"]}},"deny-confirm":{"identifier":"deny-confirm","description":"Denies the confirm command without any pre-configured scope. (**DEPRECATED**: This is now an alias to `deny-message` and will be removed in v3)","commands":{"allow":[],"deny":["message"]}},"deny-message":{"identifier":"deny-message","description":"Denies the message command without any pre-configured scope.","commands":{"allow":[],"deny":["message"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-save":{"identifier":"deny-save","description":"Denies the save command without any pre-configured scope.","commands":{"allow":[],"deny":["save"]}}},"permission_sets":{},"global_scope_schema":null},"haptics":{"default_permission":null,"permissions":{"allow-impact-feedback":{"identifier":"allow-impact-feedback","description":"Enables the impact_feedback command without any pre-configured scope.","commands":{"allow":["impact_feedback"],"deny":[]}},"allow-notification-feedback":{"identifier":"allow-notification-feedback","description":"Enables the notification_feedback command without any pre-configured scope.","commands":{"allow":["notification_feedback"],"deny":[]}},"allow-selection-feedback":{"identifier":"allow-selection-feedback","description":"Enables the selection_feedback command without any pre-configured scope.","commands":{"allow":["selection_feedback"],"deny":[]}},"allow-vibrate":{"identifier":"allow-vibrate","description":"Enables the vibrate command without any pre-configured scope.","commands":{"allow":["vibrate"],"deny":[]}},"deny-impact-feedback":{"identifier":"deny-impact-feedback","description":"Denies the impact_feedback command without any pre-configured scope.","commands":{"allow":[],"deny":["impact_feedback"]}},"deny-notification-feedback":{"identifier":"deny-notification-feedback","description":"Denies the notification_feedback command without any pre-configured scope.","commands":{"allow":[],"deny":["notification_feedback"]}},"deny-selection-feedback":{"identifier":"deny-selection-feedback","description":"Denies the selection_feedback command without any pre-configured scope.","commands":{"allow":[],"deny":["selection_feedback"]}},"deny-vibrate":{"identifier":"deny-vibrate","description":"Denies the vibrate command without any pre-configured scope.","commands":{"allow":[],"deny":["vibrate"]}}},"permission_sets":{},"global_scope_schema":null},"http":{"default_permission":{"identifier":"default","description":"This permission set configures what kind of\nfetch operations are available from the http plugin.\n\nThis enables all fetch operations but does not\nallow explicitly any origins to be fetched. This needs to\nbe manually configured before usage.\n\n#### Granted Permissions\n\nAll fetch operations are enabled.\n\n","permissions":["allow-fetch","allow-fetch-cancel","allow-fetch-send","allow-fetch-read-body","allow-fetch-cancel-body"]},"permissions":{"allow-fetch":{"identifier":"allow-fetch","description":"Enables the fetch command without any pre-configured scope.","commands":{"allow":["fetch"],"deny":[]}},"allow-fetch-cancel":{"identifier":"allow-fetch-cancel","description":"Enables the fetch_cancel command without any pre-configured scope.","commands":{"allow":["fetch_cancel"],"deny":[]}},"allow-fetch-cancel-body":{"identifier":"allow-fetch-cancel-body","description":"Enables the fetch_cancel_body command without any pre-configured scope.","commands":{"allow":["fetch_cancel_body"],"deny":[]}},"allow-fetch-read-body":{"identifier":"allow-fetch-read-body","description":"Enables the fetch_read_body command without any pre-configured scope.","commands":{"allow":["fetch_read_body"],"deny":[]}},"allow-fetch-send":{"identifier":"allow-fetch-send","description":"Enables the fetch_send command without any pre-configured scope.","commands":{"allow":["fetch_send"],"deny":[]}},"deny-fetch":{"identifier":"deny-fetch","description":"Denies the fetch command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch"]}},"deny-fetch-cancel":{"identifier":"deny-fetch-cancel","description":"Denies the fetch_cancel command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_cancel"]}},"deny-fetch-cancel-body":{"identifier":"deny-fetch-cancel-body","description":"Denies the fetch_cancel_body command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_cancel_body"]}},"deny-fetch-read-body":{"identifier":"deny-fetch-read-body","description":"Denies the fetch_read_body command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_read_body"]}},"deny-fetch-send":{"identifier":"deny-fetch-send","description":"Denies the fetch_send command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_send"]}}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"description":"A URL that can be accessed by the webview when using the HTTP APIs. Wildcards can be used following the URL pattern standard.\n\nSee [the URL Pattern spec](https://urlpattern.spec.whatwg.org/) for more information.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin on port 443\n\n- \"https://*:*\" : allows all HTTPS origin on any port\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"","type":"string"},{"properties":{"url":{"description":"A URL that can be accessed by the webview when using the HTTP APIs. Wildcards can be used following the URL pattern standard.\n\nSee [the URL Pattern spec](https://urlpattern.spec.whatwg.org/) for more information.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin on port 443\n\n- \"https://*:*\" : allows all HTTPS origin on any port\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"","type":"string"}},"required":["url"],"type":"object"}],"description":"HTTP scope entry.","title":"HttpScopeEntry"}},"notification":{"default_permission":{"identifier":"default","description":"This permission set configures which\nnotification features are by default exposed.\n\n#### Granted Permissions\n\nIt allows all notification related features.\n\n","permissions":["allow-is-permission-granted","allow-request-permission","allow-notify","allow-register-action-types","allow-register-listener","allow-cancel","allow-get-pending","allow-remove-active","allow-get-active","allow-check-permissions","allow-show","allow-batch","allow-list-channels","allow-delete-channel","allow-create-channel","allow-permission-state"]},"permissions":{"allow-batch":{"identifier":"allow-batch","description":"Enables the batch command without any pre-configured scope.","commands":{"allow":["batch"],"deny":[]}},"allow-cancel":{"identifier":"allow-cancel","description":"Enables the cancel command without any pre-configured scope.","commands":{"allow":["cancel"],"deny":[]}},"allow-check-permissions":{"identifier":"allow-check-permissions","description":"Enables the check_permissions command without any pre-configured scope.","commands":{"allow":["check_permissions"],"deny":[]}},"allow-create-channel":{"identifier":"allow-create-channel","description":"Enables the create_channel command without any pre-configured scope.","commands":{"allow":["create_channel"],"deny":[]}},"allow-delete-channel":{"identifier":"allow-delete-channel","description":"Enables the delete_channel command without any pre-configured scope.","commands":{"allow":["delete_channel"],"deny":[]}},"allow-get-active":{"identifier":"allow-get-active","description":"Enables the get_active command without any pre-configured scope.","commands":{"allow":["get_active"],"deny":[]}},"allow-get-pending":{"identifier":"allow-get-pending","description":"Enables the get_pending command without any pre-configured scope.","commands":{"allow":["get_pending"],"deny":[]}},"allow-is-permission-granted":{"identifier":"allow-is-permission-granted","description":"Enables the is_permission_granted command without any pre-configured scope.","commands":{"allow":["is_permission_granted"],"deny":[]}},"allow-list-channels":{"identifier":"allow-list-channels","description":"Enables the list_channels command without any pre-configured scope.","commands":{"allow":["list_channels"],"deny":[]}},"allow-notify":{"identifier":"allow-notify","description":"Enables the notify command without any pre-configured scope.","commands":{"allow":["notify"],"deny":[]}},"allow-permission-state":{"identifier":"allow-permission-state","description":"Enables the permission_state command without any pre-configured scope.","commands":{"allow":["permission_state"],"deny":[]}},"allow-register-action-types":{"identifier":"allow-register-action-types","description":"Enables the register_action_types command without any pre-configured scope.","commands":{"allow":["register_action_types"],"deny":[]}},"allow-register-listener":{"identifier":"allow-register-listener","description":"Enables the register_listener command without any pre-configured scope.","commands":{"allow":["register_listener"],"deny":[]}},"allow-remove-active":{"identifier":"allow-remove-active","description":"Enables the remove_active command without any pre-configured scope.","commands":{"allow":["remove_active"],"deny":[]}},"allow-request-permission":{"identifier":"allow-request-permission","description":"Enables the request_permission command without any pre-configured scope.","commands":{"allow":["request_permission"],"deny":[]}},"allow-show":{"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]}},"deny-batch":{"identifier":"deny-batch","description":"Denies the batch command without any pre-configured scope.","commands":{"allow":[],"deny":["batch"]}},"deny-cancel":{"identifier":"deny-cancel","description":"Denies the cancel command without any pre-configured scope.","commands":{"allow":[],"deny":["cancel"]}},"deny-check-permissions":{"identifier":"deny-check-permissions","description":"Denies the check_permissions command without any pre-configured scope.","commands":{"allow":[],"deny":["check_permissions"]}},"deny-create-channel":{"identifier":"deny-create-channel","description":"Denies the create_channel command without any pre-configured scope.","commands":{"allow":[],"deny":["create_channel"]}},"deny-delete-channel":{"identifier":"deny-delete-channel","description":"Denies the delete_channel command without any pre-configured scope.","commands":{"allow":[],"deny":["delete_channel"]}},"deny-get-active":{"identifier":"deny-get-active","description":"Denies the get_active command without any pre-configured scope.","commands":{"allow":[],"deny":["get_active"]}},"deny-get-pending":{"identifier":"deny-get-pending","description":"Denies the get_pending command without any pre-configured scope.","commands":{"allow":[],"deny":["get_pending"]}},"deny-is-permission-granted":{"identifier":"deny-is-permission-granted","description":"Denies the is_permission_granted command without any pre-configured scope.","commands":{"allow":[],"deny":["is_permission_granted"]}},"deny-list-channels":{"identifier":"deny-list-channels","description":"Denies the list_channels command without any pre-configured scope.","commands":{"allow":[],"deny":["list_channels"]}},"deny-notify":{"identifier":"deny-notify","description":"Denies the notify command without any pre-configured scope.","commands":{"allow":[],"deny":["notify"]}},"deny-permission-state":{"identifier":"deny-permission-state","description":"Denies the permission_state command without any pre-configured scope.","commands":{"allow":[],"deny":["permission_state"]}},"deny-register-action-types":{"identifier":"deny-register-action-types","description":"Denies the register_action_types command without any pre-configured scope.","commands":{"allow":[],"deny":["register_action_types"]}},"deny-register-listener":{"identifier":"deny-register-listener","description":"Denies the register_listener command without any pre-configured scope.","commands":{"allow":[],"deny":["register_listener"]}},"deny-remove-active":{"identifier":"deny-remove-active","description":"Denies the remove_active command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_active"]}},"deny-request-permission":{"identifier":"deny-request-permission","description":"Denies the request_permission command without any pre-configured scope.","commands":{"allow":[],"deny":["request_permission"]}},"deny-show":{"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]}}},"permission_sets":{},"global_scope_schema":null},"opener":{"default_permission":{"identifier":"default","description":"This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer","permissions":["allow-open-url","allow-reveal-item-in-dir","allow-default-urls"]},"permissions":{"allow-default-urls":{"identifier":"allow-default-urls","description":"This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"url":"mailto:*"},{"url":"tel:*"},{"url":"http://*"},{"url":"https://*"}]}},"allow-open-path":{"identifier":"allow-open-path","description":"Enables the open_path command without any pre-configured scope.","commands":{"allow":["open_path"],"deny":[]}},"allow-open-url":{"identifier":"allow-open-url","description":"Enables the open_url command without any pre-configured scope.","commands":{"allow":["open_url"],"deny":[]}},"allow-reveal-item-in-dir":{"identifier":"allow-reveal-item-in-dir","description":"Enables the reveal_item_in_dir command without any pre-configured scope.","commands":{"allow":["reveal_item_in_dir"],"deny":[]}},"deny-open-path":{"identifier":"deny-open-path","description":"Denies the open_path command without any pre-configured scope.","commands":{"allow":[],"deny":["open_path"]}},"deny-open-url":{"identifier":"deny-open-url","description":"Denies the open_url command without any pre-configured scope.","commands":{"allow":[],"deny":["open_url"]}},"deny-reveal-item-in-dir":{"identifier":"deny-reveal-item-in-dir","description":"Denies the reveal_item_in_dir command without any pre-configured scope.","commands":{"allow":[],"deny":["reveal_item_in_dir"]}}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"properties":{"app":{"allOf":[{"$ref":"#/definitions/Application"}],"description":"An application to open this url with, for example: firefox."},"url":{"description":"A URL that can be opened by the webview when using the Opener APIs.\n\nWildcards can be used following the UNIX glob pattern.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"","type":"string"}},"required":["url"],"type":"object"},{"properties":{"app":{"allOf":[{"$ref":"#/definitions/Application"}],"description":"An application to open this path with, for example: xdg-open."},"path":{"description":"A path that can be opened by the webview when using the Opener APIs.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"}},"required":["path"],"type":"object"}],"definitions":{"Application":{"anyOf":[{"description":"Open in default application.","type":"null"},{"description":"If true, allow open with any application.","type":"boolean"},{"description":"Allow specific application to open with.","type":"string"}],"description":"Opener scope application."}},"description":"Opener scope entry.","title":"OpenerScopeEntry"}},"os":{"default_permission":{"identifier":"default","description":"This permission set configures which\noperating system information are available\nto gather from the frontend.\n\n#### Granted Permissions\n\nAll information except the host name are available.\n\n","permissions":["allow-arch","allow-exe-extension","allow-family","allow-locale","allow-os-type","allow-platform","allow-version"]},"permissions":{"allow-arch":{"identifier":"allow-arch","description":"Enables the arch command without any pre-configured scope.","commands":{"allow":["arch"],"deny":[]}},"allow-exe-extension":{"identifier":"allow-exe-extension","description":"Enables the exe_extension command without any pre-configured scope.","commands":{"allow":["exe_extension"],"deny":[]}},"allow-family":{"identifier":"allow-family","description":"Enables the family command without any pre-configured scope.","commands":{"allow":["family"],"deny":[]}},"allow-hostname":{"identifier":"allow-hostname","description":"Enables the hostname command without any pre-configured scope.","commands":{"allow":["hostname"],"deny":[]}},"allow-locale":{"identifier":"allow-locale","description":"Enables the locale command without any pre-configured scope.","commands":{"allow":["locale"],"deny":[]}},"allow-os-type":{"identifier":"allow-os-type","description":"Enables the os_type command without any pre-configured scope.","commands":{"allow":["os_type"],"deny":[]}},"allow-platform":{"identifier":"allow-platform","description":"Enables the platform command without any pre-configured scope.","commands":{"allow":["platform"],"deny":[]}},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]}},"deny-arch":{"identifier":"deny-arch","description":"Denies the arch command without any pre-configured scope.","commands":{"allow":[],"deny":["arch"]}},"deny-exe-extension":{"identifier":"deny-exe-extension","description":"Denies the exe_extension command without any pre-configured scope.","commands":{"allow":[],"deny":["exe_extension"]}},"deny-family":{"identifier":"deny-family","description":"Denies the family command without any pre-configured scope.","commands":{"allow":[],"deny":["family"]}},"deny-hostname":{"identifier":"deny-hostname","description":"Denies the hostname command without any pre-configured scope.","commands":{"allow":[],"deny":["hostname"]}},"deny-locale":{"identifier":"deny-locale","description":"Denies the locale command without any pre-configured scope.","commands":{"allow":[],"deny":["locale"]}},"deny-os-type":{"identifier":"deny-os-type","description":"Denies the os_type command without any pre-configured scope.","commands":{"allow":[],"deny":["os_type"]}},"deny-platform":{"identifier":"deny-platform","description":"Denies the platform command without any pre-configured scope.","commands":{"allow":[],"deny":["platform"]}},"deny-version":{"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]}}},"permission_sets":{},"global_scope_schema":null},"process":{"default_permission":{"identifier":"default","description":"This permission set configures which\nprocess features are by default exposed.\n\n#### Granted Permissions\n\nThis enables to quit via `allow-exit` and restart via `allow-restart`\nthe application.\n","permissions":["allow-exit","allow-restart"]},"permissions":{"allow-exit":{"identifier":"allow-exit","description":"Enables the exit command without any pre-configured scope.","commands":{"allow":["exit"],"deny":[]}},"allow-restart":{"identifier":"allow-restart","description":"Enables the restart command without any pre-configured scope.","commands":{"allow":["restart"],"deny":[]}},"deny-exit":{"identifier":"deny-exit","description":"Denies the exit command without any pre-configured scope.","commands":{"allow":[],"deny":["exit"]}},"deny-restart":{"identifier":"deny-restart","description":"Denies the restart command without any pre-configured scope.","commands":{"allow":[],"deny":["restart"]}}},"permission_sets":{},"global_scope_schema":null},"store":{"default_permission":{"identifier":"default","description":"This permission set configures what kind of\noperations are available from the store plugin.\n\n#### Granted Permissions\n\nAll operations are enabled by default.\n\n","permissions":["allow-load","allow-get-store","allow-set","allow-get","allow-has","allow-delete","allow-clear","allow-reset","allow-keys","allow-values","allow-entries","allow-length","allow-reload","allow-save"]},"permissions":{"allow-clear":{"identifier":"allow-clear","description":"Enables the clear command without any pre-configured scope.","commands":{"allow":["clear"],"deny":[]}},"allow-delete":{"identifier":"allow-delete","description":"Enables the delete command without any pre-configured scope.","commands":{"allow":["delete"],"deny":[]}},"allow-entries":{"identifier":"allow-entries","description":"Enables the entries command without any pre-configured scope.","commands":{"allow":["entries"],"deny":[]}},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]}},"allow-get-store":{"identifier":"allow-get-store","description":"Enables the get_store command without any pre-configured scope.","commands":{"allow":["get_store"],"deny":[]}},"allow-has":{"identifier":"allow-has","description":"Enables the has command without any pre-configured scope.","commands":{"allow":["has"],"deny":[]}},"allow-keys":{"identifier":"allow-keys","description":"Enables the keys command without any pre-configured scope.","commands":{"allow":["keys"],"deny":[]}},"allow-length":{"identifier":"allow-length","description":"Enables the length command without any pre-configured scope.","commands":{"allow":["length"],"deny":[]}},"allow-load":{"identifier":"allow-load","description":"Enables the load command without any pre-configured scope.","commands":{"allow":["load"],"deny":[]}},"allow-reload":{"identifier":"allow-reload","description":"Enables the reload command without any pre-configured scope.","commands":{"allow":["reload"],"deny":[]}},"allow-reset":{"identifier":"allow-reset","description":"Enables the reset command without any pre-configured scope.","commands":{"allow":["reset"],"deny":[]}},"allow-save":{"identifier":"allow-save","description":"Enables the save command without any pre-configured scope.","commands":{"allow":["save"],"deny":[]}},"allow-set":{"identifier":"allow-set","description":"Enables the set command without any pre-configured scope.","commands":{"allow":["set"],"deny":[]}},"allow-values":{"identifier":"allow-values","description":"Enables the values command without any pre-configured scope.","commands":{"allow":["values"],"deny":[]}},"deny-clear":{"identifier":"deny-clear","description":"Denies the clear command without any pre-configured scope.","commands":{"allow":[],"deny":["clear"]}},"deny-delete":{"identifier":"deny-delete","description":"Denies the delete command without any pre-configured scope.","commands":{"allow":[],"deny":["delete"]}},"deny-entries":{"identifier":"deny-entries","description":"Denies the entries command without any pre-configured scope.","commands":{"allow":[],"deny":["entries"]}},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]}},"deny-get-store":{"identifier":"deny-get-store","description":"Denies the get_store command without any pre-configured scope.","commands":{"allow":[],"deny":["get_store"]}},"deny-has":{"identifier":"deny-has","description":"Denies the has command without any pre-configured scope.","commands":{"allow":[],"deny":["has"]}},"deny-keys":{"identifier":"deny-keys","description":"Denies the keys command without any pre-configured scope.","commands":{"allow":[],"deny":["keys"]}},"deny-length":{"identifier":"deny-length","description":"Denies the length command without any pre-configured scope.","commands":{"allow":[],"deny":["length"]}},"deny-load":{"identifier":"deny-load","description":"Denies the load command without any pre-configured scope.","commands":{"allow":[],"deny":["load"]}},"deny-reload":{"identifier":"deny-reload","description":"Denies the reload command without any pre-configured scope.","commands":{"allow":[],"deny":["reload"]}},"deny-reset":{"identifier":"deny-reset","description":"Denies the reset command without any pre-configured scope.","commands":{"allow":[],"deny":["reset"]}},"deny-save":{"identifier":"deny-save","description":"Denies the save command without any pre-configured scope.","commands":{"allow":[],"deny":["save"]}},"deny-set":{"identifier":"deny-set","description":"Denies the set command without any pre-configured scope.","commands":{"allow":[],"deny":["set"]}},"deny-values":{"identifier":"deny-values","description":"Denies the values command without any pre-configured scope.","commands":{"allow":[],"deny":["values"]}}},"permission_sets":{},"global_scope_schema":null}} \ No newline at end of file diff --git a/packages/mobile/src-tauri/tauri.conf.json b/packages/mobile/src-tauri/tauri.conf.json index b3033b568584..c757ffbc4182 100644 --- a/packages/mobile/src-tauri/tauri.conf.json +++ b/packages/mobile/src-tauri/tauri.conf.json @@ -20,7 +20,7 @@ } ], "security": { - "csp": "default-src 'self' ipc: https://tauri.localhost; connect-src 'self' ipc: http://127.0.0.1:* ws://127.0.0.1:* wss://127.0.0.1:* https://huggingface.co https://*.hf.co https://*.huggingface.co https://opencode.ai; img-src 'self' data: blob: https:; style-src 'self' 'unsafe-inline'; script-src 'self' 'wasm-unsafe-eval'; font-src 'self' data:; object-src 'none'; frame-ancestors 'none'" + "csp": "default-src 'self' ipc: https://tauri.localhost; connect-src 'self' ipc: http://ipc.localhost http://127.0.0.1:* ws://127.0.0.1:* wss://127.0.0.1:* https://huggingface.co https://*.hf.co https://*.huggingface.co https://opencode.ai; img-src 'self' data: blob: https:; style-src 'self' 'unsafe-inline'; script-src 'self' 'wasm-unsafe-eval'; font-src 'self' data:; object-src 'none'; frame-ancestors 'none'" } }, "bundle": { diff --git a/packages/spec-runtime/src/index.ts b/packages/spec-runtime/src/index.ts index 54898a355a5b..64343f90930b 100644 --- a/packages/spec-runtime/src/index.ts +++ b/packages/spec-runtime/src/index.ts @@ -26,6 +26,7 @@ import type { ArtifactInput } from "@unifia/artifact-runtime" export type SpecTarget = "code" | "work" | "design" | "automate" +export const SPEC_TARGETS = ["code", "work", "design", "automate"] as const export type SpecRule = { id: string; statement: string } @@ -69,7 +70,7 @@ const VERSION = /^\d+\.\d+\.\d+$/ const CAPABILITY = /^[a-z][a-z0-9._-]{1,63}$/ const COLOR = /^#[0-9a-f]{6}$/i const TOKEN_NAME = /^[a-z][a-z0-9-]{0,31}$/ -const TARGETS: ReadonlySet = new Set(["code", "work", "design", "automate"]) +const TARGETS: ReadonlySet = new Set(SPEC_TARGETS) const MAX_RULES = 256 const MAX_STATEMENT_LENGTH = 2048 diff --git a/packages/workbench-server/package.json b/packages/workbench-server/package.json index 4325230de545..7b0aecc840b5 100644 --- a/packages/workbench-server/package.json +++ b/packages/workbench-server/package.json @@ -5,7 +5,7 @@ "type": "module", "license": "MIT", "exports": { ".": "./src/index.ts", "./bootstrap": "./src/bootstrap.ts" }, - "scripts": { "typecheck": "tsc --noEmit", "test": "bun test/server.test.ts && bun test/bootstrap.test.ts", "start": "bun src/bootstrap.ts" }, + "scripts": { "typecheck": "bun x tsc --noEmit", "test": "bun test/server.test.ts && bun test/bootstrap.test.ts && bun test/topology.test.ts && bun test/security.test.ts && bun test/cors-preflight.test.ts", "start": "bun src/bootstrap.ts" }, "dependencies": { "@unifia/contracts": "workspace:*", "@unifia/workspace-runtime": "workspace:*", "@unifia/workflow-runtime": "workspace:*", "@unifia/memory-runtime": "workspace:*", "@unifia/skill-hub": "workspace:*" }, "devDependencies": { "@types/bun": "catalog:", "@types/node": "catalog:", "typescript": "catalog:" } -} \ No newline at end of file +} diff --git a/packages/workbench-server/src/index.ts b/packages/workbench-server/src/index.ts index 1bb1e4f6afa4..0f19d32357ac 100644 --- a/packages/workbench-server/src/index.ts +++ b/packages/workbench-server/src/index.ts @@ -14,8 +14,10 @@ import type { } from "@unifia/contracts" import { FixedWindowRateLimiter, principalCanOpen, principalCanRegister, type Principal, type PrincipalAuthenticator, type RateLimiter } from "./auth.js" +import { addSecurityHeaders, checkRequestOrigin } from "./security.js" export * from "./auth.js" +export * from "./security.js" type AuditPort = { record(actor: string, capability: string, decision: "allow" | "deny" | "approval_required"): unknown } export type CapabilityDecision = "allow" | "deny" | { kind: "approval_required"; approvalId: string } @@ -113,7 +115,10 @@ export class WorkbenchServer { */ async fetch(request: Request): Promise { try { - return await this.#route(request) + const origin = checkRequestOrigin(request.headers.get("origin")) + if (!origin.allowed) return addSecurityHeaders(json(403, { error: "origin not allowed" })) + if (request.method === "OPTIONS") return addSecurityHeaders(new Response(null, { status: 204 }), origin.origin) + return addSecurityHeaders(await this.#route(request), origin.origin) } catch (error) { this.#audit.record("workbench-server", "request.error", "deny") return json(400, { error: error instanceof Error ? error.message : "request failed" }) diff --git a/packages/workbench-server/src/security.ts b/packages/workbench-server/src/security.ts new file mode 100644 index 000000000000..93d84e70c29b --- /dev/null +++ b/packages/workbench-server/src/security.ts @@ -0,0 +1,26 @@ +/* SPDX-License-Identifier: MIT */ + +export const WORKBENCH_ALLOWED_ORIGINS = ["https://tauri.localhost", "http://ipc.localhost"] as const + +export type SecurityDecision = { allowed: true; origin?: string } | { allowed: false; origin: string } + +export function checkRequestOrigin(origin: string | null, allowedOrigins: readonly string[] = WORKBENCH_ALLOWED_ORIGINS): SecurityDecision { + if (origin === null) return { allowed: true } + return allowedOrigins.includes(origin) ? { allowed: true, origin } : { allowed: false, origin } +} + +export function addSecurityHeaders(response: Response, origin?: string): Response { + const headers = new Headers(response.headers) + headers.set("x-content-type-options", "nosniff") + headers.set("referrer-policy", "no-referrer") + headers.set("cross-origin-resource-policy", "same-origin") + if (origin) { + headers.set("access-control-allow-origin", origin) + headers.set("access-control-allow-credentials", "true") + headers.set("access-control-allow-methods", "GET,POST,DELETE,OPTIONS") + headers.set("access-control-allow-headers", "authorization,content-type,last-event-id,x-unifia-file-session,x-idempotency-key") + headers.set("access-control-max-age", "600") + headers.set("vary", "origin") + } + return new Response(response.body, { status: response.status, statusText: response.statusText, headers }) +} diff --git a/packages/workbench-server/test/cors-preflight.test.ts b/packages/workbench-server/test/cors-preflight.test.ts new file mode 100644 index 000000000000..b408fd1fe2f8 --- /dev/null +++ b/packages/workbench-server/test/cors-preflight.test.ts @@ -0,0 +1,21 @@ +import { describe, expect, it } from "vitest" +import { WorkbenchServer } from "../src/index.js" + +describe("workbench CORS preflight", () => { + it("answers the native preflight without authenticating the browser request", async () => { + const server = new WorkbenchServer({ + auth: { authenticate: async () => undefined }, + workspace: {} as never, + runtime: {} as never, + audit: { record: () => undefined }, + capability: { check: async () => "deny" }, + }) + const response = await server.fetch(new Request("http://127.0.0.1/v1/workspaces", { + method: "OPTIONS", + headers: { origin: "http://ipc.localhost", "access-control-request-method": "POST" }, + })) + expect(response.status).toBe(204) + expect(response.headers.get("access-control-allow-origin")).toBe("http://ipc.localhost") + expect(response.headers.get("access-control-allow-methods")).toContain("POST") + }) +}) diff --git a/packages/workbench-server/test/security.test.ts b/packages/workbench-server/test/security.test.ts new file mode 100644 index 000000000000..f23b66397c70 --- /dev/null +++ b/packages/workbench-server/test/security.test.ts @@ -0,0 +1,18 @@ +import { describe, expect, it } from "vitest" +import { WORKBENCH_ALLOWED_ORIGINS, addSecurityHeaders, checkRequestOrigin } from "../src/security.js" + +describe("workbench origin policy", () => { + it("allows only explicit native origins and requests without an Origin header", () => { + expect(checkRequestOrigin(null).allowed).toBe(true) + expect(checkRequestOrigin(WORKBENCH_ALLOWED_ORIGINS[0]).allowed).toBe(true) + expect(checkRequestOrigin("https://evil.example").allowed).toBe(false) + }) + + it("does not emit a wildcard credential policy", () => { + const response = addSecurityHeaders(new Response("ok"), WORKBENCH_ALLOWED_ORIGINS[0]) + expect(response.headers.get("access-control-allow-origin")).toBe(WORKBENCH_ALLOWED_ORIGINS[0]) + expect(response.headers.get("access-control-allow-credentials")).toBe("true") + expect(response.headers.get("access-control-allow-methods")).toContain("OPTIONS") + expect(response.headers.get("x-content-type-options")).toBe("nosniff") + }) +}) diff --git a/packages/workbench-server/test/topology.test.ts b/packages/workbench-server/test/topology.test.ts new file mode 100644 index 000000000000..95951af4efb4 --- /dev/null +++ b/packages/workbench-server/test/topology.test.ts @@ -0,0 +1,32 @@ +/* SPDX-License-Identifier: MIT */ +import { mkdtemp, rm } from "node:fs/promises" +import os from "node:os" +import path from "node:path" +import { createWorkbenchApp, loadConfigFromEnv, startWorkbench } from "../src/bootstrap.js" + +const root = await mkdtemp(path.join(os.tmpdir(), "unifia-topology-")) +const key = "unifia-topology-signing-key-0123456789" +const log = path.join(root, ".unifia", "audit.jsonl") +try { + const config = loadConfigFromEnv({ UNIFIA_WORKBENCH_SIGNING_KEY: key, UNIFIA_WORKBENCH_PORT: "0", UNIFIA_WORKBENCH_AUDIT_LOG: log }) + const first = await startWorkbench(config) + let occupied = false + try { + await startWorkbench({ ...config, port: first.port }) + } catch { + occupied = true + } + if (!occupied) throw new Error("a second server accepted an occupied port") + + const port = first.port + await first.stop() + const second = await startWorkbench({ ...config, port }) + if (second.port !== port) throw new Error("the server did not restart on the released port") + await second.stop() + + const app = createWorkbenchApp(config) + if ((await app.server.shutdown()).length !== 0) throw new Error("an unstarted server did not shut down cleanly") + console.log("WorkbenchTopology: 3/3 passed") +} finally { + await rm(root, { recursive: true, force: true }) +} diff --git a/packages/workbench-shell/package.json b/packages/workbench-shell/package.json index f98d4343278f..2f8fd28e49f2 100644 --- a/packages/workbench-shell/package.json +++ b/packages/workbench-shell/package.json @@ -5,11 +5,12 @@ "type": "module", "license": "MIT", "exports": { - ".": "./src/index.ts" + ".": "./src/index.ts", + "./modes": "./src/modes.ts" }, "scripts": { "typecheck": "tsc --noEmit", - "test": "bun test/shell.test.ts" + "test": "bun test/shell.test.ts && bun test/modes-contract.test.ts" }, "dependencies": { "@unifia/contracts": "workspace:*" @@ -17,6 +18,7 @@ "devDependencies": { "@types/bun": "catalog:", "@types/node": "catalog:", + "@unifia/spec-runtime": "workspace:*", "typescript": "catalog:", "@tsconfig/node22": "22.0.2" } diff --git a/packages/workbench-shell/test/modes-contract.test.ts b/packages/workbench-shell/test/modes-contract.test.ts new file mode 100644 index 000000000000..2fc6e9789802 --- /dev/null +++ b/packages/workbench-shell/test/modes-contract.test.ts @@ -0,0 +1,8 @@ +/* SPDX-License-Identifier: MIT */ +import { SPEC_TARGETS } from "@unifia/spec-runtime" +import { SHELL_MODES } from "../src/modes.js" + +if (SHELL_MODES.join("\0") !== SPEC_TARGETS.join("\0")) { + throw new Error(`mode registries diverged: shell=${SHELL_MODES.join(",")} spec=${SPEC_TARGETS.join(",")}`) +} +console.log(`ModeContract: ${SHELL_MODES.length}/${SPEC_TARGETS.length} entries aligned`) diff --git a/packages/workspace-runtime/package.json b/packages/workspace-runtime/package.json index a680e9e46ee6..914f2ede424e 100644 --- a/packages/workspace-runtime/package.json +++ b/packages/workspace-runtime/package.json @@ -5,7 +5,7 @@ "type": "module", "license": "MIT", "exports": { ".": "./src/index.ts" }, - "scripts": { "typecheck": "tsc --noEmit", "test": "bun test/runtime.test.ts && bun test/storage.test.ts && bun test/queue.test.ts" }, + "scripts": { "typecheck": "bun x tsc --noEmit", "test": "bun test/runtime.test.ts && bun test/identity.test.ts && bun test/storage.test.ts && bun test/queue.test.ts" }, "dependencies": { "@unifia/contracts": "workspace:*" }, "devDependencies": { "@types/bun": "catalog:", "@types/node": "catalog:", "typescript": "catalog:" } -} \ No newline at end of file +} diff --git a/packages/workspace-runtime/test/identity.test.ts b/packages/workspace-runtime/test/identity.test.ts new file mode 100644 index 000000000000..31452b67955c --- /dev/null +++ b/packages/workspace-runtime/test/identity.test.ts @@ -0,0 +1,35 @@ +/* SPDX-License-Identifier: MIT */ +import { mkdir, mkdtemp, rm, symlink } from "node:fs/promises" +import os from "node:os" +import path from "node:path" +import { WorkspaceRuntime } from "../src/index.js" + +const root = await mkdtemp(path.join(os.tmpdir(), "unifia-identity-")) +const alias = path.join(root, "alias") +try { + await mkdir(path.join(root, "nested")) + await symlink(root, alias, "junction") + const runtime = new WorkspaceRuntime({ now: () => 1_000 }) + const first = await runtime.register({ name: "first", path: root }) + const variants = [ + path.join(root, "."), + path.join(root, "nested", ".."), + alias, + ] + for (const variant of variants) { + const same = await runtime.register({ name: "variant", path: variant }) + if (same.id !== first.id) throw new Error(`path variant produced a second workspace: ${variant}`) + } + + if (process.platform === "win32") { + const mixed = root.replaceAll(path.sep, path.sep === "\\" ? "/" : "\\") + const same = await runtime.register({ name: "mixed", path: mixed }) + if (same.id !== first.id) throw new Error("mixed path separators produced a second workspace") + const caseVariant = root.toUpperCase() + const caseSame = await runtime.register({ name: "case", path: caseVariant }) + if (caseSame.id !== first.id) throw new Error("case variant produced a second workspace") + } + console.log("WorkspaceIdentity: 5/5 passed") +} finally { + await rm(root, { recursive: true, force: true }) +} diff --git a/scripts/check-mode-registry.mjs b/scripts/check-mode-registry.mjs new file mode 100644 index 000000000000..e109b08e8d46 --- /dev/null +++ b/scripts/check-mode-registry.mjs @@ -0,0 +1,30 @@ +import { readdir, readFile } from "node:fs/promises" +import path from "node:path" + +const roots = ["packages"] +const allowed = new Set([ + path.normalize("packages/workbench-shell/src/modes.ts"), + path.normalize("packages/spec-runtime/src/index.ts"), +]) +const pattern = /(?:=|new Set<[^>]+>\()\s*\[?["'`]code["'`],\s*["'`]work["'`],\s*["'`]design["'`],\s*["'`]automate["'`]/ +const found = [] + +async function visit(dir) { + for (const entry of await readdir(dir, { withFileTypes: true })) { + const file = path.join(dir, entry.name) + if (entry.isDirectory()) { + if (entry.name !== "node_modules" && entry.name !== "dist" && entry.name !== "build") await visit(file) + continue + } + if (!/\.(?:ts|tsx|js|mjs)$/.test(entry.name)) continue + const source = await readFile(file, "utf8") + if (pattern.test(source) && !allowed.has(path.normalize(file))) found.push(file) + } +} + +for (const root of roots) await visit(root) +if (found.length > 0) { + console.error(`third mode registry detected:\n${found.join("\n")}`) + process.exit(1) +} +console.log("ModeRegistryGuard: no third registry detected") diff --git a/scripts/check-pr-size.sh b/scripts/check-pr-size.sh new file mode 100644 index 000000000000..e2da6af19b0a --- /dev/null +++ b/scripts/check-pr-size.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +set -euo pipefail + +base_ref="${1:-dev}" +excluded_regex='(^|/)(bun\.lock|package-lock\.json|pnpm-lock\.yaml)$' +generated_regex='(^|/)(dist|build|target|generated)(/|$)' + +changed_lines=0 + +while IFS=$'\t' read -r added deleted path; do + [[ -z "${path:-}" ]] && continue + normalized_path="${path//\\//}" + [[ "$normalized_path" =~ $excluded_regex ]] && continue + [[ "$normalized_path" =~ $generated_regex ]] && continue + [[ "$added" =~ ^[0-9]+$ ]] && ((changed_lines += added)) + [[ "$deleted" =~ ^[0-9]+$ ]] && ((changed_lines += deleted)) +done < <(git diff --numstat "$base_ref") + +while IFS= read -r path; do + [[ -z "$path" ]] && continue + normalized_path="${path//\\//}" + [[ "$normalized_path" =~ $excluded_regex ]] && continue + [[ "$normalized_path" =~ $generated_regex ]] && continue + [[ -f "$path" ]] && changed_lines=$((changed_lines + $(wc -l < "$path"))) +done < <(git ls-files --others --exclude-standard) + +echo "Changed lines (excluding generated and lockfiles): $changed_lines" +if (( changed_lines > 400 )); then + echo "PR size limit exceeded: $changed_lines lines > 400" >&2 + exit 1 +fi diff --git a/scripts/check-workbench-security.mjs b/scripts/check-workbench-security.mjs new file mode 100644 index 000000000000..beda1bdf6639 --- /dev/null +++ b/scripts/check-workbench-security.mjs @@ -0,0 +1,20 @@ +import { readFile } from "node:fs/promises" + +const files = { + server: "packages/workbench-server/src/security.ts", + desktop: "packages/desktop/src-tauri/tauri.conf.json", + mobile: "packages/mobile/src-tauri/tauri.conf.json", +} +const contents = Object.fromEntries(await Promise.all(Object.entries(files).map(async ([key, file]) => [key, await readFile(file, "utf8")]))); +const requiredOrigins = ["https://tauri.localhost", "http://ipc.localhost"] + +for (const origin of requiredOrigins) { + for (const [name, source] of Object.entries(contents)) { + if (!source.includes(origin)) throw new Error(`${name} is missing ${origin}`) + } +} +if (/access-control-allow-origin["']?\s*[:=]\s*["']\*["']/i.test(contents.server)) throw new Error("server contains wildcard credential CORS") +for (const name of ["desktop", "mobile"]) { + if (!contents[name].includes("object-src 'none'")) throw new Error(`${name} is missing object-src none`) +} +console.log("WorkbenchSecurityGuard: explicit origins, no wildcard credentials, object-src none") diff --git a/work_design/DECISIONS.md b/work_design/DECISIONS.md new file mode 100644 index 000000000000..50e169ee69b0 --- /dev/null +++ b/work_design/DECISIONS.md @@ -0,0 +1,64 @@ +# Work/Design decisions + +This file records decisions that apply across cards. Once recorded, they are not re-debated inside a later card. + +## D1 — Product identity + +- User-facing product name: **Unifia**. +- New implementation work must use Unifia naming. +- Historical identifiers are not introduced into new code, documentation, scripts, or generated configuration. + +## D2 — Runtime authority + +- Unifia Core remains the sole authority for sessions, providers, tools, permissions, secrets, memory, and audit. +- Work and Design are adapters and surfaces; they do not create a competing agent runtime. + +## D3 — Branch and publication boundary + +- Integration branch: `work-design`. +- No direct work on `main` or `dev`. +- No merge, push, publication, signing, or store action is performed by the implementation agent. + +## D4 — Scope discipline + +- One card at a time. +- Each card must declare its allowed files before editing. +- Existing user-owned changes outside this worktree are preserved. +- A scope expansion or unresolved license/contract ambiguity is a stop condition. + +## Open decisions + +## M3 — Wire contract + +- Authority: `@unifia/contracts/workbench-wire`, exported as a contracts subpath. +- Runtime validation is implemented by parse functions over `unknown`; the returned types are the typed contract consumed by later cards. +- The protocol fixes reconciliation rules, monotonic sequence IDs, opaque cursors, UUID v7 idempotency, explicit handshake refusal, token rotation state, binary references, backpressure budgets, and SSE connection limits. + +## M1c — Security implementation boundary + +- Server-side Origin policy allows only `https://tauri.localhost` and `http://ipc.localhost`; requests without Origin remain valid for local non-browser callers. +- Preflight is explicit and credentials are never combined with wildcard CORS. +- Existing native bridge remains the integration point; no competing runtime or browser token storage was introduced. +- Human gate remains open: prove short-lived native token injection/rotation and inert SVG rendering in the packaged Android WebView before M4. + +## M1a — Gate decisions + +The following decisions are adopted from the reviewed Unifia Work/Design plan. They are the constraints for the implementation cards; later cards must stop rather than reinterpret them. + +| Gate | Decision | +|---|---| +| G1 | A Work session is implicit for the directory, with an explicit `?session=` override. Directory registration to `workspaceId` is idempotent and server-owned. | +| G2 | Workspace identity follows worktree lifecycle events; deletion, reset, and recreation cannot silently inherit prior artifacts or trace. | +| G3 | Work and Code share an explicit single-writer boundary; the kill switch scope is operation, workspace, or server and must be visible in the audit contract. | +| G4 | The workbench server runs as a minimal local service with one instance identity, an allocated/discoverable loopback port, and single-writer persistence. | +| G5 | Design v0 renders deterministic inert SVG and previews it through an image element; no scripts, external resources, or `foreignObject`. | +| G6 | The spec format and design-system catalog source must be explicit before their implementation cards; no card may infer a source during editing. | +| G7 | User vocabulary distinguishes the existing git worktree meaning of “workspace” from the workbench workspace concept through labels and help text. | +| G8 | Mobile integration uses the existing embedded JavaScript runtime and native bridge; it does not introduce a competing runtime. | +| G9 | Audit and artifact retention, rotation, compaction, eviction, and persistence-failure behavior are explicit before production-facing storage work. | + +## M1a evidence + +- Source: `D:\Documents\Obsidian\IA_Dev_Brain\OpenCode\Plan-Work-Design-Integration-2026-08-12.md`, section 13. +- Scope: documentation only; no runtime or generated file changed. +- Operator instruction: continue sequentially after M0b on `work-design`. diff --git a/work_design/MANUAL-VERIFICATION.md b/work_design/MANUAL-VERIFICATION.md new file mode 100644 index 000000000000..0603582924a3 --- /dev/null +++ b/work_design/MANUAL-VERIFICATION.md @@ -0,0 +1,22 @@ +# Vérifications manuelles restantes + +Cette liste est la source de vérité des contrôles qui nécessitent une machine, un appareil, une interaction UI ou une décision humaine. Aucun item ne doit être marqué `PASS` sur une simple compilation. + +| ID | Gate | Procédure | Preuve attendue | Statut | +|---|---|---|---|---| +| MV-01 | Bridge natif desktop | Construire le profil debug, lancer l’application Tauri et ouvrir un mode Work avec un workspace réel. Observer l’appel natif qui fournit le jeton court ; vérifier qu’aucun secret maître n’est présent dans le JS, le local storage, l’URL ou les logs. | Capture des appels/console filtrée + chemin du build + résultat d’inspection du stockage. | `PENDING` | +| MV-02 | Rotation desktop | Maintenir un flux SSE ouvert, déclencher la rotation du jeton, vérifier l’état `rotating`, la mise en attente des sorties, l’acceptation temporaire de l’ancien jeton puis son refus après la grace period. | Trace horodatée : ancien/nouveau jeton redacted, événements de rotation, requête après expiration refusée. | `PENDING` | +| MV-03 | Android runtime | Installer le build debug Android sur un appareil identifié, ouvrir Work puis Design, revenir en arrière-plan et au premier plan. Vérifier l’absence de second runtime et la reprise du flux. | `adb` package/version, `lastUpdateTime`, captures des deux modes, trace de reprise. Un candidat unsigned a été généré le 2026-08-14 ; installation et observation restent à faire. | `PENDING` | +| MV-04 | Android SVG inert | Dans le WebView Android réel, charger un SVG via `` contenant un texte, un token de couleur et une tentative de script/ressource externe. Vérifier rendu, inertie et absence de requête externe. | Capture écran + log réseau/WebView ; le script et la ressource externe ne s’exécutent pas. | `PENDING` | +| MV-05 | Mobile write safety | Depuis Android, tenter une écriture Work/Design avec un compte de test et vérifier le refus par défaut ; vérifier qu’une approbation explicite seule permet l’action prévue. | Requête, statut, écran d’approbation, audit redacted. | `PENDING` | +| MV-06 | Navigation UI | Tester le rail Code/Work/Design/Automate, les deep links et le mode persistant après fermeture/réouverture pour deux répertoires distincts. | Matrice chemin → mode affiché, captures et absence de requête réseau sur le changement de mode. | `PENDING` | +| MV-07 | Crash/restart | Arrêter brutalement le service local pendant une session, relancer l’application, vérifier l’identité d’instance, la reprise du workspace et l’absence de contamination d’un ancien worktree. | Logs de deux instances, workspace IDs, résultat de reprise et absence de trace orpheline. | `PENDING` | +| MV-08 | Port et single-writer | Lancer deux instances sur le port configuré, puis avec port automatique ; vérifier qu’une seule devient propriétaire et que l’autre échoue proprement. | Sortie des deux processus, port effectivement lié, erreur attendue et arrêt propre. | `PENDING` | +| MV-09 | CSP | Vérifier dans les builds desktop et Android que `connect-src` autorise uniquement les origines prévues pour le bridge et le loopback, que `img-src` accepte `data:`, et que `object-src`/frames restent bloqués. | Garde statique `scripts/check-workbench-security.mjs` PASS ; CSP extraite des bundles empaquetés et test manuel des URLs autorisées/interdites restent requis. | `PENDING` | +| MV-10 | Publication gate | Avant toute PR/merge, relire la checklist, inspecter le diff, vérifier licences/SPDX, migrations/rollback et confirmer explicitement qu’aucune publication n’est demandée. | Validation humaine signée dans le checkpoint ; aucun push/merge automatique. | `PENDING` | + +## Règle de mise à jour + +- `PENDING` → `PASS` uniquement avec la preuve décrite. +- `PENDING` → `BLOCKED` si l’environnement ou l’autorisation manque ; noter la cause et ne pas contourner. +- Les secrets, certificats, tokens et captures doivent être redacted avant archivage. diff --git a/work_design/STATE.md b/work_design/STATE.md new file mode 100644 index 000000000000..34bbd234cb8b --- /dev/null +++ b/work_design/STATE.md @@ -0,0 +1,66 @@ +# Work/Design execution state + +This file is the durable execution state for the Unifia Work/Design integration. + +## Current state + +- Branch: `work-design` +- Base commit: `91daa35a26a8e44d7f35b539c91030ec1e230c54` +- Current card: `M1c` +- Status: `BLOCKED_ON_HUMAN_DEVICE_GATE` +- Commit or push performed: no + +## Cards + +| Card | Status | Evidence | Notes | +|---|---|---|---| +| M0 | completed | Branch and clean worktree verified | Base is the local `dev` branch requested for this worktree. | +| M0b | completed | State files, integration ownership map, size gate, and merge simulation workflow created | 152 changed lines measured; local checks pass. | +| M1a | completed | Nine gate decisions recorded in `DECISIONS.md` from the reviewed master plan | No code or generated output changed. | +| M1b | completed | Identity variants and port lifecycle tests added; existing bootstrap proves approval flow and loopback binding | Approval persistence across process restarts remains an M8 concern. | +| M2a | completed | Export, app dependency, lockfile, runtime coherence test, and declaration-only registry guard pass | Existing test fixtures are not treated as authorities. | +| M2b | completed | Persistent per-directory mode context, four-mode rail, sibling routes, local state page, and app tests | No network client or server route introduced. | +| M3 | completed | `@unifia/contracts/workbench-wire` typecheck + 5 tests | Executable wire schemas, reconciliation rules, cursor/idempotency/token policies, binary references, handshake and rate limits. | +| M1c | blocked on human device gate | workbench-server typecheck + security 2 tests + preflight 1 test + server 72/72 + bootstrap 40/40 + topology 3/3 | CORS/origin/preflight and aligned mobile CSP implemented. Native token injection/rotation and real Android WebView SVG proof remain required before M4. | + +## Manual verification register + +See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentionally pending until a human runs the desktop, Android, UI, lifecycle, CSP, and publication checks. + +## Validation log + +- `git status --short --branch` → clean on `work-design` +- `git log -1 --oneline` → `91daa35a26 feat: complete the Unifia rebrand and repair the desync it left behind (#23)` +- `bash scripts/check-pr-size.sh dev` → 152 changed lines, under the 400-line limit +- `.github/workflows/work-design-integrity.yml` → merge-tree, size, and whitespace checks declared +- `DECISIONS.md` M1a gate table → nine plan decisions recorded +- `bun run --cwd packages/workbench-shell test` → PASS (122/122 + mode contract 4/4) +- `bun run --cwd packages/spec-runtime test` → PASS (37/37) +- `bun run --cwd packages/app typecheck` → PASS +- `node scripts/check-mode-registry.mjs` → PASS after limiting detection to registry declarations +- `bun run --cwd packages/app typecheck` → PASS +- `bun run --cwd packages/app test:unit` → PASS (704 tests, 0 failures) +- M2b scope check → no Workbench network request or server route introduced +- `bun run --cwd packages/workspace-runtime typecheck` → PASS after making the package-local compiler invocation explicit +- `bun run --cwd packages/workspace-runtime test` → PASS (12/12 + 5/5 + 12/12 + 4/4) +- `bun run --cwd packages/workbench-server typecheck` → PASS after making the package-local compiler invocation explicit +- `bun run --cwd packages/workbench-server test` → PASS (72/72 + 40/40 + 3/3) +- `bun x tsc --noEmit -p packages/contracts/tsconfig.json` → PASS +- `bun test packages/contracts/test/workbench-wire.test.ts` → PASS (5/5) +- `bun run --cwd packages/workbench-server typecheck` → PASS after explicit origin/CORS policy +- `bun test packages/workbench-server/test/security.test.ts` → PASS (2/2) +- `bun test packages/workbench-server/test/server.test.ts` → PASS (72/72) +- `bun test packages/workbench-server/test/bootstrap.test.ts` → PASS (40/40) +- `bun test packages/workbench-server/test/topology.test.ts` → PASS (3/3) +- `node scripts/check-workbench-security.mjs` → PASS locally; CI guard added for server/desktop/mobile Origin and CSP alignment +- Android runtime preparation → PASS: Alpine `rootfs.tgz` generated at 824426778 bytes; the WSL branch and Bun-unavailable bundle reuse path in `packages/mobile/scripts/prepare-android-runtime.sh` were exercised. +- Android release build → PASS (exit 0): unsigned APK and AAB generated under `packages/mobile/src-tauri/gen/android/app/build/outputs/`; APK size 1115164803 bytes, AAB size 1066480647 bytes. +- `bun scripts/check-android-runtime.mjs` from `packages/mobile` → PASS: rootfs and 30 native libraries present. The ORT binary was supplied from an existing local prepared worktree through an ignored hardlink; no source checkout was modified. +- Android build warnings remain: Gradle reports a debuggable release build and the native ORT sync reports a Windows file-lock warning. These require review before treating the artifact as release-ready. +- No APK installation, device execution, signing, commit, push, merge, or publication was performed; MV-03/MV-04 and all other human gates remain pending. + +## Resume first + +1. Read this file, `DECISIONS.md`, and `../INTEGRATION.md`. +2. Review the M0b diff and run the CI workflow on the first PR. +3. M1c is partially implemented; do not start M4 until the native short-lived token bridge/rotation and real Android `` proof are supplied. From 5b3b46e39cc39acf50d9ce5f1162c96f8cda3bfa Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 01:33:22 +0200 Subject: [PATCH 02/76] feat(workbench): add scoped token rotation issuer --- packages/workbench-server/src/auth.ts | 118 +++++++++++++++++++- packages/workbench-server/src/bootstrap.ts | 6 +- packages/workbench-server/test/auth.test.ts | 37 ++++++ work_design/STATE.md | 3 +- 4 files changed, 160 insertions(+), 4 deletions(-) create mode 100644 packages/workbench-server/test/auth.test.ts diff --git a/packages/workbench-server/src/auth.ts b/packages/workbench-server/src/auth.ts index 4ed4d7a0f383..ff32ce6cdb5c 100644 --- a/packages/workbench-server/src/auth.ts +++ b/packages/workbench-server/src/auth.ts @@ -18,7 +18,7 @@ * proven locally. See docs/autonomy/reports/GATE-C-STATUS-2026-08-03.md. */ -import { createHmac, timingSafeEqual } from "node:crypto" +import { createHmac, randomUUID, timingSafeEqual } from "node:crypto" export type Principal = { readonly id: string @@ -31,11 +31,127 @@ export type PrincipalAuthenticator = { authenticate(request: Request): Promise } +export type ScopedTokenRequest = { + readonly principalId: string + readonly workspaceId: string + readonly instanceId: string + readonly capabilities: readonly string[] +} + +export type ScopedToken = ScopedTokenRequest & { + readonly token: string + readonly tokenId: string + readonly issuedAt: number + readonly expiresAt: number +} + +type ScopedTokenClaims = ScopedTokenRequest & { + readonly kind: "unifia-workbench" + readonly tokenId: string + readonly issuedAt: number + readonly expiresAt: number +} + +type TokenLease = { + current: ScopedTokenClaims + previous?: { claims: ScopedTokenClaims; acceptedUntil: number } +} + export type RateLimiter = { /** Returns false when the caller exceeded its budget for this window. */ take(key: string): boolean } +/** + * Mints short-lived, workspace-scoped bearer tokens while keeping the signing + * key inside the native/server process. Rotation accepts the previous token + * only during the explicit grace period; closing a scope revokes both tokens. + */ +export class ScopedTokenIssuer { + readonly #key: Buffer + readonly #ttlMs: number + readonly #gracePeriodMs: number + readonly #now: () => number + readonly #leases = new Map() + + constructor(key: string | Uint8Array, ttlMs: number, gracePeriodMs: number, now: () => number = Date.now) { + const material = typeof key === "string" ? Buffer.from(key, "utf8") : Buffer.from(key) + if (material.length < 32) throw new Error("signing key must be at least 32 bytes") + if (!Number.isSafeInteger(ttlMs) || ttlMs <= 0) throw new Error("token ttl must be a positive integer") + if (!Number.isSafeInteger(gracePeriodMs) || gracePeriodMs < 0) throw new Error("token grace period must be a non-negative integer") + this.#key = material + this.#ttlMs = ttlMs + this.#gracePeriodMs = gracePeriodMs + this.#now = now + } + + issue(request: ScopedTokenRequest): ScopedToken { + const claims = this.#claims(request) + this.#leases.set(this.#scope(request), { current: claims }) + return this.#public(claims) + } + + rotate(request: ScopedTokenRequest): { token: ScopedToken; previousToken: string | null; gracePeriodMs: number } { + const scope = this.#scope(request) + const previous = this.#leases.get(scope)?.current + const claims = this.#claims(request) + this.#leases.set(scope, { current: claims, previous: previous ? { claims: previous, acceptedUntil: claims.issuedAt + this.#gracePeriodMs } : undefined }) + return { token: this.#public(claims), previousToken: previous ? this.#encode(previous) : null, gracePeriodMs: this.#gracePeriodMs } + } + + verify(token: string): ScopedToken | undefined { + const claims = this.#decode(token) + if (!claims) return undefined + const now = this.#now() + if (now >= claims.expiresAt) return undefined + const lease = this.#leases.get(this.#scope(claims)) + if (!lease || lease.current.tokenId === claims.tokenId) return lease?.current.tokenId === claims.tokenId ? this.#public(claims) : undefined + if (lease.previous?.claims.tokenId !== claims.tokenId || now >= lease.previous.acceptedUntil) return undefined + return this.#public(claims) + } + + revoke(request: Pick): void { + this.#leases.delete(this.#scope(request)) + } + + #claims(request: ScopedTokenRequest): ScopedTokenClaims { + if (!request.principalId || !request.workspaceId || !request.instanceId) throw new Error("token scope identifiers are required") + const issuedAt = this.#now() + return { ...request, capabilities: [...new Set(request.capabilities)], kind: "unifia-workbench", tokenId: randomUUID(), issuedAt, expiresAt: issuedAt + this.#ttlMs } + } + + #scope(value: Pick): string { + return `${value.workspaceId}\u0000${value.instanceId}` + } + + #public(claims: ScopedTokenClaims): ScopedToken { + return { ...claims, token: this.#encode(claims) } + } + + #encode(claims: ScopedTokenClaims): string { + const header = Buffer.from(JSON.stringify({ alg: "HS256", typ: "JWT" })).toString("base64url") + const payload = Buffer.from(JSON.stringify(claims)).toString("base64url") + const data = `${header}.${payload}` + return `${data}.${createHmac("sha256", this.#key).update(data).digest("base64url")}` + } + + #decode(token: string): ScopedTokenClaims | undefined { + const parts = token.split(".") + if (parts.length !== 3 || !BASE64URL.test(parts[0]) || !BASE64URL.test(parts[1]) || !BASE64URL.test(parts[2])) return undefined + const supplied = Buffer.from(parts[2], "base64url") + const expected = createHmac("sha256", this.#key).update(`${parts[0]}.${parts[1]}`).digest() + if (!signaturesMatch(expected, supplied)) return undefined + try { + const header = JSON.parse(Buffer.from(parts[0], "base64url").toString("utf8")) as { alg?: unknown; typ?: unknown } + const claims = JSON.parse(Buffer.from(parts[1], "base64url").toString("utf8")) as ScopedTokenClaims + if (header.alg !== "HS256" || header.typ !== "JWT" || claims.kind !== "unifia-workbench") return undefined + if (typeof claims.tokenId !== "string" || typeof claims.workspaceId !== "string" || typeof claims.instanceId !== "string" || typeof claims.principalId !== "string") return undefined + if (!Number.isSafeInteger(claims.issuedAt) || !Number.isSafeInteger(claims.expiresAt) || !Array.isArray(claims.capabilities) || !claims.capabilities.every((capability) => typeof capability === "string")) return undefined + return claims + } catch { return undefined } + } +} + export function principalCanRegister(principal: Principal): boolean { return principal.scopes.has("workspace.register") } diff --git a/packages/workbench-server/src/bootstrap.ts b/packages/workbench-server/src/bootstrap.ts index 4a866ad4c2a1..bedacf4a8b9a 100644 --- a/packages/workbench-server/src/bootstrap.ts +++ b/packages/workbench-server/src/bootstrap.ts @@ -17,7 +17,7 @@ import { appendFileSync, mkdirSync } from "node:fs" import path from "node:path" import { ApprovalBroker, AuditRuntimeDouble, FakeRuntimeAdapter, OpenCodeRuntimeAdapter, type McpUiControlBroker, type OpenCodeRuntimeBackend, type P3Capability, type RuntimeAdapter } from "@unifia/contracts" import { WorkspaceRuntime } from "@unifia/workspace-runtime" -import { FixedWindowRateLimiter, HmacTokenAuthenticator } from "./auth.js" +import { FixedWindowRateLimiter, HmacTokenAuthenticator, ScopedTokenIssuer } from "./auth.js" import { ApprovalCapabilityGate, WorkbenchServer } from "./index.js" export type WorkbenchRuntimeKind = "fake" | "opencode" @@ -111,6 +111,7 @@ export function loadConfigFromEnv(env: Record = proc export type WorkbenchApp = { readonly server: WorkbenchServer readonly authenticator: HmacTokenAuthenticator + readonly tokenIssuer: ScopedTokenIssuer readonly audit: FileAuditSink readonly workspace: WorkspaceRuntime } @@ -129,6 +130,7 @@ export function createWorkbenchApp(config: WorkbenchConfig, surfaces: WorkbenchS if (config.runtime === "opencode" && !backend) throw new Error("runtime=opencode requires an OpenCodeRuntimeBackend") const runtime: RuntimeAdapter = config.runtime === "opencode" ? new OpenCodeRuntimeAdapter(backend as OpenCodeRuntimeBackend) : new FakeRuntimeAdapter() const authenticator = new HmacTokenAuthenticator(config.signingKey, config.issuer, config.audience) + const tokenIssuer = new ScopedTokenIssuer(config.signingKey, 5 * 60_000, 30_000) const audit = new FileAuditSink(config.auditLogPath) const workspace = new WorkspaceRuntime() const server = new WorkbenchServer({ @@ -141,7 +143,7 @@ export function createWorkbenchApp(config: WorkbenchConfig, surfaces: WorkbenchS ui: surfaces.ui, uiAllowedActions: surfaces.uiAllowedActions, }) - return { server, authenticator, audit, workspace } + return { server, authenticator, tokenIssuer, audit, workspace } } /** Starts the HTTP listener and returns a handle that shuts it down cleanly. */ diff --git a/packages/workbench-server/test/auth.test.ts b/packages/workbench-server/test/auth.test.ts new file mode 100644 index 000000000000..81d2f3c52b76 --- /dev/null +++ b/packages/workbench-server/test/auth.test.ts @@ -0,0 +1,37 @@ +import { describe, expect, test } from "bun:test" +import { ScopedTokenIssuer } from "../src/auth.js" + +describe("scoped native token issuer", () => { + test("issues a token bound to workspace and instance", () => { + let now = 1_000 + const issuer = new ScopedTokenIssuer("x".repeat(32), 100, 30, () => now) + const issued = issuer.issue({ principalId: "user", workspaceId: "workspace", instanceId: "instance", capabilities: ["workspace.read"] }) + expect(issuer.verify(issued.token)?.workspaceId).toBe("workspace") + expect(issuer.verify(issued.token)?.instanceId).toBe("instance") + expect(issuer.verify(issued.token)?.capabilities).toEqual(["workspace.read"]) + now = 1_100 + expect(issuer.verify(issued.token)).toBeUndefined() + }) + + test("accepts the previous token only during rotation grace", () => { + let now = 1_000 + const issuer = new ScopedTokenIssuer("x".repeat(32), 1_000, 30, () => now) + const first = issuer.issue({ principalId: "user", workspaceId: "workspace", instanceId: "instance", capabilities: [] }) + const rotated = issuer.rotate({ principalId: "user", workspaceId: "workspace", instanceId: "instance", capabilities: ["workspace.read"] }) + expect(rotated.previousToken).toBe(first.token) + expect(issuer.verify(first.token)?.tokenId).toBe(first.tokenId) + now += 31 + expect(issuer.verify(first.token)).toBeUndefined() + expect(issuer.verify(rotated.token.token)).toBeDefined() + }) + + test("revokes current and previous tokens when a scope closes", () => { + const issuer = new ScopedTokenIssuer("x".repeat(32), 1_000, 30) + const request = { principalId: "user", workspaceId: "workspace", instanceId: "instance", capabilities: [] as const } + const first = issuer.issue(request) + const rotated = issuer.rotate(request) + issuer.revoke(request) + expect(issuer.verify(first.token)).toBeUndefined() + expect(issuer.verify(rotated.token.token)).toBeUndefined() + }) +}) diff --git a/work_design/STATE.md b/work_design/STATE.md index 34bbd234cb8b..03a65235cf4a 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -58,9 +58,10 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - `bun scripts/check-android-runtime.mjs` from `packages/mobile` → PASS: rootfs and 30 native libraries present. The ORT binary was supplied from an existing local prepared worktree through an ignored hardlink; no source checkout was modified. - Android build warnings remain: Gradle reports a debuggable release build and the native ORT sync reports a Windows file-lock warning. These require review before treating the artifact as release-ready. - No APK installation, device execution, signing, commit, push, merge, or publication was performed; MV-03/MV-04 and all other human gates remain pending. +- M1c token implementation → `ScopedTokenIssuer` now owns workspace + instance + capability scoped tokens, short TTL, rotation grace, and close-time revocation; focused auth/security/preflight/topology validation passes (6 tests, 0 failures). ## Resume first 1. Read this file, `DECISIONS.md`, and `../INTEGRATION.md`. 2. Review the M0b diff and run the CI workflow on the first PR. -3. M1c is partially implemented; do not start M4 until the native short-lived token bridge/rotation and real Android `` proof are supplied. +3. M1c is partially implemented; the server-side issuer is present, but do not start M4 until platform-native bridge/rotation wiring and real Android `` proof are supplied. From 6b0fa29cfe26387c91f284e875704587db5d4c1d Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 01:38:54 +0200 Subject: [PATCH 03/76] feat(workbench): add typed client and event dispatcher --- packages/workbench-shell/package.json | 2 +- packages/workbench-shell/src/client.ts | 166 +++++++++++++++++++ packages/workbench-shell/src/index.ts | 1 + packages/workbench-shell/test/client.test.ts | 44 +++++ work_design/STATE.md | 10 +- 5 files changed, 218 insertions(+), 5 deletions(-) create mode 100644 packages/workbench-shell/src/client.ts create mode 100644 packages/workbench-shell/test/client.test.ts diff --git a/packages/workbench-shell/package.json b/packages/workbench-shell/package.json index 2f8fd28e49f2..1922c39820ae 100644 --- a/packages/workbench-shell/package.json +++ b/packages/workbench-shell/package.json @@ -10,7 +10,7 @@ }, "scripts": { "typecheck": "tsc --noEmit", - "test": "bun test/shell.test.ts && bun test/modes-contract.test.ts" + "test": "bun test/shell.test.ts && bun test/modes-contract.test.ts && bun test/client.test.ts" }, "dependencies": { "@unifia/contracts": "workspace:*" diff --git a/packages/workbench-shell/src/client.ts b/packages/workbench-shell/src/client.ts new file mode 100644 index 000000000000..c92e45975e66 --- /dev/null +++ b/packages/workbench-shell/src/client.ts @@ -0,0 +1,166 @@ +/* SPDX-License-Identifier: MIT */ + +import { + EVENT_MERGE_RULES, + WIRE_PROTOCOL_VERSION, + createIdempotencyKey, + parseHandshakeResponse, + parseWorkspaceEvent, + type HandshakeResponse, + type IdempotencyKey, + type OpaqueCursor, + type TokenRotation, + type WorkbenchEventType, + type WorkspaceEvent, +} from "@unifia/contracts/workbench-wire" + +export type TokenProvider = { + current(): string | undefined + refresh(): Promise + applyRotation?(rotation: TokenRotation): void +} + +export type WorkbenchClientOptions = { + baseUrl: string + instanceId: string + token: TokenProvider + fetchImpl?: typeof fetch + now?: () => number +} + +export type RequestOptions = { + method?: "GET" | "POST" | "PUT" | "DELETE" + body?: unknown + idempotencyKey?: IdempotencyKey + signal?: AbortSignal +} + +export class WorkbenchHttpError extends Error { + readonly status: number + readonly retryable: boolean + + constructor(status: number, retryable: boolean) { + super(`workbench request failed: ${status}`) + this.name = "WorkbenchHttpError" + this.status = status + this.retryable = retryable + } +} + +type EventListener = (event: WorkspaceEvent) => void + +/** Merges the single SSE stream into one observable state per workspace. */ +export class WorkbenchEventDispatcher { + readonly #listeners = new Set() + readonly #replace = new Map() + readonly #lastWins = new Map() + readonly #appendOnly: WorkspaceEvent[] = [] + #workspaceId: string | undefined + #lastSequence = 0 + #resyncRequired = false + + get lastSequence(): number { return this.#lastSequence } + get resyncRequired(): boolean { return this.#resyncRequired } + get events(): readonly WorkspaceEvent[] { return [...this.#appendOnly, ...this.#replace.values(), ...this.#lastWins.values()] } + + subscribe(listener: EventListener): () => void { + this.#listeners.add(listener) + return () => this.#listeners.delete(listener) + } + + apply(value: unknown): WorkspaceEvent { + const event = parseWorkspaceEvent(value) + if (this.#workspaceId && this.#workspaceId !== event.workspaceId) throw new Error("event workspace does not match dispatcher") + this.#workspaceId = event.workspaceId + if (event.sequenceId > this.#lastSequence + 1) this.#resyncRequired = true + this.#lastSequence = Math.max(this.#lastSequence, event.sequenceId) + const rule = EVENT_MERGE_RULES[event.type] + if (rule === "append-only") this.#appendOnly.push(event) + else if (rule === "replace") this.#replace.set(event.type, event) + else if (rule === "last-wins" || rule === "state-snapshot") this.#lastWins.set(event.type, event) + for (const listener of this.#listeners) listener(event) + return event + } + + markResynced(sequence: number, cursor?: OpaqueCursor): void { + if (!Number.isInteger(sequence) || sequence < 0) throw new Error("invalid resync sequence") + this.#lastSequence = sequence + this.#resyncRequired = false + void cursor + } +} + +/** Typed transport with fail-closed retries: mutant POSTs never replay implicitly. */ +export class WorkbenchClient { + readonly #baseUrl: string + readonly #instanceId: string + readonly #token: TokenProvider + readonly #fetch: typeof fetch + readonly #now: () => number + + constructor(options: WorkbenchClientOptions) { + this.#baseUrl = options.baseUrl.replace(/\/$/, "") + this.#instanceId = options.instanceId + this.#token = options.token + this.#fetch = options.fetchImpl ?? fetch + this.#now = options.now ?? (() => Date.now()) + } + + async handshake(): Promise { + const response = await this.#fetch(`${this.#baseUrl}/v1/handshake`, { method: "POST", headers: this.#headers() }) + const payload = await response.json() + return parseHandshakeResponse(payload) + } + + async request(path: string, options: RequestOptions = {}): Promise { + const method = options.method ?? "GET" + const canRetry = method === "GET" || method === "DELETE" || options.idempotencyKey !== undefined + let token = this.#token.current() + let response = await this.#send(path, method, token, options) + if (response.status === 401 && canRetry) { + token = await this.#token.refresh() + response = await this.#send(path, method, token, options) + } + if (!response.ok) throw new WorkbenchHttpError(response.status, response.status === 429 || response.status >= 500) + return (await response.json()) as T + } + + async *events(workspaceId: string, dispatcher: WorkbenchEventDispatcher, signal?: AbortSignal): AsyncGenerator { + const cursor = dispatcher.lastSequence > 0 ? `?after=${encodeURIComponent(String(dispatcher.lastSequence))}` : "" + const response = await this.#fetch(`${this.#baseUrl}/v1/workspaces/${encodeURIComponent(workspaceId)}/events${cursor}`, { method: "GET", headers: { ...this.#headers(), accept: "text/event-stream" }, signal }) + if (!response.ok || !response.body) throw new WorkbenchHttpError(response.status, response.status >= 500) + const reader = response.body.getReader() + const decoder = new TextDecoder() + let buffer = "" + try { + while (true) { + const chunk = await reader.read() + if (chunk.done) break + buffer += decoder.decode(chunk.value, { stream: true }) + const frames = buffer.split("\n\n") + buffer = frames.pop() ?? "" + for (const frame of frames) { + const data = frame.split("\n").find((line) => line.startsWith("data: "))?.slice(6) + if (!data) continue + const event = dispatcher.apply(JSON.parse(data)) + yield event + } + } + } finally { + reader.releaseLock() + } + } + + #headers(token = this.#token.current()): Record { + return { accept: "application/json", ...(token ? { authorization: `Bearer ${token}` } : {}), "x-unifia-instance-id": this.#instanceId, "x-unifia-client-time": String(this.#now()) } + } + + #send(path: string, method: RequestOptions["method"], token: string | undefined, options: RequestOptions): Promise { + const headers: Record = { ...this.#headers(token), ...(options.body === undefined ? {} : { "content-type": "application/json" }), ...(options.idempotencyKey ? { "idempotency-key": options.idempotencyKey } : {}) } + return this.#fetch(`${this.#baseUrl}${path}`, { method, headers, body: options.body === undefined ? undefined : JSON.stringify(options.body), signal: options.signal }) + } +} + +export function newRequestId(now = Date.now()): IdempotencyKey { + return createIdempotencyKey(now) +} diff --git a/packages/workbench-shell/src/index.ts b/packages/workbench-shell/src/index.ts index af0f63eb3338..56bb1d3989ce 100644 --- a/packages/workbench-shell/src/index.ts +++ b/packages/workbench-shell/src/index.ts @@ -1,3 +1,4 @@ /* SPDX-License-Identifier: MIT */ export { DESTRUCTIVE_ACTIONS, READ_ONLY_FUNCTIONS, SHELL_MODES, WORK_V1_FUNCTIONS, isDestructive, isReadOnly, type DestructiveAction, type ShellMode, type WorkFunction } from "./modes.js" export { ShellError, WorkbenchShell, surface, type ArtifactRef, type PreviewToken, type Provenance, type ShellOptions, type ShellRefusal, type ShellResult } from "./shell.js" +export { WorkbenchClient, WorkbenchEventDispatcher, WorkbenchHttpError, newRequestId, type RequestOptions, type TokenProvider, type WorkbenchClientOptions } from "./client.js" diff --git a/packages/workbench-shell/test/client.test.ts b/packages/workbench-shell/test/client.test.ts new file mode 100644 index 000000000000..ed45909b76f7 --- /dev/null +++ b/packages/workbench-shell/test/client.test.ts @@ -0,0 +1,44 @@ +import { WorkbenchClient, WorkbenchEventDispatcher, WorkbenchHttpError, newRequestId } from "../src/index.js" + +let checks = 0 +const check = (condition: boolean, message: string): void => { + checks += 1 + if (!condition) throw new Error(message) +} + +let token = "expired" +let refreshes = 0 +const client = new WorkbenchClient({ + baseUrl: "http://127.0.0.1:7444", + instanceId: "instance-1", + token: { + current: () => token, + refresh: async () => { refreshes += 1; token = "fresh"; return token }, + }, + fetchImpl: async (_input, init) => { + if (init?.headers && token === "expired") return new Response(null, { status: 401 }) + return new Response(JSON.stringify({ ok: true }), { status: 200, headers: { "content-type": "application/json" } }) + }, +}) + +check((await client.request<{ ok: boolean }>("/v1/read")).ok, "a GET did not retry after token refresh") +check(refreshes === 1, "GET refresh count was not exactly one") + +let postCalls = 0 +const mutant = new WorkbenchClient({ + baseUrl: "http://127.0.0.1:7444", + instanceId: "instance-1", + token: { current: () => "expired", refresh: async () => "fresh" }, + fetchImpl: async () => { postCalls += 1; return new Response(null, { status: 401 }) }, +}) +try { await mutant.request("/v1/write", { method: "POST", body: { value: 1 } }) } catch (error) { check(error instanceof WorkbenchHttpError && error.status === 401, "mutant POST returned the wrong error") } +check(postCalls === 1, "mutant POST was replayed without idempotency") + +const dispatcher = new WorkbenchEventDispatcher() +dispatcher.apply({ eventId: "1", workspaceId: "ws", sequenceId: 1, cursor: "c1", type: "operation.updated", payload: { state: "running" } }) +dispatcher.apply({ eventId: "2", workspaceId: "ws", sequenceId: 3, cursor: "c3", type: "operation.updated", payload: { state: "done" } }) +check(dispatcher.lastSequence === 3 && dispatcher.resyncRequired, "sequence gap did not request resync") +check(dispatcher.events.filter((event) => event.type === "operation.updated").length === 1, "last-wins event was not merged") +check(newRequestId().includes("-7"), "idempotency key was not UUID v7") + +console.log(`WorkbenchClient: ${checks}/${checks} passed`) diff --git a/work_design/STATE.md b/work_design/STATE.md index 03a65235cf4a..ab20db28d1c2 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -6,9 +6,9 @@ This file is the durable execution state for the Unifia Work/Design integration. - Branch: `work-design` - Base commit: `91daa35a26a8e44d7f35b539c91030ec1e230c54` -- Current card: `M1c` -- Status: `BLOCKED_ON_HUMAN_DEVICE_GATE` -- Commit or push performed: no +- Current card: `M4` +- Status: `IMPLEMENTED_WITH_DEFERRED_HUMAN_PROOFS` +- Commit or push performed: yes (`138e3b87b2`, `5b3b46e39c`) ## Cards @@ -22,6 +22,7 @@ This file is the durable execution state for the Unifia Work/Design integration. | M2b | completed | Persistent per-directory mode context, four-mode rail, sibling routes, local state page, and app tests | No network client or server route introduced. | | M3 | completed | `@unifia/contracts/workbench-wire` typecheck + 5 tests | Executable wire schemas, reconciliation rules, cursor/idempotency/token policies, binary references, handshake and rate limits. | | M1c | blocked on human device gate | workbench-server typecheck + security 2 tests + preflight 1 test + server 72/72 + bootstrap 40/40 + topology 3/3 | CORS/origin/preflight and aligned mobile CSP implemented. Native token injection/rotation and real Android WebView SVG proof remain required before M4. | +| M4 | implemented with deferred human proofs | workbench-shell typecheck + shell 122/122 + modes 4/4 + client 7/7 | Typed client, bounded retry policy, SSE cursor resume, token refresh hook, event dispatcher and merge/gap rules. Native bridge and packaged WebView proofs remain pending by explicit user decision. | ## Manual verification register @@ -59,9 +60,10 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - Android build warnings remain: Gradle reports a debuggable release build and the native ORT sync reports a Windows file-lock warning. These require review before treating the artifact as release-ready. - No APK installation, device execution, signing, commit, push, merge, or publication was performed; MV-03/MV-04 and all other human gates remain pending. - M1c token implementation → `ScopedTokenIssuer` now owns workspace + instance + capability scoped tokens, short TTL, rotation grace, and close-time revocation; focused auth/security/preflight/topology validation passes (6 tests, 0 failures). +- M4 implementation → `packages/workbench-shell/src/client.ts` adds `WorkbenchClient`, `WorkbenchEventDispatcher`, bounded authentication retry, idempotency-aware mutation handling, SSE parsing, cursor continuation, and token-rotation hook; client contract test passes 7/7. ## Resume first 1. Read this file, `DECISIONS.md`, and `../INTEGRATION.md`. 2. Review the M0b diff and run the CI workflow on the first PR. -3. M1c is partially implemented; the server-side issuer is present, but do not start M4 until platform-native bridge/rotation wiring and real Android `` proof are supplied. +3. M4 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. From 2ed127fa59af79aee7ef58338d587274dcdcfb32 Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 01:41:24 +0200 Subject: [PATCH 04/76] feat(workbench): add executable route registry --- packages/workbench-shell/package.json | 2 +- packages/workbench-shell/src/index.ts | 1 + packages/workbench-shell/src/routes.ts | 49 ++++++++++++++++++++ packages/workbench-shell/test/routes.test.ts | 12 +++++ work_design/STATE.md | 4 +- 5 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 packages/workbench-shell/src/routes.ts create mode 100644 packages/workbench-shell/test/routes.test.ts diff --git a/packages/workbench-shell/package.json b/packages/workbench-shell/package.json index 1922c39820ae..62ee3c5f6da4 100644 --- a/packages/workbench-shell/package.json +++ b/packages/workbench-shell/package.json @@ -10,7 +10,7 @@ }, "scripts": { "typecheck": "tsc --noEmit", - "test": "bun test/shell.test.ts && bun test/modes-contract.test.ts && bun test/client.test.ts" + "test": "bun test/shell.test.ts && bun test/modes-contract.test.ts && bun test/client.test.ts && bun test/routes.test.ts" }, "dependencies": { "@unifia/contracts": "workspace:*" diff --git a/packages/workbench-shell/src/index.ts b/packages/workbench-shell/src/index.ts index 56bb1d3989ce..4cdec0319b28 100644 --- a/packages/workbench-shell/src/index.ts +++ b/packages/workbench-shell/src/index.ts @@ -2,3 +2,4 @@ export { DESTRUCTIVE_ACTIONS, READ_ONLY_FUNCTIONS, SHELL_MODES, WORK_V1_FUNCTIONS, isDestructive, isReadOnly, type DestructiveAction, type ShellMode, type WorkFunction } from "./modes.js" export { ShellError, WorkbenchShell, surface, type ArtifactRef, type PreviewToken, type Provenance, type ShellOptions, type ShellRefusal, type ShellResult } from "./shell.js" export { WorkbenchClient, WorkbenchEventDispatcher, WorkbenchHttpError, newRequestId, type RequestOptions, type TokenProvider, type WorkbenchClientOptions } from "./client.js" +export { WORKBENCH_ROUTE_OPERATIONS, WORKBENCH_ROUTE_REGISTRY, routeFor, routesForLineage, type ArtifactLineage, type WorkbenchRoute, type WorkbenchTransportMethod } from "./routes.js" diff --git a/packages/workbench-shell/src/routes.ts b/packages/workbench-shell/src/routes.ts new file mode 100644 index 000000000000..2c9b9cb396e9 --- /dev/null +++ b/packages/workbench-shell/src/routes.ts @@ -0,0 +1,49 @@ +/* SPDX-License-Identifier: MIT */ + +import { WORK_V1_FUNCTIONS, type WorkFunction } from "./modes.js" + +export type ArtifactLineage = "work/document" | "design/render" +export type WorkbenchTransportMethod = "GET" | "POST" | "DELETE" + +export type WorkbenchRoute = { + readonly surface: "work" | "design" + readonly operation: WorkFunction + readonly method: WorkbenchTransportMethod + readonly route: `/v1/${string}` + readonly capability: string + readonly event: string + readonly lineage?: ArtifactLineage +} + +type RouteByWorkFunction = { readonly [FunctionName in WorkFunction]: WorkbenchRoute } + +/** + * The route matrix is intentionally a total mapped type. Adding a Work V1 + * function without registering its route is a compile-time error. + */ +export const WORKBENCH_ROUTE_REGISTRY: RouteByWorkFunction = { + "workspace-switcher": { surface: "work", operation: "workspace-switcher", method: "GET", route: "/v1/workspaces", capability: "workspace.open", event: "workspace.changed" }, + "session-chat": { surface: "work", operation: "session-chat", method: "POST", route: "/v1/sessions/:sessionId/prompt", capability: "session.prompt", event: "operation.updated" }, + files: { surface: "work", operation: "files", method: "GET", route: "/v1/files/read", capability: "workspace.read", event: "workspace.changed" }, + search: { surface: "work", operation: "search", method: "GET", route: "/v1/files/search", capability: "workspace.read", event: "workspace.changed" }, + artifacts: { surface: "work", operation: "artifacts", method: "GET", route: "/v1/artifacts", capability: "workspace.read", event: "catalog.updated", lineage: "work/document" }, + documents: { surface: "work", operation: "documents", method: "GET", route: "/v1/documents", capability: "workspace.read", event: "catalog.updated", lineage: "work/document" }, + trace: { surface: "work", operation: "trace", method: "GET", route: "/v1/trace", capability: "trace.read", event: "trace.appended" }, + approvals: { surface: "work", operation: "approvals", method: "GET", route: "/v1/approvals", capability: "approval.read", event: "approval.updated" }, + "activity-log": { surface: "work", operation: "activity-log", method: "GET", route: "/v1/activity", capability: "trace.read", event: "trace.appended" }, + "capability-picker": { surface: "work", operation: "capability-picker", method: "GET", route: "/v1/capabilities", capability: "capability.read", event: "catalog.updated" }, + export: { surface: "design", operation: "export", method: "POST", route: "/v1/artifacts/export", capability: "artifact.export", event: "operation.updated", lineage: "design/render" }, +} + +export const WORKBENCH_ROUTE_OPERATIONS = Object.keys(WORKBENCH_ROUTE_REGISTRY) as WorkFunction[] + +export function routeFor(operation: WorkFunction): WorkbenchRoute { + return WORKBENCH_ROUTE_REGISTRY[operation] +} + +export function routesForLineage(lineage: ArtifactLineage): readonly WorkbenchRoute[] { + return WORKBENCH_ROUTE_OPERATIONS.map((operation) => WORKBENCH_ROUTE_REGISTRY[operation]).filter((route) => route.lineage === lineage) +} + +const missingOperations = WORK_V1_FUNCTIONS.filter((operation) => !WORKBENCH_ROUTE_OPERATIONS.includes(operation)) +if (missingOperations.length > 0) throw new Error(`route registry is missing Work V1 operations: ${missingOperations.join(", ")}`) diff --git a/packages/workbench-shell/test/routes.test.ts b/packages/workbench-shell/test/routes.test.ts new file mode 100644 index 000000000000..eb783dff8515 --- /dev/null +++ b/packages/workbench-shell/test/routes.test.ts @@ -0,0 +1,12 @@ +import { WORKBENCH_ROUTE_OPERATIONS, WORKBENCH_ROUTE_REGISTRY, routeFor, routesForLineage } from "../src/index.js" + +const expected = ["workspace-switcher", "session-chat", "files", "search", "artifacts", "documents", "trace", "approvals", "activity-log", "capability-picker", "export"] +if (WORKBENCH_ROUTE_OPERATIONS.length !== expected.length) throw new Error("route registry cardinality changed") +for (const operation of expected) { + if (!WORKBENCH_ROUTE_OPERATIONS.includes(operation as never)) throw new Error(`route missing: ${operation}`) + if (routeFor(operation as never).operation !== operation) throw new Error(`route operation mismatch: ${operation}`) +} +if (Object.keys(WORKBENCH_ROUTE_REGISTRY).length !== expected.length) throw new Error("route registry is not total") +if (routesForLineage("work/document").some((route) => route.lineage !== "work/document")) throw new Error("work lineage crossed") +if (routesForLineage("design/render").some((route) => route.lineage !== "design/render")) throw new Error("design lineage crossed") +console.log(`WorkbenchRoutes: ${expected.length}/${expected.length} entries aligned`) diff --git a/work_design/STATE.md b/work_design/STATE.md index ab20db28d1c2..0237470afcc7 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -23,6 +23,7 @@ This file is the durable execution state for the Unifia Work/Design integration. | M3 | completed | `@unifia/contracts/workbench-wire` typecheck + 5 tests | Executable wire schemas, reconciliation rules, cursor/idempotency/token policies, binary references, handshake and rate limits. | | M1c | blocked on human device gate | workbench-server typecheck + security 2 tests + preflight 1 test + server 72/72 + bootstrap 40/40 + topology 3/3 | CORS/origin/preflight and aligned mobile CSP implemented. Native token injection/rotation and real Android WebView SVG proof remain required before M4. | | M4 | implemented with deferred human proofs | workbench-shell typecheck + shell 122/122 + modes 4/4 + client 7/7 | Typed client, bounded retry policy, SSE cursor resume, token refresh hook, event dispatcher and merge/gap rules. Native bridge and packaged WebView proofs remain pending by explicit user decision. | +| M5 | implemented with deferred human proofs | workbench-shell typecheck + shell 122/122 + modes 4/4 + client 7/7 + routes 11/11 | Total typed route registry with compile-time Work V1 coverage and explicit work/document versus design/render lineage. | ## Manual verification register @@ -61,9 +62,10 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - No APK installation, device execution, signing, commit, push, merge, or publication was performed; MV-03/MV-04 and all other human gates remain pending. - M1c token implementation → `ScopedTokenIssuer` now owns workspace + instance + capability scoped tokens, short TTL, rotation grace, and close-time revocation; focused auth/security/preflight/topology validation passes (6 tests, 0 failures). - M4 implementation → `packages/workbench-shell/src/client.ts` adds `WorkbenchClient`, `WorkbenchEventDispatcher`, bounded authentication retry, idempotency-aware mutation handling, SSE parsing, cursor continuation, and token-rotation hook; client contract test passes 7/7. +- M5 implementation → `packages/workbench-shell/src/routes.ts` adds total `WORKBENCH_ROUTE_REGISTRY`, route helpers, capability/event mapping, and artifact lineage discriminants; route contract passes 11/11. ## Resume first 1. Read this file, `DECISIONS.md`, and `../INTEGRATION.md`. 2. Review the M0b diff and run the CI workflow on the first PR. -3. M4 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. +3. M5 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. From 916f8b69739db148991e174a3b08dbc4bd1e1f8f Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 01:44:44 +0200 Subject: [PATCH 05/76] feat(workbench): add resumable operations and cancellation --- packages/workbench-server/src/index.ts | 32 +++++++++- packages/workbench-server/src/operations.ts | 59 +++++++++++++++++++ .../workbench-server/test/operations.test.ts | 21 +++++++ packages/workbench-shell/src/index.ts | 2 +- packages/workbench-shell/src/routes.ts | 13 ++++ work_design/STATE.md | 4 +- 6 files changed, 127 insertions(+), 4 deletions(-) create mode 100644 packages/workbench-server/src/operations.ts create mode 100644 packages/workbench-server/test/operations.test.ts diff --git a/packages/workbench-server/src/index.ts b/packages/workbench-server/src/index.ts index 0f19d32357ac..62a0053a5c74 100644 --- a/packages/workbench-server/src/index.ts +++ b/packages/workbench-server/src/index.ts @@ -13,11 +13,14 @@ import type { WorkspacePort, } from "@unifia/contracts" +import { randomUUID } from "node:crypto" import { FixedWindowRateLimiter, principalCanOpen, principalCanRegister, type Principal, type PrincipalAuthenticator, type RateLimiter } from "./auth.js" +import { OperationRegistry } from "./operations.js" import { addSecurityHeaders, checkRequestOrigin } from "./security.js" export * from "./auth.js" export * from "./security.js" +export * from "./operations.js" type AuditPort = { record(actor: string, capability: string, decision: "allow" | "deny" | "approval_required"): unknown } export type CapabilityDecision = "allow" | "deny" | { kind: "approval_required"; approvalId: string } @@ -84,6 +87,7 @@ export class WorkbenchServer { readonly #skillHub?: SkillRegistry readonly #auth: PrincipalAuthenticator readonly #rateLimiter: RateLimiter + readonly #operations = new OperationRegistry(() => `operation-${randomUUID()}`) constructor(dependencies: ServerDependencies) { this.#auth = dependencies.auth @@ -137,6 +141,7 @@ export class WorkbenchServer { if (segments[1] === "workspaces" && segments[3] === "sessions") return this.#sessions(request, segments[2]) if (segments[1] === "sessions" && segments[3] === "prompt" && request.method === "POST") return this.#prompt(request, segments[2]) if (segments[1] === "sessions" && segments[3] === "events" && request.method === "GET") return this.#events(request, segments[2]) + if (segments[1] === "operations" && segments[3] === "cancel" && request.method === "POST") return this.#cancelOperation(request, segments[2]) if (segments[1] === "files" && (segments[2] === "read" || segments[2] === "write") && request.method === "POST") return this.#files(request, segments[2]) if (segments[1] === "file-sessions" && request.method === "DELETE") return this.#closeFileSession(request, segments[2]) if (segments[1] === "approvals" && (request.method === "POST" || request.method === "DELETE")) return this.#approval(request, segments[2]) @@ -223,9 +228,32 @@ export class WorkbenchServer { if (!token || !workspaceId) return this.#deny("session.prompt.scope", 403) const input = await body(request) if (typeof input.prompt !== "string") return this.#deny("session.prompt", 400) - await this.#runtime.sendPrompt({ sessionId, prompt: input.prompt }) + const operation = this.#operations.start(workspaceId, sessionId, typeof input.idempotencyKey === "string" ? input.idempotencyKey : undefined) + if (operation.state === "completed") return json(202, { accepted: true, workspaceId, operationId: operation.id }) + void this.#runPrompt(operation.id, sessionId, input.prompt) this.#allow("session.prompt") - return json(202, { accepted: true, workspaceId }) + return json(202, { accepted: true, workspaceId, operationId: operation.id }) + } + + async #runPrompt(operationId: string, sessionId: string, prompt: string): Promise { + try { + await this.#runtime.sendPrompt({ sessionId, prompt }) + this.#operations.complete(operationId) + } catch (error) { + this.#operations.fail(operationId, error) + } + } + + async #cancelOperation(request: Request, operationId: string): Promise { + const operation = this.#operations.get(operationId) + if (!operation || !this.#authorize(request, operation.workspaceId)) return this.#deny("operation.cancel.scope", 403) + const gate = await this.#checkCapability("workspace.watch", operation.workspaceId) + if (gate) return gate + const cancelled = this.#operations.cancel(operationId) + if (!cancelled) return this.#deny("operation.cancel", 409) + await this.#runtime.cancelSession(operation.sessionId) + this.#allow("operation.cancel") + return json(200, { operation: cancelled }) } async #files(request: Request, operation: "read" | "write"): Promise { diff --git a/packages/workbench-server/src/operations.ts b/packages/workbench-server/src/operations.ts new file mode 100644 index 000000000000..859822aa38d1 --- /dev/null +++ b/packages/workbench-server/src/operations.ts @@ -0,0 +1,59 @@ +/* SPDX-License-Identifier: MIT */ + +export type OperationState = "pending" | "running" | "completed" | "cancelled" | "failed" + +export type WorkbenchOperation = { + readonly id: string + readonly workspaceId: string + readonly sessionId: string + readonly createdAt: number + state: OperationState + error?: string +} + +export class OperationRegistry { + readonly #operations = new Map() + readonly #byIdempotency = new Map() + readonly #nextId: () => string + readonly #now: () => number + + constructor(nextId: () => string, now: () => number = Date.now) { + this.#nextId = nextId + this.#now = now + } + + start(workspaceId: string, sessionId: string, idempotencyKey?: string): WorkbenchOperation { + if (idempotencyKey) { + const existing = this.#byIdempotency.get(idempotencyKey) + if (existing) return this.#operations.get(existing) as WorkbenchOperation + } + const operation: WorkbenchOperation = { id: this.#nextId(), workspaceId, sessionId, createdAt: this.#now(), state: "running" } + this.#operations.set(operation.id, operation) + if (idempotencyKey) this.#byIdempotency.set(idempotencyKey, operation.id) + return operation + } + + complete(id: string): WorkbenchOperation | undefined { + const operation = this.#operations.get(id) + if (!operation || operation.state === "cancelled") return operation + operation.state = "completed" + return operation + } + + fail(id: string, error: unknown): WorkbenchOperation | undefined { + const operation = this.#operations.get(id) + if (!operation || operation.state === "cancelled") return operation + operation.state = "failed" + operation.error = error instanceof Error ? error.message : "operation failed" + return operation + } + + cancel(id: string): WorkbenchOperation | undefined { + const operation = this.#operations.get(id) + if (!operation || operation.state === "completed" || operation.state === "failed") return undefined + operation.state = "cancelled" + return operation + } + + get(id: string): WorkbenchOperation | undefined { return this.#operations.get(id) } +} diff --git a/packages/workbench-server/test/operations.test.ts b/packages/workbench-server/test/operations.test.ts new file mode 100644 index 000000000000..565593f8adc2 --- /dev/null +++ b/packages/workbench-server/test/operations.test.ts @@ -0,0 +1,21 @@ +import { describe, expect, test } from "bun:test" +import { OperationRegistry } from "../src/operations.js" + +describe("operation registry", () => { + test("deduplicates idempotent starts and cancels active work", () => { + let sequence = 0 + const registry = new OperationRegistry(() => `op-${++sequence}`, () => 100) + const first = registry.start("workspace", "session", "request-1") + const duplicate = registry.start("workspace", "session", "request-1") + expect(duplicate.id).toBe(first.id) + expect(registry.cancel(first.id)?.state).toBe("cancelled") + expect(registry.complete(first.id)?.state).toBe("cancelled") + }) + + test("does not cancel completed work", () => { + const registry = new OperationRegistry(() => "op-1") + const operation = registry.start("workspace", "session") + registry.complete(operation.id) + expect(registry.cancel(operation.id)).toBeUndefined() + }) +}) diff --git a/packages/workbench-shell/src/index.ts b/packages/workbench-shell/src/index.ts index 4cdec0319b28..3324fe56c8a2 100644 --- a/packages/workbench-shell/src/index.ts +++ b/packages/workbench-shell/src/index.ts @@ -2,4 +2,4 @@ export { DESTRUCTIVE_ACTIONS, READ_ONLY_FUNCTIONS, SHELL_MODES, WORK_V1_FUNCTIONS, isDestructive, isReadOnly, type DestructiveAction, type ShellMode, type WorkFunction } from "./modes.js" export { ShellError, WorkbenchShell, surface, type ArtifactRef, type PreviewToken, type Provenance, type ShellOptions, type ShellRefusal, type ShellResult } from "./shell.js" export { WorkbenchClient, WorkbenchEventDispatcher, WorkbenchHttpError, newRequestId, type RequestOptions, type TokenProvider, type WorkbenchClientOptions } from "./client.js" -export { WORKBENCH_ROUTE_OPERATIONS, WORKBENCH_ROUTE_REGISTRY, routeFor, routesForLineage, type ArtifactLineage, type WorkbenchRoute, type WorkbenchTransportMethod } from "./routes.js" +export { M6_SERVER_ROUTE_REGISTRY, WORKBENCH_ROUTE_OPERATIONS, WORKBENCH_ROUTE_REGISTRY, routeFor, routesForLineage, type ArtifactLineage, type WorkbenchRoute, type WorkbenchServerRoute, type WorkbenchTransportMethod } from "./routes.js" diff --git a/packages/workbench-shell/src/routes.ts b/packages/workbench-shell/src/routes.ts index 2c9b9cb396e9..bf2f2a0495c0 100644 --- a/packages/workbench-shell/src/routes.ts +++ b/packages/workbench-shell/src/routes.ts @@ -45,5 +45,18 @@ export function routesForLineage(lineage: ArtifactLineage): readonly WorkbenchRo return WORKBENCH_ROUTE_OPERATIONS.map((operation) => WORKBENCH_ROUTE_REGISTRY[operation]).filter((route) => route.lineage === lineage) } +export type WorkbenchServerRoute = { + readonly method: WorkbenchTransportMethod + readonly route: `/v1/${string}` + readonly capability: string + readonly event: string +} + +/** M6 routes are registered here before the server implementation consumes them. */ +export const M6_SERVER_ROUTE_REGISTRY = { + sessionEvents: { method: "GET", route: "/v1/sessions/:sessionId/events", capability: "workspace.watch", event: "trace.appended" }, + operationCancel: { method: "POST", route: "/v1/operations/:operationId/cancel", capability: "workspace.watch", event: "operation.updated" }, +} as const satisfies Record + const missingOperations = WORK_V1_FUNCTIONS.filter((operation) => !WORKBENCH_ROUTE_OPERATIONS.includes(operation)) if (missingOperations.length > 0) throw new Error(`route registry is missing Work V1 operations: ${missingOperations.join(", ")}`) diff --git a/work_design/STATE.md b/work_design/STATE.md index 0237470afcc7..db82cdf790c6 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -24,6 +24,7 @@ This file is the durable execution state for the Unifia Work/Design integration. | M1c | blocked on human device gate | workbench-server typecheck + security 2 tests + preflight 1 test + server 72/72 + bootstrap 40/40 + topology 3/3 | CORS/origin/preflight and aligned mobile CSP implemented. Native token injection/rotation and real Android WebView SVG proof remain required before M4. | | M4 | implemented with deferred human proofs | workbench-shell typecheck + shell 122/122 + modes 4/4 + client 7/7 | Typed client, bounded retry policy, SSE cursor resume, token refresh hook, event dispatcher and merge/gap rules. Native bridge and packaged WebView proofs remain pending by explicit user decision. | | M5 | implemented with deferred human proofs | workbench-shell typecheck + shell 122/122 + modes 4/4 + client 7/7 + routes 11/11 | Total typed route registry with compile-time Work V1 coverage and explicit work/document versus design/render lineage. | +| M6 | implemented with deferred human proofs | workbench-server typecheck + server 72/72 + bootstrap 40/40 + security/preflight/topology + operations 2/2 | Reconnectable session SSE remains cursor-based; long prompt operations now receive idempotent operation IDs and can be cancelled through a scoped route. | ## Manual verification register @@ -63,9 +64,10 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - M1c token implementation → `ScopedTokenIssuer` now owns workspace + instance + capability scoped tokens, short TTL, rotation grace, and close-time revocation; focused auth/security/preflight/topology validation passes (6 tests, 0 failures). - M4 implementation → `packages/workbench-shell/src/client.ts` adds `WorkbenchClient`, `WorkbenchEventDispatcher`, bounded authentication retry, idempotency-aware mutation handling, SSE parsing, cursor continuation, and token-rotation hook; client contract test passes 7/7. - M5 implementation → `packages/workbench-shell/src/routes.ts` adds total `WORKBENCH_ROUTE_REGISTRY`, route helpers, capability/event mapping, and artifact lineage discriminants; route contract passes 11/11. +- M6 implementation → operation registry adds idempotent operation tracking, asynchronous prompt execution, scoped cancellation, and typed M6 route registration; operation tests pass 2/2 and existing server suites remain green. ## Resume first 1. Read this file, `DECISIONS.md`, and `../INTEGRATION.md`. 2. Review the M0b diff and run the CI workflow on the first PR. -3. M5 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. +3. M6 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. From 857bd673062b87719d3c39c0fc36f683eef384b1 Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 01:55:48 +0200 Subject: [PATCH 06/76] feat(workbench): add bounded workspace file index --- .../contracts/examples/02-workspace-files.ts | 3 ++ packages/contracts/examples/07-fake-impl.ts | 2 + .../contracts/examples/08-integration-test.ts | 2 + packages/contracts/src/workspace.ts | 9 ++++ packages/contracts/test/contracts.test.ts | 2 + packages/workbench-server/src/index.ts | 17 +++++++ packages/workbench-server/test/server.test.ts | 9 +++- packages/workbench-shell/src/routes.ts | 6 +++ packages/workspace-runtime/src/index.ts | 47 +++++++++++++++++++ .../workspace-runtime/test/runtime.test.ts | 8 +++- work_design/STATE.md | 8 ++-- 11 files changed, 108 insertions(+), 5 deletions(-) diff --git a/packages/contracts/examples/02-workspace-files.ts b/packages/contracts/examples/02-workspace-files.ts index 8969a0c4f17e..dca25d21488f 100644 --- a/packages/contracts/examples/02-workspace-files.ts +++ b/packages/contracts/examples/02-workspace-files.ts @@ -62,6 +62,9 @@ class MemoryWorkspace implements WorkspacePort { }) } + async list() { return [] } + async search() { return [] } + async *watch(session: string): AsyncIterable { const callbacks = new Set<(e: FileEvent) => void>() this.watchers.set(session, callbacks) diff --git a/packages/contracts/examples/07-fake-impl.ts b/packages/contracts/examples/07-fake-impl.ts index 2df2f2ab700c..ecdf8c0e2f09 100644 --- a/packages/contracts/examples/07-fake-impl.ts +++ b/packages/contracts/examples/07-fake-impl.ts @@ -80,6 +80,8 @@ class FakeWorkspacePort implements WorkspacePort { return { path: w.path, bytesWritten: content.length, sha: "fake-sha" } }) } + async list() { return [] } + async search() { return [] } async *watch(_session: string) { // No events in fake } diff --git a/packages/contracts/examples/08-integration-test.ts b/packages/contracts/examples/08-integration-test.ts index 1a45a4b40e6a..63625d54605f 100644 --- a/packages/contracts/examples/08-integration-test.ts +++ b/packages/contracts/examples/08-integration-test.ts @@ -56,6 +56,8 @@ class MemWorkspace implements WorkspacePort { return { path: w.path, bytesWritten: c.length, sha: "x" } }) } + async list() { return [] } + async search() { return [] } async *watch() {} async close() {} } diff --git a/packages/contracts/src/workspace.ts b/packages/contracts/src/workspace.ts index 6e9bfd3da5a6..804221c51ed0 100644 --- a/packages/contracts/src/workspace.ts +++ b/packages/contracts/src/workspace.ts @@ -49,11 +49,20 @@ export interface FileEvent { timestamp: number } +export interface WorkspaceEntry { + path: string + kind: "file" | "directory" + size: number + modifiedAt: number +} + export interface WorkspacePort { register(input: { name: string; path: string }): Promise open(id: WorkspaceId): Promise read(session: FileSessionId, paths: string[]): Promise write(session: FileSessionId, writes: FileWrite[]): Promise + list(session: FileSessionId, prefix?: string): Promise + search(session: FileSessionId, query: string, prefix?: string): Promise watch(session: FileSessionId): AsyncIterable close(session: FileSessionId): Promise } diff --git a/packages/contracts/test/contracts.test.ts b/packages/contracts/test/contracts.test.ts index f44b4878ed6f..03e165c35f3f 100644 --- a/packages/contracts/test/contracts.test.ts +++ b/packages/contracts/test/contracts.test.ts @@ -71,6 +71,8 @@ describe("@unifia/contracts", () => { open: async () => ({ id: "w1", token: "tok" }), read: async () => [], write: async () => [], + list: async () => [], + search: async () => [], watch: async function* () {}, close: async () => {}, } diff --git a/packages/workbench-server/src/index.ts b/packages/workbench-server/src/index.ts index 62a0053a5c74..baa3b520ecab 100644 --- a/packages/workbench-server/src/index.ts +++ b/packages/workbench-server/src/index.ts @@ -143,6 +143,7 @@ export class WorkbenchServer { if (segments[1] === "sessions" && segments[3] === "events" && request.method === "GET") return this.#events(request, segments[2]) if (segments[1] === "operations" && segments[3] === "cancel" && request.method === "POST") return this.#cancelOperation(request, segments[2]) if (segments[1] === "files" && (segments[2] === "read" || segments[2] === "write") && request.method === "POST") return this.#files(request, segments[2]) + if (segments[1] === "files" && (segments[2] === "list" || segments[2] === "search") && request.method === "GET") return this.#fileIndex(request, segments[2]) if (segments[1] === "file-sessions" && request.method === "DELETE") return this.#closeFileSession(request, segments[2]) if (segments[1] === "approvals" && (request.method === "POST" || request.method === "DELETE")) return this.#approval(request, segments[2]) if (segments[1] === "browser" && request.method === "POST") return this.#browserAction(request, segments[2]) @@ -276,6 +277,22 @@ export class WorkbenchServer { return json(200, { results: results as unknown as JsonRecord[] }) } + async #fileIndex(request: Request, operation: "list" | "search"): Promise { + const url = new URL(request.url) + const workspaceId = url.searchParams.get("workspaceId") + if (!workspaceId) return this.#deny(`workspace.${operation}`, 400) + const token = this.#authorize(request, workspaceId) + if (!token) return this.#deny(`workspace.${operation}.scope`, 403) + const capabilityResponse = await this.#checkCapability("workspace.read", workspaceId) + if (capabilityResponse) return capabilityResponse + const prefix = url.searchParams.get("prefix") ?? "." + const entries = operation === "list" + ? await this.#workspace.list(token, prefix) + : await this.#workspace.search(token, url.searchParams.get("query") ?? "", prefix) + this.#allow(`workspace.${operation}`) + return json(200, { entries }) + } + async #browserAction(request: Request, action: string): Promise { if (!this.#browser) return this.#deny("browser.unavailable", 503) const input = await body(request) diff --git a/packages/workbench-server/test/server.test.ts b/packages/workbench-server/test/server.test.ts index 541d63e6f658..980dbb6604f9 100644 --- a/packages/workbench-server/test/server.test.ts +++ b/packages/workbench-server/test/server.test.ts @@ -50,6 +50,14 @@ try { if (listed.status !== 200) throw new Error("scoped session list failed") const read = await server.fetch(new Request("http://localhost/v1/files/read", { method: "POST", headers: { authorization: `Bearer ${handle.token}` }, body: JSON.stringify({ workspaceId: handle.id, paths: ["README.md"] }) })) if (read.status !== 200) throw new Error("scoped file read failed") + const fileList = await server.fetch(new Request(`http://localhost/v1/files/list?workspaceId=${handle.id}`, { headers: { authorization: `Bearer ${handle.token}` } })) + if (fileList.status !== 200) throw new Error("scoped file list failed") + const fileListBody = await fileList.json() as { entries: readonly { path: string }[] } + if (!fileListBody.entries.some((entry) => entry.path === "README.md")) throw new Error("file list did not return README.md") + const fileSearch = await server.fetch(new Request(`http://localhost/v1/files/search?workspaceId=${handle.id}&query=readme`, { headers: { authorization: `Bearer ${handle.token}` } })) + if (fileSearch.status !== 200) throw new Error("scoped file search failed") + const fileSearchBody = await fileSearch.json() as { entries: readonly { path: string }[] } + if (fileSearchBody.entries.length !== 1 || fileSearchBody.entries[0]?.path !== "README.md") throw new Error("file search did not filter README.md") capabilityDecision = "deny" const deniedWrite = await server.fetch(new Request("http://localhost/v1/files/write", { method: "POST", headers: { authorization: `Bearer ${handle.token}` }, body: JSON.stringify({ workspaceId: handle.id, writes: [{ path: "README.md", content: "blocked" }] }) })) if (deniedWrite.status !== 403) throw new Error("capability gate did not deny write") @@ -282,4 +290,3 @@ try { } finally { await rm(root, { recursive: true, force: true }) } - diff --git a/packages/workbench-shell/src/routes.ts b/packages/workbench-shell/src/routes.ts index bf2f2a0495c0..59d2c7e8fd9f 100644 --- a/packages/workbench-shell/src/routes.ts +++ b/packages/workbench-shell/src/routes.ts @@ -58,5 +58,11 @@ export const M6_SERVER_ROUTE_REGISTRY = { operationCancel: { method: "POST", route: "/v1/operations/:operationId/cancel", capability: "workspace.watch", event: "operation.updated" }, } as const satisfies Record +/** M7 file index routes are registered before the server implementation consumes them. */ +export const M7_SERVER_ROUTE_REGISTRY = { + filesList: { method: "GET", route: "/v1/files/list", capability: "workspace.read", event: "workspace.changed" }, + filesSearch: { method: "GET", route: "/v1/files/search", capability: "workspace.read", event: "workspace.changed" }, +} as const satisfies Record + const missingOperations = WORK_V1_FUNCTIONS.filter((operation) => !WORKBENCH_ROUTE_OPERATIONS.includes(operation)) if (missingOperations.length > 0) throw new Error(`route registry is missing Work V1 operations: ${missingOperations.join(", ")}`) diff --git a/packages/workspace-runtime/src/index.ts b/packages/workspace-runtime/src/index.ts index 300682021254..38cec371f2fe 100644 --- a/packages/workspace-runtime/src/index.ts +++ b/packages/workspace-runtime/src/index.ts @@ -14,6 +14,7 @@ import type { WorkspaceHandle, WorkspaceId, WorkspacePort, + WorkspaceEntry, } from "@unifia/contracts" type Session = { workspace: Workspace; token: string; closed: boolean; watchers: Set<() => void> } @@ -22,10 +23,12 @@ export type WorkspaceRuntimeOptions = { maxReadBytes?: number maxWriteBytes?: number now?: () => number + maxEntries?: number } const DEFAULT_MAX_READ_BYTES = 4 * 1024 * 1024 const DEFAULT_MAX_WRITE_BYTES = 4 * 1024 * 1024 +const DEFAULT_MAX_ENTRIES = 2_000 function sha256(value: string | Uint8Array): string { return createHash("sha256").update(value).digest("hex") @@ -56,12 +59,14 @@ export class WorkspaceRuntime implements WorkspacePort { readonly #now: () => number readonly #maxReadBytes: number readonly #maxWriteBytes: number + readonly #maxEntries: number readonly #queues = new Map>() constructor(options: WorkspaceRuntimeOptions = {}) { this.#now = options.now ?? Date.now this.#maxReadBytes = options.maxReadBytes ?? DEFAULT_MAX_READ_BYTES this.#maxWriteBytes = options.maxWriteBytes ?? DEFAULT_MAX_WRITE_BYTES + this.#maxEntries = options.maxEntries ?? DEFAULT_MAX_ENTRIES } async register(input: { name: string; path: string }): Promise { @@ -123,6 +128,20 @@ export class WorkspaceRuntime implements WorkspacePort { } return results } + + async list(sessionId: FileSessionId, prefix = "."): Promise { + const session = this.#session(sessionId) + const directory = await this.#resolveDirectory(session.workspace.path, prefix) + return this.#walkEntries(session.workspace.path, directory, undefined) + } + + async search(sessionId: FileSessionId, query: string, prefix = "."): Promise { + const normalizedQuery = query.trim().toLocaleLowerCase() + if (!normalizedQuery || normalizedQuery.length > 256 || normalizedQuery.includes("\0")) throw new Error("workspace search query is invalid") + const session = this.#session(sessionId) + const directory = await this.#resolveDirectory(session.workspace.path, prefix) + return this.#walkEntries(session.workspace.path, directory, normalizedQuery) + } watch(sessionId: FileSessionId): AsyncIterable { const session = this.#session(sessionId) const queue: FileEvent[] = [] @@ -222,6 +241,34 @@ export class WorkspaceRuntime implements WorkspacePort { return candidate } + async #resolveDirectory(root: string, relative: string): Promise { + assertRelative(relative) + const candidate = await fs.realpath(path.resolve(root, relative)) + if (!isInside(root, candidate)) throw new Error("workspace path escapes root") + const stat = await fs.stat(candidate) + if (!stat.isDirectory()) throw new Error("workspace path is not a directory") + return candidate + } + + async #walkEntries(root: string, directory: string, query: string | undefined): Promise { + const results: WorkspaceEntry[] = [] + const visit = async (current: string): Promise => { + const children = await fs.readdir(current, { withFileTypes: true }) + for (const child of children) { + const absolute = await fs.realpath(path.join(current, child.name)) + if (!isInside(root, absolute)) throw new Error("workspace path escapes root") + const stat = await fs.stat(absolute) + const relative = path.relative(root, absolute).replaceAll("\\", "/") + const entry: WorkspaceEntry = { path: relative, kind: stat.isDirectory() ? "directory" : "file", size: stat.isFile() ? stat.size : 0, modifiedAt: stat.mtimeMs } + if (!query || relative.toLocaleLowerCase().includes(query)) results.push(entry) + if (results.length > this.#maxEntries) throw new Error("workspace listing quota exceeded") + if (stat.isDirectory()) await visit(absolute) + } + } + await visit(directory) + return results + } + #session(id: FileSessionId): Session { const session = this.#sessions.get(id) if (!session || session.closed) throw new Error("file session is closed or unknown") diff --git a/packages/workspace-runtime/test/runtime.test.ts b/packages/workspace-runtime/test/runtime.test.ts index ebd488fb8326..9b08b9009ecd 100644 --- a/packages/workspace-runtime/test/runtime.test.ts +++ b/packages/workspace-runtime/test/runtime.test.ts @@ -8,6 +8,7 @@ const root = await mkdtemp(path.join(os.tmpdir(), "unifia-workspace-")) try { await mkdir(path.join(root, "src")) await writeFile(path.join(root, "src", "main.ts"), "export const value = 1\n") + await writeFile(path.join(root, "README.md"), "# Fixture\n") const runtime = new WorkspaceRuntime({ now: () => 1_000, maxReadBytes: 100, maxWriteBytes: 100 }) const workspace = await runtime.register({ name: "fixture", path: root }) const handle = await runtime.open(workspace.id) @@ -17,6 +18,11 @@ try { const written = await runtime.write(handle.token, [{ path: "src/main.ts", content: "export const value = 2\n" }]) if (written[0]?.sha.length !== 64) throw new Error("transactional write did not return sha256") if ((await readFile(path.join(root, "src", "main.ts"), "utf8")) !== "export const value = 2\n") throw new Error("write was not committed") + const entries = await runtime.list(handle.token) + if (!entries.some((entry) => entry.path === "src" && entry.kind === "directory")) throw new Error("list did not include the source directory") + if (!entries.some((entry) => entry.path === "README.md" && entry.kind === "file")) throw new Error("list did not include the root file") + const matches = await runtime.search(handle.token, "MAIN.TS") + if (matches.length !== 1 || matches[0]?.path !== "src/main.ts") throw new Error("search was not case-insensitive") const recorded = await runtime.appendFileEvent(workspace.id, { type: "modified", path: "src/main.ts", timestamp: 1_001 }) const replayed = await runtime.replayFileEvents(workspace.id, 0) if (recorded.sequence !== 1 || replayed[0]?.sequence !== 1) throw new Error("file event was not persisted with a cursor") @@ -43,4 +49,4 @@ try { console.log("WorkspaceRuntime: 12/12 passed") } finally { await rm(root, { recursive: true, force: true }) -} \ No newline at end of file +} diff --git a/work_design/STATE.md b/work_design/STATE.md index db82cdf790c6..704e1eb28e3d 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -6,9 +6,9 @@ This file is the durable execution state for the Unifia Work/Design integration. - Branch: `work-design` - Base commit: `91daa35a26a8e44d7f35b539c91030ec1e230c54` -- Current card: `M4` +- Current card: `M7` - Status: `IMPLEMENTED_WITH_DEFERRED_HUMAN_PROOFS` -- Commit or push performed: yes (`138e3b87b2`, `5b3b46e39c`) +- Commit or push performed: yes (through M7; latest SHA recorded after commit) ## Cards @@ -25,6 +25,7 @@ This file is the durable execution state for the Unifia Work/Design integration. | M4 | implemented with deferred human proofs | workbench-shell typecheck + shell 122/122 + modes 4/4 + client 7/7 | Typed client, bounded retry policy, SSE cursor resume, token refresh hook, event dispatcher and merge/gap rules. Native bridge and packaged WebView proofs remain pending by explicit user decision. | | M5 | implemented with deferred human proofs | workbench-shell typecheck + shell 122/122 + modes 4/4 + client 7/7 + routes 11/11 | Total typed route registry with compile-time Work V1 coverage and explicit work/document versus design/render lineage. | | M6 | implemented with deferred human proofs | workbench-server typecheck + server 72/72 + bootstrap 40/40 + security/preflight/topology + operations 2/2 | Reconnectable session SSE remains cursor-based; long prompt operations now receive idempotent operation IDs and can be cancelled through a scoped route. | +| M7 | implemented with deferred human proofs | contracts/workspace + workspace-runtime typecheck/tests + server 72/72 + shell typecheck + security guard | Bounded, root-confined file listing/search and protected `GET /v1/files/list` and `GET /v1/files/search` routes. | ## Manual verification register @@ -65,9 +66,10 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - M4 implementation → `packages/workbench-shell/src/client.ts` adds `WorkbenchClient`, `WorkbenchEventDispatcher`, bounded authentication retry, idempotency-aware mutation handling, SSE parsing, cursor continuation, and token-rotation hook; client contract test passes 7/7. - M5 implementation → `packages/workbench-shell/src/routes.ts` adds total `WORKBENCH_ROUTE_REGISTRY`, route helpers, capability/event mapping, and artifact lineage discriminants; route contract passes 11/11. - M6 implementation → operation registry adds idempotent operation tracking, asynchronous prompt execution, scoped cancellation, and typed M6 route registration; operation tests pass 2/2 and existing server suites remain green. +- M7 implementation → `WorkspacePort` now exposes bounded listing/search; `WorkspaceRuntime` resolves real paths inside the registered root, refuses escapes and enforces an entry quota; Workbench routes apply workspace auth and `workspace.read`; runtime and server assertions cover list/search. ## Resume first 1. Read this file, `DECISIONS.md`, and `../INTEGRATION.md`. 2. Review the M0b diff and run the CI workflow on the first PR. -3. M6 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. +3. M7 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. From 5bca85633cdf38d42094efe4791591506e42a783 Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 02:01:23 +0200 Subject: [PATCH 07/76] feat(workbench): add approval and audit observability --- packages/contracts/src/approval-broker.ts | 9 ++++- packages/contracts/src/p3-runtime.ts | 7 ++++ packages/contracts/test/p3-runtime-smoke.ts | 5 +-- packages/workbench-server/src/bootstrap.ts | 6 +++- packages/workbench-server/src/index.ts | 33 +++++++++++++++++-- packages/workbench-server/src/logging.ts | 32 ++++++++++++++++++ .../workbench-server/test/security.test.ts | 20 +++++++++++ packages/workbench-server/test/server.test.ts | 4 +++ packages/workbench-shell/src/routes.ts | 7 ++++ work_design/STATE.md | 6 ++-- 10 files changed, 120 insertions(+), 9 deletions(-) create mode 100644 packages/workbench-server/src/logging.ts diff --git a/packages/contracts/src/approval-broker.ts b/packages/contracts/src/approval-broker.ts index 49ddf7ee6723..8ca8eaa827f0 100644 --- a/packages/contracts/src/approval-broker.ts +++ b/packages/contracts/src/approval-broker.ts @@ -50,6 +50,13 @@ export class ApprovalBroker { return request ? { ...request } : undefined } + pending(resource?: string): readonly ApprovalRequestRecord[] { + const now = this.#now() + return [...this.#requests.values()] + .filter((request) => request.status === "pending" && request.expiresAt > now && (resource === undefined || request.resource === resource)) + .map((request) => ({ ...request })) + } + #close(request: ApprovalRequestRecord, status: ApprovalRequestState, decision: P3Decision): P3Decision { request.status = status this.#observe?.({ ...request }, decision) @@ -57,4 +64,4 @@ export class ApprovalBroker { } #deny(ruleId: string, reason: string): P3Decision { return { kind: "deny", ruleId, reason } } -} \ No newline at end of file +} diff --git a/packages/contracts/src/p3-runtime.ts b/packages/contracts/src/p3-runtime.ts index 6039b7c34ffc..b4a912fb21f3 100644 --- a/packages/contracts/src/p3-runtime.ts +++ b/packages/contracts/src/p3-runtime.ts @@ -26,6 +26,13 @@ export class AuditRuntimeDouble { } public events(): readonly AuditEvent[] { return this.entries.map((event) => ({ ...event })) } + + public page(afterSequence = 0, limit = 50): { events: readonly AuditEvent[]; nextCursor: number | null } { + const safeLimit = Math.min(Math.max(Math.trunc(limit), 1), 100) + const events = this.entries.filter((event) => event.sequence > afterSequence).slice(0, safeLimit).map((event) => ({ ...event })) + const last = events.at(-1)?.sequence + return { events, nextCursor: events.length === safeLimit && last !== undefined ? last : null } + } } export type SecretHandle = { id: string; name: string; scope: string } diff --git a/packages/contracts/test/p3-runtime-smoke.ts b/packages/contracts/test/p3-runtime-smoke.ts index cca96472d048..d9c8bca91a47 100644 --- a/packages/contracts/test/p3-runtime-smoke.ts +++ b/packages/contracts/test/p3-runtime-smoke.ts @@ -6,12 +6,13 @@ function test(name: string, run: () => void) { run(); passed++; console.log(`PAS test("C8-every-decision-logged", () => { const audit = new AuditRuntimeDouble(() => 1); const first = audit.record("operator", "workspace.write", "allow"); const second = audit.record("agent", "terminal.run", "deny"); assert.equal(audit.events().length, 2); assert.equal(second.previousHash, first.hash) }) test("C8-audit-chain-is-append-only", () => { const audit = new AuditRuntimeDouble(); audit.record("operator", "network.request", "approval_required"); const copy = audit.events(); copy.pop(); assert.equal(audit.events().length, 1) }) +test("C8-audit-page-uses-cursor-and-bound", () => { const audit = new AuditRuntimeDouble(() => 1); audit.record("a", "x", "allow"); audit.record("b", "y", "deny"); assert.equal(audit.page(1, 1).events[0]?.sequence, 2); assert.equal(audit.page(0, 1).nextCursor, 1) }) test("C9-secret-not-returned-to-agent-loop", () => { const store = new SecretStoreDouble(); store.put("API_TOKEN", "secret-value"); const handle = store.read("API_TOKEN", "sandbox-1"); assert.ok(handle); assert.notEqual(handle, "secret-value"); assert.equal(store.resolve(handle!, "sandbox-2"), undefined); assert.equal(store.resolve(handle!, "sandbox-1"), "secret-value") }) test("C9-quota-exceeded-deny", () => { const quota = new QuotaDouble(10); assert.equal(quota.consume(7), true); assert.equal(quota.consume(4), false); assert.equal(quota.remaining(), 3) }) test("C9-kill-switch-all-remote", () => { const switches = new KillSwitchDouble(); switches.engage("all-remote"); assert.equal(switches.isEngaged("all-remote"), true); assert.equal(switches.isEngaged("all-plugin-enable"), false) }) test("C9-kill-switch-global", () => { const switches = new KillSwitchDouble(); switches.engage("global"); assert.equal(switches.isEngaged("all-remote"), true); assert.equal(switches.isEngaged("all-plugin-enable"), true) }) -assert.equal(passed, 6) -console.log(`P3 C8/C9: ${passed}/6 passed`) +assert.equal(passed, 7) +console.log(`P3 C8/C9: ${passed}/7 passed`) import { KillSwitchRegistry, SecretStore } from "../src/p3-runtime.ts" test("C9-secret-store-issues-scoped-expiring-handles", () => { let now = 1_000; const store = new SecretStore(() => now, 10); store.put({ name: "TOKEN", value: "value" }); const handle = store.issue("TOKEN", "sandbox-a"); assert.ok(handle); assert.equal(store.resolve(handle!, "sandbox-b"), undefined); assert.equal(store.resolve(handle!, "sandbox-a"), "value"); now = 1_011; assert.equal(store.resolve(handle!, "sandbox-a"), undefined) }) test("C9-kill-switch-registry-is-reversible-and-global", () => { const switches = new KillSwitchRegistry(); switches.engage("browser"); assert.equal(switches.isEngaged("browser"), true); assert.equal(switches.isEngaged("computer-use"), false); switches.engage("global"); assert.equal(switches.isEngaged("computer-use"), true); switches.release("global"); assert.equal(switches.isEngaged("computer-use"), false) }) diff --git a/packages/workbench-server/src/bootstrap.ts b/packages/workbench-server/src/bootstrap.ts index bedacf4a8b9a..72b887d14ce1 100644 --- a/packages/workbench-server/src/bootstrap.ts +++ b/packages/workbench-server/src/bootstrap.ts @@ -15,7 +15,7 @@ import { appendFileSync, mkdirSync } from "node:fs" import path from "node:path" -import { ApprovalBroker, AuditRuntimeDouble, FakeRuntimeAdapter, OpenCodeRuntimeAdapter, type McpUiControlBroker, type OpenCodeRuntimeBackend, type P3Capability, type RuntimeAdapter } from "@unifia/contracts" +import { ApprovalBroker, AuditRuntimeDouble, FakeRuntimeAdapter, OpenCodeRuntimeAdapter, type AuditEvent, type McpUiControlBroker, type OpenCodeRuntimeBackend, type P3Capability, type RuntimeAdapter } from "@unifia/contracts" import { WorkspaceRuntime } from "@unifia/workspace-runtime" import { FixedWindowRateLimiter, HmacTokenAuthenticator, ScopedTokenIssuer } from "./auth.js" import { ApprovalCapabilityGate, WorkbenchServer } from "./index.js" @@ -73,6 +73,10 @@ export class FileAuditSink { events(): readonly unknown[] { return this.#chain.events() } + + page(afterSequence = 0, limit = 50): { events: readonly AuditEvent[]; nextCursor: number | null } { + return this.#chain.page(afterSequence, limit) + } } /** diff --git a/packages/workbench-server/src/index.ts b/packages/workbench-server/src/index.ts index baa3b520ecab..fb63e4b671ce 100644 --- a/packages/workbench-server/src/index.ts +++ b/packages/workbench-server/src/index.ts @@ -1,4 +1,4 @@ -import type { ApprovalBroker, CapabilityRegistry, BrowserAutomationBroker, McpUiControlBroker, UiAction, CapabilityManifest, DesktopAutomationBroker } from "@unifia/contracts" +import type { ApprovalBroker, ApprovalRequestRecord, AuditEvent, CapabilityRegistry, BrowserAutomationBroker, McpUiControlBroker, UiAction, CapabilityManifest, DesktopAutomationBroker } from "@unifia/contracts" /* SPDX-License-Identifier: MIT */ import type { MemoryRuntime } from "@unifia/memory-runtime" import type { WorkflowDefinition, WorkflowRuntime } from "@unifia/workflow-runtime" @@ -21,10 +21,11 @@ import { addSecurityHeaders, checkRequestOrigin } from "./security.js" export * from "./auth.js" export * from "./security.js" export * from "./operations.js" +export * from "./logging.js" -type AuditPort = { record(actor: string, capability: string, decision: "allow" | "deny" | "approval_required"): unknown } +type AuditPort = { record(actor: string, capability: string, decision: "allow" | "deny" | "approval_required"): unknown; page?: (afterSequence: number, limit: number) => { events: readonly AuditEvent[]; nextCursor: number | null } } export type CapabilityDecision = "allow" | "deny" | { kind: "approval_required"; approvalId: string } -export type CapabilityGate = { check(capability: P3Capability, resource: string, actor: string): Promise; getApproval?: (id: string) => { resource: string } | undefined; resolve?: (id: string, decision: "allow" | "deny", actor: string, grantedResource?: string) => unknown; cancel?: (id: string) => unknown } +export type CapabilityGate = { check(capability: P3Capability, resource: string, actor: string): Promise; getApproval?: (id: string) => { resource: string } | undefined; listApprovals?: (resource: string) => readonly ApprovalRequestRecord[]; resolve?: (id: string, decision: "allow" | "deny", actor: string, grantedResource?: string) => unknown; cancel?: (id: string) => unknown } type ServerDependencies = { auth: PrincipalAuthenticator; rateLimiter?: RateLimiter; workspace: WorkspacePort; runtime: RuntimeAdapter; audit: AuditPort; capability: CapabilityGate; browser?: BrowserAutomationBroker; desktop?: DesktopAutomationBroker; workflow?: WorkflowRuntime; memory?: MemoryRuntime; capabilities?: CapabilityRegistry; ui?: McpUiControlBroker; uiAllowedActions?: ReadonlySet; skillHub?: SkillRegistry } /** Requests per principal per window when the caller injects no limiter. */ @@ -145,7 +146,10 @@ export class WorkbenchServer { if (segments[1] === "files" && (segments[2] === "read" || segments[2] === "write") && request.method === "POST") return this.#files(request, segments[2]) if (segments[1] === "files" && (segments[2] === "list" || segments[2] === "search") && request.method === "GET") return this.#fileIndex(request, segments[2]) if (segments[1] === "file-sessions" && request.method === "DELETE") return this.#closeFileSession(request, segments[2]) + if (segments[1] === "approvals" && request.method === "GET") return this.#approvalList(request) if (segments[1] === "approvals" && (request.method === "POST" || request.method === "DELETE")) return this.#approval(request, segments[2]) + if (segments[1] === "trace" && request.method === "GET") return this.#auditPage(request, "trace") + if (segments[1] === "activity" && request.method === "GET") return this.#auditPage(request, "activity") if (segments[1] === "browser" && request.method === "POST") return this.#browserAction(request, segments[2]) if (segments[1] === "desktop" && request.method === "POST") return this.#desktopAction(request, segments[2]) if (segments[1] === "workflows" && request.method === "POST") return this.#workflowAction(request, segments[2]) @@ -445,6 +449,28 @@ export class WorkbenchServer { this.#audit.record("workbench-server", "approval.resolve", (decision as { kind?: string }).kind === "allow" ? "allow" : "deny") return json(200, { decision }) } + async #approvalList(request: Request): Promise { + const url = new URL(request.url) + const workspaceId = url.searchParams.get("workspaceId") + const token = workspaceId ? this.#authorize(request, workspaceId) : undefined + if (!workspaceId || !token) return this.#deny("approval.list.scope", 403) + const approvals = this.#capability.listApprovals?.(workspaceId) + if (!approvals) return this.#deny("approval.list.unavailable", 503) + this.#allow("approval.list") + return json(200, { approvals }) + } + async #auditPage(request: Request, kind: "trace" | "activity"): Promise { + const url = new URL(request.url) + const workspaceId = url.searchParams.get("workspaceId") + if (!workspaceId || !this.#authorize(request, workspaceId)) return this.#deny(`${kind}.scope`, 403) + const after = Number(url.searchParams.get("after") ?? "0") + const requestedLimit = Number(url.searchParams.get("limit") ?? "50") + const limit = Number.isSafeInteger(requestedLimit) ? Math.min(Math.max(requestedLimit, 1), 100) : 50 + const page = this.#audit.page?.(Number.isSafeInteger(after) && after > 0 ? after : 0, limit) + if (!page) return this.#deny(`${kind}.unavailable`, 503) + this.#allow(`${kind}.read`) + return json(200, { kind, ...page }) + } async #closeFileSession(request: Request, token: string): Promise { const supplied = this.#bearer(request) if (!supplied || supplied !== token || !this.#tokens.has(token)) return this.#deny("workspace.close.scope", 403) @@ -537,6 +563,7 @@ export class ApprovalCapabilityGate implements CapabilityGate { return { kind: "approval_required", approvalId: request.id } } getApproval(id: string) { return this.#broker.get(id) } + listApprovals(resource: string) { return this.#broker.pending(resource) } resolve(id: string, decision: "allow" | "deny", actor: string, grantedResource?: string) { return this.#broker.resolve(id, decision, actor, grantedResource) } cancel(id: string) { return this.#broker.cancel(id) } } diff --git a/packages/workbench-server/src/logging.ts b/packages/workbench-server/src/logging.ts new file mode 100644 index 000000000000..a8edd97edf16 --- /dev/null +++ b/packages/workbench-server/src/logging.ts @@ -0,0 +1,32 @@ +/* SPDX-License-Identifier: MIT */ +import { appendFileSync, mkdirSync, renameSync, rmSync, statSync } from "node:fs" +import path from "node:path" + +export type ServerLogLevel = "error" | "warn" | "info" | "debug" +const LEVEL_ORDER: Record = { error: 0, warn: 1, info: 2, debug: 3 } +const SECRET_FIELD = /token|secret|password|authorization|cookie|prompt|content/i + +export class ServerLogger { + readonly #path: string + readonly #level: ServerLogLevel + readonly #maxBytes: number + + constructor(logPath: string, level: ServerLogLevel = "info", maxBytes = 1_048_576) { + this.#path = logPath + this.#level = level + this.#maxBytes = maxBytes + mkdirSync(path.dirname(logPath), { recursive: true }) + } + + log(level: ServerLogLevel, event: string, fields: Record = {}): void { + if (LEVEL_ORDER[level] > LEVEL_ORDER[this.#level]) return + const safeFields = Object.fromEntries(Object.entries(fields).map(([key, value]) => [key, SECRET_FIELD.test(key) ? "[REDACTED]" : value])) + const line = `${JSON.stringify({ timestamp: Date.now(), level, event, ...safeFields })}\n` + if (this.#size() + Buffer.byteLength(line) > this.#maxBytes) { rmSync(`${this.#path}.1`, { force: true }); renameSync(this.#path, `${this.#path}.1`) } + appendFileSync(this.#path, line, "utf8") + } + + #size(): number { + try { return statSync(this.#path).size } catch { return 0 } + } +} diff --git a/packages/workbench-server/test/security.test.ts b/packages/workbench-server/test/security.test.ts index f23b66397c70..1a91d55b702b 100644 --- a/packages/workbench-server/test/security.test.ts +++ b/packages/workbench-server/test/security.test.ts @@ -1,5 +1,9 @@ import { describe, expect, it } from "vitest" +import { mkdtemp, readFile, rm } from "node:fs/promises" +import os from "node:os" +import path from "node:path" import { WORKBENCH_ALLOWED_ORIGINS, addSecurityHeaders, checkRequestOrigin } from "../src/security.js" +import { ServerLogger } from "../src/logging.js" describe("workbench origin policy", () => { it("allows only explicit native origins and requests without an Origin header", () => { @@ -15,4 +19,20 @@ describe("workbench origin policy", () => { expect(response.headers.get("access-control-allow-methods")).toContain("OPTIONS") expect(response.headers.get("x-content-type-options")).toBe("nosniff") }) + + it("keeps server logs separate, redacted, level-filtered and rolling", async () => { + const root = await mkdtemp(path.join(os.tmpdir(), "unifia-log-")) + try { + const logPath = path.join(root, "server.jsonl") + const logger = new ServerLogger(logPath, "info", 120) + logger.log("debug", "hidden", { value: "not written" }) + logger.log("info", "request", { authorization: "Bearer secret", route: "/v1/trace" }) + const content = await readFile(logPath, "utf8") + expect(content).toContain("[REDACTED]") + expect(content).not.toContain("Bearer secret") + expect(content).not.toContain("hidden") + logger.log("info", "second", { route: "/v1/files/list" }) + expect(await readFile(`${logPath}.1`, "utf8")).toContain("request") + } finally { await rm(root, { recursive: true, force: true }) } + }) }) diff --git a/packages/workbench-server/test/server.test.ts b/packages/workbench-server/test/server.test.ts index 980dbb6604f9..1a48f52f9cef 100644 --- a/packages/workbench-server/test/server.test.ts +++ b/packages/workbench-server/test/server.test.ts @@ -103,10 +103,14 @@ try { const approvalRequestResponse = await approvalServer.fetch(new Request("http://localhost/v1/files/write", { method: "POST", headers: { authorization: `Bearer ${approvalHandle.token}` }, body: JSON.stringify({ workspaceId: approvalHandle.id, writes: [{ path: "README.md", content: "approved" }] }) })) const approvalRequest = await approvalRequestResponse.json() as { approvalId: string } if (approvalRequestResponse.status !== 202 || !approvalRequest.approvalId) throw new Error("server did not return approval_required") + const pendingApprovals = await approvalServer.fetch(new Request(`http://localhost/v1/approvals?workspaceId=${approvalHandle.id}`, { headers: { authorization: `Bearer ${approvalHandle.token}` } })) + if (pendingApprovals.status !== 200 || ((await pendingApprovals.json()) as { approvals: readonly { id: string }[] }).approvals[0]?.id !== approvalRequest.approvalId) throw new Error("pending approval list failed") const resolved = await approvalServer.fetch(new Request(`http://localhost/v1/approvals/${approvalRequest.approvalId}`, { method: "POST", headers: { authorization: `Bearer ${approvalHandle.token}` }, body: JSON.stringify({ decision: "allow" }) })) if (resolved.status !== 200) throw new Error("scoped approval resolve failed") const retried = await approvalServer.fetch(new Request("http://localhost/v1/files/write", { method: "POST", headers: { authorization: `Bearer ${approvalHandle.token}` }, body: JSON.stringify({ workspaceId: approvalHandle.id, writes: [{ path: "README.md", content: "approved" }] }) })) if (retried.status !== 200) throw new Error("approved write was not retried") + const trace = await server.fetch(new Request(`http://localhost/v1/trace?workspaceId=${handle.id}&limit=2`, { headers: { authorization: `Bearer ${handle.token}` } })) + if (trace.status !== 200 || !((await trace.json()) as { events: readonly unknown[] }).events.length) throw new Error("trace pagination failed") const browser = new BrowserAutomationBroker({ navigate: async () => {}, snapshot: async () => ({ title: "fixture" }), screenshot: async () => new Uint8Array([1, 2]), quarantineDownload: async () => "quarantine/result" }, ["example.com"]) const browserServer = new WorkbenchServer({ auth: testAuth, workspace, runtime: new FakeRuntimeAdapter(() => 1_000), audit, capability: { check: async () => "allow" }, browser }) const browserOpen = await browserServer.fetch(new Request(`http://localhost/v1/workspaces/${handle.id}/open`, { method: "POST" })) diff --git a/packages/workbench-shell/src/routes.ts b/packages/workbench-shell/src/routes.ts index 59d2c7e8fd9f..859fb2dd30e2 100644 --- a/packages/workbench-shell/src/routes.ts +++ b/packages/workbench-shell/src/routes.ts @@ -64,5 +64,12 @@ export const M7_SERVER_ROUTE_REGISTRY = { filesSearch: { method: "GET", route: "/v1/files/search", capability: "workspace.read", event: "workspace.changed" }, } as const satisfies Record +/** M8 approval and audit read routes are registered before server consumption. */ +export const M8_SERVER_ROUTE_REGISTRY = { + approvalsList: { method: "GET", route: "/v1/approvals", capability: "approval.read", event: "approval.updated" }, + tracePage: { method: "GET", route: "/v1/trace", capability: "trace.read", event: "trace.appended" }, + activityPage: { method: "GET", route: "/v1/activity", capability: "trace.read", event: "trace.appended" }, +} as const satisfies Record + const missingOperations = WORK_V1_FUNCTIONS.filter((operation) => !WORKBENCH_ROUTE_OPERATIONS.includes(operation)) if (missingOperations.length > 0) throw new Error(`route registry is missing Work V1 operations: ${missingOperations.join(", ")}`) diff --git a/work_design/STATE.md b/work_design/STATE.md index 704e1eb28e3d..c7276c94e274 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -6,7 +6,7 @@ This file is the durable execution state for the Unifia Work/Design integration. - Branch: `work-design` - Base commit: `91daa35a26a8e44d7f35b539c91030ec1e230c54` -- Current card: `M7` +- Current card: `M8` - Status: `IMPLEMENTED_WITH_DEFERRED_HUMAN_PROOFS` - Commit or push performed: yes (through M7; latest SHA recorded after commit) @@ -26,6 +26,7 @@ This file is the durable execution state for the Unifia Work/Design integration. | M5 | implemented with deferred human proofs | workbench-shell typecheck + shell 122/122 + modes 4/4 + client 7/7 + routes 11/11 | Total typed route registry with compile-time Work V1 coverage and explicit work/document versus design/render lineage. | | M6 | implemented with deferred human proofs | workbench-server typecheck + server 72/72 + bootstrap 40/40 + security/preflight/topology + operations 2/2 | Reconnectable session SSE remains cursor-based; long prompt operations now receive idempotent operation IDs and can be cancelled through a scoped route. | | M7 | implemented with deferred human proofs | contracts/workspace + workspace-runtime typecheck/tests + server 72/72 + shell typecheck + security guard | Bounded, root-confined file listing/search and protected `GET /v1/files/list` and `GET /v1/files/search` routes. | +| M8 | implemented with deferred human proofs | server typecheck + server 72/72 + security 3/3 + P3 C8/C9 7/7 | Pending approval listing scoped to a workspace, cursor/limit audit pages for trace/activity, and a distinct redacted/level-filtered rolling server logger. | ## Manual verification register @@ -67,9 +68,10 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - M5 implementation → `packages/workbench-shell/src/routes.ts` adds total `WORKBENCH_ROUTE_REGISTRY`, route helpers, capability/event mapping, and artifact lineage discriminants; route contract passes 11/11. - M6 implementation → operation registry adds idempotent operation tracking, asynchronous prompt execution, scoped cancellation, and typed M6 route registration; operation tests pass 2/2 and existing server suites remain green. - M7 implementation → `WorkspacePort` now exposes bounded listing/search; `WorkspaceRuntime` resolves real paths inside the registered root, refuses escapes and enforces an entry quota; Workbench routes apply workspace auth and `workspace.read`; runtime and server assertions cover list/search. +- M8 implementation → `ApprovalBroker.pending()` and `GET /v1/approvals` expose only live requests for the authorized workspace; audit pages support bounded cursors for `/v1/trace` and `/v1/activity`; `ServerLogger` is separate from audit, defaults to info, redacts sensitive fields, filters debug, and rotates at a size limit. ## Resume first 1. Read this file, `DECISIONS.md`, and `../INTEGRATION.md`. 2. Review the M0b diff and run the CI workflow on the first PR. -3. M7 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. +3. M8 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. From e3bdc103e200cc5c6c3ceb46a4d96789dbdab88a Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 02:04:01 +0200 Subject: [PATCH 08/76] feat(workbench): expose artifact lineage reads --- packages/artifact-runtime/src/index.ts | 14 ++++++++++++++ .../artifact-runtime/test/artifact.test.ts | 1 + packages/workbench-server/package.json | 2 +- packages/workbench-server/src/index.ts | 19 ++++++++++++++++++- packages/workbench-server/test/server.test.ts | 9 ++++++++- packages/workbench-shell/src/routes.ts | 6 ++++++ work_design/STATE.md | 6 ++++-- 7 files changed, 52 insertions(+), 5 deletions(-) diff --git a/packages/artifact-runtime/src/index.ts b/packages/artifact-runtime/src/index.ts index c0b1a1742eed..4dab806514cd 100644 --- a/packages/artifact-runtime/src/index.ts +++ b/packages/artifact-runtime/src/index.ts @@ -233,6 +233,20 @@ export class ArtifactStore { return (await this.history(artifactId)).at(-1) } + async list(): Promise { + let ids: string[] + try { ids = await fs.readdir(this.#artifactsRoot) } catch (error) { + if ((error as NodeJS.ErrnoException).code === "ENOENT") return [] + throw error + } + const latest: ArtifactVersion[] = [] + for (const id of ids) if (ARTIFACT_ID.test(id)) { + const version = await this.latest(id) + if (version) latest.push(version) + } + return latest.sort((left, right) => right.createdAt - left.createdAt) + } + /** * Copies a version into the workspace outbox, applying the metadata policy. * diff --git a/packages/artifact-runtime/test/artifact.test.ts b/packages/artifact-runtime/test/artifact.test.ts index 4d2ee36e1042..78d7eefa448a 100644 --- a/packages/artifact-runtime/test/artifact.test.ts +++ b/packages/artifact-runtime/test/artifact.test.ts @@ -39,6 +39,7 @@ try { const history = await store.history(artifact.artifactId) check(history.length === 2 && history[0].version === 1 && history[1].version === 2, `history reported ${history.map((entry) => entry.version).join(",")}`) check((await store.latest(artifact.artifactId))?.version === 2, "latest did not return the head") + check((await store.list()).some((entry) => entry.artifactId === artifact.artifactId && entry.version === 2), "artifact list did not return the latest lineage head") // Both revisions remain readable: a new version must not destroy its predecessor. check(new TextDecoder().decode(await store.read(history[0])) === "hello", "the first revision was lost when the second was written") diff --git a/packages/workbench-server/package.json b/packages/workbench-server/package.json index 7b0aecc840b5..eb908abf2c3b 100644 --- a/packages/workbench-server/package.json +++ b/packages/workbench-server/package.json @@ -6,6 +6,6 @@ "license": "MIT", "exports": { ".": "./src/index.ts", "./bootstrap": "./src/bootstrap.ts" }, "scripts": { "typecheck": "bun x tsc --noEmit", "test": "bun test/server.test.ts && bun test/bootstrap.test.ts && bun test/topology.test.ts && bun test/security.test.ts && bun test/cors-preflight.test.ts", "start": "bun src/bootstrap.ts" }, - "dependencies": { "@unifia/contracts": "workspace:*", "@unifia/workspace-runtime": "workspace:*", "@unifia/workflow-runtime": "workspace:*", "@unifia/memory-runtime": "workspace:*", "@unifia/skill-hub": "workspace:*" }, + "dependencies": { "@unifia/artifact-runtime": "workspace:*", "@unifia/contracts": "workspace:*", "@unifia/workspace-runtime": "workspace:*", "@unifia/workflow-runtime": "workspace:*", "@unifia/memory-runtime": "workspace:*", "@unifia/skill-hub": "workspace:*" }, "devDependencies": { "@types/bun": "catalog:", "@types/node": "catalog:", "typescript": "catalog:" } } diff --git a/packages/workbench-server/src/index.ts b/packages/workbench-server/src/index.ts index fb63e4b671ce..fba4c74c8adf 100644 --- a/packages/workbench-server/src/index.ts +++ b/packages/workbench-server/src/index.ts @@ -2,6 +2,7 @@ import type { ApprovalBroker, ApprovalRequestRecord, AuditEvent, CapabilityRegis /* SPDX-License-Identifier: MIT */ import type { MemoryRuntime } from "@unifia/memory-runtime" import type { WorkflowDefinition, WorkflowRuntime } from "@unifia/workflow-runtime" +import type { ArtifactStore } from "@unifia/artifact-runtime" import type { SkillRegistry } from "@unifia/skill-hub" import { renderGenerativeUi, type UiNode } from "@unifia/contracts" import type { @@ -26,7 +27,7 @@ export * from "./logging.js" type AuditPort = { record(actor: string, capability: string, decision: "allow" | "deny" | "approval_required"): unknown; page?: (afterSequence: number, limit: number) => { events: readonly AuditEvent[]; nextCursor: number | null } } export type CapabilityDecision = "allow" | "deny" | { kind: "approval_required"; approvalId: string } export type CapabilityGate = { check(capability: P3Capability, resource: string, actor: string): Promise; getApproval?: (id: string) => { resource: string } | undefined; listApprovals?: (resource: string) => readonly ApprovalRequestRecord[]; resolve?: (id: string, decision: "allow" | "deny", actor: string, grantedResource?: string) => unknown; cancel?: (id: string) => unknown } -type ServerDependencies = { auth: PrincipalAuthenticator; rateLimiter?: RateLimiter; workspace: WorkspacePort; runtime: RuntimeAdapter; audit: AuditPort; capability: CapabilityGate; browser?: BrowserAutomationBroker; desktop?: DesktopAutomationBroker; workflow?: WorkflowRuntime; memory?: MemoryRuntime; capabilities?: CapabilityRegistry; ui?: McpUiControlBroker; uiAllowedActions?: ReadonlySet; skillHub?: SkillRegistry } +type ServerDependencies = { auth: PrincipalAuthenticator; rateLimiter?: RateLimiter; workspace: WorkspacePort; runtime: RuntimeAdapter; audit: AuditPort; capability: CapabilityGate; artifacts?: ArtifactStore; browser?: BrowserAutomationBroker; desktop?: DesktopAutomationBroker; workflow?: WorkflowRuntime; memory?: MemoryRuntime; capabilities?: CapabilityRegistry; ui?: McpUiControlBroker; uiAllowedActions?: ReadonlySet; skillHub?: SkillRegistry } /** Requests per principal per window when the caller injects no limiter. */ const DEFAULT_RATE_BUDGET = 240 @@ -75,6 +76,7 @@ export class WorkbenchServer { readonly #runtime: RuntimeAdapter readonly #audit: AuditPort readonly #capability: CapabilityGate + readonly #artifacts?: ArtifactStore readonly #browser?: BrowserAutomationBroker readonly #desktop?: DesktopAutomationBroker readonly #workflow?: WorkflowRuntime @@ -100,6 +102,7 @@ export class WorkbenchServer { this.#runtime = dependencies.runtime this.#audit = dependencies.audit this.#capability = dependencies.capability + this.#artifacts = dependencies.artifacts this.#browser = dependencies.browser this.#desktop = dependencies.desktop this.#workflow = dependencies.workflow @@ -150,6 +153,7 @@ export class WorkbenchServer { if (segments[1] === "approvals" && (request.method === "POST" || request.method === "DELETE")) return this.#approval(request, segments[2]) if (segments[1] === "trace" && request.method === "GET") return this.#auditPage(request, "trace") if (segments[1] === "activity" && request.method === "GET") return this.#auditPage(request, "activity") + if (segments[1] === "artifacts" && request.method === "GET") return this.#artifactRead(request, segments[2]) if (segments[1] === "browser" && request.method === "POST") return this.#browserAction(request, segments[2]) if (segments[1] === "desktop" && request.method === "POST") return this.#desktopAction(request, segments[2]) if (segments[1] === "workflows" && request.method === "POST") return this.#workflowAction(request, segments[2]) @@ -471,6 +475,19 @@ export class WorkbenchServer { this.#allow(`${kind}.read`) return json(200, { kind, ...page }) } + async #artifactRead(request: Request, artifactId?: string): Promise { + if (!this.#artifacts) return this.#deny("artifact.read.unavailable", 503) + const workspaceId = new URL(request.url).searchParams.get("workspaceId") + if (!workspaceId || !this.#authorize(request, workspaceId)) return this.#deny("artifact.read.scope", 403) + const gate = await this.#checkCapability("workspace.read", workspaceId) + if (gate) return gate + if (!artifactId) { this.#allow("artifact.list"); return json(200, { artifacts: await this.#artifacts.list() }) } + const artifact = await this.#artifacts.latest(artifactId) + if (!artifact) return this.#deny("artifact.not-found", 404) + const content = await this.#artifacts.read(artifact) + this.#allow("artifact.read") + return json(200, { artifact, content: Buffer.from(content).toString("base64"), encoding: "base64" }) + } async #closeFileSession(request: Request, token: string): Promise { const supplied = this.#bearer(request) if (!supplied || supplied !== token || !this.#tokens.has(token)) return this.#deny("workspace.close.scope", 403) diff --git a/packages/workbench-server/test/server.test.ts b/packages/workbench-server/test/server.test.ts index 1a48f52f9cef..8ab6015e3535 100644 --- a/packages/workbench-server/test/server.test.ts +++ b/packages/workbench-server/test/server.test.ts @@ -5,6 +5,7 @@ import os from "node:os" import path from "node:path" import { ApprovalBroker, AuditRuntimeDouble, BrowserAutomationBroker, CapabilityRegistry, DesktopAutomationBroker, McpUiControlBroker, FakeRuntimeAdapter } from "@unifia/contracts" import { InMemoryMemoryStore, MemoryRuntime } from "@unifia/memory-runtime" +import { ArtifactStore } from "@unifia/artifact-runtime" import { InMemoryWorkflowStore, WorkflowRuntime } from "@unifia/workflow-runtime" import { WorkspaceRuntime } from "@unifia/workspace-runtime" import { InMemorySkillRegistry, type InstalledSkill, type SkillManifest, type SkillPackage, type SkillRegistry, type SkillTrust } from "@unifia/skill-hub" @@ -36,9 +37,10 @@ const root = await mkdtemp(path.join(os.tmpdir(), "unifia-server-")) try { await writeFile(path.join(root, "README.md"), "hello") const workspace = new WorkspaceRuntime() + const artifacts = new ArtifactStore(root, () => 1_000) const audit = new AuditRuntimeDouble(() => 1_000) let capabilityDecision: "allow" | "deny" = "allow" - const server = new WorkbenchServer({ auth: testAuth, workspace, runtime: new FakeRuntimeAdapter(() => 1_000), audit, capability: { check: async () => capabilityDecision } }) + const server = new WorkbenchServer({ auth: testAuth, workspace, artifacts, runtime: new FakeRuntimeAdapter(() => 1_000), audit, capability: { check: async () => capabilityDecision } }) const registered = await server.fetch(new Request("http://localhost/v1/workspaces/register", { method: "POST", body: JSON.stringify({ name: "fixture", path: root }) })) if (registered.status !== 201) throw new Error("workspace register route failed") const registeredBody = await registered.json() as { id: string } @@ -58,6 +60,11 @@ try { if (fileSearch.status !== 200) throw new Error("scoped file search failed") const fileSearchBody = await fileSearch.json() as { entries: readonly { path: string }[] } if (fileSearchBody.entries.length !== 1 || fileSearchBody.entries[0]?.path !== "README.md") throw new Error("file search did not filter README.md") + const artifact = await artifacts.create({ kind: "text", filename: "result.txt", content: "artifact result", provenance: { sourceTool: "test" } }) + const artifactList = await server.fetch(new Request(`http://localhost/v1/artifacts?workspaceId=${handle.id}`, { headers: { authorization: `Bearer ${handle.token}` } })) + if (artifactList.status !== 200 || !((await artifactList.json()) as { artifacts: readonly { artifactId: string }[] }).artifacts.some((entry) => entry.artifactId === artifact.artifactId)) throw new Error("artifact list route failed") + const artifactDetail = await server.fetch(new Request(`http://localhost/v1/artifacts/${artifact.artifactId}?workspaceId=${handle.id}`, { headers: { authorization: `Bearer ${handle.token}` } })) + if (artifactDetail.status !== 200 || ((await artifactDetail.json()) as { encoding: string }).encoding !== "base64") throw new Error("artifact detail route failed") capabilityDecision = "deny" const deniedWrite = await server.fetch(new Request("http://localhost/v1/files/write", { method: "POST", headers: { authorization: `Bearer ${handle.token}` }, body: JSON.stringify({ workspaceId: handle.id, writes: [{ path: "README.md", content: "blocked" }] }) })) if (deniedWrite.status !== 403) throw new Error("capability gate did not deny write") diff --git a/packages/workbench-shell/src/routes.ts b/packages/workbench-shell/src/routes.ts index 859fb2dd30e2..95990165e784 100644 --- a/packages/workbench-shell/src/routes.ts +++ b/packages/workbench-shell/src/routes.ts @@ -71,5 +71,11 @@ export const M8_SERVER_ROUTE_REGISTRY = { activityPage: { method: "GET", route: "/v1/activity", capability: "trace.read", event: "trace.appended" }, } as const satisfies Record +/** M9a artifact read routes are registered before server consumption. */ +export const M9A_SERVER_ROUTE_REGISTRY = { + artifactsList: { method: "GET", route: "/v1/artifacts", capability: "workspace.read", event: "catalog.updated" }, + artifactDetail: { method: "GET", route: "/v1/artifacts/:artifactId", capability: "workspace.read", event: "catalog.updated" }, +} as const satisfies Record + const missingOperations = WORK_V1_FUNCTIONS.filter((operation) => !WORKBENCH_ROUTE_OPERATIONS.includes(operation)) if (missingOperations.length > 0) throw new Error(`route registry is missing Work V1 operations: ${missingOperations.join(", ")}`) diff --git a/work_design/STATE.md b/work_design/STATE.md index c7276c94e274..91c0fba640c9 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -6,7 +6,7 @@ This file is the durable execution state for the Unifia Work/Design integration. - Branch: `work-design` - Base commit: `91daa35a26a8e44d7f35b539c91030ec1e230c54` -- Current card: `M8` +- Current card: `M9a` - Status: `IMPLEMENTED_WITH_DEFERRED_HUMAN_PROOFS` - Commit or push performed: yes (through M7; latest SHA recorded after commit) @@ -27,6 +27,7 @@ This file is the durable execution state for the Unifia Work/Design integration. | M6 | implemented with deferred human proofs | workbench-server typecheck + server 72/72 + bootstrap 40/40 + security/preflight/topology + operations 2/2 | Reconnectable session SSE remains cursor-based; long prompt operations now receive idempotent operation IDs and can be cancelled through a scoped route. | | M7 | implemented with deferred human proofs | contracts/workspace + workspace-runtime typecheck/tests + server 72/72 + shell typecheck + security guard | Bounded, root-confined file listing/search and protected `GET /v1/files/list` and `GET /v1/files/search` routes. | | M8 | implemented with deferred human proofs | server typecheck + server 72/72 + security 3/3 + P3 C8/C9 7/7 | Pending approval listing scoped to a workspace, cursor/limit audit pages for trace/activity, and a distinct redacted/level-filtered rolling server logger. | +| M9a | implemented with deferred human proofs | artifact-runtime 38/38 + server 72/72 + typechecks + route registry | Artifact lineage listing/detail with provenance and base64 content, scoped by workspace read capability. | ## Manual verification register @@ -69,9 +70,10 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - M6 implementation → operation registry adds idempotent operation tracking, asynchronous prompt execution, scoped cancellation, and typed M6 route registration; operation tests pass 2/2 and existing server suites remain green. - M7 implementation → `WorkspacePort` now exposes bounded listing/search; `WorkspaceRuntime` resolves real paths inside the registered root, refuses escapes and enforces an entry quota; Workbench routes apply workspace auth and `workspace.read`; runtime and server assertions cover list/search. - M8 implementation → `ApprovalBroker.pending()` and `GET /v1/approvals` expose only live requests for the authorized workspace; audit pages support bounded cursors for `/v1/trace` and `/v1/activity`; `ServerLogger` is separate from audit, defaults to info, redacts sensitive fields, filters debug, and rotates at a size limit. +- M9a implementation → `ArtifactStore.list()` returns latest heads from the authoritative on-disk lineage manifests; Workbench artifact list/detail routes enforce workspace scope and `workspace.read`, expose provenance, and encode bytes explicitly as base64. ## Resume first 1. Read this file, `DECISIONS.md`, and `../INTEGRATION.md`. 2. Review the M0b diff and run the CI workflow on the first PR. -3. M8 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. +3. M9a code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. From 246abf7ff3e6224b4cb27ee51a7f709df65a1cb6 Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 02:05:44 +0200 Subject: [PATCH 09/76] feat(workbench): add artifact lineage writes --- packages/workbench-server/src/index.ts | 13 +++++++++++++ packages/workbench-server/test/server.test.ts | 2 ++ packages/workbench-shell/src/routes.ts | 5 +++++ work_design/STATE.md | 6 ++++-- 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/packages/workbench-server/src/index.ts b/packages/workbench-server/src/index.ts index fba4c74c8adf..5ea0cc841d55 100644 --- a/packages/workbench-server/src/index.ts +++ b/packages/workbench-server/src/index.ts @@ -154,6 +154,7 @@ export class WorkbenchServer { if (segments[1] === "trace" && request.method === "GET") return this.#auditPage(request, "trace") if (segments[1] === "activity" && request.method === "GET") return this.#auditPage(request, "activity") if (segments[1] === "artifacts" && request.method === "GET") return this.#artifactRead(request, segments[2]) + if (segments[1] === "artifacts" && request.method === "POST") return this.#artifactWrite(request) if (segments[1] === "browser" && request.method === "POST") return this.#browserAction(request, segments[2]) if (segments[1] === "desktop" && request.method === "POST") return this.#desktopAction(request, segments[2]) if (segments[1] === "workflows" && request.method === "POST") return this.#workflowAction(request, segments[2]) @@ -488,6 +489,18 @@ export class WorkbenchServer { this.#allow("artifact.read") return json(200, { artifact, content: Buffer.from(content).toString("base64"), encoding: "base64" }) } + async #artifactWrite(request: Request): Promise { + if (!this.#artifacts) return this.#deny("artifact.create.unavailable", 503) + const input = await body(request) + if (typeof input.workspaceId !== "string" || typeof input.kind !== "string" || typeof input.filename !== "string" || typeof input.content !== "string") return this.#deny("artifact.create", 400) + const token = this.#authorize(request, input.workspaceId) + if (!token) return this.#deny("artifact.create.scope", 403) + const gate = await this.#checkCapability("artifact.create", input.workspaceId) + if (gate) return gate + const artifact = await this.#artifacts.create({ kind: input.kind as Parameters[0]["kind"], filename: input.filename, content: input.content, artifactId: typeof input.artifactId === "string" ? input.artifactId : undefined, metadata: input.metadata as Record | undefined, provenance: input.provenance as Parameters[0]["provenance"] }) + this.#allow("artifact.create") + return json(201, { artifact }) + } async #closeFileSession(request: Request, token: string): Promise { const supplied = this.#bearer(request) if (!supplied || supplied !== token || !this.#tokens.has(token)) return this.#deny("workspace.close.scope", 403) diff --git a/packages/workbench-server/test/server.test.ts b/packages/workbench-server/test/server.test.ts index 8ab6015e3535..c555238e1278 100644 --- a/packages/workbench-server/test/server.test.ts +++ b/packages/workbench-server/test/server.test.ts @@ -65,6 +65,8 @@ try { if (artifactList.status !== 200 || !((await artifactList.json()) as { artifacts: readonly { artifactId: string }[] }).artifacts.some((entry) => entry.artifactId === artifact.artifactId)) throw new Error("artifact list route failed") const artifactDetail = await server.fetch(new Request(`http://localhost/v1/artifacts/${artifact.artifactId}?workspaceId=${handle.id}`, { headers: { authorization: `Bearer ${handle.token}` } })) if (artifactDetail.status !== 200 || ((await artifactDetail.json()) as { encoding: string }).encoding !== "base64") throw new Error("artifact detail route failed") + const artifactRevision = await server.fetch(new Request("http://localhost/v1/artifacts", { method: "POST", headers: { authorization: `Bearer ${handle.token}` }, body: JSON.stringify({ workspaceId: handle.id, kind: "text", filename: "result.txt", content: "artifact revision", artifactId: artifact.artifactId, provenance: { sourceTool: "server-test" } }) })) + if (artifactRevision.status !== 201 || ((await artifactRevision.json()) as { artifact: { version: number } }).artifact.version !== 2) throw new Error("artifact revision route failed") capabilityDecision = "deny" const deniedWrite = await server.fetch(new Request("http://localhost/v1/files/write", { method: "POST", headers: { authorization: `Bearer ${handle.token}` }, body: JSON.stringify({ workspaceId: handle.id, writes: [{ path: "README.md", content: "blocked" }] }) })) if (deniedWrite.status !== 403) throw new Error("capability gate did not deny write") diff --git a/packages/workbench-shell/src/routes.ts b/packages/workbench-shell/src/routes.ts index 95990165e784..3a9ad53dd7c7 100644 --- a/packages/workbench-shell/src/routes.ts +++ b/packages/workbench-shell/src/routes.ts @@ -77,5 +77,10 @@ export const M9A_SERVER_ROUTE_REGISTRY = { artifactDetail: { method: "GET", route: "/v1/artifacts/:artifactId", capability: "workspace.read", event: "catalog.updated" }, } as const satisfies Record +/** M9b artifact lineage write route is registered before server consumption. */ +export const M9B_SERVER_ROUTE_REGISTRY = { + artifactCreate: { method: "POST", route: "/v1/artifacts", capability: "artifact.create", event: "catalog.updated" }, +} as const satisfies Record + const missingOperations = WORK_V1_FUNCTIONS.filter((operation) => !WORKBENCH_ROUTE_OPERATIONS.includes(operation)) if (missingOperations.length > 0) throw new Error(`route registry is missing Work V1 operations: ${missingOperations.join(", ")}`) diff --git a/work_design/STATE.md b/work_design/STATE.md index 91c0fba640c9..32821e77cc27 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -6,7 +6,7 @@ This file is the durable execution state for the Unifia Work/Design integration. - Branch: `work-design` - Base commit: `91daa35a26a8e44d7f35b539c91030ec1e230c54` -- Current card: `M9a` +- Current card: `M9b` - Status: `IMPLEMENTED_WITH_DEFERRED_HUMAN_PROOFS` - Commit or push performed: yes (through M7; latest SHA recorded after commit) @@ -28,6 +28,7 @@ This file is the durable execution state for the Unifia Work/Design integration. | M7 | implemented with deferred human proofs | contracts/workspace + workspace-runtime typecheck/tests + server 72/72 + shell typecheck + security guard | Bounded, root-confined file listing/search and protected `GET /v1/files/list` and `GET /v1/files/search` routes. | | M8 | implemented with deferred human proofs | server typecheck + server 72/72 + security 3/3 + P3 C8/C9 7/7 | Pending approval listing scoped to a workspace, cursor/limit audit pages for trace/activity, and a distinct redacted/level-filtered rolling server logger. | | M9a | implemented with deferred human proofs | artifact-runtime 38/38 + server 72/72 + typechecks + route registry | Artifact lineage listing/detail with provenance and base64 content, scoped by workspace read capability. | +| M9b | implemented with deferred human proofs | server typecheck + shell typecheck + server 72/72 | Artifact creation and revision route delegates to the persistent ArtifactStore under `artifact.create`. | ## Manual verification register @@ -71,9 +72,10 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - M7 implementation → `WorkspacePort` now exposes bounded listing/search; `WorkspaceRuntime` resolves real paths inside the registered root, refuses escapes and enforces an entry quota; Workbench routes apply workspace auth and `workspace.read`; runtime and server assertions cover list/search. - M8 implementation → `ApprovalBroker.pending()` and `GET /v1/approvals` expose only live requests for the authorized workspace; audit pages support bounded cursors for `/v1/trace` and `/v1/activity`; `ServerLogger` is separate from audit, defaults to info, redacts sensitive fields, filters debug, and rotates at a size limit. - M9a implementation → `ArtifactStore.list()` returns latest heads from the authoritative on-disk lineage manifests; Workbench artifact list/detail routes enforce workspace scope and `workspace.read`, expose provenance, and encode bytes explicitly as base64. +- M9b implementation → `POST /v1/artifacts` creates a new lineage or version, validates the workspace bearer scope and `artifact.create`, and delegates persistence/provenance/versioning to `ArtifactStore`. ## Resume first 1. Read this file, `DECISIONS.md`, and `../INTEGRATION.md`. 2. Review the M0b diff and run the CI workflow on the first PR. -3. M9a code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. +3. M9b code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. From 7afe39f75fe77b3f55f3a6eeb4a4525ae5fb8180 Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 02:07:31 +0200 Subject: [PATCH 10/76] feat(workbench): gate local artifact exports --- packages/workbench-server/src/index.ts | 15 +++++++++++++++ packages/workbench-server/test/server.test.ts | 2 ++ packages/workbench-shell/src/routes.ts | 5 +++++ work_design/STATE.md | 6 ++++-- 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/packages/workbench-server/src/index.ts b/packages/workbench-server/src/index.ts index 5ea0cc841d55..1f5cfb9af4ed 100644 --- a/packages/workbench-server/src/index.ts +++ b/packages/workbench-server/src/index.ts @@ -154,6 +154,7 @@ export class WorkbenchServer { if (segments[1] === "trace" && request.method === "GET") return this.#auditPage(request, "trace") if (segments[1] === "activity" && request.method === "GET") return this.#auditPage(request, "activity") if (segments[1] === "artifacts" && request.method === "GET") return this.#artifactRead(request, segments[2]) + if (segments[1] === "artifacts" && segments[2] === "export" && request.method === "POST") return this.#artifactExport(request) if (segments[1] === "artifacts" && request.method === "POST") return this.#artifactWrite(request) if (segments[1] === "browser" && request.method === "POST") return this.#browserAction(request, segments[2]) if (segments[1] === "desktop" && request.method === "POST") return this.#desktopAction(request, segments[2]) @@ -501,6 +502,20 @@ export class WorkbenchServer { this.#allow("artifact.create") return json(201, { artifact }) } + async #artifactExport(request: Request): Promise { + if (!this.#artifacts) return this.#deny("artifact.export.unavailable", 503) + const input = await body(request) + if (typeof input.workspaceId !== "string" || typeof input.artifactId !== "string") return this.#deny("artifact.export", 400) + const token = this.#authorize(request, input.workspaceId) + if (!token) return this.#deny("artifact.export.scope", 403) + const gate = await this.#checkCapability("artifact.export", input.workspaceId) + if (gate) return gate + const artifact = await this.#artifacts.latest(input.artifactId) + if (!artifact) return this.#deny("artifact.export.not-found", 404) + const exported = await this.#artifacts.export(artifact, { outbox: typeof input.outbox === "string" ? input.outbox : undefined, metadata: input.metadata === "keep" ? "keep" : "strip" }) + this.#allow("artifact.export") + return json(200, { exported }) + } async #closeFileSession(request: Request, token: string): Promise { const supplied = this.#bearer(request) if (!supplied || supplied !== token || !this.#tokens.has(token)) return this.#deny("workspace.close.scope", 403) diff --git a/packages/workbench-server/test/server.test.ts b/packages/workbench-server/test/server.test.ts index c555238e1278..1faddbf2822b 100644 --- a/packages/workbench-server/test/server.test.ts +++ b/packages/workbench-server/test/server.test.ts @@ -67,6 +67,8 @@ try { if (artifactDetail.status !== 200 || ((await artifactDetail.json()) as { encoding: string }).encoding !== "base64") throw new Error("artifact detail route failed") const artifactRevision = await server.fetch(new Request("http://localhost/v1/artifacts", { method: "POST", headers: { authorization: `Bearer ${handle.token}` }, body: JSON.stringify({ workspaceId: handle.id, kind: "text", filename: "result.txt", content: "artifact revision", artifactId: artifact.artifactId, provenance: { sourceTool: "server-test" } }) })) if (artifactRevision.status !== 201 || ((await artifactRevision.json()) as { artifact: { version: number } }).artifact.version !== 2) throw new Error("artifact revision route failed") + const artifactExport = await server.fetch(new Request("http://localhost/v1/artifacts/export", { method: "POST", headers: { authorization: `Bearer ${handle.token}` }, body: JSON.stringify({ workspaceId: handle.id, artifactId: artifact.artifactId, outbox: "server-test" }) })) + if (artifactExport.status !== 200 || !((await artifactExport.json()) as { exported: { relativePath: string } }).exported.relativePath.includes("server-test")) throw new Error("artifact export route failed") capabilityDecision = "deny" const deniedWrite = await server.fetch(new Request("http://localhost/v1/files/write", { method: "POST", headers: { authorization: `Bearer ${handle.token}` }, body: JSON.stringify({ workspaceId: handle.id, writes: [{ path: "README.md", content: "blocked" }] }) })) if (deniedWrite.status !== 403) throw new Error("capability gate did not deny write") diff --git a/packages/workbench-shell/src/routes.ts b/packages/workbench-shell/src/routes.ts index 3a9ad53dd7c7..64cb78d50158 100644 --- a/packages/workbench-shell/src/routes.ts +++ b/packages/workbench-shell/src/routes.ts @@ -82,5 +82,10 @@ export const M9B_SERVER_ROUTE_REGISTRY = { artifactCreate: { method: "POST", route: "/v1/artifacts", capability: "artifact.create", event: "catalog.updated" }, } as const satisfies Record +/** M10 export route remains approval-gated by the server capability broker. */ +export const M10_SERVER_ROUTE_REGISTRY = { + artifactExport: { method: "POST", route: "/v1/artifacts/export", capability: "artifact.export", event: "operation.updated" }, +} as const satisfies Record + const missingOperations = WORK_V1_FUNCTIONS.filter((operation) => !WORKBENCH_ROUTE_OPERATIONS.includes(operation)) if (missingOperations.length > 0) throw new Error(`route registry is missing Work V1 operations: ${missingOperations.join(", ")}`) diff --git a/work_design/STATE.md b/work_design/STATE.md index 32821e77cc27..b1a9bee9c54d 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -6,7 +6,7 @@ This file is the durable execution state for the Unifia Work/Design integration. - Branch: `work-design` - Base commit: `91daa35a26a8e44d7f35b539c91030ec1e230c54` -- Current card: `M9b` +- Current card: `M10` - Status: `IMPLEMENTED_WITH_DEFERRED_HUMAN_PROOFS` - Commit or push performed: yes (through M7; latest SHA recorded after commit) @@ -29,6 +29,7 @@ This file is the durable execution state for the Unifia Work/Design integration. | M8 | implemented with deferred human proofs | server typecheck + server 72/72 + security 3/3 + P3 C8/C9 7/7 | Pending approval listing scoped to a workspace, cursor/limit audit pages for trace/activity, and a distinct redacted/level-filtered rolling server logger. | | M9a | implemented with deferred human proofs | artifact-runtime 38/38 + server 72/72 + typechecks + route registry | Artifact lineage listing/detail with provenance and base64 content, scoped by workspace read capability. | | M9b | implemented with deferred human proofs | server typecheck + shell typecheck + server 72/72 | Artifact creation and revision route delegates to the persistent ArtifactStore under `artifact.create`. | +| M10 | implemented with deferred human proofs | server typecheck + shell typecheck + server 72/72 | Local artifact export route is capability-gated by `artifact.export`; destination stays inside ArtifactStore outbox and metadata defaults to strip. | ## Manual verification register @@ -73,9 +74,10 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - M8 implementation → `ApprovalBroker.pending()` and `GET /v1/approvals` expose only live requests for the authorized workspace; audit pages support bounded cursors for `/v1/trace` and `/v1/activity`; `ServerLogger` is separate from audit, defaults to info, redacts sensitive fields, filters debug, and rotates at a size limit. - M9a implementation → `ArtifactStore.list()` returns latest heads from the authoritative on-disk lineage manifests; Workbench artifact list/detail routes enforce workspace scope and `workspace.read`, expose provenance, and encode bytes explicitly as base64. - M9b implementation → `POST /v1/artifacts` creates a new lineage or version, validates the workspace bearer scope and `artifact.create`, and delegates persistence/provenance/versioning to `ArtifactStore`. +- M10 implementation → `POST /v1/artifacts/export` checks `artifact.export` before exporting the verified latest version through `ArtifactStore`; outbox names remain path-safe and metadata is stripped unless explicitly kept. ## Resume first 1. Read this file, `DECISIONS.md`, and `../INTEGRATION.md`. 2. Review the M0b diff and run the CI workflow on the first PR. -3. M9b code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. +3. M10 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. From 45ea9513f49e6016ac61623654e40e99c6bc88ba Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 02:15:45 +0200 Subject: [PATCH 11/76] fix(ci): satisfy SPDX conformance gate --- packages/contracts/test/workbench-wire.test.ts | 2 ++ packages/workbench-server/test/auth.test.ts | 2 ++ packages/workbench-server/test/cors-preflight.test.ts | 2 ++ packages/workbench-server/test/operations.test.ts | 2 ++ packages/workbench-server/test/security.test.ts | 2 ++ packages/workbench-shell/test/client.test.ts | 2 ++ packages/workbench-shell/test/routes.test.ts | 2 ++ work_design/STATE.md | 1 + 8 files changed, 15 insertions(+) diff --git a/packages/contracts/test/workbench-wire.test.ts b/packages/contracts/test/workbench-wire.test.ts index 62e678f18b05..11850c8eb43f 100644 --- a/packages/contracts/test/workbench-wire.test.ts +++ b/packages/contracts/test/workbench-wire.test.ts @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: MIT */ + import { describe, expect, it } from "vitest" import { EVENT_MERGE_RULES, diff --git a/packages/workbench-server/test/auth.test.ts b/packages/workbench-server/test/auth.test.ts index 81d2f3c52b76..2e733f00ee26 100644 --- a/packages/workbench-server/test/auth.test.ts +++ b/packages/workbench-server/test/auth.test.ts @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: MIT */ + import { describe, expect, test } from "bun:test" import { ScopedTokenIssuer } from "../src/auth.js" diff --git a/packages/workbench-server/test/cors-preflight.test.ts b/packages/workbench-server/test/cors-preflight.test.ts index b408fd1fe2f8..da876f845a8d 100644 --- a/packages/workbench-server/test/cors-preflight.test.ts +++ b/packages/workbench-server/test/cors-preflight.test.ts @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: MIT */ + import { describe, expect, it } from "vitest" import { WorkbenchServer } from "../src/index.js" diff --git a/packages/workbench-server/test/operations.test.ts b/packages/workbench-server/test/operations.test.ts index 565593f8adc2..a64b9dc94181 100644 --- a/packages/workbench-server/test/operations.test.ts +++ b/packages/workbench-server/test/operations.test.ts @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: MIT */ + import { describe, expect, test } from "bun:test" import { OperationRegistry } from "../src/operations.js" diff --git a/packages/workbench-server/test/security.test.ts b/packages/workbench-server/test/security.test.ts index 1a91d55b702b..80f79cd086ce 100644 --- a/packages/workbench-server/test/security.test.ts +++ b/packages/workbench-server/test/security.test.ts @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: MIT */ + import { describe, expect, it } from "vitest" import { mkdtemp, readFile, rm } from "node:fs/promises" import os from "node:os" diff --git a/packages/workbench-shell/test/client.test.ts b/packages/workbench-shell/test/client.test.ts index ed45909b76f7..4e276cb26aaf 100644 --- a/packages/workbench-shell/test/client.test.ts +++ b/packages/workbench-shell/test/client.test.ts @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: MIT */ + import { WorkbenchClient, WorkbenchEventDispatcher, WorkbenchHttpError, newRequestId } from "../src/index.js" let checks = 0 diff --git a/packages/workbench-shell/test/routes.test.ts b/packages/workbench-shell/test/routes.test.ts index eb783dff8515..c56e3ced6d02 100644 --- a/packages/workbench-shell/test/routes.test.ts +++ b/packages/workbench-shell/test/routes.test.ts @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: MIT */ + import { WORKBENCH_ROUTE_OPERATIONS, WORKBENCH_ROUTE_REGISTRY, routeFor, routesForLineage } from "../src/index.js" const expected = ["workspace-switcher", "session-chat", "files", "search", "artifacts", "documents", "trace", "approvals", "activity-log", "capability-picker", "export"] diff --git a/work_design/STATE.md b/work_design/STATE.md index b1a9bee9c54d..661c9a1ec996 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -61,6 +61,7 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - `bun test packages/workbench-server/test/bootstrap.test.ts` → PASS (40/40) - `bun test packages/workbench-server/test/topology.test.ts` → PASS (3/3) - `node scripts/check-workbench-security.mjs` → PASS locally; CI guard added for server/desktop/mobile Origin and CSP alignment +- `node scripts/unifia-conformance.mjs --json unifia-conformance.json` → PASS (8/8) after adding SPDX headers to seven owned test files that the CI gate correctly required. - Android runtime preparation → PASS: Alpine `rootfs.tgz` generated at 824426778 bytes; the WSL branch and Bun-unavailable bundle reuse path in `packages/mobile/scripts/prepare-android-runtime.sh` were exercised. - Android release build → PASS (exit 0): unsigned APK and AAB generated under `packages/mobile/src-tauri/gen/android/app/build/outputs/`; APK size 1115164803 bytes, AAB size 1066480647 bytes. - `bun scripts/check-android-runtime.mjs` from `packages/mobile` → PASS: rootfs and 30 native libraries present. The ORT binary was supplied from an existing local prepared worktree through an ignored hardlink; no source checkout was modified. From 070c23c322029b58e3bbd35e8aaf99c0e654deac Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 03:12:15 +0200 Subject: [PATCH 12/76] feat(workbench): validate workspace design specs --- packages/workbench-server/package.json | 2 +- packages/workbench-server/src/index.ts | 14 ++++++++++++++ packages/workbench-server/test/server.test.ts | 2 ++ packages/workbench-shell/src/routes.ts | 5 +++++ work_design/STATE.md | 6 ++++-- 5 files changed, 26 insertions(+), 3 deletions(-) diff --git a/packages/workbench-server/package.json b/packages/workbench-server/package.json index eb908abf2c3b..86242246750a 100644 --- a/packages/workbench-server/package.json +++ b/packages/workbench-server/package.json @@ -6,6 +6,6 @@ "license": "MIT", "exports": { ".": "./src/index.ts", "./bootstrap": "./src/bootstrap.ts" }, "scripts": { "typecheck": "bun x tsc --noEmit", "test": "bun test/server.test.ts && bun test/bootstrap.test.ts && bun test/topology.test.ts && bun test/security.test.ts && bun test/cors-preflight.test.ts", "start": "bun src/bootstrap.ts" }, - "dependencies": { "@unifia/artifact-runtime": "workspace:*", "@unifia/contracts": "workspace:*", "@unifia/workspace-runtime": "workspace:*", "@unifia/workflow-runtime": "workspace:*", "@unifia/memory-runtime": "workspace:*", "@unifia/skill-hub": "workspace:*" }, + "dependencies": { "@unifia/artifact-runtime": "workspace:*", "@unifia/contracts": "workspace:*", "@unifia/spec-runtime": "workspace:*", "@unifia/workspace-runtime": "workspace:*", "@unifia/workflow-runtime": "workspace:*", "@unifia/memory-runtime": "workspace:*", "@unifia/skill-hub": "workspace:*" }, "devDependencies": { "@types/bun": "catalog:", "@types/node": "catalog:", "typescript": "catalog:" } } diff --git a/packages/workbench-server/src/index.ts b/packages/workbench-server/src/index.ts index 1f5cfb9af4ed..4d56e0c14fac 100644 --- a/packages/workbench-server/src/index.ts +++ b/packages/workbench-server/src/index.ts @@ -3,6 +3,7 @@ import type { ApprovalBroker, ApprovalRequestRecord, AuditEvent, CapabilityRegis import type { MemoryRuntime } from "@unifia/memory-runtime" import type { WorkflowDefinition, WorkflowRuntime } from "@unifia/workflow-runtime" import type { ArtifactStore } from "@unifia/artifact-runtime" +import { parseSpec, resolveEffectiveCapabilities } from "@unifia/spec-runtime" import type { SkillRegistry } from "@unifia/skill-hub" import { renderGenerativeUi, type UiNode } from "@unifia/contracts" import type { @@ -156,6 +157,7 @@ export class WorkbenchServer { if (segments[1] === "artifacts" && request.method === "GET") return this.#artifactRead(request, segments[2]) if (segments[1] === "artifacts" && segments[2] === "export" && request.method === "POST") return this.#artifactExport(request) if (segments[1] === "artifacts" && request.method === "POST") return this.#artifactWrite(request) + if (segments[1] === "specs" && segments[2] === "validate" && request.method === "POST") return this.#specValidate(request) if (segments[1] === "browser" && request.method === "POST") return this.#browserAction(request, segments[2]) if (segments[1] === "desktop" && request.method === "POST") return this.#desktopAction(request, segments[2]) if (segments[1] === "workflows" && request.method === "POST") return this.#workflowAction(request, segments[2]) @@ -516,6 +518,18 @@ export class WorkbenchServer { this.#allow("artifact.export") return json(200, { exported }) } + async #specValidate(request: Request): Promise { + const input = await body(request) + if (typeof input.workspaceId !== "string" || (typeof input.spec !== "string" && (!input.spec || typeof input.spec !== "object"))) return this.#deny("spec.validate", 400) + const token = this.#authorize(request, input.workspaceId) + if (!token) return this.#deny("spec.validate.scope", 403) + const gate = await this.#checkCapability("workspace.read", input.workspaceId) + if (gate) return gate + const spec = parseSpec(input.spec) + const resolution = resolveEffectiveCapabilities(spec, []) + this.#allow("spec.validate") + return json(200, { valid: true, spec, capabilities: resolution }) + } async #closeFileSession(request: Request, token: string): Promise { const supplied = this.#bearer(request) if (!supplied || supplied !== token || !this.#tokens.has(token)) return this.#deny("workspace.close.scope", 403) diff --git a/packages/workbench-server/test/server.test.ts b/packages/workbench-server/test/server.test.ts index 1faddbf2822b..14527879b3bd 100644 --- a/packages/workbench-server/test/server.test.ts +++ b/packages/workbench-server/test/server.test.ts @@ -69,6 +69,8 @@ try { if (artifactRevision.status !== 201 || ((await artifactRevision.json()) as { artifact: { version: number } }).artifact.version !== 2) throw new Error("artifact revision route failed") const artifactExport = await server.fetch(new Request("http://localhost/v1/artifacts/export", { method: "POST", headers: { authorization: `Bearer ${handle.token}` }, body: JSON.stringify({ workspaceId: handle.id, artifactId: artifact.artifactId, outbox: "server-test" }) })) if (artifactExport.status !== 200 || !((await artifactExport.json()) as { exported: { relativePath: string } }).exported.relativePath.includes("server-test")) throw new Error("artifact export route failed") + const specValidation = await server.fetch(new Request("http://localhost/v1/specs/validate", { method: "POST", headers: { authorization: `Bearer ${handle.token}` }, body: JSON.stringify({ workspaceId: handle.id, spec: { id: "server-spec", version: "1.0.0", target: "design", title: "Server spec", capabilities: ["artifact.export"], rules: [] } }) })) + if (specValidation.status !== 200 || ((await specValidation.json()) as { capabilities: { granted: readonly string[]; denied: readonly string[] } }).capabilities.denied[0] !== "artifact.export") throw new Error("spec validation route widened capabilities") capabilityDecision = "deny" const deniedWrite = await server.fetch(new Request("http://localhost/v1/files/write", { method: "POST", headers: { authorization: `Bearer ${handle.token}` }, body: JSON.stringify({ workspaceId: handle.id, writes: [{ path: "README.md", content: "blocked" }] }) })) if (deniedWrite.status !== 403) throw new Error("capability gate did not deny write") diff --git a/packages/workbench-shell/src/routes.ts b/packages/workbench-shell/src/routes.ts index 64cb78d50158..1f136819b008 100644 --- a/packages/workbench-shell/src/routes.ts +++ b/packages/workbench-shell/src/routes.ts @@ -87,5 +87,10 @@ export const M10_SERVER_ROUTE_REGISTRY = { artifactExport: { method: "POST", route: "/v1/artifacts/export", capability: "artifact.export", event: "operation.updated" }, } as const satisfies Record +/** M11 validates untrusted specs without granting their requested capabilities. */ +export const M11_SERVER_ROUTE_REGISTRY = { + specValidate: { method: "POST", route: "/v1/specs/validate", capability: "workspace.read", event: "catalog.updated" }, +} as const satisfies Record + const missingOperations = WORK_V1_FUNCTIONS.filter((operation) => !WORKBENCH_ROUTE_OPERATIONS.includes(operation)) if (missingOperations.length > 0) throw new Error(`route registry is missing Work V1 operations: ${missingOperations.join(", ")}`) diff --git a/work_design/STATE.md b/work_design/STATE.md index 661c9a1ec996..ab7174166911 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -6,7 +6,7 @@ This file is the durable execution state for the Unifia Work/Design integration. - Branch: `work-design` - Base commit: `91daa35a26a8e44d7f35b539c91030ec1e230c54` -- Current card: `M10` +- Current card: `M11` - Status: `IMPLEMENTED_WITH_DEFERRED_HUMAN_PROOFS` - Commit or push performed: yes (through M7; latest SHA recorded after commit) @@ -30,6 +30,7 @@ This file is the durable execution state for the Unifia Work/Design integration. | M9a | implemented with deferred human proofs | artifact-runtime 38/38 + server 72/72 + typechecks + route registry | Artifact lineage listing/detail with provenance and base64 content, scoped by workspace read capability. | | M9b | implemented with deferred human proofs | server typecheck + shell typecheck + server 72/72 | Artifact creation and revision route delegates to the persistent ArtifactStore under `artifact.create`. | | M10 | implemented with deferred human proofs | server typecheck + shell typecheck + server 72/72 | Local artifact export route is capability-gated by `artifact.export`; destination stays inside ArtifactStore outbox and metadata defaults to strip. | +| M11 | implemented with deferred human proofs | spec/server/shell typechecks + server 72/72 | Server-side JSON spec validation delegates to `SpecRuntime`; requested capabilities are intersected with an empty workspace grant and never elevated. Design-system catalog source remains open under G6. | ## Manual verification register @@ -76,9 +77,10 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - M9a implementation → `ArtifactStore.list()` returns latest heads from the authoritative on-disk lineage manifests; Workbench artifact list/detail routes enforce workspace scope and `workspace.read`, expose provenance, and encode bytes explicitly as base64. - M9b implementation → `POST /v1/artifacts` creates a new lineage or version, validates the workspace bearer scope and `artifact.create`, and delegates persistence/provenance/versioning to `ArtifactStore`. - M10 implementation → `POST /v1/artifacts/export` checks `artifact.export` before exporting the verified latest version through `ArtifactStore`; outbox names remain path-safe and metadata is stripped unless explicitly kept. +- M11 implementation → `POST /v1/specs/validate` parses untrusted specs through `SpecRuntime`, returns explicit denied capabilities, and does not infer or create a design-system catalog source while G6 remains open. ## Resume first 1. Read this file, `DECISIONS.md`, and `../INTEGRATION.md`. 2. Review the M0b diff and run the CI workflow on the first PR. -3. M10 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. +3. M11 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. From 9d00f34b4375b156aa60d3534f91eb92b9b51d3a Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 03:20:14 +0200 Subject: [PATCH 13/76] feat(workbench): expose typed file search client --- packages/workbench-shell/src/client.ts | 13 +++++++++++++ packages/workbench-shell/src/index.ts | 4 ++-- packages/workbench-shell/test/client.test.ts | 13 +++++++++++-- work_design/STATE.md | 6 ++++-- 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/packages/workbench-shell/src/client.ts b/packages/workbench-shell/src/client.ts index c92e45975e66..a691276025ec 100644 --- a/packages/workbench-shell/src/client.ts +++ b/packages/workbench-shell/src/client.ts @@ -35,6 +35,9 @@ export type RequestOptions = { signal?: AbortSignal } +export type WorkspaceFileEntry = { path: string; kind: "file" | "directory"; size: number; modifiedAt: number } +export type WorkspaceFilePage = { entries: readonly WorkspaceFileEntry[] } + export class WorkbenchHttpError extends Error { readonly status: number readonly retryable: boolean @@ -112,6 +115,16 @@ export class WorkbenchClient { return parseHandshakeResponse(payload) } + async listFiles(workspaceId: string, prefix = ".", signal?: AbortSignal): Promise { + const params = new URLSearchParams({ workspaceId, prefix }) + return this.request(`/v1/files/list?${params}`, { signal }) + } + + async searchFiles(workspaceId: string, query: string, prefix = ".", signal?: AbortSignal): Promise { + const params = new URLSearchParams({ workspaceId, query, prefix }) + return this.request(`/v1/files/search?${params}`, { signal }) + } + async request(path: string, options: RequestOptions = {}): Promise { const method = options.method ?? "GET" const canRetry = method === "GET" || method === "DELETE" || options.idempotencyKey !== undefined diff --git a/packages/workbench-shell/src/index.ts b/packages/workbench-shell/src/index.ts index 3324fe56c8a2..add528d30926 100644 --- a/packages/workbench-shell/src/index.ts +++ b/packages/workbench-shell/src/index.ts @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: MIT */ export { DESTRUCTIVE_ACTIONS, READ_ONLY_FUNCTIONS, SHELL_MODES, WORK_V1_FUNCTIONS, isDestructive, isReadOnly, type DestructiveAction, type ShellMode, type WorkFunction } from "./modes.js" export { ShellError, WorkbenchShell, surface, type ArtifactRef, type PreviewToken, type Provenance, type ShellOptions, type ShellRefusal, type ShellResult } from "./shell.js" -export { WorkbenchClient, WorkbenchEventDispatcher, WorkbenchHttpError, newRequestId, type RequestOptions, type TokenProvider, type WorkbenchClientOptions } from "./client.js" -export { M6_SERVER_ROUTE_REGISTRY, WORKBENCH_ROUTE_OPERATIONS, WORKBENCH_ROUTE_REGISTRY, routeFor, routesForLineage, type ArtifactLineage, type WorkbenchRoute, type WorkbenchServerRoute, type WorkbenchTransportMethod } from "./routes.js" +export { WorkbenchClient, WorkbenchEventDispatcher, WorkbenchHttpError, newRequestId, type RequestOptions, type TokenProvider, type WorkbenchClientOptions, type WorkspaceFileEntry, type WorkspaceFilePage } from "./client.js" +export { M6_SERVER_ROUTE_REGISTRY, M7_SERVER_ROUTE_REGISTRY, M8_SERVER_ROUTE_REGISTRY, M9A_SERVER_ROUTE_REGISTRY, M9B_SERVER_ROUTE_REGISTRY, M10_SERVER_ROUTE_REGISTRY, M11_SERVER_ROUTE_REGISTRY, WORKBENCH_ROUTE_OPERATIONS, WORKBENCH_ROUTE_REGISTRY, routeFor, routesForLineage, type ArtifactLineage, type WorkbenchRoute, type WorkbenchServerRoute, type WorkbenchTransportMethod } from "./routes.js" diff --git a/packages/workbench-shell/test/client.test.ts b/packages/workbench-shell/test/client.test.ts index 4e276cb26aaf..b241f7eb3219 100644 --- a/packages/workbench-shell/test/client.test.ts +++ b/packages/workbench-shell/test/client.test.ts @@ -10,6 +10,7 @@ const check = (condition: boolean, message: string): void => { let token = "expired" let refreshes = 0 +const requests: Array<{ url: string }> = [] const client = new WorkbenchClient({ baseUrl: "http://127.0.0.1:7444", instanceId: "instance-1", @@ -17,12 +18,20 @@ const client = new WorkbenchClient({ current: () => token, refresh: async () => { refreshes += 1; token = "fresh"; return token }, }, - fetchImpl: async (_input, init) => { + fetchImpl: async (input, init) => { + requests.push({ url: new URL(String(input)).pathname + new URL(String(input)).search }) if (init?.headers && token === "expired") return new Response(null, { status: 401 }) - return new Response(JSON.stringify({ ok: true }), { status: 200, headers: { "content-type": "application/json" } }) + return new Response(JSON.stringify({ ok: true, entries: [] }), { status: 200, headers: { "content-type": "application/json" } }) }, }) +const listRequest = await client.listFiles("workspace-1", "src") +check(requests.at(-1)?.url === "/v1/files/list?workspaceId=workspace-1&prefix=src", "file list client route was not encoded deterministically") +check(listRequest.entries.length === 0, "file list client did not decode the response") +const searchRequest = await client.searchFiles("workspace-1", "main.ts") +check(requests.at(-1)?.url === "/v1/files/search?workspaceId=workspace-1&query=main.ts&prefix=.", "file search client route was not encoded deterministically") +check(searchRequest.entries.length === 0, "file search client did not decode the response") + check((await client.request<{ ok: boolean }>("/v1/read")).ok, "a GET did not retry after token refresh") check(refreshes === 1, "GET refresh count was not exactly one") diff --git a/work_design/STATE.md b/work_design/STATE.md index ab7174166911..e619858cbe0f 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -6,7 +6,7 @@ This file is the durable execution state for the Unifia Work/Design integration. - Branch: `work-design` - Base commit: `91daa35a26a8e44d7f35b539c91030ec1e230c54` -- Current card: `M11` +- Current card: `M12` - Status: `IMPLEMENTED_WITH_DEFERRED_HUMAN_PROOFS` - Commit or push performed: yes (through M7; latest SHA recorded after commit) @@ -31,6 +31,7 @@ This file is the durable execution state for the Unifia Work/Design integration. | M9b | implemented with deferred human proofs | server typecheck + shell typecheck + server 72/72 | Artifact creation and revision route delegates to the persistent ArtifactStore under `artifact.create`. | | M10 | implemented with deferred human proofs | server typecheck + shell typecheck + server 72/72 | Local artifact export route is capability-gated by `artifact.export`; destination stays inside ArtifactStore outbox and metadata defaults to strip. | | M11 | implemented with deferred human proofs | spec/server/shell typechecks + server 72/72 | Server-side JSON spec validation delegates to `SpecRuntime`; requested capabilities are intersected with an empty workspace grant and never elevated. Design-system catalog source remains open under G6. | +| M12 | implemented with deferred human proofs | shell typecheck + shell 122/122 + modes 4/4 + client 11/11 + routes 11/11 | Typed client methods for bounded file listing/search, URL encoding, response typing, and export of all server route registries. | ## Manual verification register @@ -78,9 +79,10 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - M9b implementation → `POST /v1/artifacts` creates a new lineage or version, validates the workspace bearer scope and `artifact.create`, and delegates persistence/provenance/versioning to `ArtifactStore`. - M10 implementation → `POST /v1/artifacts/export` checks `artifact.export` before exporting the verified latest version through `ArtifactStore`; outbox names remain path-safe and metadata is stripped unless explicitly kept. - M11 implementation → `POST /v1/specs/validate` parses untrusted specs through `SpecRuntime`, returns explicit denied capabilities, and does not infer or create a design-system catalog source while G6 remains open. +- M12 implementation → `WorkbenchClient.listFiles/searchFiles` consume the protected M7 routes with typed entries, deterministic query parameters and abort signals; the shell index now exports M6–M11 route registries. ## Resume first 1. Read this file, `DECISIONS.md`, and `../INTEGRATION.md`. 2. Review the M0b diff and run the CI workflow on the first PR. -3. M11 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. +3. M12 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. From aede7fc1c5fba75e7b857a657ce8b70f90a5ffd5 Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 03:37:13 +0200 Subject: [PATCH 14/76] feat(workbench): expose artifact and document catalogs --- packages/workbench-server/src/index.ts | 12 ++++++++++++ packages/workbench-server/test/server.test.ts | 2 ++ packages/workbench-shell/src/client.ts | 9 +++++++++ packages/workbench-shell/src/index.ts | 2 +- packages/workbench-shell/test/client.test.ts | 4 ++++ work_design/STATE.md | 6 ++++-- 6 files changed, 32 insertions(+), 3 deletions(-) diff --git a/packages/workbench-server/src/index.ts b/packages/workbench-server/src/index.ts index 4d56e0c14fac..97abe4abf68c 100644 --- a/packages/workbench-server/src/index.ts +++ b/packages/workbench-server/src/index.ts @@ -157,6 +157,7 @@ export class WorkbenchServer { if (segments[1] === "artifacts" && request.method === "GET") return this.#artifactRead(request, segments[2]) if (segments[1] === "artifacts" && segments[2] === "export" && request.method === "POST") return this.#artifactExport(request) if (segments[1] === "artifacts" && request.method === "POST") return this.#artifactWrite(request) + if (segments[1] === "documents" && request.method === "GET") return this.#documents(request) if (segments[1] === "specs" && segments[2] === "validate" && request.method === "POST") return this.#specValidate(request) if (segments[1] === "browser" && request.method === "POST") return this.#browserAction(request, segments[2]) if (segments[1] === "desktop" && request.method === "POST") return this.#desktopAction(request, segments[2]) @@ -518,6 +519,17 @@ export class WorkbenchServer { this.#allow("artifact.export") return json(200, { exported }) } + async #documents(request: Request): Promise { + if (!this.#artifacts) return this.#deny("documents.unavailable", 503) + const url = new URL(request.url) + const workspaceId = url.searchParams.get("workspaceId") + if (!workspaceId || !this.#authorize(request, workspaceId)) return this.#deny("documents.scope", 403) + const gate = await this.#checkCapability("workspace.read", workspaceId) + if (gate) return gate + const documents = (await this.#artifacts.list()).filter((artifact) => artifact.kind !== "binary") + this.#allow("documents.list") + return json(200, { documents }) + } async #specValidate(request: Request): Promise { const input = await body(request) if (typeof input.workspaceId !== "string" || (typeof input.spec !== "string" && (!input.spec || typeof input.spec !== "object"))) return this.#deny("spec.validate", 400) diff --git a/packages/workbench-server/test/server.test.ts b/packages/workbench-server/test/server.test.ts index 14527879b3bd..87d4b8a6f881 100644 --- a/packages/workbench-server/test/server.test.ts +++ b/packages/workbench-server/test/server.test.ts @@ -71,6 +71,8 @@ try { if (artifactExport.status !== 200 || !((await artifactExport.json()) as { exported: { relativePath: string } }).exported.relativePath.includes("server-test")) throw new Error("artifact export route failed") const specValidation = await server.fetch(new Request("http://localhost/v1/specs/validate", { method: "POST", headers: { authorization: `Bearer ${handle.token}` }, body: JSON.stringify({ workspaceId: handle.id, spec: { id: "server-spec", version: "1.0.0", target: "design", title: "Server spec", capabilities: ["artifact.export"], rules: [] } }) })) if (specValidation.status !== 200 || ((await specValidation.json()) as { capabilities: { granted: readonly string[]; denied: readonly string[] } }).capabilities.denied[0] !== "artifact.export") throw new Error("spec validation route widened capabilities") + const documents = await server.fetch(new Request(`http://localhost/v1/documents?workspaceId=${handle.id}`, { headers: { authorization: `Bearer ${handle.token}` } })) + if (documents.status !== 200 || !((await documents.json()) as { documents: readonly { artifactId: string }[] }).documents.some((entry) => entry.artifactId === artifact.artifactId)) throw new Error("document list route failed") capabilityDecision = "deny" const deniedWrite = await server.fetch(new Request("http://localhost/v1/files/write", { method: "POST", headers: { authorization: `Bearer ${handle.token}` }, body: JSON.stringify({ workspaceId: handle.id, writes: [{ path: "README.md", content: "blocked" }] }) })) if (deniedWrite.status !== 403) throw new Error("capability gate did not deny write") diff --git a/packages/workbench-shell/src/client.ts b/packages/workbench-shell/src/client.ts index a691276025ec..418b36e5bd90 100644 --- a/packages/workbench-shell/src/client.ts +++ b/packages/workbench-shell/src/client.ts @@ -37,6 +37,7 @@ export type RequestOptions = { export type WorkspaceFileEntry = { path: string; kind: "file" | "directory"; size: number; modifiedAt: number } export type WorkspaceFilePage = { entries: readonly WorkspaceFileEntry[] } +export type ArtifactSummary = { artifactId: string; version: number; kind: string; filename: string; bytes: number; createdAt: number; metadata: Record; provenance?: Record } export class WorkbenchHttpError extends Error { readonly status: number @@ -125,6 +126,14 @@ export class WorkbenchClient { return this.request(`/v1/files/search?${params}`, { signal }) } + async listArtifacts(workspaceId: string, signal?: AbortSignal): Promise<{ artifacts: readonly ArtifactSummary[] }> { + return this.request(`/v1/artifacts?${new URLSearchParams({ workspaceId })}`, { signal }) + } + + async listDocuments(workspaceId: string, signal?: AbortSignal): Promise<{ documents: readonly ArtifactSummary[] }> { + return this.request(`/v1/documents?${new URLSearchParams({ workspaceId })}`, { signal }) + } + async request(path: string, options: RequestOptions = {}): Promise { const method = options.method ?? "GET" const canRetry = method === "GET" || method === "DELETE" || options.idempotencyKey !== undefined diff --git a/packages/workbench-shell/src/index.ts b/packages/workbench-shell/src/index.ts index add528d30926..0d163df55b9b 100644 --- a/packages/workbench-shell/src/index.ts +++ b/packages/workbench-shell/src/index.ts @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: MIT */ export { DESTRUCTIVE_ACTIONS, READ_ONLY_FUNCTIONS, SHELL_MODES, WORK_V1_FUNCTIONS, isDestructive, isReadOnly, type DestructiveAction, type ShellMode, type WorkFunction } from "./modes.js" export { ShellError, WorkbenchShell, surface, type ArtifactRef, type PreviewToken, type Provenance, type ShellOptions, type ShellRefusal, type ShellResult } from "./shell.js" -export { WorkbenchClient, WorkbenchEventDispatcher, WorkbenchHttpError, newRequestId, type RequestOptions, type TokenProvider, type WorkbenchClientOptions, type WorkspaceFileEntry, type WorkspaceFilePage } from "./client.js" +export { WorkbenchClient, WorkbenchEventDispatcher, WorkbenchHttpError, newRequestId, type ArtifactSummary, type RequestOptions, type TokenProvider, type WorkbenchClientOptions, type WorkspaceFileEntry, type WorkspaceFilePage } from "./client.js" export { M6_SERVER_ROUTE_REGISTRY, M7_SERVER_ROUTE_REGISTRY, M8_SERVER_ROUTE_REGISTRY, M9A_SERVER_ROUTE_REGISTRY, M9B_SERVER_ROUTE_REGISTRY, M10_SERVER_ROUTE_REGISTRY, M11_SERVER_ROUTE_REGISTRY, WORKBENCH_ROUTE_OPERATIONS, WORKBENCH_ROUTE_REGISTRY, routeFor, routesForLineage, type ArtifactLineage, type WorkbenchRoute, type WorkbenchServerRoute, type WorkbenchTransportMethod } from "./routes.js" diff --git a/packages/workbench-shell/test/client.test.ts b/packages/workbench-shell/test/client.test.ts index b241f7eb3219..194ed5bc6fe1 100644 --- a/packages/workbench-shell/test/client.test.ts +++ b/packages/workbench-shell/test/client.test.ts @@ -31,6 +31,10 @@ check(listRequest.entries.length === 0, "file list client did not decode the res const searchRequest = await client.searchFiles("workspace-1", "main.ts") check(requests.at(-1)?.url === "/v1/files/search?workspaceId=workspace-1&query=main.ts&prefix=.", "file search client route was not encoded deterministically") check(searchRequest.entries.length === 0, "file search client did not decode the response") +await client.listArtifacts("workspace-1") +check(requests.at(-1)?.url === "/v1/artifacts?workspaceId=workspace-1", "artifact list client route was not encoded deterministically") +await client.listDocuments("workspace-1") +check(requests.at(-1)?.url === "/v1/documents?workspaceId=workspace-1", "document list client route was not encoded deterministically") check((await client.request<{ ok: boolean }>("/v1/read")).ok, "a GET did not retry after token refresh") check(refreshes === 1, "GET refresh count was not exactly one") diff --git a/work_design/STATE.md b/work_design/STATE.md index e619858cbe0f..82b45d3b6c2b 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -6,7 +6,7 @@ This file is the durable execution state for the Unifia Work/Design integration. - Branch: `work-design` - Base commit: `91daa35a26a8e44d7f35b539c91030ec1e230c54` -- Current card: `M12` +- Current card: `M13` - Status: `IMPLEMENTED_WITH_DEFERRED_HUMAN_PROOFS` - Commit or push performed: yes (through M7; latest SHA recorded after commit) @@ -32,6 +32,7 @@ This file is the durable execution state for the Unifia Work/Design integration. | M10 | implemented with deferred human proofs | server typecheck + shell typecheck + server 72/72 | Local artifact export route is capability-gated by `artifact.export`; destination stays inside ArtifactStore outbox and metadata defaults to strip. | | M11 | implemented with deferred human proofs | spec/server/shell typechecks + server 72/72 | Server-side JSON spec validation delegates to `SpecRuntime`; requested capabilities are intersected with an empty workspace grant and never elevated. Design-system catalog source remains open under G6. | | M12 | implemented with deferred human proofs | shell typecheck + shell 122/122 + modes 4/4 + client 11/11 + routes 11/11 | Typed client methods for bounded file listing/search, URL encoding, response typing, and export of all server route registries. | +| M13 | implemented with deferred human proofs | server 72/72 + shell 122/122 + client 13/13 + modes/routes contracts | Documents list route filters persisted artifact heads; client exposes typed artifact and document catalogs. | ## Manual verification register @@ -80,9 +81,10 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - M10 implementation → `POST /v1/artifacts/export` checks `artifact.export` before exporting the verified latest version through `ArtifactStore`; outbox names remain path-safe and metadata is stripped unless explicitly kept. - M11 implementation → `POST /v1/specs/validate` parses untrusted specs through `SpecRuntime`, returns explicit denied capabilities, and does not infer or create a design-system catalog source while G6 remains open. - M12 implementation → `WorkbenchClient.listFiles/searchFiles` consume the protected M7 routes with typed entries, deterministic query parameters and abort signals; the shell index now exports M6–M11 route registries. +- M13 implementation → `GET /v1/documents` exposes non-binary persisted artifact heads under workspace read scope; the client adds typed artifact/document catalog methods without creating a second store. ## Resume first 1. Read this file, `DECISIONS.md`, and `../INTEGRATION.md`. 2. Review the M0b diff and run the CI workflow on the first PR. -3. M12 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. +3. M13 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. From ccf5d51dd8bbb230d8e80f5a950f428ecf4a6c56 Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 03:40:23 +0200 Subject: [PATCH 15/76] feat(workbench): expose typed trace and activity pages --- packages/workbench-shell/src/client.ts | 12 ++++++++++++ packages/workbench-shell/src/index.ts | 2 +- packages/workbench-shell/test/client.test.ts | 10 +++++++++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/packages/workbench-shell/src/client.ts b/packages/workbench-shell/src/client.ts index 418b36e5bd90..208e48d507a9 100644 --- a/packages/workbench-shell/src/client.ts +++ b/packages/workbench-shell/src/client.ts @@ -38,6 +38,8 @@ export type RequestOptions = { export type WorkspaceFileEntry = { path: string; kind: "file" | "directory"; size: number; modifiedAt: number } export type WorkspaceFilePage = { entries: readonly WorkspaceFileEntry[] } export type ArtifactSummary = { artifactId: string; version: number; kind: string; filename: string; bytes: number; createdAt: number; metadata: Record; provenance?: Record } +export type AuditEvent = { sequence: number; timestamp: number; actor: string; capability: string; decision: "allow" | "deny" | "approval_required"; previousHash: string; hash: string } +export type AuditPage = { kind: "trace" | "activity"; events: readonly AuditEvent[]; nextCursor: number | null } export class WorkbenchHttpError extends Error { readonly status: number @@ -134,6 +136,16 @@ export class WorkbenchClient { return this.request(`/v1/documents?${new URLSearchParams({ workspaceId })}`, { signal }) } + async trace(workspaceId: string, after = 0, limit = 50, signal?: AbortSignal): Promise { + const params = new URLSearchParams({ workspaceId, after: String(after), limit: String(limit) }) + return this.request(`/v1/trace?${params}`, { signal }) + } + + async activity(workspaceId: string, after = 0, limit = 50, signal?: AbortSignal): Promise { + const params = new URLSearchParams({ workspaceId, after: String(after), limit: String(limit) }) + return this.request(`/v1/activity?${params}`, { signal }) + } + async request(path: string, options: RequestOptions = {}): Promise { const method = options.method ?? "GET" const canRetry = method === "GET" || method === "DELETE" || options.idempotencyKey !== undefined diff --git a/packages/workbench-shell/src/index.ts b/packages/workbench-shell/src/index.ts index 0d163df55b9b..9a741367f9de 100644 --- a/packages/workbench-shell/src/index.ts +++ b/packages/workbench-shell/src/index.ts @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: MIT */ export { DESTRUCTIVE_ACTIONS, READ_ONLY_FUNCTIONS, SHELL_MODES, WORK_V1_FUNCTIONS, isDestructive, isReadOnly, type DestructiveAction, type ShellMode, type WorkFunction } from "./modes.js" export { ShellError, WorkbenchShell, surface, type ArtifactRef, type PreviewToken, type Provenance, type ShellOptions, type ShellRefusal, type ShellResult } from "./shell.js" -export { WorkbenchClient, WorkbenchEventDispatcher, WorkbenchHttpError, newRequestId, type ArtifactSummary, type RequestOptions, type TokenProvider, type WorkbenchClientOptions, type WorkspaceFileEntry, type WorkspaceFilePage } from "./client.js" +export { WorkbenchClient, WorkbenchEventDispatcher, WorkbenchHttpError, newRequestId, type ArtifactSummary, type AuditEvent, type AuditPage, type RequestOptions, type TokenProvider, type WorkbenchClientOptions, type WorkspaceFileEntry, type WorkspaceFilePage } from "./client.js" export { M6_SERVER_ROUTE_REGISTRY, M7_SERVER_ROUTE_REGISTRY, M8_SERVER_ROUTE_REGISTRY, M9A_SERVER_ROUTE_REGISTRY, M9B_SERVER_ROUTE_REGISTRY, M10_SERVER_ROUTE_REGISTRY, M11_SERVER_ROUTE_REGISTRY, WORKBENCH_ROUTE_OPERATIONS, WORKBENCH_ROUTE_REGISTRY, routeFor, routesForLineage, type ArtifactLineage, type WorkbenchRoute, type WorkbenchServerRoute, type WorkbenchTransportMethod } from "./routes.js" diff --git a/packages/workbench-shell/test/client.test.ts b/packages/workbench-shell/test/client.test.ts index 194ed5bc6fe1..cacecdf6f844 100644 --- a/packages/workbench-shell/test/client.test.ts +++ b/packages/workbench-shell/test/client.test.ts @@ -21,7 +21,9 @@ const client = new WorkbenchClient({ fetchImpl: async (input, init) => { requests.push({ url: new URL(String(input)).pathname + new URL(String(input)).search }) if (init?.headers && token === "expired") return new Response(null, { status: 401 }) - return new Response(JSON.stringify({ ok: true, entries: [] }), { status: 200, headers: { "content-type": "application/json" } }) + const path = new URL(String(input)).pathname + const payload = path === "/v1/trace" ? { kind: "trace", events: [], nextCursor: null } : path === "/v1/activity" ? { kind: "activity", events: [], nextCursor: null } : { ok: true, entries: [] } + return new Response(JSON.stringify(payload), { status: 200, headers: { "content-type": "application/json" } }) }, }) @@ -35,6 +37,12 @@ await client.listArtifacts("workspace-1") check(requests.at(-1)?.url === "/v1/artifacts?workspaceId=workspace-1", "artifact list client route was not encoded deterministically") await client.listDocuments("workspace-1") check(requests.at(-1)?.url === "/v1/documents?workspaceId=workspace-1", "document list client route was not encoded deterministically") +const trace = await client.trace("workspace-1", 4, 2) +check(requests.at(-1)?.url === "/v1/trace?workspaceId=workspace-1&after=4&limit=2", "trace client route was not encoded deterministically") +check(trace.kind === "trace" && trace.events.length === 0, "trace client did not decode the typed page") +const activity = await client.activity("workspace-1") +check(requests.at(-1)?.url === "/v1/activity?workspaceId=workspace-1&after=0&limit=50", "activity client route did not apply bounded defaults") +check(activity.kind === "activity", "activity client did not preserve the page kind") check((await client.request<{ ok: boolean }>("/v1/read")).ok, "a GET did not retry after token refresh") check(refreshes === 1, "GET refresh count was not exactly one") From c394880e379598dfe356464dd8e171427a81cd77 Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 03:43:07 +0200 Subject: [PATCH 16/76] feat(workbench): add approval capability and export client flows --- packages/workbench-shell/src/client.ts | 19 +++++++++++++++++++ packages/workbench-shell/src/index.ts | 4 ++-- packages/workbench-shell/src/routes.ts | 7 ++++++- packages/workbench-shell/test/client.test.ts | 6 ++++++ work_design/STATE.md | 8 ++++++-- 5 files changed, 39 insertions(+), 5 deletions(-) diff --git a/packages/workbench-shell/src/client.ts b/packages/workbench-shell/src/client.ts index 208e48d507a9..3800d610c39b 100644 --- a/packages/workbench-shell/src/client.ts +++ b/packages/workbench-shell/src/client.ts @@ -40,6 +40,9 @@ export type WorkspaceFilePage = { entries: readonly WorkspaceFileEntry[] } export type ArtifactSummary = { artifactId: string; version: number; kind: string; filename: string; bytes: number; createdAt: number; metadata: Record; provenance?: Record } export type AuditEvent = { sequence: number; timestamp: number; actor: string; capability: string; decision: "allow" | "deny" | "approval_required"; previousHash: string; hash: string } export type AuditPage = { kind: "trace" | "activity"; events: readonly AuditEvent[]; nextCursor: number | null } +export type ApprovalRequest = { id: string; capability: string; resource: string; expiresAt: number; status: "pending" | "allow" | "deny" | "cancelled" } +export type CapabilityRecord = { manifest: { descriptor: { id: string; name: string; description: string; version: string; author: string; license: string; schema: Record; tags: string[]; trustLevel: "untrusted" | "verified" | "official" }; digest: string; sourceRepo: string; sourceCommit: string; license: string; attribution?: string; remoteCode: boolean; signature?: string }; state: "registered" | "approved" | "enabled" | "revoked" } +export type ExportedArtifact = { artifactId: string; version: number; relativePath: string; sha256: string; metadata: Record } export class WorkbenchHttpError extends Error { readonly status: number @@ -146,6 +149,22 @@ export class WorkbenchClient { return this.request(`/v1/activity?${params}`, { signal }) } + async listApprovals(workspaceId: string, signal?: AbortSignal): Promise<{ approvals: readonly ApprovalRequest[] }> { + return this.request(`/v1/approvals?${new URLSearchParams({ workspaceId })}`, { signal }) + } + + async searchCapabilities(workspaceId: string, filters: { tag?: string; trustLevel?: "untrusted" | "verified" | "official"; enabledOnly?: boolean } = {}, signal?: AbortSignal): Promise<{ records: readonly CapabilityRecord[] }> { + const params = new URLSearchParams({ workspaceId }) + if (filters.tag) params.set("tag", filters.tag) + if (filters.trustLevel) params.set("trustLevel", filters.trustLevel) + if (filters.enabledOnly !== undefined) params.set("enabledOnly", String(filters.enabledOnly)) + return this.request(`/v1/capabilities/search?${params}`, { signal }) + } + + async exportArtifact(workspaceId: string, artifactId: string, options: { outbox?: string; metadata?: "keep" | "strip" } = {}, signal?: AbortSignal): Promise<{ exported: ExportedArtifact }> { + return this.request(`/v1/artifacts/export`, { method: "POST", body: { workspaceId, artifactId, ...options }, idempotencyKey: newRequestId(), signal }) + } + async request(path: string, options: RequestOptions = {}): Promise { const method = options.method ?? "GET" const canRetry = method === "GET" || method === "DELETE" || options.idempotencyKey !== undefined diff --git a/packages/workbench-shell/src/index.ts b/packages/workbench-shell/src/index.ts index 9a741367f9de..9ead8135c788 100644 --- a/packages/workbench-shell/src/index.ts +++ b/packages/workbench-shell/src/index.ts @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: MIT */ export { DESTRUCTIVE_ACTIONS, READ_ONLY_FUNCTIONS, SHELL_MODES, WORK_V1_FUNCTIONS, isDestructive, isReadOnly, type DestructiveAction, type ShellMode, type WorkFunction } from "./modes.js" export { ShellError, WorkbenchShell, surface, type ArtifactRef, type PreviewToken, type Provenance, type ShellOptions, type ShellRefusal, type ShellResult } from "./shell.js" -export { WorkbenchClient, WorkbenchEventDispatcher, WorkbenchHttpError, newRequestId, type ArtifactSummary, type AuditEvent, type AuditPage, type RequestOptions, type TokenProvider, type WorkbenchClientOptions, type WorkspaceFileEntry, type WorkspaceFilePage } from "./client.js" -export { M6_SERVER_ROUTE_REGISTRY, M7_SERVER_ROUTE_REGISTRY, M8_SERVER_ROUTE_REGISTRY, M9A_SERVER_ROUTE_REGISTRY, M9B_SERVER_ROUTE_REGISTRY, M10_SERVER_ROUTE_REGISTRY, M11_SERVER_ROUTE_REGISTRY, WORKBENCH_ROUTE_OPERATIONS, WORKBENCH_ROUTE_REGISTRY, routeFor, routesForLineage, type ArtifactLineage, type WorkbenchRoute, type WorkbenchServerRoute, type WorkbenchTransportMethod } from "./routes.js" +export { WorkbenchClient, WorkbenchEventDispatcher, WorkbenchHttpError, newRequestId, type ApprovalRequest, type ArtifactSummary, type AuditEvent, type AuditPage, type CapabilityRecord, type ExportedArtifact, type RequestOptions, type TokenProvider, type WorkbenchClientOptions, type WorkspaceFileEntry, type WorkspaceFilePage } from "./client.js" +export { M6_SERVER_ROUTE_REGISTRY, M7_SERVER_ROUTE_REGISTRY, M8_SERVER_ROUTE_REGISTRY, M9A_SERVER_ROUTE_REGISTRY, M9B_SERVER_ROUTE_REGISTRY, M10_SERVER_ROUTE_REGISTRY, M11_SERVER_ROUTE_REGISTRY, M15_SERVER_ROUTE_REGISTRY, WORKBENCH_ROUTE_OPERATIONS, WORKBENCH_ROUTE_REGISTRY, routeFor, routesForLineage, type ArtifactLineage, type WorkbenchRoute, type WorkbenchServerRoute, type WorkbenchTransportMethod } from "./routes.js" diff --git a/packages/workbench-shell/src/routes.ts b/packages/workbench-shell/src/routes.ts index 1f136819b008..bc9cd0d7d2d1 100644 --- a/packages/workbench-shell/src/routes.ts +++ b/packages/workbench-shell/src/routes.ts @@ -31,7 +31,7 @@ export const WORKBENCH_ROUTE_REGISTRY: RouteByWorkFunction = { trace: { surface: "work", operation: "trace", method: "GET", route: "/v1/trace", capability: "trace.read", event: "trace.appended" }, approvals: { surface: "work", operation: "approvals", method: "GET", route: "/v1/approvals", capability: "approval.read", event: "approval.updated" }, "activity-log": { surface: "work", operation: "activity-log", method: "GET", route: "/v1/activity", capability: "trace.read", event: "trace.appended" }, - "capability-picker": { surface: "work", operation: "capability-picker", method: "GET", route: "/v1/capabilities", capability: "capability.read", event: "catalog.updated" }, + "capability-picker": { surface: "work", operation: "capability-picker", method: "GET", route: "/v1/capabilities/search", capability: "package.install", event: "catalog.updated" }, export: { surface: "design", operation: "export", method: "POST", route: "/v1/artifacts/export", capability: "artifact.export", event: "operation.updated", lineage: "design/render" }, } @@ -92,5 +92,10 @@ export const M11_SERVER_ROUTE_REGISTRY = { specValidate: { method: "POST", route: "/v1/specs/validate", capability: "workspace.read", event: "catalog.updated" }, } as const satisfies Record +/** M15 capability picker consumes the scoped server search route. */ +export const M15_SERVER_ROUTE_REGISTRY = { + capabilitySearch: { method: "GET", route: "/v1/capabilities/search", capability: "package.install", event: "catalog.updated" }, +} as const satisfies Record + const missingOperations = WORK_V1_FUNCTIONS.filter((operation) => !WORKBENCH_ROUTE_OPERATIONS.includes(operation)) if (missingOperations.length > 0) throw new Error(`route registry is missing Work V1 operations: ${missingOperations.join(", ")}`) diff --git a/packages/workbench-shell/test/client.test.ts b/packages/workbench-shell/test/client.test.ts index cacecdf6f844..1056a56c6b2c 100644 --- a/packages/workbench-shell/test/client.test.ts +++ b/packages/workbench-shell/test/client.test.ts @@ -43,6 +43,12 @@ check(trace.kind === "trace" && trace.events.length === 0, "trace client did not const activity = await client.activity("workspace-1") check(requests.at(-1)?.url === "/v1/activity?workspaceId=workspace-1&after=0&limit=50", "activity client route did not apply bounded defaults") check(activity.kind === "activity", "activity client did not preserve the page kind") +await client.listApprovals("workspace-1") +check(requests.at(-1)?.url === "/v1/approvals?workspaceId=workspace-1", "approval list client route was not encoded deterministically") +await client.searchCapabilities("workspace-1", { tag: "design", trustLevel: "verified", enabledOnly: true }) +check(requests.at(-1)?.url === "/v1/capabilities/search?workspaceId=workspace-1&tag=design&trustLevel=verified&enabledOnly=true", "capability search client route was not encoded deterministically") +await client.exportArtifact("workspace-1", "artifact-123", { metadata: "strip" }) +check(requests.at(-1)?.url === "/v1/artifacts/export", "artifact export client route was not selected") check((await client.request<{ ok: boolean }>("/v1/read")).ok, "a GET did not retry after token refresh") check(refreshes === 1, "GET refresh count was not exactly one") diff --git a/work_design/STATE.md b/work_design/STATE.md index 82b45d3b6c2b..6e942ba960c8 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -6,7 +6,7 @@ This file is the durable execution state for the Unifia Work/Design integration. - Branch: `work-design` - Base commit: `91daa35a26a8e44d7f35b539c91030ec1e230c54` -- Current card: `M13` +- Current card: `M15` - Status: `IMPLEMENTED_WITH_DEFERRED_HUMAN_PROOFS` - Commit or push performed: yes (through M7; latest SHA recorded after commit) @@ -33,6 +33,8 @@ This file is the durable execution state for the Unifia Work/Design integration. | M11 | implemented with deferred human proofs | spec/server/shell typechecks + server 72/72 | Server-side JSON spec validation delegates to `SpecRuntime`; requested capabilities are intersected with an empty workspace grant and never elevated. Design-system catalog source remains open under G6. | | M12 | implemented with deferred human proofs | shell typecheck + shell 122/122 + modes 4/4 + client 11/11 + routes 11/11 | Typed client methods for bounded file listing/search, URL encoding, response typing, and export of all server route registries. | | M13 | implemented with deferred human proofs | server 72/72 + shell 122/122 + client 13/13 + modes/routes contracts | Documents list route filters persisted artifact heads; client exposes typed artifact and document catalogs. | +| M14 | implemented with deferred human proofs | shell typecheck + client 17/17 | Client exposes typed bounded trace and activity pages with explicit cursors and page kinds. | +| M15 | implemented with deferred human proofs | shell typecheck + client 20/20 + routes 11/11 | Client exposes scoped approvals, capability search filters, and idempotent artifact export; capability-picker registry now points to the real search route. | ## Manual verification register @@ -82,9 +84,11 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - M11 implementation → `POST /v1/specs/validate` parses untrusted specs through `SpecRuntime`, returns explicit denied capabilities, and does not infer or create a design-system catalog source while G6 remains open. - M12 implementation → `WorkbenchClient.listFiles/searchFiles` consume the protected M7 routes with typed entries, deterministic query parameters and abort signals; the shell index now exports M6–M11 route registries. - M13 implementation → `GET /v1/documents` exposes non-binary persisted artifact heads under workspace read scope; the client adds typed artifact/document catalog methods without creating a second store. +- M14 implementation → `WorkbenchClient.trace/activity` consume the existing scoped audit pages with typed events, bounded cursors, and deterministic query parameters. +- M15 implementation → `WorkbenchClient.listApprovals/searchCapabilities/exportArtifact` consumes the existing server authorities; capability search is explicitly `package.install` gated and export uses an idempotency key. ## Resume first 1. Read this file, `DECISIONS.md`, and `../INTEGRATION.md`. 2. Review the M0b diff and run the CI workflow on the first PR. -3. M13 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. +3. M15 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. From d1e1e5c1da6863ec0e0fc5f37500a987e4c9b159 Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 03:46:03 +0200 Subject: [PATCH 17/76] feat(workbench): add design spec panel model --- packages/workbench-shell/src/design-spec.ts | 39 +++++++++++++++++++ packages/workbench-shell/src/index.ts | 1 + .../workbench-shell/test/design-spec.test.ts | 20 ++++++++++ work_design/STATE.md | 6 ++- 4 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 packages/workbench-shell/src/design-spec.ts create mode 100644 packages/workbench-shell/test/design-spec.test.ts diff --git a/packages/workbench-shell/src/design-spec.ts b/packages/workbench-shell/src/design-spec.ts new file mode 100644 index 000000000000..65f52a523356 --- /dev/null +++ b/packages/workbench-shell/src/design-spec.ts @@ -0,0 +1,39 @@ +/* SPDX-License-Identifier: MIT */ + +import { parseSpec, resolveEffectiveCapabilities, type Spec } from "@unifia/spec-runtime" + +export type DesignSpecSource = { kind: "inline"; value: string } | { kind: "file"; path: string; value: string } +export type DesignSpecDiagnostic = { severity: "error"; message: string; line: number; column: number } +export type DesignSpecPanelState = { + source: DesignSpecSource + spec?: Spec + diagnostics: readonly DesignSpecDiagnostic[] + capabilities: { granted: readonly string[]; denied: readonly string[] } +} + +function location(source: string, offset: number): { line: number; column: number } { + const bounded = Math.max(0, Math.min(offset, source.length)) + const prefix = source.slice(0, bounded) + const lines = prefix.split("\n") + return { line: lines.length, column: (lines.at(-1)?.length ?? 0) + 1 } +} + +function syntaxLocation(source: string, message: string): { line: number; column: number } { + const lineAndColumn = message.match(/line\s+(\d+)\s+column\s+(\d+)/i) + if (lineAndColumn) return { line: Number(lineAndColumn[1]), column: Number(lineAndColumn[2]) } + const position = message.match(/position\s+(\d+)/i)?.[1] + return location(source, position ? Number(position) : source.length) +} + +/** Parses one untrusted design spec into a renderable panel state. */ +export function createDesignSpecPanelState(source: DesignSpecSource): DesignSpecPanelState { + try { + const spec = parseSpec(source.value) + const capabilities = resolveEffectiveCapabilities(spec, []) + return { source, spec, diagnostics: [], capabilities } + } catch (error) { + const message = error instanceof Error ? error.message : "spec validation failed" + const position = message.includes("valid JSON") ? syntaxLocation(source.value, message) : location(source.value, 0) + return { source, diagnostics: [{ severity: "error", message, ...position }], capabilities: { granted: [], denied: [] } } + } +} diff --git a/packages/workbench-shell/src/index.ts b/packages/workbench-shell/src/index.ts index 9ead8135c788..e3b21e53df0d 100644 --- a/packages/workbench-shell/src/index.ts +++ b/packages/workbench-shell/src/index.ts @@ -2,4 +2,5 @@ export { DESTRUCTIVE_ACTIONS, READ_ONLY_FUNCTIONS, SHELL_MODES, WORK_V1_FUNCTIONS, isDestructive, isReadOnly, type DestructiveAction, type ShellMode, type WorkFunction } from "./modes.js" export { ShellError, WorkbenchShell, surface, type ArtifactRef, type PreviewToken, type Provenance, type ShellOptions, type ShellRefusal, type ShellResult } from "./shell.js" export { WorkbenchClient, WorkbenchEventDispatcher, WorkbenchHttpError, newRequestId, type ApprovalRequest, type ArtifactSummary, type AuditEvent, type AuditPage, type CapabilityRecord, type ExportedArtifact, type RequestOptions, type TokenProvider, type WorkbenchClientOptions, type WorkspaceFileEntry, type WorkspaceFilePage } from "./client.js" +export { createDesignSpecPanelState, type DesignSpecDiagnostic, type DesignSpecPanelState, type DesignSpecSource } from "./design-spec.js" export { M6_SERVER_ROUTE_REGISTRY, M7_SERVER_ROUTE_REGISTRY, M8_SERVER_ROUTE_REGISTRY, M9A_SERVER_ROUTE_REGISTRY, M9B_SERVER_ROUTE_REGISTRY, M10_SERVER_ROUTE_REGISTRY, M11_SERVER_ROUTE_REGISTRY, M15_SERVER_ROUTE_REGISTRY, WORKBENCH_ROUTE_OPERATIONS, WORKBENCH_ROUTE_REGISTRY, routeFor, routesForLineage, type ArtifactLineage, type WorkbenchRoute, type WorkbenchServerRoute, type WorkbenchTransportMethod } from "./routes.js" diff --git a/packages/workbench-shell/test/design-spec.test.ts b/packages/workbench-shell/test/design-spec.test.ts new file mode 100644 index 000000000000..060d6326c075 --- /dev/null +++ b/packages/workbench-shell/test/design-spec.test.ts @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: MIT */ + +import { createDesignSpecPanelState } from "../src/design-spec.js" + +let checks = 0 +const check = (condition: boolean, message: string): void => { checks += 1; if (!condition) throw new Error(message) } + +const valid = JSON.stringify({ id: "landing-page", version: "1.0.0", target: "design", title: "Landing", capabilities: ["workspace.read", "secret.read"], rules: [], tokens: { colors: { primary: "#ffffff" } } }) +const inline = createDesignSpecPanelState({ kind: "inline", value: valid }) +check(inline.spec?.id === "landing-page", "valid inline spec was not parsed") +check(inline.capabilities.granted.length === 0 && inline.capabilities.denied.length === 2, "spec capabilities were elevated") + +const invalid = createDesignSpecPanelState({ kind: "file", path: "design/spec.json", value: '{\n "id": "broken"\n}' }) +check(invalid.source.kind === "file" && invalid.source.path === "design/spec.json", "file provenance was not preserved") +check(invalid.diagnostics.length === 1 && invalid.diagnostics[0]?.line === 1, "semantic diagnostics did not point to the source") + +const malformed = createDesignSpecPanelState({ kind: "inline", value: '{\n "id": ' }) +check(malformed.diagnostics[0]?.line === 2 && malformed.diagnostics[0]?.column > 1, "JSON syntax diagnostic lost line/column") + +console.log(`DesignSpecPanel: ${checks}/${checks} passed`) diff --git a/work_design/STATE.md b/work_design/STATE.md index 6e942ba960c8..126329a9d2a6 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -6,7 +6,7 @@ This file is the durable execution state for the Unifia Work/Design integration. - Branch: `work-design` - Base commit: `91daa35a26a8e44d7f35b539c91030ec1e230c54` -- Current card: `M15` +- Current card: `M16` - Status: `IMPLEMENTED_WITH_DEFERRED_HUMAN_PROOFS` - Commit or push performed: yes (through M7; latest SHA recorded after commit) @@ -35,6 +35,7 @@ This file is the durable execution state for the Unifia Work/Design integration. | M13 | implemented with deferred human proofs | server 72/72 + shell 122/122 + client 13/13 + modes/routes contracts | Documents list route filters persisted artifact heads; client exposes typed artifact and document catalogs. | | M14 | implemented with deferred human proofs | shell typecheck + client 17/17 | Client exposes typed bounded trace and activity pages with explicit cursors and page kinds. | | M15 | implemented with deferred human proofs | shell typecheck + client 20/20 + routes 11/11 | Client exposes scoped approvals, capability search filters, and idempotent artifact export; capability-picker registry now points to the real search route. | +| M16 | implemented with deferred human proofs | shell typecheck + DesignSpecPanel 5/5 | Pure spec panel model preserves inline/file provenance, reports line/column diagnostics, and resolves requested capabilities against an empty grant. | ## Manual verification register @@ -86,9 +87,10 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - M13 implementation → `GET /v1/documents` exposes non-binary persisted artifact heads under workspace read scope; the client adds typed artifact/document catalog methods without creating a second store. - M14 implementation → `WorkbenchClient.trace/activity` consume the existing scoped audit pages with typed events, bounded cursors, and deterministic query parameters. - M15 implementation → `WorkbenchClient.listApprovals/searchCapabilities/exportArtifact` consumes the existing server authorities; capability search is explicitly `package.install` gated and export uses an idempotency key. +- M16 implementation → `createDesignSpecPanelState` is the shared pure model for Design spec input and diagnostics; it delegates validation to `SpecRuntime` and never elevates capabilities. ## Resume first 1. Read this file, `DECISIONS.md`, and `../INTEGRATION.md`. 2. Review the M0b diff and run the CI workflow on the first PR. -3. M15 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. +3. M16 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. From 40ca96ea140c63a432ff0177037dbe4254285648 Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 03:47:33 +0200 Subject: [PATCH 18/76] feat(workbench): add deterministic design renderer --- .../workbench-shell/src/design-renderer.ts | 31 +++++++++++++++++++ packages/workbench-shell/src/index.ts | 1 + .../test/design-renderer.test.ts | 13 ++++++++ work_design/STATE.md | 6 ++-- 4 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 packages/workbench-shell/src/design-renderer.ts create mode 100644 packages/workbench-shell/test/design-renderer.test.ts diff --git a/packages/workbench-shell/src/design-renderer.ts b/packages/workbench-shell/src/design-renderer.ts new file mode 100644 index 000000000000..a609774ff437 --- /dev/null +++ b/packages/workbench-shell/src/design-renderer.ts @@ -0,0 +1,31 @@ +/* SPDX-License-Identifier: MIT */ + +import type { Spec } from "@unifia/spec-runtime" + +export type DesignRenderOptions = { width?: number; height?: number } + +function escapeXml(value: string): string { + return value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'") +} + +function positiveDimension(value: number | undefined, fallback: number): number { + return Number.isFinite(value) && value !== undefined && value > 0 ? Math.min(Math.trunc(value), 4096) : fallback +} + +/** Produces a stable SVG fixture from a validated design spec. */ +export function renderDesignSpecSvg(spec: Spec, options: DesignRenderOptions = {}): string { + const width = positiveDimension(options.width, 1024) + const height = positiveDimension(options.height, 768) + const primary = spec.tokens?.colors?.primary ?? "#ffffff" + const foreground = spec.tokens?.colors?.foreground ?? "#111111" + const gutter = spec.tokens?.spacing?.gutter ?? 24 + const titleY = Math.max(gutter * 2, 48) + const ruleStart = titleY + 44 + const ruleGap = Math.max(spec.tokens?.spacing?.stack ?? 16, 16) + const rules = spec.rules.map((rule, index) => { + const y = ruleStart + index * ruleGap + return `${escapeXml(`${rule.id}: ${rule.statement}`)}` + }).join("") + return `${escapeXml(spec.title)}${rules}` +} + diff --git a/packages/workbench-shell/src/index.ts b/packages/workbench-shell/src/index.ts index e3b21e53df0d..88592420226f 100644 --- a/packages/workbench-shell/src/index.ts +++ b/packages/workbench-shell/src/index.ts @@ -3,4 +3,5 @@ export { DESTRUCTIVE_ACTIONS, READ_ONLY_FUNCTIONS, SHELL_MODES, WORK_V1_FUNCTION export { ShellError, WorkbenchShell, surface, type ArtifactRef, type PreviewToken, type Provenance, type ShellOptions, type ShellRefusal, type ShellResult } from "./shell.js" export { WorkbenchClient, WorkbenchEventDispatcher, WorkbenchHttpError, newRequestId, type ApprovalRequest, type ArtifactSummary, type AuditEvent, type AuditPage, type CapabilityRecord, type ExportedArtifact, type RequestOptions, type TokenProvider, type WorkbenchClientOptions, type WorkspaceFileEntry, type WorkspaceFilePage } from "./client.js" export { createDesignSpecPanelState, type DesignSpecDiagnostic, type DesignSpecPanelState, type DesignSpecSource } from "./design-spec.js" +export { renderDesignSpecSvg, type DesignRenderOptions } from "./design-renderer.js" export { M6_SERVER_ROUTE_REGISTRY, M7_SERVER_ROUTE_REGISTRY, M8_SERVER_ROUTE_REGISTRY, M9A_SERVER_ROUTE_REGISTRY, M9B_SERVER_ROUTE_REGISTRY, M10_SERVER_ROUTE_REGISTRY, M11_SERVER_ROUTE_REGISTRY, M15_SERVER_ROUTE_REGISTRY, WORKBENCH_ROUTE_OPERATIONS, WORKBENCH_ROUTE_REGISTRY, routeFor, routesForLineage, type ArtifactLineage, type WorkbenchRoute, type WorkbenchServerRoute, type WorkbenchTransportMethod } from "./routes.js" diff --git a/packages/workbench-shell/test/design-renderer.test.ts b/packages/workbench-shell/test/design-renderer.test.ts new file mode 100644 index 000000000000..bc787ebf23e1 --- /dev/null +++ b/packages/workbench-shell/test/design-renderer.test.ts @@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: MIT */ + +import { parseSpec } from "@unifia/spec-runtime" +import { renderDesignSpecSvg } from "../src/design-renderer.js" + +const spec = parseSpec({ id: "render-card", version: "1.0.0", target: "design", title: "", capabilities: [], rules: [{ id: "safe-copy", statement: "Use & keep it readable" }], tokens: { colors: { primary: "#abcdef", foreground: "#123456" }, spacing: { gutter: 32 } } }) +const first = renderDesignSpecSvg(spec, { width: 640, height: 480 }) +const second = renderDesignSpecSvg(spec, { width: 640, height: 480 }) +if (first !== second) throw new Error("design renderer was not deterministic") +if (!first.startsWith('` proof are supplied. +3. M17 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. From e7155a618d1314f9f746989e5a3e33d155ee64c6 Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 03:49:15 +0200 Subject: [PATCH 19/76] feat(workbench): add responsive design previews --- .../workbench-shell/src/design-preview.ts | 25 +++++++++++++++++++ packages/workbench-shell/src/index.ts | 1 + .../test/design-preview.test.ts | 15 +++++++++++ work_design/STATE.md | 6 +++-- 4 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 packages/workbench-shell/src/design-preview.ts create mode 100644 packages/workbench-shell/test/design-preview.test.ts diff --git a/packages/workbench-shell/src/design-preview.ts b/packages/workbench-shell/src/design-preview.ts new file mode 100644 index 000000000000..4a4bfb3aa20f --- /dev/null +++ b/packages/workbench-shell/src/design-preview.ts @@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: MIT */ + +import { renderDesignSpecSvg } from "./design-renderer.js" +import type { DesignSpecDiagnostic, DesignSpecPanelState } from "./design-spec.js" + +export type DesignPreview = { label: "mobile" | "tablet" | "desktop"; width: number; src: string } +export type DesignPreviewPanelState = { diagnostics: readonly DesignSpecDiagnostic[]; previews: readonly DesignPreview[] } + +const VIEWPORTS = [ + { label: "mobile", width: 390 }, + { label: "tablet", width: 768 }, + { label: "desktop", width: 1440 }, +] as const + +/** Builds the three responsive preview sources without executing generated markup. */ +export function createDesignPreviewPanelState(state: DesignSpecPanelState): DesignPreviewPanelState { + if (!state.spec || state.diagnostics.length > 0) return { diagnostics: state.diagnostics, previews: [] } + const spec = state.spec + const previews = VIEWPORTS.map(({ label, width }) => { + const height = Math.round(width * 0.75) + const svg = renderDesignSpecSvg(spec, { width, height }) + return { label, width, src: `data:image/svg+xml,${encodeURIComponent(svg)}` } + }) + return { diagnostics: [], previews } +} diff --git a/packages/workbench-shell/src/index.ts b/packages/workbench-shell/src/index.ts index 88592420226f..202e70a4f748 100644 --- a/packages/workbench-shell/src/index.ts +++ b/packages/workbench-shell/src/index.ts @@ -4,4 +4,5 @@ export { ShellError, WorkbenchShell, surface, type ArtifactRef, type PreviewToke export { WorkbenchClient, WorkbenchEventDispatcher, WorkbenchHttpError, newRequestId, type ApprovalRequest, type ArtifactSummary, type AuditEvent, type AuditPage, type CapabilityRecord, type ExportedArtifact, type RequestOptions, type TokenProvider, type WorkbenchClientOptions, type WorkspaceFileEntry, type WorkspaceFilePage } from "./client.js" export { createDesignSpecPanelState, type DesignSpecDiagnostic, type DesignSpecPanelState, type DesignSpecSource } from "./design-spec.js" export { renderDesignSpecSvg, type DesignRenderOptions } from "./design-renderer.js" +export { createDesignPreviewPanelState, type DesignPreview, type DesignPreviewPanelState } from "./design-preview.js" export { M6_SERVER_ROUTE_REGISTRY, M7_SERVER_ROUTE_REGISTRY, M8_SERVER_ROUTE_REGISTRY, M9A_SERVER_ROUTE_REGISTRY, M9B_SERVER_ROUTE_REGISTRY, M10_SERVER_ROUTE_REGISTRY, M11_SERVER_ROUTE_REGISTRY, M15_SERVER_ROUTE_REGISTRY, WORKBENCH_ROUTE_OPERATIONS, WORKBENCH_ROUTE_REGISTRY, routeFor, routesForLineage, type ArtifactLineage, type WorkbenchRoute, type WorkbenchServerRoute, type WorkbenchTransportMethod } from "./routes.js" diff --git a/packages/workbench-shell/test/design-preview.test.ts b/packages/workbench-shell/test/design-preview.test.ts new file mode 100644 index 000000000000..79f794d8d569 --- /dev/null +++ b/packages/workbench-shell/test/design-preview.test.ts @@ -0,0 +1,15 @@ +/* SPDX-License-Identifier: MIT */ + +import { createDesignPreviewPanelState } from "../src/design-preview.js" +import { createDesignSpecPanelState } from "../src/design-spec.js" + +const valid = createDesignSpecPanelState({ kind: "inline", value: JSON.stringify({ id: "preview-card", version: "1.0.0", target: "design", title: "Preview", rules: [] }) }) +const preview = createDesignPreviewPanelState(valid) +if (preview.previews.length !== 3) throw new Error("preview did not create mobile/tablet/desktop widths") +if (preview.previews[0]?.label !== "mobile" || preview.previews[2]?.width !== 1440) throw new Error("preview widths were not canonical") +if (!preview.previews.every((item) => item.src.startsWith("data:image/svg+xml,"))) throw new Error("preview did not use SVG image sources") + +const invalid = createDesignSpecPanelState({ kind: "inline", value: "{}" }) +const blocked = createDesignPreviewPanelState(invalid) +if (blocked.previews.length !== 0 || blocked.diagnostics.length !== 1) throw new Error("invalid spec was rendered") +console.log("DesignPreviewPanel: 4/4 passed") diff --git a/work_design/STATE.md b/work_design/STATE.md index 946f8909d8c9..6fe5325dd9c4 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -6,7 +6,7 @@ This file is the durable execution state for the Unifia Work/Design integration. - Branch: `work-design` - Base commit: `91daa35a26a8e44d7f35b539c91030ec1e230c54` -- Current card: `M17` +- Current card: `M18` - Status: `IMPLEMENTED_WITH_DEFERRED_HUMAN_PROOFS` - Commit or push performed: yes (through M7; latest SHA recorded after commit) @@ -37,6 +37,7 @@ This file is the durable execution state for the Unifia Work/Design integration. | M15 | implemented with deferred human proofs | shell typecheck + client 20/20 + routes 11/11 | Client exposes scoped approvals, capability search filters, and idempotent artifact export; capability-picker registry now points to the real search route. | | M16 | implemented with deferred human proofs | shell typecheck + DesignSpecPanel 5/5 | Pure spec panel model preserves inline/file provenance, reports line/column diagnostics, and resolves requested capabilities against an empty grant. | | M17 | implemented with deferred human proofs | shell typecheck + DesignRenderer 5/5 | Canonical escaped SVG renderer consumes validated spec/tokens with deterministic dimensions and output. | +| M18 | implemented with deferred human proofs | shell typecheck + DesignPreviewPanel 4/4 | Preview model exposes mobile/tablet/desktop SVG data sources and refuses invalid specs while preserving diagnostics. | ## Manual verification register @@ -90,9 +91,10 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - M15 implementation → `WorkbenchClient.listApprovals/searchCapabilities/exportArtifact` consumes the existing server authorities; capability search is explicitly `package.install` gated and export uses an idempotency key. - M16 implementation → `createDesignSpecPanelState` is the shared pure model for Design spec input and diagnostics; it delegates validation to `SpecRuntime` and never elevates capabilities. - M17 implementation → `renderDesignSpecSvg` is the shared deterministic SVG authority; it escapes spec text and applies only validated token values. +- M18 implementation → `createDesignPreviewPanelState` derives three canonical responsive previews from the renderer and never emits an image for invalid input. ## Resume first 1. Read this file, `DECISIONS.md`, and `../INTEGRATION.md`. 2. Review the M0b diff and run the CI workflow on the first PR. -3. M17 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. +3. M18 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. From ce0d1d4d6989ecde98218b6bbc5a673c0862d127 Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 03:50:59 +0200 Subject: [PATCH 20/76] feat(workbench): add design file catalog adapter --- packages/workbench-shell/src/design-files.ts | 25 +++++++++++++++++++ packages/workbench-shell/src/index.ts | 1 + .../workbench-shell/test/design-files.test.ts | 18 +++++++++++++ work_design/STATE.md | 6 +++-- 4 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 packages/workbench-shell/src/design-files.ts create mode 100644 packages/workbench-shell/test/design-files.test.ts diff --git a/packages/workbench-shell/src/design-files.ts b/packages/workbench-shell/src/design-files.ts new file mode 100644 index 000000000000..8b3317e12b73 --- /dev/null +++ b/packages/workbench-shell/src/design-files.ts @@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: MIT */ + +import type { WorkspaceFileEntry, WorkspaceFilePage } from "./client.js" + +export type DesignFileKind = "asset" | "component" | "style" | "unknown" +export type DesignFile = Omit & { kind: DesignFileKind } +export type DesignFilesPanelState = { files: readonly DesignFile[]; selectedPath?: string } + +function fileKind(path: string): DesignFileKind { + const extension = path.split(".").at(-1)?.toLowerCase() + if (extension && ["png", "jpg", "jpeg", "gif", "webp", "svg", "ico"].includes(extension)) return "asset" + if (extension && ["tsx", "jsx", "vue", "svelte"].includes(extension)) return "component" + if (extension && ["css", "scss", "less", "json", "tokens"].includes(extension)) return "style" + return "unknown" +} + +/** Adapts the bounded workspace index into a stable Design file catalog. */ +export function adaptDesignFiles(page: WorkspaceFilePage): readonly DesignFile[] { + return page.entries.filter((entry) => entry.kind === "file").map((entry) => ({ ...entry, kind: fileKind(entry.path) })).sort((left, right) => left.path.localeCompare(right.path)) +} + +export function createDesignFilesPanelState(page: WorkspaceFilePage, selectedPath?: string): DesignFilesPanelState { + const files = adaptDesignFiles(page) + return { files, selectedPath: files.some((file) => file.path === selectedPath) ? selectedPath : undefined } +} diff --git a/packages/workbench-shell/src/index.ts b/packages/workbench-shell/src/index.ts index 202e70a4f748..80a451d9bef4 100644 --- a/packages/workbench-shell/src/index.ts +++ b/packages/workbench-shell/src/index.ts @@ -5,4 +5,5 @@ export { WorkbenchClient, WorkbenchEventDispatcher, WorkbenchHttpError, newReque export { createDesignSpecPanelState, type DesignSpecDiagnostic, type DesignSpecPanelState, type DesignSpecSource } from "./design-spec.js" export { renderDesignSpecSvg, type DesignRenderOptions } from "./design-renderer.js" export { createDesignPreviewPanelState, type DesignPreview, type DesignPreviewPanelState } from "./design-preview.js" +export { adaptDesignFiles, createDesignFilesPanelState, type DesignFile, type DesignFileKind, type DesignFilesPanelState } from "./design-files.js" export { M6_SERVER_ROUTE_REGISTRY, M7_SERVER_ROUTE_REGISTRY, M8_SERVER_ROUTE_REGISTRY, M9A_SERVER_ROUTE_REGISTRY, M9B_SERVER_ROUTE_REGISTRY, M10_SERVER_ROUTE_REGISTRY, M11_SERVER_ROUTE_REGISTRY, M15_SERVER_ROUTE_REGISTRY, WORKBENCH_ROUTE_OPERATIONS, WORKBENCH_ROUTE_REGISTRY, routeFor, routesForLineage, type ArtifactLineage, type WorkbenchRoute, type WorkbenchServerRoute, type WorkbenchTransportMethod } from "./routes.js" diff --git a/packages/workbench-shell/test/design-files.test.ts b/packages/workbench-shell/test/design-files.test.ts new file mode 100644 index 000000000000..f0bc2b460adf --- /dev/null +++ b/packages/workbench-shell/test/design-files.test.ts @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: MIT */ + +import { adaptDesignFiles, createDesignFilesPanelState } from "../src/design-files.js" + +const page = { entries: [ + { path: "zeta.ts", kind: "file" as const, size: 1, modifiedAt: 2 }, + { path: "assets/logo.svg", kind: "file" as const, size: 2, modifiedAt: 3 }, + { path: "styles/theme.css", kind: "file" as const, size: 3, modifiedAt: 4 }, + { path: "components/Card.tsx", kind: "file" as const, size: 4, modifiedAt: 5 }, + { path: "components", kind: "directory" as const, size: 0, modifiedAt: 5 }, +] } +const files = adaptDesignFiles(page) +if (files.length !== 4 || files[0]?.path !== "assets/logo.svg") throw new Error("design file adapter did not filter/sort files") +if (files.find((file) => file.path === "assets/logo.svg")?.kind !== "asset") throw new Error("asset kind was not inferred") +if (files.find((file) => file.path === "components/Card.tsx")?.kind !== "component") throw new Error("component kind was not inferred") +if (createDesignFilesPanelState(page, "missing.ts").selectedPath !== undefined) throw new Error("panel selected an absent file") +if (createDesignFilesPanelState(page, "styles/theme.css").selectedPath !== "styles/theme.css") throw new Error("panel did not preserve a valid selection") +console.log("DesignFiles: 5/5 passed") diff --git a/work_design/STATE.md b/work_design/STATE.md index 6fe5325dd9c4..8215fafe7a8f 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -6,7 +6,7 @@ This file is the durable execution state for the Unifia Work/Design integration. - Branch: `work-design` - Base commit: `91daa35a26a8e44d7f35b539c91030ec1e230c54` -- Current card: `M18` +- Current card: `M19a` - Status: `IMPLEMENTED_WITH_DEFERRED_HUMAN_PROOFS` - Commit or push performed: yes (through M7; latest SHA recorded after commit) @@ -38,6 +38,7 @@ This file is the durable execution state for the Unifia Work/Design integration. | M16 | implemented with deferred human proofs | shell typecheck + DesignSpecPanel 5/5 | Pure spec panel model preserves inline/file provenance, reports line/column diagnostics, and resolves requested capabilities against an empty grant. | | M17 | implemented with deferred human proofs | shell typecheck + DesignRenderer 5/5 | Canonical escaped SVG renderer consumes validated spec/tokens with deterministic dimensions and output. | | M18 | implemented with deferred human proofs | shell typecheck + DesignPreviewPanel 4/4 | Preview model exposes mobile/tablet/desktop SVG data sources and refuses invalid specs while preserving diagnostics. | +| M19a | implemented with deferred human proofs | shell typecheck + DesignFiles 5/5 | Workspace file page adapts to a sorted Design catalog with asset/component/style classification and safe selection. | ## Manual verification register @@ -92,9 +93,10 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - M16 implementation → `createDesignSpecPanelState` is the shared pure model for Design spec input and diagnostics; it delegates validation to `SpecRuntime` and never elevates capabilities. - M17 implementation → `renderDesignSpecSvg` is the shared deterministic SVG authority; it escapes spec text and applies only validated token values. - M18 implementation → `createDesignPreviewPanelState` derives three canonical responsive previews from the renderer and never emits an image for invalid input. +- M19a implementation → `adaptDesignFiles` is the sole adapter from the bounded workspace index to Design file categories; directories and absent selections are excluded. ## Resume first 1. Read this file, `DECISIONS.md`, and `../INTEGRATION.md`. 2. Review the M0b diff and run the CI workflow on the first PR. -3. M18 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. +3. M19a code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. From 583296a49e7e9ff0fb0a8a85eb5a54859e08efd5 Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 03:52:11 +0200 Subject: [PATCH 21/76] feat(workbench): render design file rows --- packages/workbench-shell/src/design-files.ts | 5 +++++ packages/workbench-shell/src/index.ts | 2 +- packages/workbench-shell/test/design-files.test.ts | 8 +++++--- work_design/STATE.md | 6 ++++-- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/packages/workbench-shell/src/design-files.ts b/packages/workbench-shell/src/design-files.ts index 8b3317e12b73..a2219268f0e9 100644 --- a/packages/workbench-shell/src/design-files.ts +++ b/packages/workbench-shell/src/design-files.ts @@ -5,6 +5,7 @@ import type { WorkspaceFileEntry, WorkspaceFilePage } from "./client.js" export type DesignFileKind = "asset" | "component" | "style" | "unknown" export type DesignFile = Omit & { kind: DesignFileKind } export type DesignFilesPanelState = { files: readonly DesignFile[]; selectedPath?: string } +export type DesignFileRow = { path: string; label: string; kind: DesignFileKind; selected: boolean } function fileKind(path: string): DesignFileKind { const extension = path.split(".").at(-1)?.toLowerCase() @@ -23,3 +24,7 @@ export function createDesignFilesPanelState(page: WorkspaceFilePage, selectedPat const files = adaptDesignFiles(page) return { files, selectedPath: files.some((file) => file.path === selectedPath) ? selectedPath : undefined } } + +export function renderDesignFileRows(state: DesignFilesPanelState): readonly DesignFileRow[] { + return state.files.map((file) => ({ path: file.path, label: file.path.split("/").at(-1) ?? file.path, kind: file.kind, selected: file.path === state.selectedPath })) +} diff --git a/packages/workbench-shell/src/index.ts b/packages/workbench-shell/src/index.ts index 80a451d9bef4..c7329d5d783f 100644 --- a/packages/workbench-shell/src/index.ts +++ b/packages/workbench-shell/src/index.ts @@ -5,5 +5,5 @@ export { WorkbenchClient, WorkbenchEventDispatcher, WorkbenchHttpError, newReque export { createDesignSpecPanelState, type DesignSpecDiagnostic, type DesignSpecPanelState, type DesignSpecSource } from "./design-spec.js" export { renderDesignSpecSvg, type DesignRenderOptions } from "./design-renderer.js" export { createDesignPreviewPanelState, type DesignPreview, type DesignPreviewPanelState } from "./design-preview.js" -export { adaptDesignFiles, createDesignFilesPanelState, type DesignFile, type DesignFileKind, type DesignFilesPanelState } from "./design-files.js" +export { adaptDesignFiles, createDesignFilesPanelState, renderDesignFileRows, type DesignFile, type DesignFileKind, type DesignFileRow, type DesignFilesPanelState } from "./design-files.js" export { M6_SERVER_ROUTE_REGISTRY, M7_SERVER_ROUTE_REGISTRY, M8_SERVER_ROUTE_REGISTRY, M9A_SERVER_ROUTE_REGISTRY, M9B_SERVER_ROUTE_REGISTRY, M10_SERVER_ROUTE_REGISTRY, M11_SERVER_ROUTE_REGISTRY, M15_SERVER_ROUTE_REGISTRY, WORKBENCH_ROUTE_OPERATIONS, WORKBENCH_ROUTE_REGISTRY, routeFor, routesForLineage, type ArtifactLineage, type WorkbenchRoute, type WorkbenchServerRoute, type WorkbenchTransportMethod } from "./routes.js" diff --git a/packages/workbench-shell/test/design-files.test.ts b/packages/workbench-shell/test/design-files.test.ts index f0bc2b460adf..5d3f294af50e 100644 --- a/packages/workbench-shell/test/design-files.test.ts +++ b/packages/workbench-shell/test/design-files.test.ts @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: MIT */ -import { adaptDesignFiles, createDesignFilesPanelState } from "../src/design-files.js" +import { adaptDesignFiles, createDesignFilesPanelState, renderDesignFileRows } from "../src/design-files.js" const page = { entries: [ { path: "zeta.ts", kind: "file" as const, size: 1, modifiedAt: 2 }, @@ -14,5 +14,7 @@ if (files.length !== 4 || files[0]?.path !== "assets/logo.svg") throw new Error( if (files.find((file) => file.path === "assets/logo.svg")?.kind !== "asset") throw new Error("asset kind was not inferred") if (files.find((file) => file.path === "components/Card.tsx")?.kind !== "component") throw new Error("component kind was not inferred") if (createDesignFilesPanelState(page, "missing.ts").selectedPath !== undefined) throw new Error("panel selected an absent file") -if (createDesignFilesPanelState(page, "styles/theme.css").selectedPath !== "styles/theme.css") throw new Error("panel did not preserve a valid selection") -console.log("DesignFiles: 5/5 passed") +const selected = createDesignFilesPanelState(page, "styles/theme.css") +if (selected.selectedPath !== "styles/theme.css") throw new Error("panel did not preserve a valid selection") +if (renderDesignFileRows(selected).find((row) => row.path === "styles/theme.css")?.selected !== true) throw new Error("panel did not render the selected row") +console.log("DesignFiles: 6/6 passed") diff --git a/work_design/STATE.md b/work_design/STATE.md index 8215fafe7a8f..d6c9be02ae80 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -6,7 +6,7 @@ This file is the durable execution state for the Unifia Work/Design integration. - Branch: `work-design` - Base commit: `91daa35a26a8e44d7f35b539c91030ec1e230c54` -- Current card: `M19a` +- Current card: `M19b` - Status: `IMPLEMENTED_WITH_DEFERRED_HUMAN_PROOFS` - Commit or push performed: yes (through M7; latest SHA recorded after commit) @@ -39,6 +39,7 @@ This file is the durable execution state for the Unifia Work/Design integration. | M17 | implemented with deferred human proofs | shell typecheck + DesignRenderer 5/5 | Canonical escaped SVG renderer consumes validated spec/tokens with deterministic dimensions and output. | | M18 | implemented with deferred human proofs | shell typecheck + DesignPreviewPanel 4/4 | Preview model exposes mobile/tablet/desktop SVG data sources and refuses invalid specs while preserving diagnostics. | | M19a | implemented with deferred human proofs | shell typecheck + DesignFiles 5/5 | Workspace file page adapts to a sorted Design catalog with asset/component/style classification and safe selection. | +| M19b | implemented with deferred human proofs | shell typecheck + DesignFiles 6/6 | Design file rows expose stable labels, kinds, and selected state for a UI surface. | ## Manual verification register @@ -94,9 +95,10 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - M17 implementation → `renderDesignSpecSvg` is the shared deterministic SVG authority; it escapes spec text and applies only validated token values. - M18 implementation → `createDesignPreviewPanelState` derives three canonical responsive previews from the renderer and never emits an image for invalid input. - M19a implementation → `adaptDesignFiles` is the sole adapter from the bounded workspace index to Design file categories; directories and absent selections are excluded. +- M19b implementation → `renderDesignFileRows` projects the adapted catalog into stable panel rows and marks only the validated selection. ## Resume first 1. Read this file, `DECISIONS.md`, and `../INTEGRATION.md`. 2. Review the M0b diff and run the CI workflow on the first PR. -3. M19a code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. +3. M19b code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. From be8256ba59c866a4784ef637752d672ab01b0acf Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 03:53:40 +0200 Subject: [PATCH 22/76] feat(workbench): add design system catalog picker --- packages/workbench-shell/src/design-system.ts | 40 +++++++++++++++++++ packages/workbench-shell/src/index.ts | 1 + .../test/design-system.test.ts | 12 ++++++ work_design/STATE.md | 8 +++- 4 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 packages/workbench-shell/src/design-system.ts create mode 100644 packages/workbench-shell/test/design-system.test.ts diff --git a/packages/workbench-shell/src/design-system.ts b/packages/workbench-shell/src/design-system.ts new file mode 100644 index 000000000000..6d1c7e4cc206 --- /dev/null +++ b/packages/workbench-shell/src/design-system.ts @@ -0,0 +1,40 @@ +/* SPDX-License-Identifier: MIT */ + +export type DesignSystemTokens = { colors: Readonly>; spacing: Readonly>; typography: Readonly> } +export type DesignSystemCatalog = { id: string; name: string; version: string; source: string; tokens: DesignSystemTokens } +export type DesignSystemPickerRow = { id: string; label: string; version: string; source: string; selected: boolean } + +function record(value: unknown): Record { + if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error("design system field must be an object") + return value as Record +} + +function stringMap(value: unknown, field: string): Record { + return Object.fromEntries(Object.entries(record(value)).map(([key, item]) => { + if (typeof item !== "string" || !item) throw new Error(`${field}.${key} must be a non-empty string`) + return [key, item] + })) +} + +function numberMap(value: unknown, field: string): Record { + return Object.fromEntries(Object.entries(record(value)).map(([key, item]) => { + if (typeof item !== "number" || !Number.isFinite(item) || item < 0) throw new Error(`${field}.${key} must be a non-negative number`) + return [key, item] + })) +} + +/** Parses an explicitly supplied catalog; it does not discover or create a source. */ +export function parseDesignSystemCatalog(value: unknown): DesignSystemCatalog { + const input = record(value) + if (typeof input.id !== "string" || !/^[a-z][a-z0-9-]{2,63}$/.test(input.id)) throw new Error("design system id is invalid") + if (typeof input.name !== "string" || !input.name.trim()) throw new Error("design system name is required") + if (typeof input.version !== "string" || !/^\d+\.\d+\.\d+$/.test(input.version)) throw new Error("design system version is invalid") + if (typeof input.source !== "string" || !input.source.trim()) throw new Error("design system source is required") + const tokens = record(input.tokens) + return { id: input.id, name: input.name, version: input.version, source: input.source, tokens: { colors: stringMap(tokens.colors ?? {}, "colors"), spacing: numberMap(tokens.spacing ?? {}, "spacing"), typography: stringMap(tokens.typography ?? {}, "typography") } } +} + +export function createDesignSystemPickerRows(catalogs: readonly DesignSystemCatalog[], selectedId?: string): readonly DesignSystemPickerRow[] { + return [...catalogs].sort((left, right) => left.name.localeCompare(right.name) || left.version.localeCompare(right.version)).map((catalog) => ({ id: catalog.id, label: catalog.name, version: catalog.version, source: catalog.source, selected: catalog.id === selectedId })) +} + diff --git a/packages/workbench-shell/src/index.ts b/packages/workbench-shell/src/index.ts index c7329d5d783f..cb7488c44675 100644 --- a/packages/workbench-shell/src/index.ts +++ b/packages/workbench-shell/src/index.ts @@ -6,4 +6,5 @@ export { createDesignSpecPanelState, type DesignSpecDiagnostic, type DesignSpecP export { renderDesignSpecSvg, type DesignRenderOptions } from "./design-renderer.js" export { createDesignPreviewPanelState, type DesignPreview, type DesignPreviewPanelState } from "./design-preview.js" export { adaptDesignFiles, createDesignFilesPanelState, renderDesignFileRows, type DesignFile, type DesignFileKind, type DesignFileRow, type DesignFilesPanelState } from "./design-files.js" +export { createDesignSystemPickerRows, parseDesignSystemCatalog, type DesignSystemCatalog, type DesignSystemPickerRow, type DesignSystemTokens } from "./design-system.js" export { M6_SERVER_ROUTE_REGISTRY, M7_SERVER_ROUTE_REGISTRY, M8_SERVER_ROUTE_REGISTRY, M9A_SERVER_ROUTE_REGISTRY, M9B_SERVER_ROUTE_REGISTRY, M10_SERVER_ROUTE_REGISTRY, M11_SERVER_ROUTE_REGISTRY, M15_SERVER_ROUTE_REGISTRY, WORKBENCH_ROUTE_OPERATIONS, WORKBENCH_ROUTE_REGISTRY, routeFor, routesForLineage, type ArtifactLineage, type WorkbenchRoute, type WorkbenchServerRoute, type WorkbenchTransportMethod } from "./routes.js" diff --git a/packages/workbench-shell/test/design-system.test.ts b/packages/workbench-shell/test/design-system.test.ts new file mode 100644 index 000000000000..198ed7e45ca5 --- /dev/null +++ b/packages/workbench-shell/test/design-system.test.ts @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: MIT */ + +import { createDesignSystemPickerRows, parseDesignSystemCatalog } from "../src/design-system.js" + +const catalog = parseDesignSystemCatalog({ id: "unifia-system", name: "Unifia", version: "1.0.0", source: "workspace://design-system", tokens: { colors: { primary: "#ffffff" }, spacing: { gutter: 24 }, typography: { body: "Inter" } } }) +if (catalog.tokens.spacing.gutter !== 24 || catalog.source !== "workspace://design-system") throw new Error("design system contract lost tokens/source") +const rows = createDesignSystemPickerRows([catalog, { ...catalog, id: "alpha-system", name: "Alpha" }], "unifia-system") +if (rows[0]?.id !== "alpha-system" || rows[1]?.selected !== true) throw new Error("design system picker was not sorted/selected") +let refused = false +try { parseDesignSystemCatalog({ ...catalog, source: "" }) } catch { refused = true } +if (!refused) throw new Error("design system parser accepted a missing source") +console.log("DesignSystem: 3/3 passed") diff --git a/work_design/STATE.md b/work_design/STATE.md index d6c9be02ae80..cab075d4b505 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -6,7 +6,7 @@ This file is the durable execution state for the Unifia Work/Design integration. - Branch: `work-design` - Base commit: `91daa35a26a8e44d7f35b539c91030ec1e230c54` -- Current card: `M19b` +- Current card: `M20b` - Status: `IMPLEMENTED_WITH_DEFERRED_HUMAN_PROOFS` - Commit or push performed: yes (through M7; latest SHA recorded after commit) @@ -40,6 +40,8 @@ This file is the durable execution state for the Unifia Work/Design integration. | M18 | implemented with deferred human proofs | shell typecheck + DesignPreviewPanel 4/4 | Preview model exposes mobile/tablet/desktop SVG data sources and refuses invalid specs while preserving diagnostics. | | M19a | implemented with deferred human proofs | shell typecheck + DesignFiles 5/5 | Workspace file page adapts to a sorted Design catalog with asset/component/style classification and safe selection. | | M19b | implemented with deferred human proofs | shell typecheck + DesignFiles 6/6 | Design file rows expose stable labels, kinds, and selected state for a UI surface. | +| M20a | implemented with deferred human proofs | shell typecheck + DesignSystem 3/3 | Explicit injected Design System catalog schema validates id/version/source/tokens without discovering a new authority. | +| M20b | implemented with deferred human proofs | shell typecheck + DesignSystem 3/3 | Picker rows sort catalogs deterministically and preserve a validated selected id. | ## Manual verification register @@ -96,9 +98,11 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - M18 implementation → `createDesignPreviewPanelState` derives three canonical responsive previews from the renderer and never emits an image for invalid input. - M19a implementation → `adaptDesignFiles` is the sole adapter from the bounded workspace index to Design file categories; directories and absent selections are excluded. - M19b implementation → `renderDesignFileRows` projects the adapted catalog into stable panel rows and marks only the validated selection. +- M20a implementation → `parseDesignSystemCatalog` validates an explicitly supplied catalog and keeps G6 open by requiring its source rather than inventing one. +- M20b implementation → `createDesignSystemPickerRows` provides deterministic labels, versions, sources, and selection state. ## Resume first 1. Read this file, `DECISIONS.md`, and `../INTEGRATION.md`. 2. Review the M0b diff and run the CI workflow on the first PR. -3. M19b code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. +3. M20b code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. From 96def2c44bcb2eaccf87724b8371f102ff60c49a Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 03:55:26 +0200 Subject: [PATCH 23/76] feat(workbench): add artifact version panel model --- .../workbench-shell/src/artifact-version.ts | 26 +++++++++++++++++++ packages/workbench-shell/src/index.ts | 1 + .../test/artifact-version.test.ts | 13 ++++++++++ work_design/STATE.md | 6 +++-- 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 packages/workbench-shell/src/artifact-version.ts create mode 100644 packages/workbench-shell/test/artifact-version.test.ts diff --git a/packages/workbench-shell/src/artifact-version.ts b/packages/workbench-shell/src/artifact-version.ts new file mode 100644 index 000000000000..22ff5e729087 --- /dev/null +++ b/packages/workbench-shell/src/artifact-version.ts @@ -0,0 +1,26 @@ +/* SPDX-License-Identifier: MIT */ + +import type { ArtifactSummary, ExportedArtifact } from "./client.js" + +export type ArtifactVersionSummary = ArtifactSummary & { sha256: string; relativePath: string; scan?: "clean" | "unscanned" } +export type ArtifactDiff = { changed: readonly string[]; added: readonly string[]; removed: readonly string[] } +export type ArtifactVersionPanelState = { history: readonly ArtifactVersionSummary[]; selectedVersion?: number; provenance?: Record; export: { approved: boolean; result?: ExportedArtifact } } + +export function createArtifactVersionPanelState(history: readonly ArtifactVersionSummary[], selectedVersion?: number, exportResult?: ExportedArtifact): ArtifactVersionPanelState { + const ordered = [...history].sort((left, right) => left.version - right.version) + const selected = ordered.find((artifact) => artifact.version === selectedVersion) ?? ordered.at(-1) + return { history: ordered, selectedVersion: selected?.version, provenance: selected?.provenance, export: { approved: exportResult !== undefined, result: exportResult } } +} + +export function diffArtifactVersions(previous: ArtifactVersionSummary | undefined, current: ArtifactVersionSummary | undefined): ArtifactDiff { + if (!previous && !current) return { changed: [], added: [], removed: [] } + if (!previous && current) return { changed: [], added: ["artifact"], removed: [] } + if (previous && !current) return { changed: [], added: [], removed: ["artifact"] } + if (!previous || !current) throw new Error("unreachable artifact diff state") + const left = previous + const right = current + const changed: string[] = [] + const fields: Array = ["kind", "filename", "bytes", "sha256", "metadata", "provenance", "scan"] + for (const field of fields) if (JSON.stringify(left[field]) !== JSON.stringify(right[field])) changed.push(field) + return { changed, added: [], removed: [] } +} diff --git a/packages/workbench-shell/src/index.ts b/packages/workbench-shell/src/index.ts index cb7488c44675..9708175689f4 100644 --- a/packages/workbench-shell/src/index.ts +++ b/packages/workbench-shell/src/index.ts @@ -7,4 +7,5 @@ export { renderDesignSpecSvg, type DesignRenderOptions } from "./design-renderer export { createDesignPreviewPanelState, type DesignPreview, type DesignPreviewPanelState } from "./design-preview.js" export { adaptDesignFiles, createDesignFilesPanelState, renderDesignFileRows, type DesignFile, type DesignFileKind, type DesignFileRow, type DesignFilesPanelState } from "./design-files.js" export { createDesignSystemPickerRows, parseDesignSystemCatalog, type DesignSystemCatalog, type DesignSystemPickerRow, type DesignSystemTokens } from "./design-system.js" +export { createArtifactVersionPanelState, diffArtifactVersions, type ArtifactDiff, type ArtifactVersionPanelState, type ArtifactVersionSummary } from "./artifact-version.js" export { M6_SERVER_ROUTE_REGISTRY, M7_SERVER_ROUTE_REGISTRY, M8_SERVER_ROUTE_REGISTRY, M9A_SERVER_ROUTE_REGISTRY, M9B_SERVER_ROUTE_REGISTRY, M10_SERVER_ROUTE_REGISTRY, M11_SERVER_ROUTE_REGISTRY, M15_SERVER_ROUTE_REGISTRY, WORKBENCH_ROUTE_OPERATIONS, WORKBENCH_ROUTE_REGISTRY, routeFor, routesForLineage, type ArtifactLineage, type WorkbenchRoute, type WorkbenchServerRoute, type WorkbenchTransportMethod } from "./routes.js" diff --git a/packages/workbench-shell/test/artifact-version.test.ts b/packages/workbench-shell/test/artifact-version.test.ts new file mode 100644 index 000000000000..d7a96c77a826 --- /dev/null +++ b/packages/workbench-shell/test/artifact-version.test.ts @@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: MIT */ + +import { createArtifactVersionPanelState, diffArtifactVersions, type ArtifactVersionSummary } from "../src/artifact-version.js" + +const base: ArtifactVersionSummary = { artifactId: "artifact-123", version: 1, kind: "text", filename: "design.md", bytes: 10, createdAt: 1, metadata: { owner: "user" }, provenance: { sourceTool: "editor" }, relativePath: ".unifia/artifacts/artifact-123/v1/design.md", sha256: "a", scan: "clean" } +const next = { ...base, version: 2, bytes: 11, sha256: "b" } +const panel = createArtifactVersionPanelState([next, base], 2) +if (panel.history[0]?.version !== 1 || panel.selectedVersion !== 2 || panel.provenance?.sourceTool !== "editor") throw new Error("artifact version panel lost ordering/provenance") +if (panel.export.approved) throw new Error("artifact export was approved without a result") +const diff = diffArtifactVersions(base, next) +if (!diff.changed.includes("bytes") || !diff.changed.includes("sha256")) throw new Error("artifact structural diff missed changed fields") +if (diffArtifactVersions(undefined, next).added[0] !== "artifact") throw new Error("artifact diff did not report an addition") +console.log("ArtifactVersionPanel: 4/4 passed") diff --git a/work_design/STATE.md b/work_design/STATE.md index cab075d4b505..ff9121bcfd48 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -6,7 +6,7 @@ This file is the durable execution state for the Unifia Work/Design integration. - Branch: `work-design` - Base commit: `91daa35a26a8e44d7f35b539c91030ec1e230c54` -- Current card: `M20b` +- Current card: `M21` - Status: `IMPLEMENTED_WITH_DEFERRED_HUMAN_PROOFS` - Commit or push performed: yes (through M7; latest SHA recorded after commit) @@ -42,6 +42,7 @@ This file is the durable execution state for the Unifia Work/Design integration. | M19b | implemented with deferred human proofs | shell typecheck + DesignFiles 6/6 | Design file rows expose stable labels, kinds, and selected state for a UI surface. | | M20a | implemented with deferred human proofs | shell typecheck + DesignSystem 3/3 | Explicit injected Design System catalog schema validates id/version/source/tokens without discovering a new authority. | | M20b | implemented with deferred human proofs | shell typecheck + DesignSystem 3/3 | Picker rows sort catalogs deterministically and preserve a validated selected id. | +| M21 | implemented with deferred human proofs | shell typecheck + ArtifactVersionPanel 4/4 | Artifact history ordering, structural diff, provenance display, and explicit export approval state are modeled from persisted artifact summaries. | ## Manual verification register @@ -100,9 +101,10 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - M19b implementation → `renderDesignFileRows` projects the adapted catalog into stable panel rows and marks only the validated selection. - M20a implementation → `parseDesignSystemCatalog` validates an explicitly supplied catalog and keeps G6 open by requiring its source rather than inventing one. - M20b implementation → `createDesignSystemPickerRows` provides deterministic labels, versions, sources, and selection state. +- M21 implementation → `createArtifactVersionPanelState` and `diffArtifactVersions` expose ordered history, provenance, changed fields, and an export state that is false until an approved export result exists. ## Resume first 1. Read this file, `DECISIONS.md`, and `../INTEGRATION.md`. 2. Review the M0b diff and run the CI workflow on the first PR. -3. M20b code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. +3. M21 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. From fbc8e062d6450aea099dbd5faa5609c7a24f2fa1 Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 03:56:59 +0200 Subject: [PATCH 24/76] feat(workbench): add shared mobile navigation model --- packages/workbench-shell/src/index.ts | 1 + packages/workbench-shell/src/mobile-navigation.ts | 14 ++++++++++++++ .../workbench-shell/test/mobile-navigation.test.ts | 11 +++++++++++ work_design/STATE.md | 6 ++++-- 4 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 packages/workbench-shell/src/mobile-navigation.ts create mode 100644 packages/workbench-shell/test/mobile-navigation.test.ts diff --git a/packages/workbench-shell/src/index.ts b/packages/workbench-shell/src/index.ts index 9708175689f4..7fa170cf2d9f 100644 --- a/packages/workbench-shell/src/index.ts +++ b/packages/workbench-shell/src/index.ts @@ -8,4 +8,5 @@ export { createDesignPreviewPanelState, type DesignPreview, type DesignPreviewPa export { adaptDesignFiles, createDesignFilesPanelState, renderDesignFileRows, type DesignFile, type DesignFileKind, type DesignFileRow, type DesignFilesPanelState } from "./design-files.js" export { createDesignSystemPickerRows, parseDesignSystemCatalog, type DesignSystemCatalog, type DesignSystemPickerRow, type DesignSystemTokens } from "./design-system.js" export { createArtifactVersionPanelState, diffArtifactVersions, type ArtifactDiff, type ArtifactVersionPanelState, type ArtifactVersionSummary } from "./artifact-version.js" +export { createMobileNavigationModel, type MobileNavigationInput, type MobileNavigationModel } from "./mobile-navigation.js" export { M6_SERVER_ROUTE_REGISTRY, M7_SERVER_ROUTE_REGISTRY, M8_SERVER_ROUTE_REGISTRY, M9A_SERVER_ROUTE_REGISTRY, M9B_SERVER_ROUTE_REGISTRY, M10_SERVER_ROUTE_REGISTRY, M11_SERVER_ROUTE_REGISTRY, M15_SERVER_ROUTE_REGISTRY, WORKBENCH_ROUTE_OPERATIONS, WORKBENCH_ROUTE_REGISTRY, routeFor, routesForLineage, type ArtifactLineage, type WorkbenchRoute, type WorkbenchServerRoute, type WorkbenchTransportMethod } from "./routes.js" diff --git a/packages/workbench-shell/src/mobile-navigation.ts b/packages/workbench-shell/src/mobile-navigation.ts new file mode 100644 index 000000000000..9d9f7d97a1e9 --- /dev/null +++ b/packages/workbench-shell/src/mobile-navigation.ts @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: MIT */ + +import { WORKBENCH_ROUTE_REGISTRY, WORKBENCH_ROUTE_OPERATIONS } from "./routes.js" +import type { WorkFunction } from "./modes.js" + +export type MobileNavigationInput = { viewportWidth: number; documents: number; designPreviews: number; active: WorkFunction } +export type MobileNavigationModel = { layout: "rail" | "drawer"; active: WorkFunction; entries: readonly { operation: WorkFunction; route: string; selected: boolean }[]; workCount: number; designPreviewCount: number } + +/** Keeps mobile navigation on the same route registry as desktop. */ +export function createMobileNavigationModel(input: MobileNavigationInput): MobileNavigationModel { + const layout = input.viewportWidth < 720 ? "drawer" : "rail" + const entries = WORKBENCH_ROUTE_OPERATIONS.map((operation) => ({ operation, route: WORKBENCH_ROUTE_REGISTRY[operation].route, selected: operation === input.active })) + return { layout, active: input.active, entries, workCount: Math.max(0, Math.trunc(input.documents)), designPreviewCount: Math.max(0, Math.trunc(input.designPreviews)) } +} diff --git a/packages/workbench-shell/test/mobile-navigation.test.ts b/packages/workbench-shell/test/mobile-navigation.test.ts new file mode 100644 index 000000000000..d5a58ade2a89 --- /dev/null +++ b/packages/workbench-shell/test/mobile-navigation.test.ts @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: MIT */ + +import { createMobileNavigationModel } from "../src/mobile-navigation.js" + +const drawer = createMobileNavigationModel({ viewportWidth: 390, documents: 3, designPreviews: 3, active: "documents" }) +if (drawer.layout !== "drawer" || drawer.workCount !== 3 || drawer.designPreviewCount !== 3) throw new Error("mobile drawer model lost surface counts") +if (drawer.entries.find((entry) => entry.operation === "documents")?.selected !== true) throw new Error("mobile model lost active route") +const rail = createMobileNavigationModel({ viewportWidth: 1024, documents: -1.8, designPreviews: 1.9, active: "capability-picker" }) +if (rail.layout !== "rail" || rail.workCount !== 0 || rail.designPreviewCount !== 1) throw new Error("wide mobile model did not use the rail") +if (rail.entries.length !== 11 || rail.entries.some((entry) => !entry.route.startsWith("/v1/"))) throw new Error("mobile model diverged from route registry") +console.log("MobileNavigation: 4/4 passed") diff --git a/work_design/STATE.md b/work_design/STATE.md index ff9121bcfd48..7126beee3385 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -6,7 +6,7 @@ This file is the durable execution state for the Unifia Work/Design integration. - Branch: `work-design` - Base commit: `91daa35a26a8e44d7f35b539c91030ec1e230c54` -- Current card: `M21` +- Current card: `M22` - Status: `IMPLEMENTED_WITH_DEFERRED_HUMAN_PROOFS` - Commit or push performed: yes (through M7; latest SHA recorded after commit) @@ -43,6 +43,7 @@ This file is the durable execution state for the Unifia Work/Design integration. | M20a | implemented with deferred human proofs | shell typecheck + DesignSystem 3/3 | Explicit injected Design System catalog schema validates id/version/source/tokens without discovering a new authority. | | M20b | implemented with deferred human proofs | shell typecheck + DesignSystem 3/3 | Picker rows sort catalogs deterministically and preserve a validated selected id. | | M21 | implemented with deferred human proofs | shell typecheck + ArtifactVersionPanel 4/4 | Artifact history ordering, structural diff, provenance display, and explicit export approval state are modeled from persisted artifact summaries. | +| M22 | implemented with deferred human proofs | shell typecheck + MobileNavigation 4/4 | Mobile navigation uses the shared route registry, switches drawer/rail by viewport, and carries Work/Design counts. | ## Manual verification register @@ -102,9 +103,10 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - M20a implementation → `parseDesignSystemCatalog` validates an explicitly supplied catalog and keeps G6 open by requiring its source rather than inventing one. - M20b implementation → `createDesignSystemPickerRows` provides deterministic labels, versions, sources, and selection state. - M21 implementation → `createArtifactVersionPanelState` and `diffArtifactVersions` expose ordered history, provenance, changed fields, and an export state that is false until an approved export result exists. +- M22 implementation → `createMobileNavigationModel` reuses the shared eleven-route registry for mobile and exposes deterministic drawer/rail and Work/Design surface counts. ## Resume first 1. Read this file, `DECISIONS.md`, and `../INTEGRATION.md`. 2. Review the M0b diff and run the CI workflow on the first PR. -3. M21 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. +3. M22 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. From 57fd6f45f8b5d73bb6f800bb68292f8aa0e944aa Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 03:58:21 +0200 Subject: [PATCH 25/76] docs(workbench): record Work Design release candidate --- work_design/RELEASE-CANDIDATE.md | 21 +++++++++++++++++++++ work_design/STATE.md | 6 ++++-- 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 work_design/RELEASE-CANDIDATE.md diff --git a/work_design/RELEASE-CANDIDATE.md b/work_design/RELEASE-CANDIDATE.md new file mode 100644 index 000000000000..4b59e6a1358c --- /dev/null +++ b/work_design/RELEASE-CANDIDATE.md @@ -0,0 +1,21 @@ +# Unifia Work/Design release candidate + +**Branch**: `work-design` +**Base**: `dev` at `91daa35a26a8e44d7f35b539c91030ec1e230c54` +**Candidate commit**: the commit containing this file on `work-design` +**Status**: implementation complete; human release gates pending + +## Automated evidence + +- Workbench Shell typecheck: PASS. +- Workbench Shell full suite: 11 files, 0 failures; WorkbenchShell 122/122, client 20/20, DesignSpecPanel 5/5, DesignRenderer 5/5, DesignPreviewPanel 4/4, DesignFiles 6/6, DesignSystem 3/3, ArtifactVersionPanel 4/4, MobileNavigation 4/4, modes 4/4, routes 11/11. +- Remote turbo typecheck on the latest push: 35/35 successful. +- CI conformance repair remains green at 8/8; the non-blocking Node 20/24 action warning remains known. + +## Human gates + +`work_design/MANUAL-VERIFICATION.md` remains authoritative. MV-01 through MV-10 are still `PENDING`; in particular no desktop/native bridge, Android install/observation, SVG WebView, signing, merge, or publication claim is made by this candidate. + +## Scope completed + +M14–M22 now provide typed audit/approval/capability/export client flows, spec diagnostics, deterministic SVG and responsive previews, file and Design System models, artifact version/diff/provenance state, and shared mobile navigation. G6 remains open because no Design System catalog authority was invented. diff --git a/work_design/STATE.md b/work_design/STATE.md index 7126beee3385..0c4d36c41f72 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -6,7 +6,7 @@ This file is the durable execution state for the Unifia Work/Design integration. - Branch: `work-design` - Base commit: `91daa35a26a8e44d7f35b539c91030ec1e230c54` -- Current card: `M22` +- Current card: `M23` - Status: `IMPLEMENTED_WITH_DEFERRED_HUMAN_PROOFS` - Commit or push performed: yes (through M7; latest SHA recorded after commit) @@ -44,6 +44,7 @@ This file is the durable execution state for the Unifia Work/Design integration. | M20b | implemented with deferred human proofs | shell typecheck + DesignSystem 3/3 | Picker rows sort catalogs deterministically and preserve a validated selected id. | | M21 | implemented with deferred human proofs | shell typecheck + ArtifactVersionPanel 4/4 | Artifact history ordering, structural diff, provenance display, and explicit export approval state are modeled from persisted artifact summaries. | | M22 | implemented with deferred human proofs | shell typecheck + MobileNavigation 4/4 | Mobile navigation uses the shared route registry, switches drawer/rail by viewport, and carries Work/Design counts. | +| M23 | implemented with deferred human proofs | full Workbench Shell suite: 11 files, 0 failures; remote typecheck 35/35; release candidate file | Candidate release checklist is recorded; MV-01 through MV-10 remain pending and no signing/merge/publication is claimed. | ## Manual verification register @@ -104,9 +105,10 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - M20b implementation → `createDesignSystemPickerRows` provides deterministic labels, versions, sources, and selection state. - M21 implementation → `createArtifactVersionPanelState` and `diffArtifactVersions` expose ordered history, provenance, changed fields, and an export state that is false until an approved export result exists. - M22 implementation → `createMobileNavigationModel` reuses the shared eleven-route registry for mobile and exposes deterministic drawer/rail and Work/Design surface counts. +- M23 implementation → `work_design/RELEASE-CANDIDATE.md` records the completed implementation scope, automated evidence, open G6 decision, and all human release gates without declaring release readiness. ## Resume first 1. Read this file, `DECISIONS.md`, and `../INTEGRATION.md`. 2. Review the M0b diff and run the CI workflow on the first PR. -3. M22 code is present by explicit user override; keep MV-01 through MV-04 pending until platform-native bridge/rotation wiring and real Android `` proof are supplied. +3. M23 implementation is complete by explicit user override; keep MV-01 through MV-10 pending until their described evidence exists. Do not sign, merge, publish, or mark the candidate release-ready from automated checks alone. From 439486f4a24a2f59eaac1400e66393032f23ab50 Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 09:40:10 +0200 Subject: [PATCH 26/76] docs(workbench): record full conformance evidence --- work_design/RELEASE-CANDIDATE.md | 1 + work_design/STATE.md | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/work_design/RELEASE-CANDIDATE.md b/work_design/RELEASE-CANDIDATE.md index 4b59e6a1358c..9de044882c02 100644 --- a/work_design/RELEASE-CANDIDATE.md +++ b/work_design/RELEASE-CANDIDATE.md @@ -11,6 +11,7 @@ - Workbench Shell full suite: 11 files, 0 failures; WorkbenchShell 122/122, client 20/20, DesignSpecPanel 5/5, DesignRenderer 5/5, DesignPreviewPanel 4/4, DesignFiles 6/6, DesignSystem 3/3, ArtifactVersionPanel 4/4, MobileNavigation 4/4, modes 4/4, routes 11/11. - Remote turbo typecheck on the latest push: 35/35 successful. - CI conformance repair remains green at 8/8; the non-blocking Node 20/24 action warning remains known. +- Fresh local conformance rerun: PASS 8/8, 43 suites (41 Bun + 2 Vitest), 25 owned packages lint clean; browser E2E is explicitly skipped because it requires a real browser. ## Human gates diff --git a/work_design/STATE.md b/work_design/STATE.md index 0c4d36c41f72..8dd17b6acca3 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -8,7 +8,7 @@ This file is the durable execution state for the Unifia Work/Design integration. - Base commit: `91daa35a26a8e44d7f35b539c91030ec1e230c54` - Current card: `M23` - Status: `IMPLEMENTED_WITH_DEFERRED_HUMAN_PROOFS` -- Commit or push performed: yes (through M7; latest SHA recorded after commit) +- Commit or push performed: yes; latest pushed SHA is `57fd6f45f8`. ## Cards @@ -106,6 +106,7 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - M21 implementation → `createArtifactVersionPanelState` and `diffArtifactVersions` expose ordered history, provenance, changed fields, and an export state that is false until an approved export result exists. - M22 implementation → `createMobileNavigationModel` reuses the shared eleven-route registry for mobile and exposes deterministic drawer/rail and Work/Design surface counts. - M23 implementation → `work_design/RELEASE-CANDIDATE.md` records the completed implementation scope, automated evidence, open G6 decision, and all human release gates without declaring release readiness. +- Fresh conformance rerun → PASS 8/8: 43 suites, 25 owned packages lint clean, typecheck 35/35; browser E2E remains explicitly skipped and Gate C remains NO-GO on its documented external conditions. ## Resume first From 2dcc3560f14e25db5b748ab7b64e47e6b9bfd3e1 Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 09:46:14 +0200 Subject: [PATCH 27/76] docs(workbench): record partial Android runtime evidence --- work_design/MANUAL-VERIFICATION.md | 9 +++++++++ work_design/RELEASE-CANDIDATE.md | 4 +++- work_design/STATE.md | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/work_design/MANUAL-VERIFICATION.md b/work_design/MANUAL-VERIFICATION.md index 0603582924a3..41a0138e6250 100644 --- a/work_design/MANUAL-VERIFICATION.md +++ b/work_design/MANUAL-VERIFICATION.md @@ -20,3 +20,12 @@ Cette liste est la source de vérité des contrôles qui nécessitent une machin - `PENDING` → `PASS` uniquement avec la preuve décrite. - `PENDING` → `BLOCKED` si l’environnement ou l’autorisation manque ; noter la cause et ne pas contourner. - Les secrets, certificats, tokens et captures doivent être redacted avant archivage. + +## Observations appareil — 2026-08-14 + +- Appareil détecté : `b7163823` — Xiaomi Mi 10 Pro (`adb devices -l`). +- Copie locale signée avec `C:\Users\barat\.android\debug.keystore` : signature APK v2/v3 vérifiée ; l’APK source reste unsigned et inchangé. +- Installation : package `ai.unifia.mobile`, version `0.1.0`, `lastUpdateTime=2026-08-14 09:43:38`. +- Runtime : `ai.unifia.mobile/.MainActivity` résumée au premier plan ; les logs montrent `/global/health` complété avec `healthy=true`, version `local` et port loopback `127.0.0.1:14096`. +- Capture locale : `D:\App\OpenCode\.build-temp\unifia-device-proof-2.png` montre l’application Unifia avec le sélecteur « Ouvrir un projet » et le runtime disponible. +- Statut inchangé : MV-03 et MV-04 restent `PENDING`, car l’observation n’a pas encore couvert tout le parcours Work/Design, arrière-plan/reprise et le test SVG inert demandé. diff --git a/work_design/RELEASE-CANDIDATE.md b/work_design/RELEASE-CANDIDATE.md index 9de044882c02..b67e13b08972 100644 --- a/work_design/RELEASE-CANDIDATE.md +++ b/work_design/RELEASE-CANDIDATE.md @@ -15,7 +15,9 @@ ## Human gates -`work_design/MANUAL-VERIFICATION.md` remains authoritative. MV-01 through MV-10 are still `PENDING`; in particular no desktop/native bridge, Android install/observation, SVG WebView, signing, merge, or publication claim is made by this candidate. +`work_design/MANUAL-VERIFICATION.md` remains authoritative. MV-01 through MV-10 are still `PENDING`; in particular no complete desktop/native bridge, Android lifecycle, SVG WebView, merge, or publication claim is made by this candidate. + +Partial device evidence now exists for MV-03: a debug-signed local copy installed and launched on `b7163823`, with healthy loopback runtime. The full Android Work/Design, lifecycle and SVG inert procedures remain pending. ## Scope completed diff --git a/work_design/STATE.md b/work_design/STATE.md index 8dd17b6acca3..29f9e174ba8b 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -107,6 +107,7 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - M22 implementation → `createMobileNavigationModel` reuses the shared eleven-route registry for mobile and exposes deterministic drawer/rail and Work/Design surface counts. - M23 implementation → `work_design/RELEASE-CANDIDATE.md` records the completed implementation scope, automated evidence, open G6 decision, and all human release gates without declaring release readiness. - Fresh conformance rerun → PASS 8/8: 43 suites, 25 owned packages lint clean, typecheck 35/35; browser E2E remains explicitly skipped and Gate C remains NO-GO on its documented external conditions. +- Device observation → APK debug source remained unsigned; a local debug-signed copy installed on `b7163823`, `MainActivity` resumed, and `/global/health` returned `healthy=true` on loopback `127.0.0.1:14096`; MV-03/MV-04 remain pending for their full procedures. ## Resume first From a518ef2f7aa52980bf78c9d77ad7bc57ce739ed8 Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 09:47:22 +0200 Subject: [PATCH 28/76] docs(workbench): record Android lifecycle permission boundary --- work_design/MANUAL-VERIFICATION.md | 1 + work_design/STATE.md | 1 + 2 files changed, 2 insertions(+) diff --git a/work_design/MANUAL-VERIFICATION.md b/work_design/MANUAL-VERIFICATION.md index 41a0138e6250..a89d7db5186a 100644 --- a/work_design/MANUAL-VERIFICATION.md +++ b/work_design/MANUAL-VERIFICATION.md @@ -28,4 +28,5 @@ Cette liste est la source de vérité des contrôles qui nécessitent une machin - Installation : package `ai.unifia.mobile`, version `0.1.0`, `lastUpdateTime=2026-08-14 09:43:38`. - Runtime : `ai.unifia.mobile/.MainActivity` résumée au premier plan ; les logs montrent `/global/health` complété avec `healthy=true`, version `local` et port loopback `127.0.0.1:14096`. - Capture locale : `D:\App\OpenCode\.build-temp\unifia-device-proof-2.png` montre l’application Unifia avec le sélecteur « Ouvrir un projet » et le runtime disponible. +- Sous-test lifecycle : PID `6866` avant/après la relance et `MainActivity` résumée ; l’injection réelle de `KEYCODE_HOME` a été refusée par MIUI (`SecurityException`, permission `INJECT_EVENTS` manquante), donc le passage arrière-plan n’est pas prouvé. - Statut inchangé : MV-03 et MV-04 restent `PENDING`, car l’observation n’a pas encore couvert tout le parcours Work/Design, arrière-plan/reprise et le test SVG inert demandé. diff --git a/work_design/STATE.md b/work_design/STATE.md index 29f9e174ba8b..c545fdebe3fb 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -108,6 +108,7 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - M23 implementation → `work_design/RELEASE-CANDIDATE.md` records the completed implementation scope, automated evidence, open G6 decision, and all human release gates without declaring release readiness. - Fresh conformance rerun → PASS 8/8: 43 suites, 25 owned packages lint clean, typecheck 35/35; browser E2E remains explicitly skipped and Gate C remains NO-GO on its documented external conditions. - Device observation → APK debug source remained unsigned; a local debug-signed copy installed on `b7163823`, `MainActivity` resumed, and `/global/health` returned `healthy=true` on loopback `127.0.0.1:14096`; MV-03/MV-04 remain pending for their full procedures. +- Lifecycle sub-test → same PID `6866` and resumed `MainActivity` after relaunch; MIUI refused `adb shell input keyevent` with missing `INJECT_EVENTS`, so true background/foreground behavior remains unproven. ## Resume first From 54abaa839459202ec2a048dc0403554a0974e668 Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 09:53:13 +0200 Subject: [PATCH 29/76] docs(workbench): reconcile verification state --- work_design/MANUAL-VERIFICATION.md | 3 ++- work_design/RELEASE-CANDIDATE.md | 1 + work_design/STATE.md | 7 ++++--- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/work_design/MANUAL-VERIFICATION.md b/work_design/MANUAL-VERIFICATION.md index a89d7db5186a..9bbeea63828f 100644 --- a/work_design/MANUAL-VERIFICATION.md +++ b/work_design/MANUAL-VERIFICATION.md @@ -6,7 +6,7 @@ Cette liste est la source de vérité des contrôles qui nécessitent une machin |---|---|---|---|---| | MV-01 | Bridge natif desktop | Construire le profil debug, lancer l’application Tauri et ouvrir un mode Work avec un workspace réel. Observer l’appel natif qui fournit le jeton court ; vérifier qu’aucun secret maître n’est présent dans le JS, le local storage, l’URL ou les logs. | Capture des appels/console filtrée + chemin du build + résultat d’inspection du stockage. | `PENDING` | | MV-02 | Rotation desktop | Maintenir un flux SSE ouvert, déclencher la rotation du jeton, vérifier l’état `rotating`, la mise en attente des sorties, l’acceptation temporaire de l’ancien jeton puis son refus après la grace period. | Trace horodatée : ancien/nouveau jeton redacted, événements de rotation, requête après expiration refusée. | `PENDING` | -| MV-03 | Android runtime | Installer le build debug Android sur un appareil identifié, ouvrir Work puis Design, revenir en arrière-plan et au premier plan. Vérifier l’absence de second runtime et la reprise du flux. | `adb` package/version, `lastUpdateTime`, captures des deux modes, trace de reprise. Un candidat unsigned a été généré le 2026-08-14 ; installation et observation restent à faire. | `PENDING` | +| MV-03 | Android runtime | Installer le build debug Android sur un appareil identifié, ouvrir Work puis Design, revenir en arrière-plan et au premier plan. Vérifier l’absence de second runtime et la reprise du flux. | `adb` package/version, `lastUpdateTime`, captures des deux modes, trace de reprise. Installation et démarrage ont été observés sur `b7163823`; le parcours Work/Design et le cycle arrière-plan/reprise restent à prouver. | `PENDING` | | MV-04 | Android SVG inert | Dans le WebView Android réel, charger un SVG via `` contenant un texte, un token de couleur et une tentative de script/ressource externe. Vérifier rendu, inertie et absence de requête externe. | Capture écran + log réseau/WebView ; le script et la ressource externe ne s’exécutent pas. | `PENDING` | | MV-05 | Mobile write safety | Depuis Android, tenter une écriture Work/Design avec un compte de test et vérifier le refus par défaut ; vérifier qu’une approbation explicite seule permet l’action prévue. | Requête, statut, écran d’approbation, audit redacted. | `PENDING` | | MV-06 | Navigation UI | Tester le rail Code/Work/Design/Automate, les deep links et le mode persistant après fermeture/réouverture pour deux répertoires distincts. | Matrice chemin → mode affiché, captures et absence de requête réseau sur le changement de mode. | `PENDING` | @@ -29,4 +29,5 @@ Cette liste est la source de vérité des contrôles qui nécessitent une machin - Runtime : `ai.unifia.mobile/.MainActivity` résumée au premier plan ; les logs montrent `/global/health` complété avec `healthy=true`, version `local` et port loopback `127.0.0.1:14096`. - Capture locale : `D:\App\OpenCode\.build-temp\unifia-device-proof-2.png` montre l’application Unifia avec le sélecteur « Ouvrir un projet » et le runtime disponible. - Sous-test lifecycle : PID `6866` avant/après la relance et `MainActivity` résumée ; l’injection réelle de `KEYCODE_HOME` a été refusée par MIUI (`SecurityException`, permission `INJECT_EVENTS` manquante), donc le passage arrière-plan n’est pas prouvé. +- CSP statique : `packages/desktop/src-tauri/tauri.conf.json` et `packages/mobile/src-tauri/tauri.conf.json` déclarent des origines explicites, `img-src data:`, `object-src 'none'` et `frame-ancestors 'none'`; le runtime `packages/unifia/src/server/instance.ts` reste limité à `self data:` pour `connect-src`. L’extraction des bundles empaquetés et les essais URL restent requis pour MV-09. - Statut inchangé : MV-03 et MV-04 restent `PENDING`, car l’observation n’a pas encore couvert tout le parcours Work/Design, arrière-plan/reprise et le test SVG inert demandé. diff --git a/work_design/RELEASE-CANDIDATE.md b/work_design/RELEASE-CANDIDATE.md index b67e13b08972..aecae5456858 100644 --- a/work_design/RELEASE-CANDIDATE.md +++ b/work_design/RELEASE-CANDIDATE.md @@ -12,6 +12,7 @@ - Remote turbo typecheck on the latest push: 35/35 successful. - CI conformance repair remains green at 8/8; the non-blocking Node 20/24 action warning remains known. - Fresh local conformance rerun: PASS 8/8, 43 suites (41 Bun + 2 Vitest), 25 owned packages lint clean; browser E2E is explicitly skipped because it requires a real browser. +- Static CSP extraction: PASS for explicit Tauri origins, loopback/IPC scoping, `img-src data:`, `object-src 'none'`, and `frame-ancestors 'none'`; the runtime server remains self/data-only for `connect-src`. MV-09 still requires packaged-bundle extraction and interactive allow/deny checks. ## Human gates diff --git a/work_design/STATE.md b/work_design/STATE.md index c545fdebe3fb..45501ddf452f 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -8,7 +8,7 @@ This file is the durable execution state for the Unifia Work/Design integration. - Base commit: `91daa35a26a8e44d7f35b539c91030ec1e230c54` - Current card: `M23` - Status: `IMPLEMENTED_WITH_DEFERRED_HUMAN_PROOFS` -- Commit or push performed: yes; latest pushed SHA is `57fd6f45f8`. +- Commit or push performed: yes; latest pushed SHA is `a518ef2f7a`. ## Cards @@ -53,7 +53,7 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio ## Validation log - `git status --short --branch` → clean on `work-design` -- `git log -1 --oneline` → `91daa35a26 feat: complete the Unifia rebrand and repair the desync it left behind (#23)` +- `git log -1 --oneline` → `a518ef2f7a docs(workbench): record Android lifecycle permission boundary` - `bash scripts/check-pr-size.sh dev` → 152 changed lines, under the 400-line limit - `.github/workflows/work-design-integrity.yml` → merge-tree, size, and whitespace checks declared - `DECISIONS.md` M1a gate table → nine plan decisions recorded @@ -81,7 +81,7 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - Android release build → PASS (exit 0): unsigned APK and AAB generated under `packages/mobile/src-tauri/gen/android/app/build/outputs/`; APK size 1115164803 bytes, AAB size 1066480647 bytes. - `bun scripts/check-android-runtime.mjs` from `packages/mobile` → PASS: rootfs and 30 native libraries present. The ORT binary was supplied from an existing local prepared worktree through an ignored hardlink; no source checkout was modified. - Android build warnings remain: Gradle reports a debuggable release build and the native ORT sync reports a Windows file-lock warning. These require review before treating the artifact as release-ready. -- No APK installation, device execution, signing, commit, push, merge, or publication was performed; MV-03/MV-04 and all other human gates remain pending. +- The source APK remains unsigned; a local debug-signed copy was installed and executed on `b7163823`. No release signing, merge, or publication was performed; MV-03/MV-04 and all other human gates remain pending. - M1c token implementation → `ScopedTokenIssuer` now owns workspace + instance + capability scoped tokens, short TTL, rotation grace, and close-time revocation; focused auth/security/preflight/topology validation passes (6 tests, 0 failures). - M4 implementation → `packages/workbench-shell/src/client.ts` adds `WorkbenchClient`, `WorkbenchEventDispatcher`, bounded authentication retry, idempotency-aware mutation handling, SSE parsing, cursor continuation, and token-rotation hook; client contract test passes 7/7. - M5 implementation → `packages/workbench-shell/src/routes.ts` adds total `WORKBENCH_ROUTE_REGISTRY`, route helpers, capability/event mapping, and artifact lineage discriminants; route contract passes 11/11. @@ -109,6 +109,7 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - Fresh conformance rerun → PASS 8/8: 43 suites, 25 owned packages lint clean, typecheck 35/35; browser E2E remains explicitly skipped and Gate C remains NO-GO on its documented external conditions. - Device observation → APK debug source remained unsigned; a local debug-signed copy installed on `b7163823`, `MainActivity` resumed, and `/global/health` returned `healthy=true` on loopback `127.0.0.1:14096`; MV-03/MV-04 remain pending for their full procedures. - Lifecycle sub-test → same PID `6866` and resumed `MainActivity` after relaunch; MIUI refused `adb shell input keyevent` with missing `INJECT_EVENTS`, so true background/foreground behavior remains unproven. +- CSP static extraction → desktop and mobile Tauri configurations declare explicit loopback/IPC origins, `img-src data:`, `object-src 'none'`, and `frame-ancestors 'none'`; the runtime server CSP is self/data-only. Packaged-bundle and interactive URL checks remain MV-09. ## Resume first From d9811140f60fd996f200fce3f40aebf1630d5483 Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 09:56:58 +0200 Subject: [PATCH 30/76] docs(workbench): record green conformance run --- work_design/RELEASE-CANDIDATE.md | 1 + work_design/STATE.md | 1 + 2 files changed, 2 insertions(+) diff --git a/work_design/RELEASE-CANDIDATE.md b/work_design/RELEASE-CANDIDATE.md index aecae5456858..3f28ca65457a 100644 --- a/work_design/RELEASE-CANDIDATE.md +++ b/work_design/RELEASE-CANDIDATE.md @@ -12,6 +12,7 @@ - Remote turbo typecheck on the latest push: 35/35 successful. - CI conformance repair remains green at 8/8; the non-blocking Node 20/24 action warning remains known. - Fresh local conformance rerun: PASS 8/8, 43 suites (41 Bun + 2 Vitest), 25 owned packages lint clean; browser E2E is explicitly skipped because it requires a real browser. +- GitHub Actions confirmation: run `31761195329` completed `success` for `unifia-conformance` on code commit `aede7fc1c5fba75e7b857a657ce8b70f90a5ffd5`; later documentation-only pushes do not match the workflow path filter. - Static CSP extraction: PASS for explicit Tauri origins, loopback/IPC scoping, `img-src data:`, `object-src 'none'`, and `frame-ancestors 'none'`; the runtime server remains self/data-only for `connect-src`. MV-09 still requires packaged-bundle extraction and interactive allow/deny checks. ## Human gates diff --git a/work_design/STATE.md b/work_design/STATE.md index 45501ddf452f..6332e27033fe 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -107,6 +107,7 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - M22 implementation → `createMobileNavigationModel` reuses the shared eleven-route registry for mobile and exposes deterministic drawer/rail and Work/Design surface counts. - M23 implementation → `work_design/RELEASE-CANDIDATE.md` records the completed implementation scope, automated evidence, open G6 decision, and all human release gates without declaring release readiness. - Fresh conformance rerun → PASS 8/8: 43 suites, 25 owned packages lint clean, typecheck 35/35; browser E2E remains explicitly skipped and Gate C remains NO-GO on its documented external conditions. +- GitHub Actions → run `31761195329` (`unifia-conformance`) completed `success` on code commit `aede7fc1c5fba75e7b857a657ce8b70f90a5ffd5`; subsequent pushes `54abaa8394` are documentation-only and outside the workflow path filter. - Device observation → APK debug source remained unsigned; a local debug-signed copy installed on `b7163823`, `MainActivity` resumed, and `/global/health` returned `healthy=true` on loopback `127.0.0.1:14096`; MV-03/MV-04 remain pending for their full procedures. - Lifecycle sub-test → same PID `6866` and resumed `MainActivity` after relaunch; MIUI refused `adb shell input keyevent` with missing `INJECT_EVENTS`, so true background/foreground behavior remains unproven. - CSP static extraction → desktop and mobile Tauri configurations declare explicit loopback/IPC origins, `img-src data:`, `object-src 'none'`, and `frame-ancestors 'none'`; the runtime server CSP is self/data-only. Packaged-bundle and interactive URL checks remain MV-09. From 0f0d4823ab8f7fec2297b825b72a9d475d1ce7a3 Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 10:02:39 +0200 Subject: [PATCH 31/76] feat(app): wire Work Design surfaces --- packages/app/src/pages/workbench-mode.tsx | 111 +++++++++++++++++++++- work_design/RELEASE-CANDIDATE.md | 1 + work_design/STATE.md | 6 +- 3 files changed, 111 insertions(+), 7 deletions(-) diff --git a/packages/app/src/pages/workbench-mode.tsx b/packages/app/src/pages/workbench-mode.tsx index 07ddf95ab0c4..232793a62860 100644 --- a/packages/app/src/pages/workbench-mode.tsx +++ b/packages/app/src/pages/workbench-mode.tsx @@ -1,13 +1,114 @@ +import { For, Show, createMemo } from "solid-js" import { useMode } from "@/context/mode" +import { + createDesignPreviewPanelState, + createDesignSpecPanelState, + createMobileNavigationModel, + WORK_V1_FUNCTIONS, + type WorkFunction, +} from "@unifia/workbench-shell" + +const SAMPLE_SPEC = JSON.stringify( + { + id: "unifia-workbench-preview", + version: "1.0.0", + target: "design", + title: "Unifia Workbench", + tokens: { colors: { primary: "#19212b", foreground: "#f5f7fa" }, spacing: { gutter: 32, stack: 24 } }, + rules: [ + { id: "work", statement: "Documents and traces stay scoped to the active workspace" }, + { id: "design", statement: "Validated specs render as inert responsive SVG previews" }, + ], + }, + null, + 2, +) + +const labelFor = (operation: WorkFunction) => operation.replaceAll("-", " ") + +function WorkSurface() { + const navigation = createMemo(() => + createMobileNavigationModel({ viewportWidth: window.innerWidth, documents: 0, designPreviews: 3, active: "documents" }), + ) + + return ( +
+
+
+

Work

+

Workspace operations

+

Read-only workspace surfaces are derived from the shared Work registry and keep their scope explicit.

+
+
+ + {(operation) => ( +
+
+

{labelFor(operation)}

+ entry.operation === operation)?.selected}> + Active + +
+

+ {operation === "documents" ? `${navigation().workCount} documents` : operation === "export" ? "Approval required" : "Scoped to this workspace"} +

+
+ )} +
+
+
+
+ ) +} + +function DesignSurface() { + const spec = createMemo(() => createDesignSpecPanelState({ kind: "inline", value: SAMPLE_SPEC })) + const preview = createMemo(() => createDesignPreviewPanelState(spec())) + + return ( +
+
+
+

Design

+

Validated responsive preview

+

The preview is produced only after spec validation and is loaded as an inert image source.

+
+ 0} fallback={

{spec().diagnostics[0]?.message}

}> +
+ + {(item) => ( +
+ {`${item.label} +
{item.label} · {item.width}px
+
+ )} +
+
+
+
+
+ ) +} export default function WorkbenchMode() { const mode = useMode() return ( -
-
-

{mode.active()} mode

-

This Unifia surface is enabled in navigation and ready for its implementation card.

-
+
+ + + + + + + +
+
+

Automate

+

Automation controls

+

Automation remains scoped to explicit approvals and the existing Unifia runtime.

+
+
+
) } diff --git a/work_design/RELEASE-CANDIDATE.md b/work_design/RELEASE-CANDIDATE.md index 3f28ca65457a..49aa44d07e01 100644 --- a/work_design/RELEASE-CANDIDATE.md +++ b/work_design/RELEASE-CANDIDATE.md @@ -14,6 +14,7 @@ - Fresh local conformance rerun: PASS 8/8, 43 suites (41 Bun + 2 Vitest), 25 owned packages lint clean; browser E2E is explicitly skipped because it requires a real browser. - GitHub Actions confirmation: run `31761195329` completed `success` for `unifia-conformance` on code commit `aede7fc1c5fba75e7b857a657ce8b70f90a5ffd5`; later documentation-only pushes do not match the workflow path filter. - Static CSP extraction: PASS for explicit Tauri origins, loopback/IPC scoping, `img-src data:`, `object-src 'none'`, and `frame-ancestors 'none'`; the runtime server remains self/data-only for `connect-src`. MV-09 still requires packaged-bundle extraction and interactive allow/deny checks. +- Workbench UI wiring: PASS for the existing route composition; Work renders the shared eleven-function registry and Design renders three validated responsive SVG previews through image sources. App typecheck and 704 unit tests pass. ## Human gates diff --git a/work_design/STATE.md b/work_design/STATE.md index 6332e27033fe..a70b1269cd27 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -6,7 +6,7 @@ This file is the durable execution state for the Unifia Work/Design integration. - Branch: `work-design` - Base commit: `91daa35a26a8e44d7f35b539c91030ec1e230c54` -- Current card: `M23` +- Current card: `M24` - Status: `IMPLEMENTED_WITH_DEFERRED_HUMAN_PROOFS` - Commit or push performed: yes; latest pushed SHA is `a518ef2f7a`. @@ -45,6 +45,7 @@ This file is the durable execution state for the Unifia Work/Design integration. | M21 | implemented with deferred human proofs | shell typecheck + ArtifactVersionPanel 4/4 | Artifact history ordering, structural diff, provenance display, and explicit export approval state are modeled from persisted artifact summaries. | | M22 | implemented with deferred human proofs | shell typecheck + MobileNavigation 4/4 | Mobile navigation uses the shared route registry, switches drawer/rail by viewport, and carries Work/Design counts. | | M23 | implemented with deferred human proofs | full Workbench Shell suite: 11 files, 0 failures; remote typecheck 35/35; release candidate file | Candidate release checklist is recorded; MV-01 through MV-10 remain pending and no signing/merge/publication is claimed. | +| M24 | implemented with deferred human proofs | app typecheck + app unit suite 704/704 | Existing Workbench route now renders the shared Work registry for Work and validated inert responsive SVG previews for Design; native, lifecycle, and publication gates remain pending. | ## Manual verification register @@ -111,9 +112,10 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - Device observation → APK debug source remained unsigned; a local debug-signed copy installed on `b7163823`, `MainActivity` resumed, and `/global/health` returned `healthy=true` on loopback `127.0.0.1:14096`; MV-03/MV-04 remain pending for their full procedures. - Lifecycle sub-test → same PID `6866` and resumed `MainActivity` after relaunch; MIUI refused `adb shell input keyevent` with missing `INJECT_EVENTS`, so true background/foreground behavior remains unproven. - CSP static extraction → desktop and mobile Tauri configurations declare explicit loopback/IPC origins, `img-src data:`, `object-src 'none'`, and `frame-ancestors 'none'`; the runtime server CSP is self/data-only. Packaged-bundle and interactive URL checks remain MV-09. +- M24 UI wiring → `packages/app/src/pages/workbench-mode.tsx` now composes `createMobileNavigationModel`, `createDesignSpecPanelState`, and `createDesignPreviewPanelState`; app typecheck passes and the unit suite reports 704/704. ## Resume first 1. Read this file, `DECISIONS.md`, and `../INTEGRATION.md`. 2. Review the M0b diff and run the CI workflow on the first PR. -3. M23 implementation is complete by explicit user override; keep MV-01 through MV-10 pending until their described evidence exists. Do not sign, merge, publish, or mark the candidate release-ready from automated checks alone. +3. M24 UI wiring is implemented; keep MV-01 through MV-10 pending until their described evidence exists. Do not sign, merge, publish, or mark the candidate release-ready from automated checks alone. From 8035c401c5ce0fa4414c5c6f6322a2e1cf7bf1fc Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 10:12:04 +0200 Subject: [PATCH 32/76] docs(workbench): record app bundle evidence --- work_design/RELEASE-CANDIDATE.md | 1 + work_design/STATE.md | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/work_design/RELEASE-CANDIDATE.md b/work_design/RELEASE-CANDIDATE.md index 49aa44d07e01..a2e47baf04c2 100644 --- a/work_design/RELEASE-CANDIDATE.md +++ b/work_design/RELEASE-CANDIDATE.md @@ -15,6 +15,7 @@ - GitHub Actions confirmation: run `31761195329` completed `success` for `unifia-conformance` on code commit `aede7fc1c5fba75e7b857a657ce8b70f90a5ffd5`; later documentation-only pushes do not match the workflow path filter. - Static CSP extraction: PASS for explicit Tauri origins, loopback/IPC scoping, `img-src data:`, `object-src 'none'`, and `frame-ancestors 'none'`; the runtime server remains self/data-only for `connect-src`. MV-09 still requires packaged-bundle extraction and interactive allow/deny checks. - Workbench UI wiring: PASS for the existing route composition; Work renders the shared eleven-function registry and Design renders three validated responsive SVG previews through image sources. App typecheck and 704 unit tests pass. +- App production bundle: PASS; Vite build completed successfully, with existing chunk-size, CSS minifier, and dynamic-import warnings recorded but no build error. ## Human gates diff --git a/work_design/STATE.md b/work_design/STATE.md index a70b1269cd27..ed336e4fe03f 100644 --- a/work_design/STATE.md +++ b/work_design/STATE.md @@ -8,7 +8,7 @@ This file is the durable execution state for the Unifia Work/Design integration. - Base commit: `91daa35a26a8e44d7f35b539c91030ec1e230c54` - Current card: `M24` - Status: `IMPLEMENTED_WITH_DEFERRED_HUMAN_PROOFS` -- Commit or push performed: yes; latest pushed SHA is `a518ef2f7a`. +- Commit or push performed: yes; latest pushed SHA is `0f0d4823ab`. ## Cards @@ -54,7 +54,7 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio ## Validation log - `git status --short --branch` → clean on `work-design` -- `git log -1 --oneline` → `a518ef2f7a docs(workbench): record Android lifecycle permission boundary` +- `git log -1 --oneline` → `0f0d4823ab feat(app): wire Work Design surfaces` - `bash scripts/check-pr-size.sh dev` → 152 changed lines, under the 400-line limit - `.github/workflows/work-design-integrity.yml` → merge-tree, size, and whitespace checks declared - `DECISIONS.md` M1a gate table → nine plan decisions recorded @@ -113,6 +113,7 @@ See `work_design/MANUAL-VERIFICATION.md`. Items MV-01 through MV-10 are intentio - Lifecycle sub-test → same PID `6866` and resumed `MainActivity` after relaunch; MIUI refused `adb shell input keyevent` with missing `INJECT_EVENTS`, so true background/foreground behavior remains unproven. - CSP static extraction → desktop and mobile Tauri configurations declare explicit loopback/IPC origins, `img-src data:`, `object-src 'none'`, and `frame-ancestors 'none'`; the runtime server CSP is self/data-only. Packaged-bundle and interactive URL checks remain MV-09. - M24 UI wiring → `packages/app/src/pages/workbench-mode.tsx` now composes `createMobileNavigationModel`, `createDesignSpecPanelState`, and `createDesignPreviewPanelState`; app typecheck passes and the unit suite reports 704/704. +- M24 production bundle → `bun run --cwd packages/app build` PASS; Vite emitted only pre-existing chunk-size, CSS minifier, and dynamic-import warnings. ## Resume first From a04be041fa3405ff86348624a5b7af527afe4bbf Mon Sep 17 00:00:00 2001 From: MM2-B02-WORKER Date: Fri, 14 Aug 2026 10:14:13 +0200 Subject: [PATCH 33/76] feat(app): make Work Design surfaces interactive --- packages/app/src/pages/workbench-mode.tsx | 44 +++++++++++++++++++---- work_design/RELEASE-CANDIDATE.md | 2 +- work_design/STATE.md | 3 +- 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/packages/app/src/pages/workbench-mode.tsx b/packages/app/src/pages/workbench-mode.tsx index 232793a62860..1c0ce3a5835c 100644 --- a/packages/app/src/pages/workbench-mode.tsx +++ b/packages/app/src/pages/workbench-mode.tsx @@ -1,4 +1,4 @@ -import { For, Show, createMemo } from "solid-js" +import { For, Show, createMemo, createSignal } from "solid-js" import { useMode } from "@/context/mode" import { createDesignPreviewPanelState, @@ -27,8 +27,9 @@ const SAMPLE_SPEC = JSON.stringify( const labelFor = (operation: WorkFunction) => operation.replaceAll("-", " ") function WorkSurface() { + const [activeOperation, setActiveOperation] = createSignal("documents") const navigation = createMemo(() => - createMobileNavigationModel({ viewportWidth: window.innerWidth, documents: 0, designPreviews: 3, active: "documents" }), + createMobileNavigationModel({ viewportWidth: window.innerWidth, documents: 0, designPreviews: 3, active: activeOperation() }), ) return ( @@ -42,27 +43,40 @@ function WorkSurface() {
{(operation) => ( -
+
+ )}
+
+

Selected operation

+

{labelFor(activeOperation())}

+

This surface keeps the operation scoped to the active workspace and routes writes through the existing approval boundary.

+
) } function DesignSurface() { - const spec = createMemo(() => createDesignSpecPanelState({ kind: "inline", value: SAMPLE_SPEC })) + const [source, setSource] = createSignal(SAMPLE_SPEC) + const spec = createMemo(() => createDesignSpecPanelState({ kind: "inline", value: source() })) const preview = createMemo(() => createDesignPreviewPanelState(spec())) return ( @@ -73,6 +87,24 @@ function DesignSurface() {

Validated responsive preview

The preview is produced only after spec validation and is loaded as an inert image source.

+